diff --git a/packages/convertions/convertions.go b/packages/convertions/convertions.go index 5320c1d..a1f3856 100644 --- a/packages/convertions/convertions.go +++ b/packages/convertions/convertions.go @@ -11,12 +11,12 @@ import ( "github.com/google/uuid" ) -func ConvertStringUint32(s string) (uint32, error) { +func StringToUint32(s string) (uint32, error) { v, err := strconv.ParseUint(s, 10, 32) return uint32(v), err } -func ConvertStringToRgba(str string) (*types.Rgba, error) { +func StringToRgba(str string) (*types.Rgba, error) { parts := strings.SplitN(str, ",", 5) if len(parts) != 4 { return nil, fmt.Errorf("invalid rgba") diff --git a/packages/http/httpConnectionAndDm.go b/packages/http/connectionsAndDms.go similarity index 88% rename from packages/http/httpConnectionAndDm.go rename to packages/http/connectionsAndDms.go index 4e7ccac..2db8d16 100644 --- a/packages/http/httpConnectionAndDm.go +++ b/packages/http/connectionsAndDms.go @@ -20,12 +20,12 @@ import ( ) func HandleDm(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return @@ -51,9 +51,9 @@ func HandleDm(response http.ResponseWriter, request *http.Request) { var target *types.User if user.Id == conn.RequestorId { - target, err = GetUserById(ctx, conn.RecipientId) + target, err = getUserById(ctx, conn.RecipientId) } else if user.Id == conn.RecipientId { - target, err = GetUserById(ctx, conn.RequestorId) + target, err = getUserById(ctx, conn.RequestorId) } else { http.Error(response, "invalid connectionid", http.StatusBadRequest) return @@ -86,11 +86,11 @@ func HandleDm(response http.ResponseWriter, request *http.Request) { } func HandleUserGetConnectionMessages(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return @@ -107,7 +107,7 @@ func HandleUserGetConnectionMessages(response http.ResponseWriter, request *http before = time.Now() } - messagesCap, err := convertions.ConvertStringUint32(request.FormValue("messages")) + messagesCap, err := convertions.StringToUint32(request.FormValue("messages")) if err != nil { messagesCap = globals.MaxDirectMsgCache } @@ -162,11 +162,11 @@ func HandleUserGetConnectionMessages(response http.ResponseWriter, request *http } func HandleUserNewConnection(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - requestor, err := GetUserByToken(ctx, request.FormValue("token")) + requestor, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return @@ -176,7 +176,7 @@ func HandleUserNewConnection(response http.ResponseWriter, request *http.Request http.Error(response, "no such user", http.StatusUnauthorized) return } - recipient, err := GetUserById(ctx, recipientId) + recipient, err := getUserById(ctx, recipientId) if err != nil { http.Error(response, "no such user", http.StatusUnauthorized) return @@ -221,12 +221,12 @@ func HandleUserNewConnection(response http.ResponseWriter, request *http.Request } func HandleUserDeleteConnection(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return @@ -246,14 +246,14 @@ func HandleUserDeleteConnection(response http.ResponseWriter, request *http.Requ var user2 *types.User if conn.RequestorId == user.Id { - recipient, err := GetUserById(ctx, conn.RecipientId) + recipient, err := getUserById(ctx, conn.RecipientId) if err != nil { http.Error(response, "internal server error", http.StatusInternalServerError) return } user2 = recipient } else if conn.RecipientId == user.Id { - requestor, err := GetUserById(ctx, conn.RequestorId) + requestor, err := getUserById(ctx, conn.RequestorId) if err != nil { http.Error(response, "internal server error", http.StatusInternalServerError) return @@ -280,11 +280,11 @@ func HandleUserDeleteConnection(response http.ResponseWriter, request *http.Requ } func HandleUserElevateConnection(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return @@ -324,9 +324,9 @@ func HandleUserElevateConnection(response http.ResponseWriter, request *http.Req var user2 *types.User if conn.RequestorId == user.Id { - user2, err = GetUserById(ctx, conn.RecipientId) + user2, err = getUserById(ctx, conn.RecipientId) } else { - user2, err = GetUserById(ctx, conn.RequestorId) + user2, err = getUserById(ctx, conn.RequestorId) } if err != nil { http.Error(response, "internal server error", http.StatusInternalServerError) @@ -349,11 +349,11 @@ func HandleUserElevateConnection(response http.ResponseWriter, request *http.Req } func HandleUserGetConnections(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return diff --git a/packages/http/file.go b/packages/http/file.go new file mode 100644 index 0000000..b3dfd61 --- /dev/null +++ b/packages/http/file.go @@ -0,0 +1,32 @@ +package http + +import ( + "net/http" + + "go-socket/packages/convertions" +) + +func HandleFileUpload(response http.ResponseWriter, request *http.Request) { + if !postValidCheckWithResponseOnFail(&response, request, true) { + return + } + ctx := request.Context() + + user, err := getUserByToken(ctx, request.Header.Get("token")) + if err != nil { + http.Error(response, "invalid token", http.StatusUnauthorized) + return + } + + connectionId, err := convertions.ConvertStringUuid(request.FormValue("connectionid")) + if err != nil { + http.Error(response, "invalid connectionid", http.StatusBadRequest) + return + } + _, ok := user.Connections[connectionId] + if !ok { + http.Error(response, "no such connection", http.StatusUnauthorized) + return + } + +} diff --git a/packages/http/get.go b/packages/http/get.go index 951fc83..4da0ffe 100644 --- a/packages/http/get.go +++ b/packages/http/get.go @@ -11,7 +11,7 @@ import ( "github.com/google/uuid" ) -func GetUserById(ctx context.Context, userId uuid.UUID) (*types.User, error) { +func getUserById(ctx context.Context, userId uuid.UUID) (*types.User, error) { user, err := cache.CacheGetUserById(userId) if err != nil { user = &types.User{Id: userId} @@ -24,10 +24,10 @@ func GetUserById(ctx context.Context, userId uuid.UUID) (*types.User, error) { return user, nil } -func GetUserByToken(ctx context.Context, token string) (*types.User, error) { +func getUserByToken(ctx context.Context, token string) (*types.User, error) { userId, err := tokens.TokenValidateGetId(token) if err != nil { return nil, err } - return GetUserById(ctx, userId) + return getUserById(ctx, userId) } diff --git a/packages/http/helper.go b/packages/http/helper.go index 3101a6d..1eea783 100644 --- a/packages/http/helper.go +++ b/packages/http/helper.go @@ -2,15 +2,19 @@ package http import ( "net/http" + + "go-socket/packages/globals" ) -func postValidCheckWithResponseOnFail(response *http.ResponseWriter, request *http.Request) bool { +func postValidCheckWithResponseOnFail(response *http.ResponseWriter, request *http.Request, withFile bool) bool { if request.Method != http.MethodPost { http.Error(*response, "POST only", http.StatusMethodNotAllowed) return false } - if request.ContentLength > 8192 { + if withFile && request.ContentLength > int64(globals.MaxPostWithFileBytes) || + !withFile && request.ContentLength > int64(globals.MaxPostBytes) { http.Error(*response, "Request too large", http.StatusRequestEntityTooLarge) + return false } return true diff --git a/packages/http/httpUser.go b/packages/http/user.go similarity index 89% rename from packages/http/httpUser.go rename to packages/http/user.go index f9302c0..6795b3f 100644 --- a/packages/http/httpUser.go +++ b/packages/http/user.go @@ -16,7 +16,7 @@ import ( ) func HandleUserNewToken(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } @@ -75,7 +75,7 @@ func HandleUserNewToken(response http.ResponseWriter, request *http.Request) { } func HandleUserNew(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } @@ -116,7 +116,7 @@ func HandleUserNew(response http.ResponseWriter, request *http.Request) { } func HandleUserDelete(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() @@ -139,18 +139,18 @@ func HandleUserDelete(response http.ResponseWriter, request *http.Request) { // HandleUserModifyAppearance currently just color func HandleUserModifyAppearance(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return } - color, err := convertions.ConvertStringToRgba(request.FormValue("color")) + color, err := convertions.StringToRgba(request.FormValue("color")) if err != nil { http.Error(response, "invalid color", http.StatusBadRequest) return @@ -166,12 +166,12 @@ func HandleUserModifyAppearance(response http.ResponseWriter, request *http.Requ // HandleUserModifyAbout currently just pronouns func HandleUserModifyAbout(response http.ResponseWriter, request *http.Request) { - if !postValidCheckWithResponseOnFail(&response, request) { + if !postValidCheckWithResponseOnFail(&response, request, false) { return } ctx := request.Context() - user, err := GetUserByToken(ctx, request.FormValue("token")) + user, err := getUserByToken(ctx, request.FormValue("token")) if err != nil { http.Error(response, "invalid token", http.StatusUnauthorized) return diff --git a/packages/minio/minio.go b/packages/minio/minio.go index 028f1f8..6396dba 100644 --- a/packages/minio/minio.go +++ b/packages/minio/minio.go @@ -8,6 +8,7 @@ import ( "go-socket/packages/globals" + "github.com/google/uuid" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) @@ -64,12 +65,15 @@ func MinInit() { } -func upload(ctx context.Context, key string, body io.Reader, size int64, contentType string) error { +func upload(ctx context.Context, key string, body io.Reader, size int64, contentType string, uploader uuid.UUID) error { _, err := minClient.PutObject(ctx, globals.FileStorageBucketName, key, body, size, minio.PutObjectOptions{ ContentType: contentType, PartSize: globals.FileProcessingPartSize, NumThreads: globals.FileProcessingThreads, + UserMetadata: map[string]string{ + "uploader": uploader.String(), + }, }) return err }