| @ -0,0 +1,87 @@ | |||
| package Friends | |||
| import ( | |||
| "encoding/json" | |||
| "io/ioutil" | |||
| "net/http" | |||
| "time" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Database" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Models" | |||
| ) | |||
| // CreateFriendRequest creates a FriendRequest from post data | |||
| func CreateFriendRequest(w http.ResponseWriter, r *http.Request) { | |||
| var ( | |||
| friendRequest Models.FriendRequest | |||
| requestBody []byte | |||
| returnJSON []byte | |||
| err error | |||
| ) | |||
| requestBody, err = ioutil.ReadAll(r.Body) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| err = json.Unmarshal(requestBody, &friendRequest) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| friendRequest.AcceptedAt.Scan(nil) | |||
| err = Database.CreateFriendRequest(&friendRequest) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| returnJSON, err = json.MarshalIndent(friendRequest, "", " ") | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| // Return updated json | |||
| w.WriteHeader(http.StatusOK) | |||
| w.Write(returnJSON) | |||
| } | |||
| // CreateFriendRequestQrCode creates a FriendRequest from post data from qr code scan | |||
| func CreateFriendRequestQrCode(w http.ResponseWriter, r *http.Request) { | |||
| var ( | |||
| friendRequests []Models.FriendRequest | |||
| requestBody []byte | |||
| i int | |||
| err error | |||
| ) | |||
| requestBody, err = ioutil.ReadAll(r.Body) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| err = json.Unmarshal(requestBody, &friendRequests) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| for i = range friendRequests { | |||
| friendRequests[i].AcceptedAt.Time = time.Now() | |||
| friendRequests[i].AcceptedAt.Valid = true | |||
| } | |||
| err = Database.CreateFriendRequests(&friendRequests) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| // Return updated json | |||
| w.WriteHeader(http.StatusOK) | |||
| } | |||
| @ -1,41 +0,0 @@ | |||
| package Friends | |||
| import ( | |||
| "encoding/json" | |||
| "net/http" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Api/Auth" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Database" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Models" | |||
| ) | |||
| // FriendRequestList gets friend request list | |||
| func FriendRequestList(w http.ResponseWriter, r *http.Request) { | |||
| var ( | |||
| userSession Models.Session | |||
| friends []Models.FriendRequest | |||
| returnJSON []byte | |||
| err error | |||
| ) | |||
| userSession, err = Auth.CheckCookie(r) | |||
| if err != nil { | |||
| http.Error(w, "Forbidden", http.StatusUnauthorized) | |||
| return | |||
| } | |||
| friends, err = Database.GetFriendRequestsByUserID(userSession.UserID.String()) | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| returnJSON, err = json.MarshalIndent(friends, "", " ") | |||
| if err != nil { | |||
| http.Error(w, "Error", http.StatusInternalServerError) | |||
| return | |||
| } | |||
| w.WriteHeader(http.StatusOK) | |||
| w.Write(returnJSON) | |||
| } | |||
| @ -0,0 +1,124 @@ | |||
| package Friends_test | |||
| import ( | |||
| "encoding/base64" | |||
| "encoding/json" | |||
| "fmt" | |||
| "io/ioutil" | |||
| "net/http" | |||
| "testing" | |||
| "time" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Database" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Database/Seeder" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Models" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Tests" | |||
| ) | |||
| func Test_FriendRequestList(t *testing.T) { | |||
| client, ts, err := Tests.InitTestEnv() | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| u, err := Database.GetUserByUsername("test") | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| for i := 0; i < 30; i++ { | |||
| u2, err := Tests.InitTestCreateUser(fmt.Sprintf("test%d", i)) | |||
| decodedPublicKey := Seeder.GetPubKey() | |||
| key, err := Seeder.GenerateAesKey() | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| encPublicKey, err := key.AesEncrypt([]byte(Seeder.PublicKey)) | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| friendReq := Models.FriendRequest{ | |||
| UserID: u.ID, | |||
| FriendID: base64.StdEncoding.EncodeToString( | |||
| Seeder.EncryptWithPublicKey( | |||
| []byte(u2.ID.String()), | |||
| decodedPublicKey, | |||
| ), | |||
| ), | |||
| FriendUsername: base64.StdEncoding.EncodeToString( | |||
| Seeder.EncryptWithPublicKey( | |||
| []byte(u2.Username), | |||
| decodedPublicKey, | |||
| ), | |||
| ), | |||
| FriendPublicAsymmetricKey: base64.StdEncoding.EncodeToString( | |||
| encPublicKey, | |||
| ), | |||
| SymmetricKey: base64.StdEncoding.EncodeToString( | |||
| Seeder.EncryptWithPublicKey(key.Key, decodedPublicKey), | |||
| ), | |||
| } | |||
| if i > 20 { | |||
| friendReq.AcceptedAt.Time = time.Now() | |||
| friendReq.AcceptedAt.Valid = true | |||
| } | |||
| err = Database.CreateFriendRequest(&friendReq) | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| } | |||
| req, _ := http.NewRequest("GET", ts.URL+"/api/v1/auth/friend_requests", nil) | |||
| resp, err := client.Do(req) | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| if resp.StatusCode != http.StatusOK { | |||
| t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode) | |||
| return | |||
| } | |||
| requestBody, err := ioutil.ReadAll(resp.Body) | |||
| if err != nil { | |||
| t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode) | |||
| return | |||
| } | |||
| var users []Models.FriendRequest | |||
| json.Unmarshal(requestBody, &users) | |||
| if len(users) != 20 { | |||
| t.Errorf("Expected %d, recieved %d", 1, len(users)) | |||
| return | |||
| } | |||
| for i := 0; i < 20; i++ { | |||
| eq := true | |||
| if i > 8 { | |||
| eq = false | |||
| } | |||
| if users[i].AcceptedAt.Valid != eq { | |||
| t.Errorf( | |||
| "Expected %v, recieved %v, on user %d", | |||
| eq, users[i].AcceptedAt.Valid, | |||
| i, | |||
| ) | |||
| return | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,106 @@ | |||
| package Users_test | |||
| import ( | |||
| "encoding/json" | |||
| "fmt" | |||
| "io/ioutil" | |||
| "net/http" | |||
| "testing" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Models" | |||
| "git.tovijaeschke.xyz/tovi/Capsule/Backend/Tests" | |||
| ) | |||
| func Test_SearchUsers(t *testing.T) { | |||
| client, ts, err := Tests.InitTestEnv() | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| u2, err := Tests.InitTestCreateUser("abcd") | |||
| req, _ := http.NewRequest( | |||
| "GET", | |||
| fmt.Sprintf("%s/api/v1/auth/users?username=%s", ts.URL, u2.Username), | |||
| nil, | |||
| ) | |||
| resp, err := client.Do(req) | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| if resp.StatusCode != http.StatusOK { | |||
| t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode) | |||
| return | |||
| } | |||
| requestBody, err := ioutil.ReadAll(resp.Body) | |||
| if err != nil { | |||
| t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode) | |||
| return | |||
| } | |||
| var user Models.User | |||
| json.Unmarshal(requestBody, &user) | |||
| if user.Username != "abcd" { | |||
| t.Errorf("Expected abcd, recieved %s", user.Username) | |||
| return | |||
| } | |||
| if user.Password != "" { | |||
| t.Errorf("Expected \"\", recieved %s", user.Password) | |||
| return | |||
| } | |||
| if user.AsymmetricPrivateKey != "" { | |||
| t.Errorf("Expected \"\", recieved %s", user.AsymmetricPrivateKey) | |||
| return | |||
| } | |||
| } | |||
| func Test_SearchUsersPartialMatchFails(t *testing.T) { | |||
| client, ts, err := Tests.InitTestEnv() | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| _, err = Tests.InitTestCreateUser("abcd") | |||
| req, _ := http.NewRequest( | |||
| "GET", | |||
| fmt.Sprintf("%s/api/v1/auth/users?username=%s", ts.URL, "abc"), | |||
| nil, | |||
| ) | |||
| resp, err := client.Do(req) | |||
| if err != nil { | |||
| t.Errorf("Expected nil, recieved %s", err.Error()) | |||
| return | |||
| } | |||
| if resp.StatusCode != http.StatusNotFound { | |||
| t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode) | |||
| return | |||
| } | |||
| requestBody, err := ioutil.ReadAll(resp.Body) | |||
| if err != nil { | |||
| t.Errorf("Expected %d, recieved %d", http.StatusOK, resp.StatusCode) | |||
| return | |||
| } | |||
| var user interface{} | |||
| json.Unmarshal(requestBody, &user) | |||
| if user != nil { | |||
| t.Errorf("Expected nil, recieved %+v", user) | |||
| return | |||
| } | |||
| } | |||