diff options
Diffstat (limited to 'http-client/client.go')
| -rw-r--r-- | http-client/client.go | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/http-client/client.go b/http-client/client.go index ee3e044..13baf20 100644 --- a/http-client/client.go +++ b/http-client/client.go @@ -2,9 +2,11 @@ package main import ( "bytes" + "crypto/rsa" "crypto/sha256" "encoding/base64" "encoding/json" + "errors" "fmt" "fyne.io/fyne/v2/data/binding" "io" @@ -57,28 +59,71 @@ func signData(data []byte) string { return fmt.Sprintf("%s.%s", data64, signature) } -func makeRequest(request Request, apiMethod string) (*http.Response, error) { - req, _ := json.Marshal(request) - signedRequest := signData(req) +func makeRequest(request Request, apiMethod string, key *rsa.PublicKey) (*http.Response, error) { + signedRequest, err := signRequest(request, key) + if err != nil { + return nil, err + } reader := bytes.NewReader([]byte(signedRequest)) return http.Post(URL+"/"+apiMethod, "application/json", reader) } -func sendMessage(user UserData, message string) { +func sendMessage(user UserData, message string, key *rsa.PublicKey) { // TODO(andrew): Добавить отображение ошибки в интерфейс _, _ = makeRequest(Request{ User: user.Username, Data: message, - }, SendMessage) + }, SendMessage, key) +} + +func register(user UserData, serverKey string, key *rsa.PublicKey) (Response, error) { + var resp Response + httpResp, err := makeRequest(Request{ + User: user.Username, + Data: serverKey, + }, Register, key) + if err != nil { + return resp, err + } + + body, _ := io.ReadAll(httpResp.Body) + _ = json.Unmarshal(body, &resp) + + if httpResp.StatusCode == http.StatusOK { + return resp, nil + } else { + return resp, errors.New(resp.Message) + } +} + +func tryAuth(user UserData, key *rsa.PublicKey) (bool, error) { + var resp Response + httpResp, err := makeRequest(Request{ + User: user.Username, + Data: "auth", + }, TryAuth, key) + if err != nil { + return false, err + } + + body, _ := io.ReadAll(httpResp.Body) + _ = json.Unmarshal(body, &resp) + + if httpResp.StatusCode == http.StatusOK { + return true, nil + } else { + return false, errors.New(resp.Message) + } } func runClient(user UserData) { lastPoll := time.Now().UnixNano() + key, _ := parseKey(user.UserKey) for { httpResp, _ := makeRequest(Request{ User: user.Username, Data: fmt.Sprint(lastPoll), - }, PollMessages) + }, PollMessages, key) lastPoll = time.Now().UnixNano() if httpResp.StatusCode == http.StatusOK { |