client side login and register almost done

This commit is contained in:
Tiago Sousa 2024-05-31 00:18:25 +01:00
parent 78031d8e70
commit 46cf748651
Signed by: tiago
SSH key fingerprint: SHA256:rOmjD81ZIhKdCkFWS9UIKdBi4UByF5x3hRH/0YeXsPI

View file

@ -36,7 +36,7 @@ func Run() {
log.Fatalln(err) log.Fatalln(err)
} }
token = cryptoUtils.GetUserToken() token = cryptoUtils.GetUserToken()
command := flag.Arg(0) command := flag.Arg(0)
switch command { switch command {
@ -79,7 +79,7 @@ func Run() {
if err != nil { if err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
showMessagesInfo(page, pageSize, listClientMessageInfo) showMessagesInfo(page, pageSize, listClientMessageInfo)
case "getmsg": case "getmsg":
if flag.NArg() < 2 { if flag.NArg() < 2 {
@ -97,7 +97,39 @@ func Run() {
printError(err.Error()) printError(err.Error())
} }
showMessage(msg) 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": case "help":
showHelp() showHelp()
@ -105,7 +137,6 @@ func Run() {
printError("MSG SERVICE: command error!") printError("MSG SERVICE: command error!")
showHelp() showHelp()
} }
} }
func getHTTPClient(tlsConfig *tls.Config) *http.Client { func getHTTPClient(tlsConfig *tls.Config) *http.Client {
@ -113,6 +144,104 @@ func getHTTPClient(tlsConfig *tls.Config) *http.Client {
return &http.Client{Transport: transport} 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 { func sendCommand(clientKeyStore cryptoUtils.KeyStore, plainSubject, plainBody, uid string) error {
//Turn content to bytes //Turn content to bytes
plainSubjectBytes, err := Marshal(plainSubject) 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) return fmt.Errorf("error reading response body: %v", err)
} }
if resp.StatusCode != 200 { if resp.StatusCode != http.StatusOK {
var reportError protocol.ReportError var reportError protocol.ReportError
if err := json.Unmarshal(responseBody, &reportError); err != nil { if err := json.Unmarshal(responseBody, &reportError); err != nil {
return err return err
@ -219,7 +348,7 @@ func getMsgCommand(clientKeyStore cryptoUtils.KeyStore, num int) (ClientMessage,
return ClientMessage{}, fmt.Errorf("error reading response body: %v", err) return ClientMessage{}, fmt.Errorf("error reading response body: %v", err)
} }
if resp.StatusCode != 200 { if resp.StatusCode != http.StatusOK {
var reportError protocol.ReportError var reportError protocol.ReportError
if err := json.Unmarshal(body, &reportError); err != nil { if err := json.Unmarshal(body, &reportError); err != nil {
return ClientMessage{}, err 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) return nil, fmt.Errorf("error reading response body: %v", err)
} }
if resp.StatusCode == 200 { if resp.StatusCode == http.StatusOK {
var answerGetUserCert protocol.AnswerGetUserCert var answerGetUserCert protocol.AnswerGetUserCert
if err := json.Unmarshal(body, &answerGetUserCert); err != nil { if err := json.Unmarshal(body, &answerGetUserCert); err != nil {
return nil, err 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) 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 //Create Set of needed certificates
var answerGetUnreadMsgsInfo protocol.AnswerGetUnreadMsgsInfo var answerGetUnreadMsgsInfo protocol.AnswerGetUnreadMsgsInfo
if err := json.Unmarshal(body, &answerGetUnreadMsgsInfo); err != nil { if err := json.Unmarshal(body, &answerGetUnreadMsgsInfo); err != nil {