summaryrefslogtreecommitdiff
path: root/http-client/client.go
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2021-04-28 20:31:16 +0400
committerAndrew <saintruler@gmail.com>2021-04-28 20:31:16 +0400
commit8ebbdab5079f803567297af842c87ce012b7ea11 (patch)
treeffe28a45797dab60b036eb05e419532cae329171 /http-client/client.go
parent7d6270f64b1dc00d91230b5c793bc49991f0fcf8 (diff)
Added cryptography functions and completed client and server.
Diffstat (limited to 'http-client/client.go')
-rw-r--r--http-client/client.go57
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 {