From d901618ad739e1f6cf5027226aa23d3983bdd2e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Dry=C5=9B?= Date: Fri, 30 Jan 2026 11:33:10 +0100 Subject: [PATCH 1/6] chore: fix more lint warnings --- .golangci.yml | 42 +++++----- cmd/migrate/main.go | 9 +-- .../browser_extension_2fa_request_test.go | 81 +++++++++++++++---- .../browser_extension_2fa_test.go | 30 +++++-- .../browser_extension_pairing_test.go | 16 +++- .../browser_extension_test.go | 5 +- e2e-tests/helpers.go | 15 +++- e2e-tests/icons/icons_requests_test.go | 5 +- e2e-tests/icons/web_services_dump_test.go | 9 ++- ..._extension_2fa_request_mysql_repository.go | 4 +- ...wser_extension_devices_mysql_repository.go | 2 +- .../remove_all_extension_paired_devices.go | 2 +- .../app/command/remove_browser_extension.go | 2 +- .../app/command/request_2fa_token.go | 71 ++++++++-------- internal/api/browser_extension/ports/http.go | 2 +- .../icons_collection_gorm_repository.go | 12 +-- ...s_collections_relations_gorm_repository.go | 6 +- .../icons/adapters/icons_gorm_repository.go | 12 +-- .../icons_relations_gorm_repository.go | 6 +- internal/api/icons/service/service.go | 2 +- internal/common/crypto/prng.go | 2 +- 21 files changed, 216 insertions(+), 119 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 9014132..d7f8940 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -29,27 +29,27 @@ linters: - gocheckcompilerdirectives - gochecknoinits - gochecksumtype -# - gocognit -# - goconst -# - gocritic -# - gocyclo -# - godot -# - gomoddirectives -# - gomodguard -# - goprintffuncname -# - gosec -# - gosmopolitan -# - govet -# - grouper -# - importas -# - inamedparam -# - ineffassign -# - interfacebloat -# - lll -# - loggercheck -# - maintidx -# - makezero -# - mirror + - gocognit + - goconst + - gocritic + - gocyclo + - godot + - gomoddirectives + - gomodguard + - goprintffuncname + - gosec + - gosmopolitan + - govet + - grouper + - importas + - inamedparam + - ineffassign + - interfacebloat + - lll + - loggercheck + - maintidx + - makezero + - mirror # - misspell # - musttag # - nakedret diff --git a/cmd/migrate/main.go b/cmd/migrate/main.go index 2b826ce..80daee8 100644 --- a/cmd/migrate/main.go +++ b/cmd/migrate/main.go @@ -50,16 +50,15 @@ func main() { config.LoadConfiguration() - appDb := db.NewDbConnection(config.Config) - - defer appDb.Close() - if err := goose.SetDialect(dialect); err != nil { log.Fatal(err) } + appDb := db.NewDbConnection(config.Config) + defer appDb.Close() + if err := goose.Run(command, appDb, *dir, args[1:]...); err != nil { - log.Fatalf("migrate run: %v", err) + log.Fatalf("migrate run: %v", err) // nolint:gocritic } } diff --git a/e2e-tests/browser_extension/browser_extension_2fa_request_test.go b/e2e-tests/browser_extension/browser_extension_2fa_request_test.go index 7d21543..1026d10 100644 --- a/e2e-tests/browser_extension/browser_extension_2fa_request_test.go +++ b/e2e-tests/browser_extension/browser_extension_2fa_request_test.go @@ -28,12 +28,17 @@ func (s *BrowserExtensionTwoFactorAuthTestSuite) TestRequest2FaToken() { var tokenRequest *e2e_tests.AuthTokenRequestResponse request2FaTokenPayload := []byte(`{"domain":"https://facebook.com/path/nested"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", request2FaTokenPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + request2FaTokenPayload, + &tokenRequest) s.Equal(browserExtension.Id, tokenRequest.ExtensionId) var tokenRequestById *e2e_tests.AuthTokenRequestResponse - e2e_tests.DoAPISuccessGet(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, &tokenRequestById) + e2e_tests.DoAPISuccessGet(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, + &tokenRequestById) s.Equal(tokenRequest.Id, tokenRequestById.Id) s.Equal("https://facebook.com", tokenRequestById.Domain) } @@ -42,13 +47,21 @@ func (s *BrowserExtensionTwoFactorAuthTestSuite) TestFindAll2FaRequestsForBrowse browserExtension := e2e_tests.CreateBrowserExtension(s.T(), "go-ext") facebook2FaTokenRequest := []byte(`{"domain":"facebook.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", facebook2FaTokenRequest, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + facebook2FaTokenRequest, + nil) google2FaTokenRequest := []byte(`{"domain":"google.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", google2FaTokenRequest, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + google2FaTokenRequest, + nil) var tokenRequestsCollection []*e2e_tests.AuthTokenRequestResponse - e2e_tests.DoAPISuccessGet(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests", &tokenRequestsCollection) + e2e_tests.DoAPISuccessGet(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests", + &tokenRequestsCollection) s.Len(tokenRequestsCollection, 2) } @@ -57,31 +70,51 @@ func (s *BrowserExtensionTwoFactorAuthTestSuite) TestClose2FaTokenRequest() { var tokenRequest *e2e_tests.AuthTokenRequestResponse browserExtension := e2e_tests.CreateBrowserExtension(s.T(), "go-ext") tokenRequestPayload := []byte(`{"domain":"facebook.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", tokenRequestPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + tokenRequestPayload, + &tokenRequest) closeTokenRequestPayload := []byte(`{"status":"completed"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", closeTokenRequestPayload, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", + closeTokenRequestPayload, + nil) var closedTokenRequest *e2e_tests.AuthTokenRequestResponse - e2e_tests.DoAPISuccessGet(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, &closedTokenRequest) + e2e_tests.DoAPISuccessGet(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, + &closedTokenRequest) s.Equal("completed", closedTokenRequest.Status) } func (s *BrowserExtensionTwoFactorAuthTestSuite) TestCloseNotExisting2FaTokenRequest() { - notExistingTokenRequestId := uuid.New() + notExistingTokenRequestId := uuid.New().String() browserExtension := e2e_tests.CreateBrowserExtension(s.T(), "go-ext") + beID := browserExtension.Id closeTokenRequestPayload := []byte(`{"status":"completed"}`) - e2e_tests.DoAPIPostAndAssertCode(s.T(), 404, "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+notExistingTokenRequestId.String()+"/commands/close_2fa_request", closeTokenRequestPayload, nil) + uri := "browser_extensions/" + beID + "/2fa_requests/" + notExistingTokenRequestId + "/commands/close_2fa_request" + e2e_tests.DoAPIPostAndAssertCode(s.T(), + 404, + uri, + closeTokenRequestPayload, + nil) } func (s *BrowserExtensionTwoFactorAuthTestSuite) TestDoNotReturnClosed2FaRequests() { var tokenRequest *e2e_tests.AuthTokenRequestResponse browserExtension := e2e_tests.CreateBrowserExtension(s.T(), "go-ext") tokenRequestPayload := []byte(`{"domain":"facebook.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", tokenRequestPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + tokenRequestPayload, + &tokenRequest) closeTokenRequestPayload := []byte(`{"status":"completed"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", closeTokenRequestPayload, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", + closeTokenRequestPayload, + nil) var response []*e2e_tests.AuthTokenRequestResponse e2e_tests.DoAPISuccessGet(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests", &response) @@ -92,10 +125,16 @@ func (s *BrowserExtensionTwoFactorAuthTestSuite) TestTerminate2FaRequest() { var tokenRequest *e2e_tests.AuthTokenRequestResponse browserExtension := e2e_tests.CreateBrowserExtension(s.T(), "go-ext") tokenRequestPayload := []byte(`{"domain":"facebook.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", tokenRequestPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + tokenRequestPayload, + &tokenRequest) closeTokenRequestPayload := []byte(`{"status":"terminated"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", closeTokenRequestPayload, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", + closeTokenRequestPayload, + nil) var response *e2e_tests.AuthTokenRequestResponse e2e_tests.DoAPISuccessGet(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, &response) @@ -109,12 +148,20 @@ func (s *BrowserExtensionTwoFactorAuthTestSuite) TestClose2FaRequest() { var tokenRequest *e2e_tests.AuthTokenRequestResponse request2FaTokenPayload := []byte(`{"domain":"domain.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", request2FaTokenPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + request2FaTokenPayload, + &tokenRequest) closeTokenRequestPayload := []byte(`{"status":"completed"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", closeTokenRequestPayload, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", + closeTokenRequestPayload, + nil) var closedTokenRequest *e2e_tests.AuthTokenRequestResponse - e2e_tests.DoAPISuccessGet(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, &closedTokenRequest) + e2e_tests.DoAPISuccessGet(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id, + &closedTokenRequest) s.Equal("completed", closedTokenRequest.Status) } diff --git a/e2e-tests/browser_extension/browser_extension_2fa_test.go b/e2e-tests/browser_extension/browser_extension_2fa_test.go index 711bd54..e46949c 100644 --- a/e2e-tests/browser_extension/browser_extension_2fa_test.go +++ b/e2e-tests/browser_extension/browser_extension_2fa_test.go @@ -41,13 +41,21 @@ func (s *TwoFactorAuthTestSuite) TestBrowserExtensionAuthFullFlow() { tokenRequest := e2e_tests.Request2FaToken(s.T(), "facebook.com", browserExtension.Id) - extensionTokenRequestWebsocketListener := e2e_tests.NewWebsocketTestListener("browser_extensions/" + browserExtension.Id + "/2fa_requests/" + tokenRequest.Id) + extensionTokenRequestWebsocketListener := e2e_tests.NewWebsocketTestListener( + "browser_extensions/" + browserExtension.Id + "/2fa_requests/" + tokenRequest.Id) extensionTokenRequestWebsocketConnection := extensionTokenRequestWebsocketListener.StartListening() defer extensionTokenRequestWebsocketConnection.Close() - e2e_tests.Send2FaTokenToExtension(s.T(), browserExtension.Id, device.Id, tokenRequest.Id, "2fa-token") + e2e_tests.Send2FaTokenToExtension(s.T(), + browserExtension.Id, + device.Id, + tokenRequest.Id, + "2fa-token") - expected2FaTokenWebsocket := createBrowserExtensionReceived2FaTokenMessage(s.T(), browserExtension.Id, device.Id, tokenRequest.Id) + expected2FaTokenWebsocket := createBrowserExtensionReceived2FaTokenMessage(s.T(), + browserExtension.Id, + device.Id, + tokenRequest.Id) extensionTokenRequestWebsocketListener.AssertMessageHasBeenReceived(s.T(), expected2FaTokenWebsocket) } @@ -76,7 +84,11 @@ func createBrowserExtensionReceived2FaTokenMessage(t *testing.T, extensionId, de return string(message) } -func createPairingSuccessWebsocketMessage(t *testing.T, browserExtension *e2e_tests.BrowserExtensionResponse, device *e2e_tests.DeviceResponse, devicePubKey string) string { +func createPairingSuccessWebsocketMessage( + t *testing.T, + browserExtension *e2e_tests.BrowserExtensionResponse, + device *e2e_tests.DeviceResponse, + devicePubKey string) string { t.Helper() expectedPairingWebsocketMessageRaw := &struct { @@ -99,7 +111,10 @@ func createPairingSuccessWebsocketMessage(t *testing.T, browserExtension *e2e_te return string(message) } -func assertBrowserExtensionHasPairedDevice(t *testing.T, browserExtension *e2e_tests.BrowserExtensionResponse, device *e2e_tests.DeviceResponse) { +func assertBrowserExtensionHasPairedDevice( + t *testing.T, + browserExtension *e2e_tests.BrowserExtensionResponse, + device *e2e_tests.DeviceResponse) { t.Helper() var browserExtensionDevices []*e2e_tests.DeviceResponse e2e_tests.DoAPISuccessGet(t, "browser_extensions/"+browserExtension.Id+"/devices", &browserExtensionDevices) @@ -108,7 +123,10 @@ func assertBrowserExtensionHasPairedDevice(t *testing.T, browserExtension *e2e_t assert.Equal(t, device.Id, browserExtensionDevices[0].Id) } -func assertDeviceHasPairedExtension(t *testing.T, device *e2e_tests.DeviceResponse, browserExtension *e2e_tests.BrowserExtensionResponse) { +func assertDeviceHasPairedExtension( + t *testing.T, + device *e2e_tests.DeviceResponse, + browserExtension *e2e_tests.BrowserExtensionResponse) { t.Helper() var deviceBrowserExtensions []*e2e_tests.BrowserExtensionResponse e2e_tests.DoAPISuccessGet(t, "mobile/devices/"+device.Id+"/browser_extensions", &deviceBrowserExtensions) diff --git a/e2e-tests/browser_extension/browser_extension_pairing_test.go b/e2e-tests/browser_extension/browser_extension_pairing_test.go index b51d277..887cb99 100644 --- a/e2e-tests/browser_extension/browser_extension_pairing_test.go +++ b/e2e-tests/browser_extension/browser_extension_pairing_test.go @@ -95,7 +95,11 @@ func (s *BrowserExtensionPairingTestSuite) TestRemoveBrowserExtensionPairedDevic e2e_tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExt, device) e2e_tests.DoAPISuccessDelete(s.T(), "/browser_extensions/"+browserExt.Id+"/devices/"+device.Id) - response := e2e_tests.DoAPIRequest(s.T(), "/browser_extensions/"+browserExt.Id+"/devices/"+device.Id, http.MethodDelete, nil /*payload*/, nil /*resp*/) + response := e2e_tests.DoAPIRequest(s.T(), + "/browser_extensions/"+browserExt.Id+"/devices/"+device.Id, + http.MethodDelete, + nil, /*payload*/ + nil /*resp*/) s.Equal(404, response.StatusCode) } @@ -160,7 +164,9 @@ func (s *BrowserExtensionPairingTestSuite) TestGetPairedDevicesByNotExistingExte notExistingExtensionId := uuid.New() var firstExtensionDevices []*e2e_tests.ExtensionPairedDeviceResponse - e2e_tests.DoAPISuccessGet(s.T(), "/browser_extensions/"+notExistingExtensionId.String()+"/devices/", &firstExtensionDevices) + e2e_tests.DoAPISuccessGet(s.T(), + "/browser_extensions/"+notExistingExtensionId.String()+"/devices/", + &firstExtensionDevices) s.Empty(firstExtensionDevices) } @@ -197,7 +203,11 @@ func (s *BrowserExtensionPairingTestSuite) TestCannotPairSameDeviceAndExtensionT payloadJson, err := json.Marshal(payload) s.Require().NoError(err) - e2e_tests.DoAPIPostAndAssertCode(s.T(), 409, "/mobile/devices/"+device.Id+"/browser_extensions", payloadJson, pairingResult) + e2e_tests.DoAPIPostAndAssertCode(s.T(), + 409, + "/mobile/devices/"+device.Id+"/browser_extensions", + payloadJson, + pairingResult) } func getExtensionPairedDevices(t *testing.T, browserExt *e2e_tests.BrowserExtensionResponse) []*e2e_tests.ExtensionPairedDeviceResponse { diff --git a/e2e-tests/browser_extension/browser_extension_test.go b/e2e-tests/browser_extension/browser_extension_test.go index e30c5e3..102df05 100644 --- a/e2e-tests/browser_extension/browser_extension_test.go +++ b/e2e-tests/browser_extension/browser_extension_test.go @@ -91,7 +91,10 @@ func createBrowserExtension(t *testing.T, name string) *http.Response { pubKey := crypto.PublicKeyToBase64(keyPair.PublicKey) - payload := []byte(fmt.Sprintf(`{"name":"%s","browser_name":"go-browser","browser_version":"0.1","public_key":"%s"}`, name, pubKey)) + payload := []byte(fmt.Sprintf( + `{"name":"%s","browser_name":"go-browser","browser_version":"0.1","public_key":"%s"}`, + name, + pubKey)) return e2e_tests.DoAPIRequest(t, "/browser_extensions", http.MethodPost, payload, nil) } diff --git a/e2e-tests/helpers.go b/e2e-tests/helpers.go index f0f5ddb..fdaa9b4 100644 --- a/e2e-tests/helpers.go +++ b/e2e-tests/helpers.go @@ -30,7 +30,10 @@ func CreateBrowserExtension(t *testing.T, name string) *BrowserExtensionResponse pubKey := crypto.PublicKeyToBase64(keyPair.PublicKey) - payload := []byte(fmt.Sprintf(`{"name":"%s","browser_name":"go-browser","browser_version":"0.1","public_key":"%s"}`, name, pubKey)) + payload := []byte( + fmt.Sprintf( + `{"name":"%s","browser_name":"go-browser","browser_version":"0.1","public_key":"%s"}`, + name, pubKey)) browserExt := new(BrowserExtensionResponse) @@ -42,7 +45,9 @@ func CreateBrowserExtension(t *testing.T, name string) *BrowserExtensionResponse func CreateBrowserExtensionWithPublicKey(t *testing.T, name, publicKey string) *BrowserExtensionResponse { t.Helper() - payload := []byte(fmt.Sprintf(`{"name":"%s","browser_name":"go-browser","browser_version":"0.1","public_key":"%s"}`, name, publicKey)) + payload := []byte( + fmt.Sprintf(`{"name":"%s","browser_name":"go-browser","browser_version":"0.1","public_key":"%s"}`, + name, publicKey)) browserExt := new(BrowserExtensionResponse) @@ -51,7 +56,11 @@ func CreateBrowserExtensionWithPublicKey(t *testing.T, name, publicKey string) * return browserExt } -func PairDeviceWithBrowserExtension(t *testing.T, devicePubKey string, browserExtension *BrowserExtensionResponse, device *DeviceResponse) *PairingResultResponse { +func PairDeviceWithBrowserExtension( + t *testing.T, + devicePubKey string, + browserExtension *BrowserExtensionResponse, + device *DeviceResponse) *PairingResultResponse { t.Helper() payload := struct { diff --git a/e2e-tests/icons/icons_requests_test.go b/e2e-tests/icons/icons_requests_test.go index e82fde1..c0b4428 100644 --- a/e2e-tests/icons/icons_requests_test.go +++ b/e2e-tests/icons/icons_requests_test.go @@ -93,7 +93,10 @@ func (s *IconsRequestsTestSuite) TestTransformIconRequestIntoWebService() { iconRequest := createIconRequest(s.T(), "service") var result *queries.WebServicePresenter - e2e_tests.DoAdminAPISuccessPost(s.T(), "mobile/icons/requests/"+iconRequest.Id+"/commands/transform_to_web_service", nil, &result) + e2e_tests.DoAdminAPISuccessPost(s.T(), + "mobile/icons/requests/"+iconRequest.Id+"/commands/transform_to_web_service", + nil, + &result) s.Equal("service", result.Name) } diff --git a/e2e-tests/icons/web_services_dump_test.go b/e2e-tests/icons/web_services_dump_test.go index 7d86e73..89a972d 100644 --- a/e2e-tests/icons/web_services_dump_test.go +++ b/e2e-tests/icons/web_services_dump_test.go @@ -37,15 +37,16 @@ func createWebService(t *testing.T) *webServiceResponse { t.Helper() iconsCollection := createIconsCollection(t) - payload := []byte(` + id := fmt.Sprintf("service-%d", rand.Int()) // nolint:gosec // only for tests + payload := []byte(fmt.Sprintf(` { - "name":"` + fmt.Sprintf("service-%d", rand.Int()) + `", + "name":"%s", "description":"another", "issuers":["facebook", "m.facebook"], "tags":["shitbook"], - "icons_collections":["` + iconsCollection.Id + `"] + "icons_collections":["%s"] } - `) + `, id, iconsCollection.Id)) var webService *webServiceResponse diff --git a/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go b/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go index 53e9f76..93a132b 100644 --- a/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go +++ b/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go @@ -50,7 +50,7 @@ func (r *BrowserExtension2FaRequestsMysqlRepository) Delete(request *domain.Brow return nil } -func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(extensionId uuid.UUID) []*domain.BrowserExtension2FaRequest { +func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(extensionId uuid.UUID) []*domain.BrowserExtension2FaRequest { // nolint:lll, struct method is too long to make line shorter var requests []*domain.BrowserExtension2FaRequest r.db.Find(&requests, "extension_id = ?", extensionId.String()) @@ -58,7 +58,7 @@ func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(ex return requests } -func (r *BrowserExtension2FaRequestsMysqlRepository) FindById(tokenRequestId, extensionId uuid.UUID) (*domain.BrowserExtension2FaRequest, error) { +func (r *BrowserExtension2FaRequestsMysqlRepository) FindById(tokenRequestId, extensionId uuid.UUID) (*domain.BrowserExtension2FaRequest, error) { // nolint:lll, struct method is too long to make line shorter var request *domain.BrowserExtension2FaRequest result := r.db.First(&request, "extension_id = ? AND id = ?", extensionId.String(), tokenRequestId.String()) diff --git a/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go b/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go index 66aa6ef..173c417 100644 --- a/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go +++ b/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go @@ -68,7 +68,7 @@ func (r *BrowserExtensionDevicesMysqlRepository) Delete(pairedDevice *domain.Ext return nil } -func (r *BrowserExtensionDevicesMysqlRepository) GetById(extensionId, deviceId uuid.UUID) (*domain.ExtensionDevice, error) { +func (r *BrowserExtensionDevicesMysqlRepository) GetById(extensionId, deviceId uuid.UUID) (*domain.ExtensionDevice, error) { // nolint:lll, struct method is too long to make line shorter var device *domain.ExtensionDevice mdbeT := goqu.T("mobile_device_browser_extension") diff --git a/internal/api/browser_extension/app/command/remove_all_extension_paired_devices.go b/internal/api/browser_extension/app/command/remove_all_extension_paired_devices.go index 892abb6..d8d1aa4 100644 --- a/internal/api/browser_extension/app/command/remove_all_extension_paired_devices.go +++ b/internal/api/browser_extension/app/command/remove_all_extension_paired_devices.go @@ -39,7 +39,7 @@ func (h *RemoveALlExtensionPairedDevicesHandler) Handle(cmd *RemoveAllExtensionP return nil } -// RemoveAllBrowserExtensionsDevices command for tests +// RemoveAllBrowserExtensionsDevices command for tests. type RemoveAllBrowserExtensionsDevices struct{} type RemoveAllBrowserExtensionsDevicesHandler struct { diff --git a/internal/api/browser_extension/app/command/remove_browser_extension.go b/internal/api/browser_extension/app/command/remove_browser_extension.go index 7428465..41b55df 100644 --- a/internal/api/browser_extension/app/command/remove_browser_extension.go +++ b/internal/api/browser_extension/app/command/remove_browser_extension.go @@ -5,7 +5,7 @@ import ( "gorm.io/gorm" ) -// RemoveAllBrowserExtensions command for tests +// RemoveAllBrowserExtensions command for tests. type RemoveAllBrowserExtensions struct{} type RemoveAllBrowserExtensionsHandler struct { diff --git a/internal/api/browser_extension/app/command/request_2fa_token.go b/internal/api/browser_extension/app/command/request_2fa_token.go index e9304e4..110fe83 100644 --- a/internal/api/browser_extension/app/command/request_2fa_token.go +++ b/internal/api/browser_extension/app/command/request_2fa_token.go @@ -73,7 +73,9 @@ type Request2FaTokenHandler struct { Pusher push.Pusher } -func (h *Request2FaTokenHandler) Handle(ctx context.Context, cmd *Request2FaToken) (map[string]PushNotificationStatus, error) { +func (h *Request2FaTokenHandler) Handle( + ctx context.Context, + cmd *Request2FaToken) (map[string]PushNotificationStatus, error) { log := logging.FromContext(ctx) extId, _ := uuid.Parse(cmd.ExtensionId) @@ -92,42 +94,47 @@ func (h *Request2FaTokenHandler) Handle(ctx context.Context, cmd *Request2FaToke result := map[string]PushNotificationStatus{} for _, device := range pairedDevices { - if device.FcmToken == "" { - log.WithFields(logging.Fields{ - "extension_id": extId.String(), - "device_id": device.Id.String(), - "token_request_id": cmd.Id, - "domain": cmd.Domain, - "platform": device.Platform, - "type": "browser_extension_request", - }).Info("Cannot send push notification, missing FCM token") - result[device.Id.String()] = PushNotificationStatusNoFCM - continue - } - - err := h.sendNotification(ctx, device, data) - if err == nil { - result[device.Id.String()] = PushNotificationStatusOK - } else if messaging.IsUnregistered(err) { - result[device.Id.String()] = PushNotificationStatusUnregistered - } else { - result[device.Id.String()] = PushNotificationStatusError - log.WithFields(logging.Fields{ - "extension_id": extId.String(), - "device_id": device.Id.String(), - "token_request_id": cmd.Id, - "domain": cmd.Domain, - "platform": device.Platform, - "type": "browser_extension_request", - "error": err.Error(), - }).Error("Cannot send push notification for \"2fa_request\"") - } + log = log.WithFields(logging.Fields{ + "extension_id": extId.String(), + "device_id": device.Id.String(), + "token_request_id": cmd.Id, + "domain": cmd.Domain, + "platform": device.Platform, + "type": "browser_extension_request", + }) + + result[device.Id.String()] = h.sendPush(ctx, log, device, data) } return result, nil } -func (h *Request2FaTokenHandler) findPairedDevices(extId uuid.UUID, cmd *Request2FaToken) ([]*domain.ExtensionDevice, error) { +func (h *Request2FaTokenHandler) sendPush( + ctx context.Context, + log logging.FieldLogger, + device *domain.ExtensionDevice, + data map[string]interface{}) PushNotificationStatus { + if device.FcmToken == "" { + log.Info("Cannot send push notification, missing FCM token") + return PushNotificationStatusNoFCM + } + + err := h.sendNotification(ctx, device, data) + if err != nil { + if messaging.IsUnregistered(err) { + return PushNotificationStatusUnregistered + } + log.WithFields(logging.Fields{ + "error": err.Error(), + }).Error("Cannot send push notification for \"2fa_request\"") + return PushNotificationStatusError + } + return PushNotificationStatusOK +} + +func (h *Request2FaTokenHandler) findPairedDevices( + extId uuid.UUID, + cmd *Request2FaToken) ([]*domain.ExtensionDevice, error) { browserExtension, err := h.BrowserExtensionsRepository.FindById(extId) if err != nil { return nil, err diff --git a/internal/api/browser_extension/ports/http.go b/internal/api/browser_extension/ports/http.go index 435c119..e0466ae 100644 --- a/internal/api/browser_extension/ports/http.go +++ b/internal/api/browser_extension/ports/http.go @@ -326,7 +326,7 @@ func (r *RoutesHandler) Request2FaToken(c *gin.Context) { query.BrowserExtension2FaRequestPresenter PushStatus map[string]command.PushNotificationStatus `json:"push_status"` } - if len(result) >= 0 && result[0] != nil { + if len(result) > 0 && result[0] != nil { jsonResult.BrowserExtension2FaRequestPresenter = *result[0] } jsonResult.PushStatus = pushResult diff --git a/internal/api/icons/adapters/icons_collection_gorm_repository.go b/internal/api/icons/adapters/icons_collection_gorm_repository.go index f811eb7..4d060af 100644 --- a/internal/api/icons/adapters/icons_collection_gorm_repository.go +++ b/internal/api/icons/adapters/icons_collection_gorm_repository.go @@ -26,24 +26,24 @@ func NewIconsCollectionMysqlRepository(db *gorm.DB) *IconsCollectionMysqlReposit return &IconsCollectionMysqlRepository{db: db} } -func (r *IconsCollectionMysqlRepository) Save(IconsCollection *domain.IconsCollection) error { - if err := r.db.Create(IconsCollection).Error; err != nil { +func (r *IconsCollectionMysqlRepository) Save(iconsCollection *domain.IconsCollection) error { + if err := r.db.Create(iconsCollection).Error; err != nil { return err } return nil } -func (r *IconsCollectionMysqlRepository) Update(IconsCollection *domain.IconsCollection) error { - if err := r.db.Updates(IconsCollection).Error; err != nil { +func (r *IconsCollectionMysqlRepository) Update(iconsCollection *domain.IconsCollection) error { + if err := r.db.Updates(iconsCollection).Error; err != nil { return err } return nil } -func (r *IconsCollectionMysqlRepository) Delete(IconsCollection *domain.IconsCollection) error { - if err := r.db.Delete(IconsCollection).Error; err != nil { +func (r *IconsCollectionMysqlRepository) Delete(iconsCollection *domain.IconsCollection) error { + if err := r.db.Delete(iconsCollection).Error; err != nil { return err } diff --git a/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go b/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go index 9c52446..e455ca9 100644 --- a/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go +++ b/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go @@ -16,10 +16,10 @@ func NewIconsCollectionsRelationsMysqlRepository(db *gorm.DB) *IconsCollectionsR return &IconsCollectionsRelationsMysqlRepository{db: db} } -func (r *IconsCollectionsRelationsMysqlRepository) DeleteAll(IconCollection *domain.IconsCollection) error { +func (r *IconsCollectionsRelationsMysqlRepository) DeleteAll(iconCollection *domain.IconsCollection) error { sql := fmt.Sprintf("UPDATE web_services SET icons_collections = %s WHERE \"%s\" MEMBER OF (icons_collections)", - "JSON_REMOVE(`icons_collections`, JSON_UNQUOTE(JSON_SEARCH(`icons_collections`, 'one', '"+IconCollection.Id.String()+"')))", - IconCollection.Id.String(), + "JSON_REMOVE(`icons_collections`, JSON_UNQUOTE(JSON_SEARCH(`icons_collections`, 'one', '"+iconCollection.Id.String()+"')))", + iconCollection.Id.String(), ) res := r.db.Exec(sql) diff --git a/internal/api/icons/adapters/icons_gorm_repository.go b/internal/api/icons/adapters/icons_gorm_repository.go index 526bbb6..d5daa28 100644 --- a/internal/api/icons/adapters/icons_gorm_repository.go +++ b/internal/api/icons/adapters/icons_gorm_repository.go @@ -27,24 +27,24 @@ func NewIconMysqlRepository(db *gorm.DB) *IconMysqlRepository { return &IconMysqlRepository{db: db} } -func (r *IconMysqlRepository) Save(Icon *domain.Icon) error { - if err := r.db.Create(Icon).Error; err != nil { +func (r *IconMysqlRepository) Save(icon *domain.Icon) error { + if err := r.db.Create(icon).Error; err != nil { return err } return nil } -func (r *IconMysqlRepository) Update(Icon *domain.Icon) error { - if err := r.db.Updates(Icon).Error; err != nil { +func (r *IconMysqlRepository) Update(icon *domain.Icon) error { + if err := r.db.Updates(icon).Error; err != nil { return err } return nil } -func (r *IconMysqlRepository) Delete(Icon *domain.Icon) error { - if err := r.db.Delete(Icon).Error; err != nil { +func (r *IconMysqlRepository) Delete(icon *domain.Icon) error { + if err := r.db.Delete(icon).Error; err != nil { return err } diff --git a/internal/api/icons/adapters/icons_relations_gorm_repository.go b/internal/api/icons/adapters/icons_relations_gorm_repository.go index fa70d4b..a349838 100644 --- a/internal/api/icons/adapters/icons_relations_gorm_repository.go +++ b/internal/api/icons/adapters/icons_relations_gorm_repository.go @@ -16,10 +16,10 @@ func NewIconsRelationsMysqlRepository(db *gorm.DB) *IconsRelationsMysqlRepositor return &IconsRelationsMysqlRepository{db: db} } -func (r *IconsRelationsMysqlRepository) DeleteAll(Icon *domain.Icon) error { +func (r *IconsRelationsMysqlRepository) DeleteAll(icon *domain.Icon) error { sql := fmt.Sprintf("UPDATE icons_collections SET icons = %s WHERE \"%s\" MEMBER OF (icons)", - "JSON_REMOVE(`icons`, JSON_UNQUOTE(JSON_SEARCH(`icons`, 'one', '"+Icon.Id.String()+"')))", - Icon.Id.String(), + "JSON_REMOVE(`icons`, JSON_UNQUOTE(JSON_SEARCH(`icons`, 'one', '"+icon.Id.String()+"')))", + icon.Id.String(), ) res := r.db.Exec(sql) diff --git a/internal/api/icons/service/service.go b/internal/api/icons/service/service.go index 6528093..e3dae55 100644 --- a/internal/api/icons/service/service.go +++ b/internal/api/icons/service/service.go @@ -24,7 +24,7 @@ type IconsModule struct { Config config.Configuration } -func NewIconsModule(config config.Configuration, gorm *gorm.DB, database *sql.DB, validate *validator.Validate, iconsStorage storage.FileSystemStorage) *IconsModule { //nolint:funlen // This is an initialization function. +func NewIconsModule(config config.Configuration, gorm *gorm.DB, database *sql.DB, validate *validator.Validate, iconsStorage storage.FileSystemStorage) *IconsModule { //nolint:funlen,lll // This is an initialization function. queryBuilder := db.NewQueryBuilder(database) webServicesRepository := adapters.NewWebServiceMysqlRepository(gorm) diff --git a/internal/common/crypto/prng.go b/internal/common/crypto/prng.go index 116a192..fcc8c7b 100644 --- a/internal/common/crypto/prng.go +++ b/internal/common/crypto/prng.go @@ -15,5 +15,5 @@ func GenerateNonce() (string, error) { } return hex.EncodeToString(bytes), nil - //return base64.URLEncoding.EncodeToString(nonceBytes), nil + // return base64.URLEncoding.EncodeToString(nonceBytes), nil } From a7e37ef40fb42e328bdbfa07acd4334d3b0b62d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Dry=C5=9B?= Date: Fri, 30 Jan 2026 13:19:04 +0100 Subject: [PATCH 2/6] chore(linter): add more linters, fix warnings --- .../browser_extension_pairing_test.go | 4 ++- e2e-tests/icons/icons_collection_test.go | 5 ++- e2e-tests/icons/icons_requests_test.go | 16 ++++++++-- ...le_browser_extensions_2fa_requests_test.go | 23 +++++++++++--- .../mobile/mobile_device_extension_test.go | 27 ++++++++++++---- e2e-tests/mobile/mobile_notifications_test.go | 11 +++++-- e2e-tests/support/mobile_debug_logs_test.go | 17 +++++++--- e2e-tests/system/api_test.go | 2 +- ..._extension_2fa_request_mysql_repository.go | 4 +-- .../app/command/request_2fa_token.go | 4 ++- .../browser_extension_2fa_requests_query.go | 3 +- .../browser_extension_paired_devices_query.go | 6 ++-- .../api/browser_extension/service/service.go | 31 ++++++++++++------- ...s_collections_relations_gorm_repository.go | 2 +- internal/api/icons/app/command/icons.go | 4 ++- .../api/icons/app/command/icons_requests.go | 25 ++++++++++----- internal/api/icons/service/service.go | 6 ++-- ...obile_device_extensions_gorm_repository.go | 3 +- .../app/command/pair_mobile_with_extension.go | 7 +++-- .../device_browser_extensions_2fa_requests.go | 3 +- .../device_browser_extensions_query.go | 3 +- .../app/queries/paired_browser_extension.go | 3 +- .../app/queries/whatsnew_notification.go | 6 ++-- internal/api/mobile/service/service.go | 20 +++++++----- internal/api/support/service/service.go | 6 +++- 25 files changed, 174 insertions(+), 67 deletions(-) diff --git a/e2e-tests/browser_extension/browser_extension_pairing_test.go b/e2e-tests/browser_extension/browser_extension_pairing_test.go index 887cb99..7380fd9 100644 --- a/e2e-tests/browser_extension/browser_extension_pairing_test.go +++ b/e2e-tests/browser_extension/browser_extension_pairing_test.go @@ -210,7 +210,9 @@ func (s *BrowserExtensionPairingTestSuite) TestCannotPairSameDeviceAndExtensionT pairingResult) } -func getExtensionPairedDevices(t *testing.T, browserExt *e2e_tests.BrowserExtensionResponse) []*e2e_tests.ExtensionPairedDeviceResponse { +func getExtensionPairedDevices( + t *testing.T, + browserExt *e2e_tests.BrowserExtensionResponse) []*e2e_tests.ExtensionPairedDeviceResponse { t.Helper() var extensionDevices []*e2e_tests.ExtensionPairedDeviceResponse e2e_tests.DoAPISuccessGet(t, "/browser_extensions/"+browserExt.Id+"/devices/", &extensionDevices) diff --git a/e2e-tests/icons/icons_collection_test.go b/e2e-tests/icons/icons_collection_test.go index 130313a..bd10807 100644 --- a/e2e-tests/icons/icons_collection_test.go +++ b/e2e-tests/icons/icons_collection_test.go @@ -65,7 +65,10 @@ func (s *IconsCollectionsTestSuite) TestUpdateIconsCollection() { `) var updatedIconsCollection *iconsCollectionResponse - e2e_tests.DoAdminSuccessPut(s.T(), "mobile/icons/collections/"+iconsCollection.Id, updatePayload, &updatedIconsCollection) + e2e_tests.DoAdminSuccessPut(s.T(), + "mobile/icons/collections/"+iconsCollection.Id, + updatePayload, + &updatedIconsCollection) s.Equal("meta", updatedIconsCollection.Name) s.Equal([]string{"icon-1", "icon-2"}, updatedIconsCollection.Icons) diff --git a/e2e-tests/icons/icons_requests_test.go b/e2e-tests/icons/icons_requests_test.go index c0b4428..1c4e42b 100644 --- a/e2e-tests/icons/icons_requests_test.go +++ b/e2e-tests/icons/icons_requests_test.go @@ -106,7 +106,10 @@ func (s *IconsRequestsTestSuite) TestTransformSingleIconRequestsIntoWebServiceFr createIconRequest(s.T(), "service") var result *queries.WebServicePresenter - e2e_tests.DoAdminAPISuccessPost(s.T(), "mobile/icons/requests/"+iconRequest.Id+"/commands/transform_to_web_service", nil, &result) + e2e_tests.DoAdminAPISuccessPost(s.T(), + "mobile/icons/requests/"+iconRequest.Id+"/commands/transform_to_web_service", + nil, + &result) var icons []*queries.IconPresenter e2e_tests.DoAPIGet(s.T(), "mobile/icons", &icons) @@ -119,7 +122,11 @@ func (s *IconsRequestsTestSuite) TestTransformIconRequestWithAlreadyExistingWebS iconRequest := createIconRequest(s.T(), webService.Name) var result *queries.WebServicePresenter - e2e_tests.DoAdminPostAndAssertCode(s.T(), 409, "mobile/icons/requests/"+iconRequest.Id+"/commands/transform_to_web_service", nil, &result) + e2e_tests.DoAdminPostAndAssertCode(s.T(), + 409, + "mobile/icons/requests/"+iconRequest.Id+"/commands/transform_to_web_service", + nil, + &result) } func (s *IconsRequestsTestSuite) TestUpdateWebServiceFromIconRequest() { @@ -128,7 +135,10 @@ func (s *IconsRequestsTestSuite) TestUpdateWebServiceFromIconRequest() { var result *queries.WebServicePresenter payload := []byte(`{"web_service_id":"` + webService.Id + `"}`) - e2e_tests.DoAdminAPISuccessPost(s.T(), "mobile/icons/requests/"+iconRequest.Id+"/commands/update_web_service", payload, &result) + e2e_tests.DoAdminAPISuccessPost(s.T(), + "mobile/icons/requests/"+iconRequest.Id+"/commands/update_web_service", + payload, + &result) s.Equal(webService.Name, result.Name) diff --git a/e2e-tests/mobile/mobile_browser_extensions_2fa_requests_test.go b/e2e-tests/mobile/mobile_browser_extensions_2fa_requests_test.go index 32936ad..7865900 100644 --- a/e2e-tests/mobile/mobile_browser_extensions_2fa_requests_test.go +++ b/e2e-tests/mobile/mobile_browser_extensions_2fa_requests_test.go @@ -29,10 +29,15 @@ func (s *MobileDeviceExtensionIntegrationTestSuite) TestGetPending2FaRequests() var tokenRequest *e2e_tests.AuthTokenRequestResponse request2FaTokenPayload := []byte(`{"domain":"domain.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", request2FaTokenPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + request2FaTokenPayload, + &tokenRequest) var tokenRequestsCollection []*e2e_tests.AuthTokenRequestResponse - e2e_tests.DoAPISuccessGet(s.T(), "mobile/devices/"+device.Id+"/browser_extensions/2fa_requests", &tokenRequestsCollection) + e2e_tests.DoAPISuccessGet(s.T(), + "mobile/devices/"+device.Id+"/browser_extensions/2fa_requests", + &tokenRequestsCollection) s.Len(tokenRequestsCollection, 1) } @@ -43,12 +48,20 @@ func (s *MobileDeviceExtensionIntegrationTestSuite) TestDoNotReturnCompleted2FaR var tokenRequest *e2e_tests.AuthTokenRequestResponse request2FaTokenPayload := []byte(`{"domain":"domain.com"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", request2FaTokenPayload, &tokenRequest) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/commands/request_2fa_token", + request2FaTokenPayload, + &tokenRequest) closeTokenRequestPayload := []byte(`{"status":"completed"}`) - e2e_tests.DoAPISuccessPost(s.T(), "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", closeTokenRequestPayload, nil) + e2e_tests.DoAPISuccessPost(s.T(), + "browser_extensions/"+browserExtension.Id+"/2fa_requests/"+tokenRequest.Id+"/commands/close_2fa_request", + closeTokenRequestPayload, + nil) var tokenRequestsCollection []*e2e_tests.AuthTokenRequestResponse - e2e_tests.DoAPISuccessGet(s.T(), "mobile/devices/"+device.Id+"/browser_extensions/2fa_requests", &tokenRequestsCollection) + e2e_tests.DoAPISuccessGet(s.T(), + "mobile/devices/"+device.Id+"/browser_extensions/2fa_requests", + &tokenRequestsCollection) s.Empty(tokenRequestsCollection) } diff --git a/e2e-tests/mobile/mobile_device_extension_test.go b/e2e-tests/mobile/mobile_device_extension_test.go index 411eb24..f7c3fc2 100644 --- a/e2e-tests/mobile/mobile_device_extension_test.go +++ b/e2e-tests/mobile/mobile_device_extension_test.go @@ -38,7 +38,9 @@ func (s *MobileDeviceExtensionTestSuite) TestDoNotFindNotExistingMobileDeviceExt e2e_tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExt, device) notExistingExtensionId := uuid.New() - response := e2e_tests.DoAPIGet(s.T(), "/mobile/devices/"+device.Id+"/browser_extensions/"+notExistingExtensionId.String(), nil) + response := e2e_tests.DoAPIGet(s.T(), + "/mobile/devices/"+device.Id+"/browser_extensions/"+notExistingExtensionId.String(), + nil) s.Equal(404, response.StatusCode) } @@ -49,7 +51,9 @@ func (s *MobileDeviceExtensionTestSuite) Test_FindExtensionForDevice() { e2e_tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExt, device) var deviceBrowserExtension *e2e_tests.BrowserExtensionResponse - e2e_tests.DoAPISuccessGet(s.T(), "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt.Id, &deviceBrowserExtension) + e2e_tests.DoAPISuccessGet(s.T(), + "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt.Id, + &deviceBrowserExtension) s.Equal(browserExt.Id, deviceBrowserExtension.Id) } @@ -78,11 +82,15 @@ func (s *MobileDeviceExtensionTestSuite) Test_DisconnectExtensionFromDevice() { e2e_tests.DoAPISuccessDelete(s.T(), "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt1.Id) var deviceBrowserExtension1 *e2e_tests.BrowserExtensionResponse - response := e2e_tests.DoAPIGet(s.T(), "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt1.Id, &deviceBrowserExtension1) + response := e2e_tests.DoAPIGet(s.T(), + "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt1.Id, + &deviceBrowserExtension1) s.Equal(404, response.StatusCode) var deviceBrowserExtension2 *e2e_tests.BrowserExtensionResponse - e2e_tests.DoAPISuccessGet(s.T(), "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt2.Id, &deviceBrowserExtension2) + e2e_tests.DoAPISuccessGet(s.T(), + "/mobile/devices/"+device.Id+"/browser_extensions/"+browserExt2.Id, + &deviceBrowserExtension2) s.Equal(browserExt2.Id, deviceBrowserExtension2.Id) } @@ -91,7 +99,14 @@ func (s *MobileDeviceExtensionTestSuite) TestExtensionHasAlreadyBeenConnected() device, devicePubKey := e2e_tests.CreateDevice(s.T(), "go-test-device", "some-device-id") e2e_tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, extension, device) - payload := []byte(fmt.Sprintf(`{"extension_id":"%s","device_name":"%s","device_public_key":"%s"}`, extension.Id, device.Name, devicePubKey)) + payload := []byte(fmt.Sprintf(`{"extension_id":"%s","device_name":"%s","device_public_key":"%s"}`, + extension.Id, + device.Name, + devicePubKey)) - e2e_tests.DoAPIPostAndAssertCode(s.T(), 409, "/mobile/devices/"+device.Id+"/browser_extensions", payload, nil) + e2e_tests.DoAPIPostAndAssertCode(s.T(), + 409, + "/mobile/devices/"+device.Id+"/browser_extensions", + payload, + nil) } diff --git a/e2e-tests/mobile/mobile_notifications_test.go b/e2e-tests/mobile/mobile_notifications_test.go index e25d4b3..5337776 100644 --- a/e2e-tests/mobile/mobile_notifications_test.go +++ b/e2e-tests/mobile/mobile_notifications_test.go @@ -67,7 +67,11 @@ func (s *MobileNotificationsTestSuite) TestDeleteMobileNotification() { func (s *MobileNotificationsTestSuite) TestDeleteNotExistingMobileNotification() { id := uuid.New() - response := e2e_tests.DoAPIRequest(s.T(), "mobile/notifications/"+id.String(), http.MethodDelete, nil /*payload*/, nil /*resp*/) + response := e2e_tests.DoAPIRequest(s.T(), + "mobile/notifications/"+id.String(), + http.MethodDelete, + nil, /*payload*/ + nil /*resp*/) s.Equal(404, response.StatusCode) } @@ -101,7 +105,10 @@ func (s *MobileNotificationsTestSuite) TestPublishNotification() { e2e_tests.DoAdminAPISuccessPost(s.T(), "mobile/notifications", payload, ¬ification) var publishedNotification *query.MobileNotificationPresenter - e2e_tests.DoAdminAPISuccessPost(s.T(), "mobile/notifications/"+notification.Id+"/commands/publish", payload, &publishedNotification) + e2e_tests.DoAdminAPISuccessPost(s.T(), + "mobile/notifications/"+notification.Id+"/commands/publish", + payload, + &publishedNotification) s.NotEmpty(publishedNotification.PublishedAt, "published_at") } diff --git a/e2e-tests/support/mobile_debug_logs_test.go b/e2e-tests/support/mobile_debug_logs_test.go index 3cfc131..cc3d109 100644 --- a/e2e-tests/support/mobile_debug_logs_test.go +++ b/e2e-tests/support/mobile_debug_logs_test.go @@ -45,7 +45,10 @@ func (s *DebugLogsAuditTestSuite) TestUpdateDebugLogsAuditClaim() { var updatedAuditClaim *query.DebugLogsAuditPresenter updatePayload := []byte(`{"username": "app-user-1", "description": "another description"}`) - e2e_tests.DoAdminSuccessPut(s.T(), "mobile/support/debug_logs/audit/claim/"+auditClaim.Id, updatePayload, &updatedAuditClaim) + e2e_tests.DoAdminSuccessPut(s.T(), + "mobile/support/debug_logs/audit/claim/"+auditClaim.Id, + updatePayload, + &updatedAuditClaim) s.Equal("app-user-1", updatedAuditClaim.Username) s.Equal("another description", updatedAuditClaim.Description) @@ -62,7 +65,9 @@ func (s *DebugLogsAuditTestSuite) TestFulfillDebugLogsAuditClaim() { writer.Close() - request, _ := http.NewRequest(http.MethodPost, "http://localhost/mobile/support/debug_logs/audit/"+auditClaim.Id, body) + request, _ := http.NewRequest(http.MethodPost, + "http://localhost/mobile/support/debug_logs/audit/"+auditClaim.Id, + body) request.Header.Add("Content-Type", writer.FormDataContentType()) response, err := http.DefaultClient.Do(request) @@ -110,7 +115,9 @@ func (s *DebugLogsAuditTestSuite) TestTryToFulfillDebugLogsAuditClaimTwice() { body, formDataContentType, err = mkFormFileBody() s.Require().NoError(err) - secondRequest, _ := http.NewRequest(http.MethodPost, "http://localhost/mobile/support/debug_logs/audit/"+auditClaim.Id, body) + secondRequest, _ := http.NewRequest(http.MethodPost, + "http://localhost/mobile/support/debug_logs/audit/"+auditClaim.Id, + body) secondRequest.Header.Add("Content-Type", formDataContentType) secondResponse, err := http.DefaultClient.Do(secondRequest) s.Require().NoError(err) @@ -127,7 +134,9 @@ func (s *DebugLogsAuditTestSuite) TestTryToFulfillNotExistingDebugLogsAuditClaim body, formDataContentType, err := mkFormFileBody() s.Require().NoError(err) - request, _ := http.NewRequest(http.MethodPost, "http://localhost/mobile/support/debug_logs/audit/"+notExistingAuditClaimId, body) + request, _ := http.NewRequest(http.MethodPost, + "http://localhost/mobile/support/debug_logs/audit/"+notExistingAuditClaimId, + body) request.Header.Add("Content-Type", formDataContentType) response, err := http.DefaultClient.Do(request) s.Require().NoError(err) diff --git a/e2e-tests/system/api_test.go b/e2e-tests/system/api_test.go index c51950c..2029c20 100644 --- a/e2e-tests/system/api_test.go +++ b/e2e-tests/system/api_test.go @@ -16,7 +16,7 @@ func Test_Default404Response(t *testing.T) { rawBody, err := io.ReadAll(response.Body) require.NoError(t, err) - expected := `{"Code":404,"Type":"NotFound","Description":"Requested resource can not be found","Reason":"URI not found"}` + expected := `{"Code":404,"Type":"NotFound","Description":"Requested resource can not be found","Reason":"URI not found"}` // nolint: lll assert.Equal(t, 404, response.StatusCode) assert.JSONEq(t, expected, string(rawBody)) diff --git a/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go b/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go index 93a132b..122a682 100644 --- a/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go +++ b/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go @@ -50,7 +50,7 @@ func (r *BrowserExtension2FaRequestsMysqlRepository) Delete(request *domain.Brow return nil } -func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(extensionId uuid.UUID) []*domain.BrowserExtension2FaRequest { // nolint:lll, struct method is too long to make line shorter +func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(extensionId uuid.UUID) []*domain.BrowserExtension2FaRequest { // nolint:lll // struct name is too long to make line shorter var requests []*domain.BrowserExtension2FaRequest r.db.Find(&requests, "extension_id = ?", extensionId.String()) @@ -58,7 +58,7 @@ func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(ex return requests } -func (r *BrowserExtension2FaRequestsMysqlRepository) FindById(tokenRequestId, extensionId uuid.UUID) (*domain.BrowserExtension2FaRequest, error) { // nolint:lll, struct method is too long to make line shorter +func (r *BrowserExtension2FaRequestsMysqlRepository) FindById(tokenRequestId, extensionId uuid.UUID) (*domain.BrowserExtension2FaRequest, error) { // nolint:lll // struct name is too long to make line shorter var request *domain.BrowserExtension2FaRequest result := r.db.First(&request, "extension_id = ? AND id = ?", extensionId.String(), tokenRequestId.String()) diff --git a/internal/api/browser_extension/app/command/request_2fa_token.go b/internal/api/browser_extension/app/command/request_2fa_token.go index 110fe83..c090310 100644 --- a/internal/api/browser_extension/app/command/request_2fa_token.go +++ b/internal/api/browser_extension/app/command/request_2fa_token.go @@ -155,7 +155,9 @@ func (h *Request2FaTokenHandler) findPairedDevices( return h.PairedDevicesRepository.FindAll(browserExtension.Id), nil } -func (h *Request2FaTokenHandler) sendNotification(ctx context.Context, device *domain.ExtensionDevice, data map[string]interface{}) error { +func (h *Request2FaTokenHandler) sendNotification(ctx context.Context, + device *domain.ExtensionDevice, + data map[string]interface{}) error { var notification *messaging.Message switch device.Platform { diff --git a/internal/api/browser_extension/app/query/browser_extension_2fa_requests_query.go b/internal/api/browser_extension/app/query/browser_extension_2fa_requests_query.go index 1b2e43f..45c7709 100644 --- a/internal/api/browser_extension/app/query/browser_extension_2fa_requests_query.go +++ b/internal/api/browser_extension/app/query/browser_extension_2fa_requests_query.go @@ -26,7 +26,8 @@ type BrowserExtension2FaRequestQueryHandler struct { Qb *goqu.Database } -func (h *BrowserExtension2FaRequestQueryHandler) Handle(query *BrowserExtension2FaRequestQuery) ([]*BrowserExtension2FaRequestPresenter, error) { +func (h *BrowserExtension2FaRequestQueryHandler) Handle( + query *BrowserExtension2FaRequestQuery) ([]*BrowserExtension2FaRequestPresenter, error) { var presenter []*BrowserExtension2FaRequestPresenter ds := h.Qb.From("browser_extensions_2fa_requests") diff --git a/internal/api/browser_extension/app/query/browser_extension_paired_devices_query.go b/internal/api/browser_extension/app/query/browser_extension_paired_devices_query.go index 099fa71..3540596 100644 --- a/internal/api/browser_extension/app/query/browser_extension_paired_devices_query.go +++ b/internal/api/browser_extension/app/query/browser_extension_paired_devices_query.go @@ -26,7 +26,8 @@ type BrowserExtensionPairedMobileDevicesQueryHandler struct { Qb *goqu.Database } -func (h *BrowserExtensionPairedMobileDevicesQueryHandler) Handle(query *BrowserExtensionPairedDevicesQuery) []BrowserPairedDevicePresenter { +func (h *BrowserExtensionPairedMobileDevicesQueryHandler) Handle( + query *BrowserExtensionPairedDevicesQuery) []BrowserPairedDevicePresenter { var presenter []BrowserPairedDevicePresenter relationTable := goqu.T("mobile_device_browser_extension") @@ -52,7 +53,8 @@ type BrowserExtensionPairedMobileDeviceQueryHandler struct { Qb *goqu.Database } -func (h *BrowserExtensionPairedMobileDeviceQueryHandler) Handle(query *BrowserExtensionPairedDeviceQuery) (*BrowserPairedDevicePresenter, error) { +func (h *BrowserExtensionPairedMobileDeviceQueryHandler) Handle( + query *BrowserExtensionPairedDeviceQuery) (*BrowserPairedDevicePresenter, error) { var presenter *BrowserPairedDevicePresenter relationTable := goqu.T("mobile_device_browser_extension") diff --git a/internal/api/browser_extension/service/service.go b/internal/api/browser_extension/service/service.go index 5e1386d..be37cca 100644 --- a/internal/api/browser_extension/service/service.go +++ b/internal/api/browser_extension/service/service.go @@ -126,17 +126,26 @@ func (m *BrowserExtensionModule) RegisterPublicRoutes(router *gin.Engine) { publicRouter.GET("/browser_extensions/:extension_id", m.RoutesHandler.FindBrowserExtension) publicRouter.PUT("/browser_extensions/:extension_id", m.RoutesHandler.UpdateBrowserExtension) - publicRouter.GET("/browser_extensions/:extension_id/devices", m.RoutesHandler.FindBrowserExtensionPairedMobileDevices) - publicRouter.GET("/browser_extensions/:extension_id/devices/:device_id", m.RoutesHandler.GetBrowserExtensionPairedMobileDevice) - publicRouter.DELETE("/browser_extensions/:extension_id/devices", m.RoutesHandler.RemoveAllExtensionPairedDevices) - publicRouter.DELETE("/browser_extensions/:extension_id/devices/:device_id", m.RoutesHandler.RemovePairedDeviceFromExtension) - - publicRouter.POST("/browser_extensions/:extension_id/commands/request_2fa_token", m.RoutesHandler.Request2FaToken) - publicRouter.POST("/browser_extensions/:extension_id/commands/store_log", m.RoutesHandler.Log) - - publicRouter.GET("/browser_extensions/:extension_id/2fa_requests", m.RoutesHandler.GetAllBrowserExtension2FaTokenRequests) - publicRouter.GET("/browser_extensions/:extension_id/2fa_requests/:token_request_id", m.RoutesHandler.GetBrowserExtension2FaTokenRequest) - publicRouter.POST("/browser_extensions/:extension_id/2fa_requests/:token_request_id/commands/close_2fa_request", m.RoutesHandler.Close2FaRequest) + publicRouter.GET("/browser_extensions/:extension_id/devices", + m.RoutesHandler.FindBrowserExtensionPairedMobileDevices) + publicRouter.GET("/browser_extensions/:extension_id/devices/:device_id", + m.RoutesHandler.GetBrowserExtensionPairedMobileDevice) + publicRouter.DELETE("/browser_extensions/:extension_id/devices", + m.RoutesHandler.RemoveAllExtensionPairedDevices) + publicRouter.DELETE("/browser_extensions/:extension_id/devices/:device_id", + m.RoutesHandler.RemovePairedDeviceFromExtension) + + publicRouter.POST("/browser_extensions/:extension_id/commands/request_2fa_token", + m.RoutesHandler.Request2FaToken) + publicRouter.POST("/browser_extensions/:extension_id/commands/store_log", + m.RoutesHandler.Log) + + publicRouter.GET("/browser_extensions/:extension_id/2fa_requests", + m.RoutesHandler.GetAllBrowserExtension2FaTokenRequests) + publicRouter.GET("/browser_extensions/:extension_id/2fa_requests/:token_request_id", + m.RoutesHandler.GetBrowserExtension2FaTokenRequest) + publicRouter.POST("/browser_extensions/:extension_id/2fa_requests/:token_request_id/commands/close_2fa_request", + m.RoutesHandler.Close2FaRequest) } func (m *BrowserExtensionModule) RegisterAdminRoutes(g *gin.RouterGroup) { if m.Config.IsTestingEnv() { diff --git a/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go b/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go index e455ca9..fc8d420 100644 --- a/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go +++ b/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go @@ -18,7 +18,7 @@ func NewIconsCollectionsRelationsMysqlRepository(db *gorm.DB) *IconsCollectionsR func (r *IconsCollectionsRelationsMysqlRepository) DeleteAll(iconCollection *domain.IconsCollection) error { sql := fmt.Sprintf("UPDATE web_services SET icons_collections = %s WHERE \"%s\" MEMBER OF (icons_collections)", - "JSON_REMOVE(`icons_collections`, JSON_UNQUOTE(JSON_SEARCH(`icons_collections`, 'one', '"+iconCollection.Id.String()+"')))", + "JSON_REMOVE(`icons_collections`, JSON_UNQUOTE(JSON_SEARCH(`icons_collections`, 'one', '"+iconCollection.Id.String()+"')))", // nolint:lll iconCollection.Id.String(), ) diff --git a/internal/api/icons/app/command/icons.go b/internal/api/icons/app/command/icons.go index d4a3193..6ff29fd 100644 --- a/internal/api/icons/app/command/icons.go +++ b/internal/api/icons/app/command/icons.go @@ -68,7 +68,9 @@ func validateImage(img image.Image) error { } } - errMsg := fmt.Sprintf("Invalid image dimensions [%d %d]: allowed options are 120x120, 80x80, 40x40", imageWidth, imageHeight) + errMsg := fmt.Sprintf("Invalid image dimensions [%d %d]: allowed options are 120x120, 80x80, 40x40", + imageWidth, + imageHeight) return errors.New(errMsg) } diff --git a/internal/api/icons/app/command/icons_requests.go b/internal/api/icons/app/command/icons_requests.go index 77ef05a..7a12e4d 100644 --- a/internal/api/icons/app/command/icons_requests.go +++ b/internal/api/icons/app/command/icons_requests.go @@ -169,7 +169,9 @@ func (h *UpdateWebServiceFromIconRequestHandler) Handle(cmd *UpdateWebServiceFro return fmt.Errorf("failed to update icons collection %q: %w", webServiceIconsCollectionsIds[0], err) } } else { - webService.IconsCollections, err = h.replaceIconsCollections(webServiceIconsCollectionsIds, iconRequest.ServiceName, iconsJson) + webService.IconsCollections, err = h.replaceIconsCollections(webServiceIconsCollectionsIds, + iconRequest.ServiceName, + iconsJson) if err != nil { return fmt.Errorf("failed to replace icons collections: %w", err) } @@ -186,8 +188,11 @@ func (h *UpdateWebServiceFromIconRequestHandler) Handle(cmd *UpdateWebServiceFro return nil } -func saveIcons(iconRequest *domain.IconRequest, iconsStorage storage.FileSystemStorage, iconsRepository domain.IconsRepository) ([]string, error) { - lightIconID, err := saveIcon(iconRequest.LightIconUrl, iconRequest.ServiceName, domain.Light, iconsStorage, iconsRepository) +func saveIcons(iconRequest *domain.IconRequest, + iconsStorage storage.FileSystemStorage, + iconsRepository domain.IconsRepository) ([]string, error) { + lightIconID, err := saveIcon(iconRequest.LightIconUrl, + iconRequest.ServiceName, domain.Light, iconsStorage, iconsRepository) if err != nil { return nil, fmt.Errorf("failed to save light icon: %w", err) } @@ -197,7 +202,8 @@ func saveIcons(iconRequest *domain.IconRequest, iconsStorage storage.FileSystemS } if iconRequest.DarkIconUrl != "" { //nolint:dupl - darkIconId, err := saveIcon(iconRequest.DarkIconUrl, iconRequest.ServiceName, domain.Dark, iconsStorage, iconsRepository) + darkIconId, err := saveIcon( + iconRequest.DarkIconUrl, iconRequest.ServiceName, domain.Dark, iconsStorage, iconsRepository) if err != nil { return nil, fmt.Errorf("failed to save dark icon: %w", err) } @@ -207,7 +213,8 @@ func saveIcons(iconRequest *domain.IconRequest, iconsStorage storage.FileSystemS return iconsIds, nil } -func saveIcon(iconURL, serviceName, iconType string, iconsStorage storage.FileSystemStorage, iconsRepository domain.IconsRepository) (uuid.UUID, error) { +func saveIcon(iconURL, serviceName, iconType string, + iconsStorage storage.FileSystemStorage, iconsRepository domain.IconsRepository) (uuid.UUID, error) { iconFileName := filepath.Base(iconURL) storagePath := filepath.Join(iconsStoragePath, iconFileName) @@ -244,7 +251,9 @@ func saveIcon(iconURL, serviceName, iconType string, iconsStorage storage.FileSy return iconID, nil } -func (h *UpdateWebServiceFromIconRequestHandler) updateIconsCollection(iconsCollectionID string, name string, iconsJson []byte) error { +func (h *UpdateWebServiceFromIconRequestHandler) updateIconsCollection(iconsCollectionID string, + name string, + iconsJson []byte) error { id, err := uuid.Parse(iconsCollectionID) if err != nil { return fmt.Errorf("invalid icons collection id: %w", err) @@ -257,7 +266,9 @@ func (h *UpdateWebServiceFromIconRequestHandler) updateIconsCollection(iconsColl }) } -func (h *UpdateWebServiceFromIconRequestHandler) replaceIconsCollections(oldCollectionIds []string, serviceName string, iconsJson []byte) (datatypes.JSON, error) { +func (h *UpdateWebServiceFromIconRequestHandler) replaceIconsCollections(oldCollectionIds []string, + serviceName string, + iconsJson []byte) (datatypes.JSON, error) { for _, outdatedIconsCollectionId := range oldCollectionIds { if err := h.deleteIconsCollection(outdatedIconsCollectionId); err != nil { return nil, fmt.Errorf("failed to delete icons collection %q: %w", outdatedIconsCollectionId, err) diff --git a/internal/api/icons/service/service.go b/internal/api/icons/service/service.go index e3dae55..4ae9ebe 100644 --- a/internal/api/icons/service/service.go +++ b/internal/api/icons/service/service.go @@ -166,7 +166,9 @@ func (m *IconsModule) RegisterAdminRoutes(g *gin.RouterGroup) { g.DELETE("/mobile/icons/:icon_id", m.RoutesHandler.RemoveIcon) g.DELETE("/mobile/icons/requests/:icon_request_id", m.RoutesHandler.RemoveIconRequest) - g.POST("/mobile/icons/requests/:icon_request_id/commands/update_web_service", m.RoutesHandler.UpdateWebServiceFromIconRequest) - g.POST("/mobile/icons/requests/:icon_request_id/commands/transform_to_web_service", m.RoutesHandler.TransformToWebService) + g.POST("/mobile/icons/requests/:icon_request_id/commands/update_web_service", + m.RoutesHandler.UpdateWebServiceFromIconRequest) + g.POST("/mobile/icons/requests/:icon_request_id/commands/transform_to_web_service", + m.RoutesHandler.TransformToWebService) g.GET("/mobile/icons/requests/:icon_request_id", m.RoutesHandler.FindIconRequest) } diff --git a/internal/api/mobile/adapters/mobile_device_extensions_gorm_repository.go b/internal/api/mobile/adapters/mobile_device_extensions_gorm_repository.go index 3a07d58..37a48e7 100644 --- a/internal/api/mobile/adapters/mobile_device_extensions_gorm_repository.go +++ b/internal/api/mobile/adapters/mobile_device_extensions_gorm_repository.go @@ -32,7 +32,8 @@ func NewMobileDeviceExtensionsGormRepository(db *gorm.DB, qb *goqu.Database) *Mo } } -func (r *MobileDeviceExtensionsGormRepository) FindById(deviceId, extensionId uuid.UUID) (*domain.MobileDeviceExtension, error) { +func (r *MobileDeviceExtensionsGormRepository) FindById( + deviceId, extensionId uuid.UUID) (*domain.MobileDeviceExtension, error) { var pairedExtension *domain.MobileDeviceExtension result := r.db.First(&pairedExtension, "device_id = ? and extension_id = ?", deviceId.String(), extensionId.String()) diff --git a/internal/api/mobile/app/command/pair_mobile_with_extension.go b/internal/api/mobile/app/command/pair_mobile_with_extension.go index 9efb927..12f3424 100644 --- a/internal/api/mobile/app/command/pair_mobile_with_extension.go +++ b/internal/api/mobile/app/command/pair_mobile_with_extension.go @@ -27,7 +27,8 @@ type BrowserExtensionHasNotBeenPairedWithDevice struct { Reason string `json:"reason"` } -func NewBrowserExtensionHasBeenPairedWithDevice(deviceId, devicePublicKey string, extId uuid.UUID) *BrowserExtensionHasBeenPairedWithDevice { +func NewBrowserExtensionHasBeenPairedWithDevice(deviceId, devicePublicKey string, + extId uuid.UUID) *BrowserExtensionHasBeenPairedWithDevice { return &BrowserExtensionHasBeenPairedWithDevice{ Event: "browser_extensions.pairing.success", BrowserExtensionId: extId.String(), @@ -36,7 +37,9 @@ func NewBrowserExtensionHasBeenPairedWithDevice(deviceId, devicePublicKey string } } -func NewBrowserExtensionHasNotBeenPairedWithDevice(err error, deviceId string, extId uuid.UUID) *BrowserExtensionHasNotBeenPairedWithDevice { +func NewBrowserExtensionHasNotBeenPairedWithDevice(err error, + deviceId string, + extId uuid.UUID) *BrowserExtensionHasNotBeenPairedWithDevice { return &BrowserExtensionHasNotBeenPairedWithDevice{ Event: "browser_extensions.pairing.failure", BrowserExtensionId: extId.String(), diff --git a/internal/api/mobile/app/queries/device_browser_extensions_2fa_requests.go b/internal/api/mobile/app/queries/device_browser_extensions_2fa_requests.go index 959a76e..0bcd7a4 100644 --- a/internal/api/mobile/app/queries/device_browser_extensions_2fa_requests.go +++ b/internal/api/mobile/app/queries/device_browser_extensions_2fa_requests.go @@ -27,7 +27,8 @@ type DeviceBrowserExtension2FaRequestQueryHandler struct { Clock clock.Clock } -func (h *DeviceBrowserExtension2FaRequestQueryHandler) Handle(query *DeviceBrowserExtension2FaRequestQuery) ([]*DeviceBrowserExtension2FaRequestPresenter, error) { +func (h *DeviceBrowserExtension2FaRequestQueryHandler) Handle( + query *DeviceBrowserExtension2FaRequestQuery) ([]*DeviceBrowserExtension2FaRequestPresenter, error) { var presenter []*DeviceBrowserExtension2FaRequestPresenter sourceT := goqu.T("browser_extensions_2fa_requests") diff --git a/internal/api/mobile/app/queries/device_browser_extensions_query.go b/internal/api/mobile/app/queries/device_browser_extensions_query.go index 8faa7c9..51eaad6 100644 --- a/internal/api/mobile/app/queries/device_browser_extensions_query.go +++ b/internal/api/mobile/app/queries/device_browser_extensions_query.go @@ -25,7 +25,8 @@ type DeviceBrowserExtensionsQueryHandler struct { Qb *goqu.Database } -func (h *DeviceBrowserExtensionsQueryHandler) Handle(query *DeviceBrowserExtensionsQuery) ([]*DeviceBrowserExtensionPresenter, error) { +func (h *DeviceBrowserExtensionsQueryHandler) Handle( + query *DeviceBrowserExtensionsQuery) ([]*DeviceBrowserExtensionPresenter, error) { var presenter []*DeviceBrowserExtensionPresenter relationTable := goqu.T("mobile_device_browser_extension") diff --git a/internal/api/mobile/app/queries/paired_browser_extension.go b/internal/api/mobile/app/queries/paired_browser_extension.go index 1c166e3..d558cc6 100644 --- a/internal/api/mobile/app/queries/paired_browser_extension.go +++ b/internal/api/mobile/app/queries/paired_browser_extension.go @@ -20,7 +20,8 @@ type PairedBrowserExtensionQueryHandler struct { Qb *goqu.Database } -func (h *PairedBrowserExtensionQueryHandler) Handle(q *PairedBrowserExtensionQuery) (*PairedBrowserExtensionPresenter, error) { +func (h *PairedBrowserExtensionQueryHandler) Handle( + q *PairedBrowserExtensionQuery) (*PairedBrowserExtensionPresenter, error) { sql, _, _ := h.Qb.From("browser_extensions").Where(goqu.Ex{ "id": q.ExtensionId, }).ToSQL() diff --git a/internal/api/mobile/app/queries/whatsnew_notification.go b/internal/api/mobile/app/queries/whatsnew_notification.go index 05abeff..d7d8d92 100644 --- a/internal/api/mobile/app/queries/whatsnew_notification.go +++ b/internal/api/mobile/app/queries/whatsnew_notification.go @@ -31,7 +31,8 @@ type MobileNotificationsQueryHandler struct { Qb *goqu.Database } -func (h *MobileNotificationsQueryHandler) FindOne(query *MobileNotificationsQuery) (*MobileNotificationPresenter, error) { +func (h *MobileNotificationsQueryHandler) FindOne( + query *MobileNotificationsQuery) (*MobileNotificationPresenter, error) { ds := h.Qb.From("mobile_notifications").Where(goqu.And( goqu.C("id").Eq(query.Id), goqu.C("deleted_at").IsNull(), @@ -50,7 +51,8 @@ func (h *MobileNotificationsQueryHandler) FindOne(query *MobileNotificationsQuer return presenter, nil } -func (h *MobileNotificationsQueryHandler) FindAll(query *MobileNotificationsQuery) ([]*MobileNotificationPresenter, error) { +func (h *MobileNotificationsQueryHandler) FindAll( + query *MobileNotificationsQuery) ([]*MobileNotificationPresenter, error) { var presenter []*MobileNotificationPresenter ds := h.Qb.From("mobile_notifications").Where(goqu.And( diff --git a/internal/api/mobile/service/service.go b/internal/api/mobile/service/service.go index 8a9cb8b..51ca3bf 100644 --- a/internal/api/mobile/service/service.go +++ b/internal/api/mobile/service/service.go @@ -30,7 +30,7 @@ type MobileModule struct { Redis *redis.Client } -func NewMobileModule(config config.Configuration, gorm *gorm.DB, database *sql.DB, validate *validator.Validate, redisClient *redis.Client) *MobileModule { //nolint:funlen // This is an initialization function. +func NewMobileModule(config config.Configuration, gorm *gorm.DB, database *sql.DB, validate *validator.Validate, redisClient *redis.Client) *MobileModule { //nolint:funlen,lll // This is an initialization function. queryBuilder := db.NewQueryBuilder(database) mobileDeviceRepository := adapters.NewMobileDeviceMysqlRepository(gorm) @@ -135,12 +135,18 @@ func (m *MobileModule) RegisterPublicRoutes(router *gin.Engine) { publicRouter.GET("/mobile/notifications", m.RoutesHandler.FindAllMobileNotifications) publicRouter.GET("/mobile/notifications/:notification_id", m.RoutesHandler.FindMobileNotification) - publicRouter.POST("/mobile/devices/:device_id/commands/send_2fa_token", m.RoutesHandler.Send2FaToken) - publicRouter.GET("/mobile/devices/:device_id/browser_extensions/2fa_requests", m.RoutesHandler.GetAll2FaTokenRequests) - publicRouter.POST("/mobile/devices/:device_id/browser_extensions", m.RoutesHandler.PairMobileWithExtension) - publicRouter.DELETE("/mobile/devices/:device_id/browser_extensions/:extension_id", m.RoutesHandler.RemovePairingWithExtension) - publicRouter.GET("/mobile/devices/:device_id/browser_extensions", m.RoutesHandler.FindAllMobileAppExtensions) - publicRouter.GET("/mobile/devices/:device_id/browser_extensions/:extension_id", m.RoutesHandler.FindMobileAppExtensionById) + publicRouter.POST("/mobile/devices/:device_id/commands/send_2fa_token", + m.RoutesHandler.Send2FaToken) + publicRouter.GET("/mobile/devices/:device_id/browser_extensions/2fa_requests", + m.RoutesHandler.GetAll2FaTokenRequests) + publicRouter.POST("/mobile/devices/:device_id/browser_extensions", + m.RoutesHandler.PairMobileWithExtension) + publicRouter.DELETE("/mobile/devices/:device_id/browser_extensions/:extension_id", + m.RoutesHandler.RemovePairingWithExtension) + publicRouter.GET("/mobile/devices/:device_id/browser_extensions", + m.RoutesHandler.FindAllMobileAppExtensions) + publicRouter.GET("/mobile/devices/:device_id/browser_extensions/:extension_id", + m.RoutesHandler.FindMobileAppExtensionById) } func (m *MobileModule) RegisterAdminRoutes(g *gin.RouterGroup) { diff --git a/internal/api/support/service/service.go b/internal/api/support/service/service.go index ed8f496..3c5b14f 100644 --- a/internal/api/support/service/service.go +++ b/internal/api/support/service/service.go @@ -25,7 +25,11 @@ type SupportModule struct { Config config.Configuration } -func NewSupportModule(config config.Configuration, gorm *gorm.DB, database *sql.DB, validate *validator.Validate, debugLogsStorage storage.FileSystemStorage) *SupportModule { +func NewSupportModule(config config.Configuration, + gorm *gorm.DB, + database *sql.DB, + validate *validator.Validate, + debugLogsStorage storage.FileSystemStorage) *SupportModule { queryBuilder := db.NewQueryBuilder(database) debugLogsConfig := domain.LoadDebugLogsConfig() From 7f0b93643e42d2896cb8ac8d2b46cf0a0107f515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Dry=C5=9B?= Date: Thu, 5 Feb 2026 08:54:02 +0100 Subject: [PATCH 3/6] Update e2e-tests/system/api_test.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- e2e-tests/system/api_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/system/api_test.go b/e2e-tests/system/api_test.go index 2029c20..28d8e36 100644 --- a/e2e-tests/system/api_test.go +++ b/e2e-tests/system/api_test.go @@ -16,7 +16,7 @@ func Test_Default404Response(t *testing.T) { rawBody, err := io.ReadAll(response.Body) require.NoError(t, err) - expected := `{"Code":404,"Type":"NotFound","Description":"Requested resource can not be found","Reason":"URI not found"}` // nolint: lll + expected := `{"Code":404,"Type":"NotFound","Description":"Requested resource can not be found","Reason":"URI not found"}` // nolint:lll assert.Equal(t, 404, response.StatusCode) assert.JSONEq(t, expected, string(rawBody)) From 9a27708ee8e888d4b2b8561c5fae5d798e1bad10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Dry=C5=9B?= Date: Thu, 5 Feb 2026 08:54:37 +0100 Subject: [PATCH 4/6] Update internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../adapters/browser_extension_devices_mysql_repository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go b/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go index 173c417..3f48476 100644 --- a/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go +++ b/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go @@ -68,7 +68,7 @@ func (r *BrowserExtensionDevicesMysqlRepository) Delete(pairedDevice *domain.Ext return nil } -func (r *BrowserExtensionDevicesMysqlRepository) GetById(extensionId, deviceId uuid.UUID) (*domain.ExtensionDevice, error) { // nolint:lll, struct method is too long to make line shorter +func (r *BrowserExtensionDevicesMysqlRepository) GetById(extensionId, deviceId uuid.UUID) (*domain.ExtensionDevice, error) { // nolint:lll // struct method is too long to make line shorter var device *domain.ExtensionDevice mdbeT := goqu.T("mobile_device_browser_extension") From 890d8afc3dae6e91cf461d6725ce2465ceb6a35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Dry=C5=9B?= Date: Thu, 5 Feb 2026 08:56:30 +0100 Subject: [PATCH 5/6] rm unused --- internal/common/crypto/prng.go | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 internal/common/crypto/prng.go diff --git a/internal/common/crypto/prng.go b/internal/common/crypto/prng.go deleted file mode 100644 index fcc8c7b..0000000 --- a/internal/common/crypto/prng.go +++ /dev/null @@ -1,19 +0,0 @@ -package crypto - -import ( - "crypto/rand" - "encoding/hex" -) - -func GenerateNonce() (string, error) { - bytes := make([]byte, 32) - - _, err := rand.Read(bytes) - - if err != nil { - return "", err - } - - return hex.EncodeToString(bytes), nil - // return base64.URLEncoding.EncodeToString(nonceBytes), nil -} From 1e8fc73b43a8e9303e8c62e0452672d9dfa56988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Dry=C5=9B?= Date: Thu, 5 Feb 2026 09:03:37 +0100 Subject: [PATCH 6/6] review comments --- .golangci.yml | 2 ++ e2e-tests/system/api_test.go | 2 +- .../browser_extension_2fa_request_mysql_repository.go | 4 ++-- .../adapters/browser_extension_devices_mysql_repository.go | 2 +- .../adapters/icons_collections_relations_gorm_repository.go | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index d7f8940..477f6b3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -85,6 +85,8 @@ linters: # - wrapcheck - zerologlint settings: + lll: + line-length: 160 errcheck: check-type-assertions: true verbose: true diff --git a/e2e-tests/system/api_test.go b/e2e-tests/system/api_test.go index 28d8e36..c51950c 100644 --- a/e2e-tests/system/api_test.go +++ b/e2e-tests/system/api_test.go @@ -16,7 +16,7 @@ func Test_Default404Response(t *testing.T) { rawBody, err := io.ReadAll(response.Body) require.NoError(t, err) - expected := `{"Code":404,"Type":"NotFound","Description":"Requested resource can not be found","Reason":"URI not found"}` // nolint:lll + expected := `{"Code":404,"Type":"NotFound","Description":"Requested resource can not be found","Reason":"URI not found"}` assert.Equal(t, 404, response.StatusCode) assert.JSONEq(t, expected, string(rawBody)) diff --git a/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go b/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go index 122a682..53e9f76 100644 --- a/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go +++ b/internal/api/browser_extension/adapters/browser_extension_2fa_request_mysql_repository.go @@ -50,7 +50,7 @@ func (r *BrowserExtension2FaRequestsMysqlRepository) Delete(request *domain.Brow return nil } -func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(extensionId uuid.UUID) []*domain.BrowserExtension2FaRequest { // nolint:lll // struct name is too long to make line shorter +func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(extensionId uuid.UUID) []*domain.BrowserExtension2FaRequest { var requests []*domain.BrowserExtension2FaRequest r.db.Find(&requests, "extension_id = ?", extensionId.String()) @@ -58,7 +58,7 @@ func (r *BrowserExtension2FaRequestsMysqlRepository) FindPendingByExtensionId(ex return requests } -func (r *BrowserExtension2FaRequestsMysqlRepository) FindById(tokenRequestId, extensionId uuid.UUID) (*domain.BrowserExtension2FaRequest, error) { // nolint:lll // struct name is too long to make line shorter +func (r *BrowserExtension2FaRequestsMysqlRepository) FindById(tokenRequestId, extensionId uuid.UUID) (*domain.BrowserExtension2FaRequest, error) { var request *domain.BrowserExtension2FaRequest result := r.db.First(&request, "extension_id = ? AND id = ?", extensionId.String(), tokenRequestId.String()) diff --git a/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go b/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go index 3f48476..66aa6ef 100644 --- a/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go +++ b/internal/api/browser_extension/adapters/browser_extension_devices_mysql_repository.go @@ -68,7 +68,7 @@ func (r *BrowserExtensionDevicesMysqlRepository) Delete(pairedDevice *domain.Ext return nil } -func (r *BrowserExtensionDevicesMysqlRepository) GetById(extensionId, deviceId uuid.UUID) (*domain.ExtensionDevice, error) { // nolint:lll // struct method is too long to make line shorter +func (r *BrowserExtensionDevicesMysqlRepository) GetById(extensionId, deviceId uuid.UUID) (*domain.ExtensionDevice, error) { var device *domain.ExtensionDevice mdbeT := goqu.T("mobile_device_browser_extension") diff --git a/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go b/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go index fc8d420..e455ca9 100644 --- a/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go +++ b/internal/api/icons/adapters/icons_collections_relations_gorm_repository.go @@ -18,7 +18,7 @@ func NewIconsCollectionsRelationsMysqlRepository(db *gorm.DB) *IconsCollectionsR func (r *IconsCollectionsRelationsMysqlRepository) DeleteAll(iconCollection *domain.IconsCollection) error { sql := fmt.Sprintf("UPDATE web_services SET icons_collections = %s WHERE \"%s\" MEMBER OF (icons_collections)", - "JSON_REMOVE(`icons_collections`, JSON_UNQUOTE(JSON_SEARCH(`icons_collections`, 'one', '"+iconCollection.Id.String()+"')))", // nolint:lll + "JSON_REMOVE(`icons_collections`, JSON_UNQUOTE(JSON_SEARCH(`icons_collections`, 'one', '"+iconCollection.Id.String()+"')))", iconCollection.Id.String(), )