diff --git a/Projs/PD2/internal/client/client.go b/Projs/PD2/internal/client/client.go index e176a2f..66f242f 100644 --- a/Projs/PD2/internal/client/client.go +++ b/Projs/PD2/internal/client/client.go @@ -36,7 +36,7 @@ func Run() { log.Fatalln(err) } - token = cryptoUtils.GetUserToken() + token = cryptoUtils.GetUserToken() command := flag.Arg(0) switch command { @@ -79,7 +79,7 @@ func Run() { if err != nil { log.Fatalln(err) } - showMessagesInfo(page, pageSize, listClientMessageInfo) + showMessagesInfo(page, pageSize, listClientMessageInfo) case "getmsg": if flag.NArg() < 2 { @@ -97,7 +97,39 @@ func Run() { printError(err.Error()) } showMessage(msg) + case "register": + // call register + if flag.NArg() > 3 { + printError("MSG SERVICE: command error!") + showHelp() + os.Exit(1) + } + userId := flag.Arg(1) + password := flag.Arg(2) + if userId == "" || password == "" { + printError("MSG SERVICE: command error!") + showHelp() + os.Exit(1) + } + err := registerUser(userId, password, clientKeyStore) + if err != nil { + printError(err.Error()) + } + // TODO: print register successful + case "login": + if flag.NArg() > 3 { + printError("MSG SERVICE: command error!") + showHelp() + os.Exit(1) + } + userId := flag.Arg(1) + password := flag.Arg(2) + err := login(userId,password,clientKeyStore) + if err != nil { + printError(err.Error()) + } + // TODO: print logged in case "help": showHelp() @@ -105,7 +137,6 @@ func Run() { printError("MSG SERVICE: command error!") showHelp() } - } func getHTTPClient(tlsConfig *tls.Config) *http.Client { @@ -113,6 +144,104 @@ func getHTTPClient(tlsConfig *tls.Config) *http.Client { return &http.Client{Transport: transport} } +func registerUser(userId string, password string, clientKeyStore cryptoUtils.KeyStore) error { + postRegister := protocol.NewPostRegister(userId, password, clientKeyStore.GetCert().Raw) + + jsonData, err := json.Marshal(postRegister) + if err != nil { + return err + } + + client := getHTTPClient(clientKeyStore.GetClientTLSConfig()) + + parsedURL, err := url.Parse(baseURL) + if err != nil { + return err + } + parsedURL.JoinPath("register") + + req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewBuffer(jsonData)) + if err != nil { + return fmt.Errorf("error creating request: %v", err) + } + + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("error making request: %v", err) + } + defer resp.Body.Close() + + // Read response + responseBody, err := io.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("error reading response body: %v", err) + } + + if resp.StatusCode != http.StatusOK { + var reportError protocol.ReportError + if err := json.Unmarshal(responseBody, &reportError); err != nil { + return err + } + return errors.New(reportError.ErrorMessage) + } + + return nil +} + +type Token struct { + Value string `json:"token"` +} + +func login(userId string, password string, clientKeyStore cryptoUtils.KeyStore) error { + postLogin := protocol.NewPostLogin(userId, password) + + jsonData, err := json.Marshal(postLogin) + if err != nil { + return err + } + + client := getHTTPClient(clientKeyStore.GetClientTLSConfig()) + + parsedURL, err := url.Parse(baseURL) + if err != nil { + return err + } + parsedURL.JoinPath("Login") + + req, err := http.NewRequest("POST", parsedURL.String(), bytes.NewBuffer(jsonData)) + if err != nil { + return fmt.Errorf("error creating request: %v", err) + } + + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("error making request: %v", err) + } + defer resp.Body.Close() + + // Read response + responseBody, err := io.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("error reading response body: %v", err) + } + + if resp.StatusCode != http.StatusOK { + var reportError protocol.ReportError + if err := json.Unmarshal(responseBody, &reportError); err != nil { + return err + } + return errors.New(reportError.ErrorMessage) + } + var token Token + err = json.Unmarshal(responseBody,token) + if err != nil { + return err + } + // TODO: persist token to disk + + return nil +} + func sendCommand(clientKeyStore cryptoUtils.KeyStore, plainSubject, plainBody, uid string) error { //Turn content to bytes plainSubjectBytes, err := Marshal(plainSubject) @@ -171,7 +300,7 @@ func sendCommand(clientKeyStore cryptoUtils.KeyStore, plainSubject, plainBody, u return fmt.Errorf("error reading response body: %v", err) } - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { var reportError protocol.ReportError if err := json.Unmarshal(responseBody, &reportError); err != nil { return err @@ -219,7 +348,7 @@ func getMsgCommand(clientKeyStore cryptoUtils.KeyStore, num int) (ClientMessage, return ClientMessage{}, fmt.Errorf("error reading response body: %v", err) } - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { var reportError protocol.ReportError if err := json.Unmarshal(body, &reportError); err != nil { return ClientMessage{}, err @@ -293,7 +422,7 @@ func getUserCert(keyStore cryptoUtils.KeyStore, uid string) (*x509.Certificate, return nil, fmt.Errorf("error reading response body: %v", err) } - if resp.StatusCode == 200 { + if resp.StatusCode == http.StatusOK { var answerGetUserCert protocol.AnswerGetUserCert if err := json.Unmarshal(body, &answerGetUserCert); err != nil { return nil, err @@ -352,7 +481,7 @@ func getUnreadMessagesInfo(keyStore cryptoUtils.KeyStore, page int, pageSize int return protocol.AnswerGetUnreadMsgsInfo{}, nil, fmt.Errorf("error reading response body: %v", err) } - if resp.StatusCode == 200 { + if resp.StatusCode == http.StatusOK { //Create Set of needed certificates var answerGetUnreadMsgsInfo protocol.AnswerGetUnreadMsgsInfo if err := json.Unmarshal(body, &answerGetUnreadMsgsInfo); err != nil {