diff --git a/db/integrations/strava/strava.go b/db/integrations/strava/strava.go index 17ab130c..f41bbd6a 100644 --- a/db/integrations/strava/strava.go +++ b/db/integrations/strava/strava.go @@ -52,10 +52,15 @@ func SyncStrava(app core.App) error { return err } + decryptedRefreshToken, err := security.Decrypt(stravaIntegration.RefreshToken, encryptionKey) + if err != nil { + return err + } + request := RefreshTokenRequest{ ClientID: stravaIntegration.ClientID, ClientSecret: string(decryptedSecret), - RefreshToken: stravaIntegration.RefreshToken, + RefreshToken: string(decryptedRefreshToken), GrantType: "refresh_token", } r, err := GetStravaToken(request) diff --git a/db/main.go b/db/main.go index 81cf9c98..8d6f31d9 100644 --- a/db/main.go +++ b/db/main.go @@ -9,6 +9,7 @@ import ( "os" "strconv" "strings" + "time" "github.com/meilisearch/meilisearch-go" "github.com/pocketbase/dbx" @@ -97,9 +98,9 @@ func setupEventHandlers(app *pocketbase.PocketBase, client meilisearch.ServiceMa app.OnRecordAfterCreateSuccess("comments").BindFunc(createCommentHandler()) app.OnRecordsListRequest("integrations").BindFunc(listIntegrationHandler()) - app.OnRecordCreateRequest("integrations").BindFunc(createIntegrationHandler()) + app.OnRecordCreate("integrations").BindFunc(createIntegrationHandler()) app.OnRecordAfterCreateSuccess("integrations").BindFunc(createUpdateIntegrationSuccessHandler()) - app.OnRecordUpdateRequest("integrations").BindFunc(updateIntegrationHandler()) + app.OnRecordUpdate("integrations").BindFunc(updateIntegrationHandler()) app.OnRecordAfterUpdateSuccess("integrations").BindFunc(createUpdateIntegrationSuccessHandler()) app.OnRecordRequestEmailChangeRequest("users").BindFunc(changeUserEmailHandler()) @@ -197,10 +198,17 @@ func updateTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordEv func deleteTrailHandler(client meilisearch.ServiceManager) func(e *core.RecordEvent) error { return func(e *core.RecordEvent) error { record := e.Record - _, err := client.Index("trails").DeleteDocument(record.Id) + task, err := client.Index("trails").DeleteDocument(record.Id) if err != nil { return err } + + interval := 500 * time.Millisecond + _, err = client.WaitForTask(task.TaskUID, interval) + if err != nil { + log.Fatalf("Error waiting for task completion: %v", err) + } + return e.Next() } } @@ -440,8 +448,8 @@ func listIntegrationHandler() func(e *core.RecordsListRequestEvent) error { } } -func createIntegrationHandler() func(e *core.RecordRequestEvent) error { - return func(e *core.RecordRequestEvent) error { +func createIntegrationHandler() func(e *core.RecordEvent) error { + return func(e *core.RecordEvent) error { err := encryptIntegrationSecrets(e.App, e.Record) if err != nil { return err @@ -461,8 +469,8 @@ func createUpdateIntegrationSuccessHandler() func(e *core.RecordEvent) error { } } -func updateIntegrationHandler() func(e *core.RecordRequestEvent) error { - return func(e *core.RecordRequestEvent) error { +func updateIntegrationHandler() func(e *core.RecordEvent) error { + return func(e *core.RecordEvent) error { err := encryptIntegrationSecrets(e.App, e.Record) if err != nil { return err diff --git a/db/util/secrets.go b/db/util/secrets.go index f45c8b51..7191dcc0 100644 --- a/db/util/secrets.go +++ b/db/util/secrets.go @@ -43,11 +43,33 @@ func CanDecryptSecret(ciphertext string) bool { return false } - decryptedSecret, err := security.Decrypt(ciphertext, encryptionKey) - - if len(decryptedSecret) > 0 && err == nil { - return true + // Decode Base64 first + cipherBytes, err := base64.StdEncoding.DecodeString(ciphertext) + if err != nil { + return false // Not a valid Base64 string } - return false + // Get nonce size from encryption parameters + block, err := aes.NewCipher([]byte(encryptionKey)) + if err != nil { + return false + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return false + } + + nonceSize := gcm.NonceSize() + + // Ensure decoded cipherBytes is long enough to contain a nonce + if len(cipherBytes) < nonceSize { + return false + } + + // Try to decrypt (only now) + decryptedSecret, err := security.Decrypt(ciphertext, encryptionKey) + + // Check if decryption was successful + return err == nil && len(decryptedSecret) > 0 }