mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2026-05-10 22:38:10 +00:00
105 lines
91 KiB
HTML
105 lines
91 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>golangci-lint</title>
|
|
<link rel="shortcut icon" type="image/png" href="https://golangci-lint.run/favicon-32x32.png">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.2/css/bulma.min.css"
|
|
integrity="sha512-byErQdWdTqREz6DLAA9pCnLbdoGGhXfU6gm1c8bkf7F51JVmUBlayGe2A31VpXWQP+eiJ3ilTAZHCR3vmMyybA=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"/>
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/styles/default.min.css"
|
|
integrity="sha512-kZqGbhf9JTB4bVJ0G8HCkqmaPcRgo88F0dneK30yku5Y/dep7CZfCnNml2Je/sY4lBoqoksXz4PtVXS4GHSUzQ=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"/>
|
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/highlight.min.js"
|
|
integrity="sha512-s+tOYYcC3Jybgr9mVsdAxsRYlGNq4mlAurOrfNuGMQ/SCofNPu92tjE7YRZCsdEtWL1yGkqk15fU/ark206YTg=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.2/languages/go.min.js"
|
|
integrity="sha512-+UYV2NyyynWEQcZ4sMTKmeppyV331gqvMOGZ61/dqc89Tn1H40lF05ACd03RSD9EWwGutNwKj256mIR8waEJBQ=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"
|
|
integrity="sha512-qlzIeUtTg7eBpmEaS12NZgxz52YYZVF5myj89mjJEesBd/oE9UPsYOX2QAXzvOAZYEvQohKdcY8zKE02ifXDmA=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
<script type="text/javascript"
|
|
src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"
|
|
integrity="sha512-9jGNr5Piwe8nzLLYTk8QrEMPfjGU0px80GYzKZUxi7lmCfrBjtyCc1V5kkS5vxVwwIB7Qpzc7UxLiQxfAN30dw=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"
|
|
integrity="sha512-kp7YHLxuJDJcOzStgd6vtpxr4ZU9kjn77e6dBsivSz+pUuAuMlE2UTdKB7jjsWT84qbS8kdCWHPETnP/ctrFsA=="
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
</head>
|
|
<body>
|
|
<section class="section">
|
|
<div class="container">
|
|
<div id="content"></div>
|
|
</div>
|
|
</section>
|
|
<script>
|
|
const data = {"Issues":[{"Title":"653-714 lines are duplicate of `internal/controller/oidc_controller_test.go:715-776`","Pos":"internal/controller/oidc_controller_test.go:653","Linter":"dupl","Code":"\t\t{\n\t\t\tdescription: \"Ensure S256 PKCE succeeds\",\n\t\t\tmiddlewares: []gin.HandlerFunc{\n\t\t\t\tsimpleCtx,\n\t\t\t},\n\t\t\trun: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {\n\t\t\t\thasher := sha256.New()\n\t\t\t\thasher.Write([]byte(\"some-challenge\"))\n\t\t\t\tcodeChallenge := hasher.Sum(nil)\n\t\t\t\tcodeChallengeEncoded := base64.RawURLEncoding.EncodeToString(codeChallenge)\n\t\t\t\treqBody := service.AuthorizeRequest{\n\t\t\t\t\tScope: \"openid\",\n\t\t\t\t\tResponseType: \"code\",\n\t\t\t\t\tClientID: \"some-client-id\",\n\t\t\t\t\tRedirectURI: \"https://test.example.com/callback\",\n\t\t\t\t\tState: \"some-state\",\n\t\t\t\t\tNonce: \"some-nonce\",\n\t\t\t\t\tCodeChallenge: codeChallengeEncoded,\n\t\t\t\t\tCodeChallengeMethod: \"S256\",\n\t\t\t\t}\n\t\t\t\treqBodyBytes, err := json.Marshal(reqBody)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\treq := httptest.NewRequest(http.MethodPost, \"/api/oidc/authorize\", strings.NewReader(string(reqBodyBytes)))\n\t\t\t\treq.Header.Set(\"Content-Type\", \"application/json\")\n\t\t\t\trouter.ServeHTTP(recorder, req)\n\t\t\t\tassert.Equal(t, 200, recorder.Code)\n\n\t\t\t\tvar res map[string]any\n\n\t\t\t\terr = json.Unmarshal(recorder.Body.Bytes(), \u0026res)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\tredirectURI := res[\"redirect_uri\"].(string)\n\t\t\t\turl, err := url.Parse(redirectURI)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\tqueryParams := url.Query()\n\t\t\t\tassert.Equal(t, \"some-state\", queryParams.Get(\"state\"))\n\n\t\t\t\tcode := queryParams.Get(\"code\")\n\t\t\t\tassert.NotEmpty(t, code)\n\n\t\t\t\t// Now exchange the code for a token\n\t\t\t\trecorder = httptest.NewRecorder()\n\t\t\t\ttokenReqBody := controller.TokenRequest{\n\t\t\t\t\tGrantType: \"authorization_code\",\n\t\t\t\t\tCode: code,\n\t\t\t\t\tRedirectURI: \"https://test.example.com/callback\",\n\t\t\t\t\tCodeVerifier: \"some-challenge\",\n\t\t\t\t}\n\t\t\t\treqBodyEncoded, err := query.Values(tokenReqBody)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\treq = httptest.NewRequest(http.MethodPost, \"/api/oidc/token\", strings.NewReader(reqBodyEncoded.Encode()))\n\t\t\t\treq.Header.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\t\t\t\treq.SetBasicAuth(\"some-client-id\", \"some-client-secret\")\n\t\t\t\trouter.ServeHTTP(recorder, req)\n\n\t\t\t\tassert.Equal(t, 200, recorder.Code)\n\t\t\t},\n\t\t},"},{"Title":"715-776 lines are duplicate of `internal/controller/oidc_controller_test.go:653-714`","Pos":"internal/controller/oidc_controller_test.go:715","Linter":"dupl","Code":"\t\t{\n\t\t\tdescription: \"Ensure request with invalid PKCE fails\",\n\t\t\tmiddlewares: []gin.HandlerFunc{\n\t\t\t\tsimpleCtx,\n\t\t\t},\n\t\t\trun: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {\n\t\t\t\thasher := sha256.New()\n\t\t\t\thasher.Write([]byte(\"some-challenge\"))\n\t\t\t\tcodeChallenge := hasher.Sum(nil)\n\t\t\t\tcodeChallengeEncoded := base64.RawURLEncoding.EncodeToString(codeChallenge)\n\t\t\t\treqBody := service.AuthorizeRequest{\n\t\t\t\t\tScope: \"openid\",\n\t\t\t\t\tResponseType: \"code\",\n\t\t\t\t\tClientID: \"some-client-id\",\n\t\t\t\t\tRedirectURI: \"https://test.example.com/callback\",\n\t\t\t\t\tState: \"some-state\",\n\t\t\t\t\tNonce: \"some-nonce\",\n\t\t\t\t\tCodeChallenge: codeChallengeEncoded,\n\t\t\t\t\tCodeChallengeMethod: \"S256\",\n\t\t\t\t}\n\t\t\t\treqBodyBytes, err := json.Marshal(reqBody)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\treq := httptest.NewRequest(http.MethodPost, \"/api/oidc/authorize\", strings.NewReader(string(reqBodyBytes)))\n\t\t\t\treq.Header.Set(\"Content-Type\", \"application/json\")\n\t\t\t\trouter.ServeHTTP(recorder, req)\n\t\t\t\tassert.Equal(t, 200, recorder.Code)\n\n\t\t\t\tvar res map[string]any\n\n\t\t\t\terr = json.Unmarshal(recorder.Body.Bytes(), \u0026res)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\tredirectURI := res[\"redirect_uri\"].(string)\n\t\t\t\turl, err := url.Parse(redirectURI)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\tqueryParams := url.Query()\n\t\t\t\tassert.Equal(t, \"some-state\", queryParams.Get(\"state\"))\n\n\t\t\t\tcode := queryParams.Get(\"code\")\n\t\t\t\tassert.NotEmpty(t, code)\n\n\t\t\t\t// Now exchange the code for a token\n\t\t\t\trecorder = httptest.NewRecorder()\n\t\t\t\ttokenReqBody := controller.TokenRequest{\n\t\t\t\t\tGrantType: \"authorization_code\",\n\t\t\t\t\tCode: code,\n\t\t\t\t\tRedirectURI: \"https://test.example.com/callback\",\n\t\t\t\t\tCodeVerifier: \"some-challenge-1\",\n\t\t\t\t}\n\t\t\t\treqBodyEncoded, err := query.Values(tokenReqBody)\n\t\t\t\tassert.NoError(t, err)\n\n\t\t\t\treq = httptest.NewRequest(http.MethodPost, \"/api/oidc/token\", strings.NewReader(reqBodyEncoded.Encode()))\n\t\t\t\treq.Header.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\t\t\t\treq.SetBasicAuth(\"some-client-id\", \"some-client-secret\")\n\t\t\t\trouter.ServeHTTP(recorder, req)\n\n\t\t\t\tassert.Equal(t, 400, recorder.Code)\n\t\t\t},\n\t\t},"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"client name is required. use tinyauth oidc create \u003cname\u003e\\\")\"","Pos":"cmd/tinyauth/create_oidc_client.go:23:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"client name is required. use tinyauth oidc create \u003cname\u003e\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"client name can only contain alphanumeric characters and hyphens\\\")\"","Pos":"cmd/tinyauth/create_oidc_client.go:31:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"client name can only contain alphanumeric characters and hyphens\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"username cannot be empty\\\")\"","Pos":"cmd/tinyauth/create_user.go:50:16","Linter":"err113","Code":"\t\t\t\t\t\t\t\treturn errors.New(\"username cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"password cannot be empty\\\")\"","Pos":"cmd/tinyauth/create_user.go:57:16","Linter":"err113","Code":"\t\t\t\t\t\t\t\treturn errors.New(\"password cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"username and password cannot be empty\\\")\"","Pos":"cmd/tinyauth/create_user.go:75:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"username and password cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"user cannot be empty\\\")\"","Pos":"cmd/tinyauth/generate_totp.go:50:16","Linter":"err113","Code":"\t\t\t\t\t\t\t\treturn errors.New(\"user cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"user already has a TOTP secret\\\")\"","Pos":"cmd/tinyauth/generate_totp.go:74:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"user already has a TOTP secret\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"could not determine app url\\\")\"","Pos":"cmd/tinyauth/healthcheck.go:48:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"could not determine app url\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"service is not healthy, got: %s\\\", resp.Status)\"","Pos":"cmd/tinyauth/healthcheck.go:68:12","Linter":"err113","Code":"\t\t\t\treturn fmt.Errorf(\"service is not healthy, got: %s\", resp.Status)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"user cannot be empty\\\")\"","Pos":"cmd/tinyauth/verify_user.go:54:16","Linter":"err113","Code":"\t\t\t\t\t\t\t\treturn errors.New(\"user cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"username cannot be empty\\\")\"","Pos":"cmd/tinyauth/verify_user.go:61:16","Linter":"err113","Code":"\t\t\t\t\t\t\t\treturn errors.New(\"username cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"password cannot be empty\\\")\"","Pos":"cmd/tinyauth/verify_user.go:68:16","Linter":"err113","Code":"\t\t\t\t\t\t\t\treturn errors.New(\"password cannot be empty\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"username is incorrect\\\")\"","Pos":"cmd/tinyauth/verify_user.go:91:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"username is incorrect\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"TOTP code incorrect\\\")\"","Pos":"cmd/tinyauth/verify_user.go:112:12","Linter":"err113","Code":"\t\t\t\treturn errors.New(\"TOTP code incorrect\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"app URL cannot be empty, perhaps config loading failed\\\")\"","Pos":"internal/bootstrap/app_bootstrap.go:51:10","Linter":"err113","Code":"\t\treturn errors.New(\"app URL cannot be empty, perhaps config loading failed\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"session max lifetime cannot be less than session expiry\\\")\"","Pos":"internal/bootstrap/app_bootstrap.go:63:10","Linter":"err113","Code":"\t\treturn errors.New(\"session max lifetime cannot be less than session expiry\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"no authentication providers configured\\\")\"","Pos":"internal/bootstrap/app_bootstrap.go:198:10","Linter":"err113","Code":"\t\treturn errors.New(\"no authentication providers configured\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"err_oidc_not_configured\\\")\"","Pos":"internal/controller/oidc_controller.go:113:32","Linter":"err113","Code":"\t\tcontroller.authorizeError(c, errors.New(\"err_oidc_not_configured\"), \"OIDC not configured\", \"This instance is not configured for OIDC\", \"\", \"\", \"\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"err user not logged in\\\")\"","Pos":"internal/controller/oidc_controller.go:126:32","Linter":"err113","Code":"\t\tcontroller.authorizeError(c, errors.New(\"err user not logged in\"), \"User not logged in\", \"The user is not logged in\", \"\", \"\", \"\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"unsupported proxy type: %v\\\", proxy)\"","Pos":"internal/controller/proxy_controller.go:379:13","Linter":"err113","Code":"\t\treturn 0, fmt.Errorf(\"unsupported proxy type: %v\", proxy)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"x-forwarded-host not found\\\")\"","Pos":"internal/controller/proxy_controller.go:389:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"x-forwarded-host not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"x-forwarded-uri not found\\\")\"","Pos":"internal/controller/proxy_controller.go:395:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"x-forwarded-uri not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"x-forwarded-proto not found\\\")\"","Pos":"internal/controller/proxy_controller.go:401:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"x-forwarded-proto not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"x-original-url not found\\\")\"","Pos":"internal/controller/proxy_controller.go:421:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"x-original-url not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"host not found\\\")\"","Pos":"internal/controller/proxy_controller.go:432:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"host not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"proto not found\\\")\"","Pos":"internal/controller/proxy_controller.go:438:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"proto not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"x-forwarded-proto not found\\\")\"","Pos":"internal/controller/proxy_controller.go:458:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"x-forwarded-proto not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"host not found\\\")\"","Pos":"internal/controller/proxy_controller.go:465:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, errors.New(\"host not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"unsupported auth module: %v\\\", module)\"","Pos":"internal/controller/proxy_controller.go:521:25","Linter":"err113","Code":"\treturn ProxyContext{}, fmt.Errorf(\"unsupported auth module: %v\", module)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"no auth modules supported for proxy: %v\\\", req.Proxy)\"","Pos":"internal/controller/proxy_controller.go:542:26","Linter":"err113","Code":"\t\treturn ProxyContext{}, fmt.Errorf(\"no auth modules supported for proxy: %v\", req.Proxy)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"local user not found\\\")\"","Pos":"internal/middleware/context_middleware.go:134:21","Linter":"err113","Code":"\t\t\treturn nil, nil, errors.New(\"local user not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"user from session cookie is not ldap\\\")\"","Pos":"internal/middleware/context_middleware.go:153:21","Linter":"err113","Code":"\t\t\treturn nil, nil, errors.New(\"user from session cookie is not ldap\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"oauth provider from session cookie not found: %s\\\", userContext.OAuth.ID)\"","Pos":"internal/middleware/context_middleware.go:168:21","Linter":"err113","Code":"\t\t\treturn nil, nil, fmt.Errorf(\"oauth provider from session cookie not found: %s\", userContext.OAuth.ID)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"email from session cookie not whitelisted: %s\\\", userContext.OAuth.Email)\"","Pos":"internal/middleware/context_middleware.go:174:21","Linter":"err113","Code":"\t\t\treturn nil, nil, fmt.Errorf(\"email from session cookie not whitelisted: %s\", userContext.OAuth.Email)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"user with totp not allowed to login via basic auth: %s\\\", username)\"","Pos":"internal/middleware/context_middleware.go:219:21","Linter":"err113","Code":"\t\t\treturn nil, nil, fmt.Errorf(\"user with totp not allowed to login via basic auth: %s\", username)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"failed to get user context\\\")\"","Pos":"internal/model/context.go:80:15","Linter":"err113","Code":"\t\treturn nil, errors.New(\"failed to get user context\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"invalid user context type\\\")\"","Pos":"internal/model/context.go:86:15","Linter":"err113","Code":"\t\treturn nil, errors.New(\"invalid user context type\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"incomplete user context\\\")\"","Pos":"internal/model/context.go:90:15","Linter":"err113","Code":"\t\treturn nil, errors.New(\"incomplete user context\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"unknown user search type\\\")\"","Pos":"internal/service/auth_service.go:171:10","Linter":"err113","Code":"\t\treturn errors.New(\"unknown user search type\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"user authentication failed\\\")\"","Pos":"internal/service/auth_service.go:174:9","Linter":"err113","Code":"\treturn errors.New(\"user authentication failed\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"ldap service not configured\\\")\"","Pos":"internal/service/auth_service.go:193:15","Linter":"err113","Code":"\t\treturn nil, errors.New(\"ldap service not configured\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"session not found\\\")\"","Pos":"internal/service/auth_service.go:424:16","Linter":"err113","Code":"\t\t\treturn nil, errors.New(\"session not found\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"session max lifetime exceeded\\\")\"","Pos":"internal/service/auth_service.go:439:16","Linter":"err113","Code":"\t\t\treturn nil, errors.New(\"session max lifetime exceeded\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"errors.New(\\\"session expired\\\")\"","Pos":"internal/service/auth_service.go:449:15","Linter":"err113","Code":"\t\treturn nil, errors.New(\"session expired\")"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"oauth service not found: %s\\\", serviceName)\"","Pos":"internal/service/auth_service.go:654:37","Linter":"err113","Code":"\t\treturn \"\", OAuthPendingSession{}, fmt.Errorf(\"oauth service not found: %s\", serviceName)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"oauth token not found for session: %s\\\", sessionId)\"","Pos":"internal/service/auth_service.go:714:15","Linter":"err113","Code":"\t\treturn nil, fmt.Errorf(\"oauth token not found for session: %s\", sessionId)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"oauth session not found: %s\\\", sessionId)\"","Pos":"internal/service/auth_service.go:767:34","Linter":"err113","Code":"\t\treturn \u0026OAuthPendingSession{}, fmt.Errorf(\"oauth session not found: %s\", sessionId)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"oauth session expired: %s\\\", sessionId)\"","Pos":"internal/service/auth_service.go:775:34","Linter":"err113","Code":"\t\treturn \u0026OAuthPendingSession{}, fmt.Errorf(\"oauth session expired: %s\", sessionId)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"multiple or no entries found for user %s\\\", username)\"","Pos":"internal/service/ldap_service.go:182:14","Linter":"err113","Code":"\t\treturn \"\", fmt.Errorf(\"multiple or no entries found for user %s\", username)"},{"Title":"do not define dynamic errors, use wrapped static errors instead: \"fmt.Errorf(\\\"invalid DN format: %s\\\", dn)\"","Pos":"internal/service/ldap_service.go:225:23","Linter":"err113","Code":"\t\t\treturn []string{}, fmt.Errorf(\"invalid DN format: %s\", dn)"},{"Title":"Error return value of `encoding/json.Marshal` is not checked","Pos":"internal/service/oidc_service_test.go:24:17","Linter":"errchkjson","Code":"\taddrJSON, _ := json.Marshal(addr)"},{"Title":"missing cases in switch of type reflect.Kind: reflect.Invalid, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface, reflect.Pointer|reflect.Ptr, reflect.UnsafePointer","Pos":"gen/gen.go:26:3","Linter":"exhaustive","Code":"\t\tswitch fieldType.Kind() {"},{"Title":"missing cases in switch of type reflect.Kind: reflect.Invalid, reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer|reflect.Ptr, reflect.Struct, reflect.UnsafePointer","Pos":"gen/gen_env.go:61:2","Linter":"exhaustive","Code":"\tswitch childValue.Kind() {"},{"Title":"missing cases in switch of type reflect.Kind: reflect.Invalid, reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer|reflect.Ptr, reflect.String, reflect.Struct, reflect.UnsafePointer","Pos":"gen/gen_md.go:63:2","Linter":"exhaustive","Code":"\tswitch childValue.Kind() {"},{"Title":"missing cases in switch of type model.ProviderType: model.ProviderBasicAuth","Pos":"internal/middleware/context_middleware.go:129:2","Linter":"exhaustive","Code":"\tswitch userContext.Provider {"},{"Title":"missing cases in switch of type watch.EventType: watch.Bookmark, watch.Error","Pos":"internal/service/kubernetes_service.go:215:4","Linter":"exhaustive","Code":"\t\t\tswitch event.Type {"},{"Title":"use of `fmt.Print` forbidden by pattern `^(fmt\\.Print(|f|ln)|print|println)$`","Pos":"cmd/tinyauth/create_oidc_client.go:68:4","Linter":"forbidigo","Code":"\t\t\tfmt.Print(out)"},{"Title":"use of `fmt.Printf` forbidden by pattern `^(fmt\\.Print(|f|ln)|print|println)$`","Pos":"cmd/tinyauth/version.go:17:4","Linter":"forbidigo","Code":"\t\t\tfmt.Printf(\"Version: %s\\n\", model.Version)"},{"Title":"use of `fmt.Printf` forbidden by pattern `^(fmt\\.Print(|f|ln)|print|println)$`","Pos":"cmd/tinyauth/version.go:18:4","Linter":"forbidigo","Code":"\t\t\tfmt.Printf(\"Commit Hash: %s\\n\", model.CommitHash)"},{"Title":"use of `fmt.Printf` forbidden by pattern `^(fmt\\.Print(|f|ln)|print|println)$`","Pos":"cmd/tinyauth/version.go:19:4","Linter":"forbidigo","Code":"\t\t\tfmt.Printf(\"Build Timestamp: %s\\n\", model.BuildTimestamp)"},{"Title":"type assertion must be checked","Pos":"internal/controller/oidc_controller_test.go:171:5","Linter":"forcetypeassert","Code":"\t\t\t\tredirectURI := res[\"redirect_uri\"].(string)"},{"Title":"type assertion must be checked","Pos":"internal/controller/oidc_controller_test.go:281:5","Linter":"forcetypeassert","Code":"\t\t\t\tredirectURI := authorizeRes[\"redirect_uri\"].(string)"},{"Title":"type assertion must be checked","Pos":"internal/controller/oidc_controller_test.go:325:5","Linter":"forcetypeassert","Code":"\t\t\t\trefreshToken := tokenRes[\"refresh_token\"].(string)"},{"Title":"right hand must be only type assertion","Pos":"internal/service/oidc_service.go:229:3","Linter":"forcetypeassert","Code":"\t\tder := x509.MarshalPKCS1PublicKey(publicKey.(*rsa.PublicKey))"},{"Title":"unexported method \"logPath\" for struct \"ZerologMiddleware\" should be placed after the exported method \"Middleware\"","Pos":"internal/middleware/zerolog_middleware.go:30:1","Linter":"funcorder","Code":"func (m *ZerologMiddleware) logPath(path string) bool {"},{"Title":"constructor \"NewDefaultConfiguration\" for struct \"Config\" should be placed after the struct declaration","Pos":"internal/model/config.go:4:1","Linter":"funcorder","Code":"func NewDefaultConfiguration() *Config {"},{"Title":"unexported method \"lookupStaticACLs\" for struct \"AccessControlsService\" should be placed after the exported method \"GetAccessControls\"","Pos":"internal/service/access_controls_service.go:30:1","Linter":"funcorder","Code":"func (acls *AccessControlsService) lookupStaticACLs(domain string) *model.App {"},{"Title":"unexported method \"ensureOAuthSessionLimit\" for struct \"AuthService\" should be placed after the exported method \"ClearRateLimitsTestingOnly\"","Pos":"internal/service/auth_service.go:781:1","Linter":"funcorder","Code":"func (auth *AuthService) ensureOAuthSessionLimit() {"},{"Title":"unexported method \"lockdownMode\" for struct \"AuthService\" should be placed after the exported method \"ClearRateLimitsTestingOnly\"","Pos":"internal/service/auth_service.go:819:1","Linter":"funcorder","Code":"func (auth *AuthService) lockdownMode() {"},{"Title":"unexported method \"getContainers\" for struct \"DockerService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/docker_service.go:55:1","Linter":"funcorder","Code":"func (docker *DockerService) getContainers() ([]container.Summary, error) {"},{"Title":"unexported method \"addIngressApps\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:58:1","Linter":"funcorder","Code":"func (k *KubernetesService) addIngressApps(namespace, name string, apps []ingressApp) {"},{"Title":"unexported method \"removeIngress\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:79:1","Linter":"funcorder","Code":"func (k *KubernetesService) removeIngress(namespace, name string) {"},{"Title":"unexported method \"getByDomain\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:94:1","Linter":"funcorder","Code":"func (k *KubernetesService) getByDomain(domain string) *model.App {"},{"Title":"unexported method \"getByAppName\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:112:1","Linter":"funcorder","Code":"func (k *KubernetesService) getByAppName(appName string) *model.App {"},{"Title":"unexported method \"updateFromItem\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:130:1","Linter":"funcorder","Code":"func (k *KubernetesService) updateFromItem(item *unstructured.Unstructured) {"},{"Title":"unexported method \"resyncGVR\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:170:1","Linter":"funcorder","Code":"func (k *KubernetesService) resyncGVR(gvr schema.GroupVersionResource) error {"},{"Title":"unexported method \"runWatcher\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:192:1","Linter":"funcorder","Code":"func (k *KubernetesService) runWatcher(gvr schema.GroupVersionResource, w watch.Interface, resyncTicker *time.Ticker) bool {"},{"Title":"unexported method \"watchGVR\" for struct \"KubernetesService\" should be placed after the exported method \"GetLabels\"","Pos":"internal/service/kubernetes_service.go:230:1","Linter":"funcorder","Code":"func (k *KubernetesService) watchGVR(gvr schema.GroupVersionResource) {"},{"Title":"unexported method \"connect\" for struct \"LdapService\" should be placed after the exported method \"Bind\"","Pos":"internal/service/ldap_service.go:119:1","Linter":"funcorder","Code":"func (ldap *LdapService) connect() (*ldapgo.Conn, error) {"},{"Title":"unexported method \"filterScopes\" for struct \"OIDCService\" should be placed after the exported method \"ValidatePKCE\"","Pos":"internal/service/oidc_service.go:356:1","Linter":"funcorder","Code":"func (service *OIDCService) filterScopes(scopes []string) []string {"},{"Title":"unexported method \"generateIDToken\" for struct \"OIDCService\" should be placed after the exported method \"ValidatePKCE\"","Pos":"internal/service/oidc_service.go:476:1","Linter":"funcorder","Code":"func (service *OIDCService) generateIDToken(client model.OIDCClientConfig, user repository.OidcUserinfo, scope string, nonce string) (string, error) {"},{"Title":"contextSkipPathsPrefix is a global variable","Pos":"internal/middleware/context_middleware.go:22:2","Linter":"gochecknoglobals","Code":"\tcontextSkipPathsPrefix = []string{"},{"Title":"loggerSkipPathsPrefix is a global variable","Pos":"internal/middleware/zerolog_middleware.go:13:2","Linter":"gochecknoglobals","Code":"\tloggerSkipPathsPrefix = []string{"},{"Title":"presets is a global variable","Pos":"internal/service/oauth_broker_service.go:26:5","Linter":"gochecknoglobals","Code":"var presets = map[string]func(config model.OAuthServiceConfig) *OAuthService{"},{"Title":"SupportedResponseTypes is a global variable","Pos":"internal/service/oidc_service.go:34:2","Linter":"gochecknoglobals","Code":"\tSupportedResponseTypes = []string{\"code\"}"},{"Title":"SupportedGrantTypes is a global variable","Pos":"internal/service/oidc_service.go:35:2","Linter":"gochecknoglobals","Code":"\tSupportedGrantTypes = []string{\"authorization_code\", \"refresh_token\"}"},{"Title":"HTTP is a global variable","Pos":"internal/utils/tlog/log_wrapper.go:21:2","Linter":"gochecknoglobals","Code":"\tHTTP zerolog.Logger"},{"Title":"App is a global variable","Pos":"internal/utils/tlog/log_wrapper.go:22:2","Linter":"gochecknoglobals","Code":"\tApp zerolog.Logger"},{"Title":"ifElseChain: rewrite if-else to switch statement","Pos":"internal/controller/oidc_controller.go:417:2","Linter":"gocritic","Code":"\tif authorization != \"\" {"},{"Title":"appendAssign: append result not assigned to the same slice","Pos":"internal/service/auth_service.go:579:16","Linter":"gocritic","Code":"\tblockedIps := append(auth.config.IP.Block, acls.IP.Block...)"},{"Title":"appendAssign: append result not assigned to the same slice","Pos":"internal/service/auth_service.go:580:16","Linter":"gocritic","Code":"\tallowedIPs := append(auth.config.IP.Allow, acls.IP.Allow...)"},{"Title":"G704: SSRF via taint analysis","Pos":"cmd/tinyauth/healthcheck.go:57:31","Linter":"gosec","Code":"\t\t\treq, err := http.NewRequest(http.MethodGet, appUrl+\"/api/healthz\", nil)"},{"Title":"G704: SSRF via taint analysis","Pos":"cmd/tinyauth/healthcheck.go:62:26","Linter":"gosec","Code":"\t\t\tresp, err := client.Do(req)"},{"Title":"G306: Expect WriteFile permissions to be 0600 or less","Pos":"gen/gen_env.go:39:8","Linter":"gosec","Code":"\terr = os.WriteFile(\".env.example\", compiled, 0644)"},{"Title":"G306: Expect WriteFile permissions to be 0600 or less","Pos":"gen/gen_md.go:40:8","Linter":"gosec","Code":"\terr = os.WriteFile(\"config.gen.md\", compiled, 0644)"},{"Title":"G301: Expect directory permissions to be 0750 or less","Pos":"internal/controller/resources_controller_test.go:27:9","Linter":"gosec","Code":"\terr := os.Mkdir(resourcesControllerCfg.Path, 0777)"},{"Title":"G117: Marshaled struct field \"Password\" (JSON key \"password\") matches secret pattern","Pos":"internal/controller/user_controller_test.go:139:26","Linter":"gosec","Code":"\t\t\t\tloginReqBody, err := json.Marshal(loginReq)"},{"Title":"G117: Marshaled struct field \"Password\" (JSON key \"password\") matches secret pattern","Pos":"internal/controller/user_controller_test.go:167:26","Linter":"gosec","Code":"\t\t\t\tloginReqBody, err := json.Marshal(loginReq)"},{"Title":"G117: Marshaled struct field \"Password\" (JSON key \"password\") matches secret pattern","Pos":"internal/controller/user_controller_test.go:188:26","Linter":"gosec","Code":"\t\t\t\tloginReqBody, err := json.Marshal(loginReq)"},{"Title":"G104: Errors unhandled","Pos":"internal/controller/well_known_controller.go:83:2","Linter":"gosec","Code":"\tc.Writer.WriteString(`{\"keys\":[`)"},{"Title":"G104: Errors unhandled","Pos":"internal/middleware/context_middleware.go:172:4","Linter":"gosec","Code":"\t\t\tm.auth.DeleteSession(ctx, uuid) //nolint:errcheck"},{"Title":"G101: Potential hardcoded credentials","Pos":"internal/middleware/context_middleware_test.go:30:4","Linter":"gosec","Code":"\t\t\t{\n\t\t\t\tUsername: \"testuser\",\n\t\t\t\tPassword: \"$2a$10$ZwVYQH07JX2zq7Fjkt3gU.BjwvvwPeli4OqOno04RQIv0P7usBrXa\", // password\n\t\t\t},"},{"Title":"G101: Potential hardcoded credentials","Pos":"internal/middleware/context_middleware_test.go:34:4","Linter":"gosec","Code":"\t\t\t{\n\t\t\t\tUsername: \"totpuser\",\n\t\t\t\tPassword: \"$2a$10$ZwVYQH07JX2zq7Fjkt3gU.BjwvvwPeli4OqOno04RQIv0P7usBrXa\", // password\n\t\t\t\tTOTPSecret: \"JPIEBDKJH6UGWJMX66RR3S55UFP2SGKK\",\n\t\t\t},"},{"Title":"G104: Errors unhandled","Pos":"internal/middleware/ui_middleware.go:52:4","Linter":"gosec","Code":"\t\t\tc.Writer.Write([]byte(\"User-agent: *\\nDisallow: /\\n\"))"},{"Title":"G124: http.Cookie missing or has insecure Secure, HttpOnly, or SameSite attribute","Pos":"internal/service/auth_service.go:332:21","Linter":"gosec","Code":"\treturn \u0026http.Cookie{"},{"Title":"G124: http.Cookie missing or has insecure Secure, HttpOnly, or SameSite attribute","Pos":"internal/service/auth_service.go:383:21","Linter":"gosec","Code":"\treturn \u0026http.Cookie{"},{"Title":"G124: http.Cookie missing or has insecure Secure, HttpOnly, or SameSite attribute","Pos":"internal/service/auth_service.go:407:21","Linter":"gosec","Code":"\treturn \u0026http.Cookie{"},{"Title":"G118: context cancellation function returned by WithCancel/WithTimeout/WithDeadline is not called","Pos":"internal/service/kubernetes_service.go:293:38","Linter":"gosec","Code":"\tk.ctx, k.cancel = context.WithCancel(context.Background())"},{"Title":"G402: TLS InsecureSkipVerify may be set to true.","Pos":"internal/service/ldap_service.go:141:24","Linter":"gosec","Code":"\t\t\tInsecureSkipVerify: ldap.config.Insecure,"},{"Title":"G402: TLS InsecureSkipVerify may be set to true.","Pos":"internal/service/oauth_service.go:28:25","Linter":"gosec","Code":"\t\t\t\tInsecureSkipVerify: config.Insecure,"},{"Title":"G306: Expect WriteFile permissions to be 0600 or less","Pos":"internal/service/oidc_service.go:241:9","Linter":"gosec","Code":"\t\terr = os.WriteFile(service.config.PublicKeyPath, encoded, 0644)"},{"Title":"G101: Potential hardcoded credentials","Pos":"internal/utils/decoders/label_decoder_test.go:47:10","Linter":"gosec","Code":"\ttest := map[string]string{\n\t\t\"tinyauth.apps.foo.config.domain\": \"example.com\",\n\t\t\"tinyauth.apps.foo.users.allow\": \"user1,user2\",\n\t\t\"tinyauth.apps.foo.users.block\": \"user3\",\n\t\t\"tinyauth.apps.foo.oauth.whitelist\": \"somebody@example.com\",\n\t\t\"tinyauth.apps.foo.oauth.groups\": \"group3\",\n\t\t\"tinyauth.apps.foo.ip.allow\": \"10.71.0.1/24,10.71.0.2\",\n\t\t\"tinyauth.apps.foo.ip.block\": \"10.10.10.10,10.0.0.0/24\",\n\t\t\"tinyauth.apps.foo.ip.bypass\": \"192.168.1.1\",\n\t\t\"tinyauth.apps.foo.response.headers\": \"X-Foo=Bar,X-Baz=Qux\",\n\t\t\"tinyauth.apps.foo.response.basicauth.username\": \"admin\",\n\t\t\"tinyauth.apps.foo.response.basicauth.password\": \"password\",\n\t\t\"tinyauth.apps.foo.response.basicauth.passwordfile\": \"/path/to/passwordfile\",\n\t\t\"tinyauth.apps.foo.path.allow\": \"/public\",\n\t\t\"tinyauth.apps.foo.path.block\": \"/private\",\n\t}"},{"Title":"G304: Potential file inclusion via variable","Pos":"internal/utils/fs_utils.go:11:15","Linter":"gosec","Code":"\tdata, err := os.ReadFile(file)"},{"Title":"G303: File creation in shared tmp directory without using ioutil.Tempfile","Pos":"internal/utils/fs_utils_test.go:13:15","Linter":"gosec","Code":"\tfile, err := os.Create(\"/tmp/tinyauth_test_file\")"},{"Title":"G303: File creation in shared tmp directory without using ioutil.Tempfile","Pos":"internal/utils/security_utils_test.go:14:15","Linter":"gosec","Code":"\tfile, err := os.Create(\"/tmp/tinyauth_test_secret\")"},{"Title":"G303: File creation in shared tmp directory without using ioutil.Tempfile","Pos":"internal/utils/string_utils_test.go:67:15","Linter":"gosec","Code":"\tfile, err := os.Create(\"/tmp/tinyauth_list_test_file\")"},{"Title":"G304: Potential file inclusion via variable","Pos":"internal/utils/user_utils_test.go:19:15","Linter":"gosec","Code":"\tfile, err := os.Create(tmpDir + \"/tinyauth_users_test.txt\")"},{"Title":"for loop can be changed to use an integer range (Go 1.22+)\nBecause the key is returned by a function or method, take care to consider side effects.","Pos":"gen/gen.go:21:2","Linter":"intrange","Code":"\tfor i := 0; i \u003c parent.NumField(); i++ {"},{"Title":"Function name: TestOIDCController, Cyclomatic Complexity: 5, Halstead Volume: 31715.65, Maintainability Index: 3","Pos":"internal/controller/oidc_controller_test.go:26:1","Linter":"maintidx","Code":"func TestOIDCController(t *testing.T) {"},{"Title":"Function name: proxyHandler, Cyclomatic Complexity: 26, Halstead Volume: 5982.94, Maintainability Index: 18","Pos":"internal/controller/proxy_controller.go:78:1","Linter":"maintidx","Code":"func (controller *ProxyController) proxyHandler(c *gin.Context) {"},{"Title":"Function name: TestProxyController, Cyclomatic Complexity: 3, Halstead Volume: 15640.80, Maintainability Index: 12","Pos":"internal/controller/proxy_controller_test.go:20:1","Linter":"maintidx","Code":"func TestProxyController(t *testing.T) {"},{"Title":"Function name: TestUserController, Cyclomatic Complexity: 5, Halstead Volume: 15817.54, Maintainability Index: 11","Pos":"internal/controller/user_controller_test.go:25:1","Linter":"maintidx","Code":"func TestUserController(t *testing.T) {"},{"Title":"Function name: TestContextMiddleware, Cyclomatic Complexity: 4, Halstead Volume: 10575.99, Maintainability Index: 16","Pos":"internal/middleware/context_middleware_test.go:23:1","Linter":"maintidx","Code":"func TestContextMiddleware(t *testing.T) {"},{"Title":"Function name: TestContext, Cyclomatic Complexity: 3, Halstead Volume: 10439.29, Maintainability Index: 18","Pos":"internal/model/context_test.go:14:1","Linter":"maintidx","Code":"func TestContext(t *testing.T) {"},{"Title":"Magic number: 12, in \u003cargument\u003e detected","Pos":"internal/bootstrap/app_bootstrap.go:254:41","Linter":"mnd","Code":"\tticker := time.NewTicker(time.Duration(12) * time.Hour)"},{"Title":"Magic number: 200, in \u003cargument\u003e detected","Pos":"internal/controller/context_controller.go:82:10","Linter":"mnd","Code":"\t\tc.JSON(200, UserContextResponse{"},{"Title":"Magic number: 401, in \u003cassign\u003e detected","Pos":"internal/controller/context_controller.go:83:16","Linter":"mnd","Code":"\t\t\tStatus: 401,"},{"Title":"Magic number: 200, in \u003cassign\u003e detected","Pos":"internal/controller/context_controller.go:92:16","Linter":"mnd","Code":"\t\tStatus: 200,"},{"Title":"Magic number: 200, in \u003cargument\u003e detected","Pos":"internal/controller/context_controller.go:104:9","Linter":"mnd","Code":"\tc.JSON(200, userContext)"},{"Title":"Magic number: 500, in \u003cargument\u003e detected","Pos":"internal/controller/context_controller.go:111:10","Linter":"mnd","Code":"\t\tc.JSON(500, gin.H{"},{"Title":"Magic number: 500, in \u003cassign\u003e detected","Pos":"internal/controller/context_controller.go:112:15","Linter":"mnd","Code":"\t\t\t\"status\": 500,"},{"Title":"Magic number: 200, in \u003cargument\u003e detected","Pos":"internal/controller/context_controller.go:119:9","Linter":"mnd","Code":"\tc.JSON(200, AppContextResponse{"},{"Title":"Magic number: 200, in \u003cassign\u003e detected","Pos":"internal/controller/context_controller.go:120:26","Linter":"mnd","Code":"\t\tStatus: 200,"},{"Title":"Magic number: 200, in \u003cassign\u003e detected","Pos":"internal/controller/health_controller.go:22:14","Linter":"mnd","Code":"\t\t\"status\": 200,"},{"Title":"Magic number: 400, in \u003cargument\u003e detected","Pos":"internal/controller/oauth_controller.go:58:10","Linter":"mnd","Code":"\t\tc.JSON(400, gin.H{"},{"Title":"Magic number: 400, in \u003cassign\u003e detected","Pos":"internal/controller/oauth_controller.go:59:15","Linter":"mnd","Code":"\t\t\t\"status\": 400,"},{"Title":"Magic number: 400, in \u003cargument\u003e detected","Pos":"internal/controller/oauth_controller.go:71:10","Linter":"mnd","Code":"\t\tc.JSON(400, gin.H{"},{"Title":"Magic number: 400, in \u003cassign\u003e detected","Pos":"internal/controller/oauth_controller.go:72:15","Linter":"mnd","Code":"\t\t\t\"status\": 400,"},{"Title":"Magic number: 500, in \u003cargument\u003e detected","Pos":"internal/controller/oauth_controller.go:91:10","Linter":"mnd","Code":"\t\tc.JSON(500, gin.H{"},{"Title":"Magic number: 500, in \u003cassign\u003e detected","Pos":"internal/controller/oauth_controller.go:92:15","Linter":"mnd","Code":"\t\t\t\"status\": 500,"},{"Title":"Magic number: 500, in \u003cargument\u003e detected","Pos":"internal/controller/oauth_controller.go:102:10","Linter":"mnd","Code":"\t\tc.JSON(500, gin.H{"},{"Title":"Magic number: 500, in \u003cassign\u003e detected","Pos":"internal/controller/oauth_controller.go:103:15","Linter":"mnd","Code":"\t\t\t\"status\": 500,"},{"Title":"Magic number: 400, in \u003cargument\u003e detected","Pos":"internal/controller/oauth_controller.go:125:10","Linter":"mnd","Code":"\t\tc.JSON(400, gin.H{"},{"Title":"Magic number: 400, in \u003cassign\u003e detected","Pos":"internal/controller/oauth_controller.go:126:15","Linter":"mnd","Code":"\t\t\t\"status\": 400,"},{"Title":"Magic number: 404, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:96:10","Linter":"mnd","Code":"\t\tc.JSON(404, gin.H{"},{"Title":"Magic number: 404, in \u003cassign\u003e detected","Pos":"internal/controller/oidc_controller.go:97:15","Linter":"mnd","Code":"\t\t\t\"status\": 404,"},{"Title":"Magic number: 32, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:165:31","Linter":"mnd","Code":"\tcode := utils.GenerateString(32)"},{"Title":"Magic number: 404, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:212:10","Linter":"mnd","Code":"\t\tc.JSON(404, gin.H{"},{"Title":"Magic number: 404, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:407:10","Linter":"mnd","Code":"\t\tc.JSON(404, gin.H{"},{"Title":"Magic number: 401, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:421:11","Linter":"mnd","Code":"\t\t\tc.JSON(401, gin.H{"},{"Title":"Magic number: 401, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:430:11","Linter":"mnd","Code":"\t\t\tc.JSON(401, gin.H{"},{"Title":"Magic number: 401, in \u003cargument\u003e detected","Pos":"internal/controller/oidc_controller.go:451:11","Linter":"mnd","Code":"\t\t\tc.JSON(401, gin.H{"},{"Title":"Magic number: 401, in \u003cassign\u003e detected","Pos":"internal/controller/proxy_controller.go:152:16","Linter":"mnd","Code":"\t\t\t\t\"status\": 401,"},{"Title":"Magic number: 403, in \u003cargument\u003e detected","Pos":"internal/controller/proxy_controller.go:201:12","Linter":"mnd","Code":"\t\t\t\tc.JSON(403, gin.H{"},{"Title":"Magic number: 403, in \u003cassign\u003e detected","Pos":"internal/controller/proxy_controller.go:202:17","Linter":"mnd","Code":"\t\t\t\t\t\"status\": 403,"},{"Title":"Magic number: 403, in \u003cargument\u003e detected","Pos":"internal/controller/proxy_controller.go:247:13","Linter":"mnd","Code":"\t\t\t\t\tc.JSON(403, gin.H{"},{"Title":"Magic number: 403, in \u003cassign\u003e detected","Pos":"internal/controller/proxy_controller.go:248:18","Linter":"mnd","Code":"\t\t\t\t\t\t\"status\": 403,"},{"Title":"Magic number: 401, in \u003cassign\u003e detected","Pos":"internal/controller/proxy_controller.go:299:15","Linter":"mnd","Code":"\t\t\t\"status\": 401,"},{"Title":"Magic number: 404, in \u003cassign\u003e detected","Pos":"internal/controller/resources_controller.go:37:15","Linter":"mnd","Code":"\t\t\t\"status\": 404,"},{"Title":"Magic number: 403, in \u003cargument\u003e detected","Pos":"internal/controller/resources_controller.go:45:10","Linter":"mnd","Code":"\t\tc.JSON(403, gin.H{"},{"Title":"Magic number: 403, in \u003cassign\u003e detected","Pos":"internal/controller/resources_controller.go:46:15","Linter":"mnd","Code":"\t\t\t\"status\": 403,"},{"Title":"Magic number: 429, in \u003cargument\u003e detected","Pos":"internal/controller/user_controller.go:77:10","Linter":"mnd","Code":"\t\tc.JSON(429, gin.H{"},{"Title":"Magic number: 429, in \u003cassign\u003e detected","Pos":"internal/controller/user_controller.go:78:15","Linter":"mnd","Code":"\t\t\t\"status\": 429,"},{"Title":"Magic number: 429, in \u003cargument\u003e detected","Pos":"internal/controller/user_controller.go:318:10","Linter":"mnd","Code":"\t\tc.JSON(429, gin.H{"},{"Title":"Magic number: 429, in \u003cassign\u003e detected","Pos":"internal/controller/user_controller.go:319:15","Linter":"mnd","Code":"\t\t\t\"status\": 429,"},{"Title":"Magic number: 2, in \u003cargument\u003e detected","Pos":"internal/middleware/ui_middleware.go:44:36","Linter":"mnd","Code":"\t\tswitch strings.SplitN(path, \"/\", 2)[0] {"},{"Title":"Magic number: 15, in \u003coperation\u003e detected","Pos":"internal/middleware/ui_middleware.go:59:14","Linter":"mnd","Code":"\t\t\tmaxAge := 15 * time.Minute"},{"Title":"Magic number: 30, in \u003coperation\u003e detected","Pos":"internal/middleware/ui_middleware.go:65:14","Linter":"mnd","Code":"\t\t\t\tmaxAge = 30 * 24 * time.Hour"},{"Title":"Magic number: 500, in \u003ccase\u003e detected","Pos":"internal/middleware/zerolog_middleware.go:65:17","Linter":"mnd","Code":"\t\t\tcase code \u003e= 500:"},{"Title":"Magic number: 3000, in \u003cassign\u003e detected","Pos":"internal/model/config.go:17:13","Linter":"mnd","Code":"\t\t\tPort: 3000,"},{"Title":"Magic number: 86400, in \u003cassign\u003e detected","Pos":"internal/model/config.go:22:24","Linter":"mnd","Code":"\t\t\tSessionExpiry: 86400, // 1 day"},{"Title":"Magic number: 300, in \u003cassign\u003e detected","Pos":"internal/model/config.go:24:24","Linter":"mnd","Code":"\t\t\tLoginTimeout: 300, // 5 minutes"},{"Title":"Magic number: 3, in \u003cassign\u003e detected","Pos":"internal/model/config.go:25:24","Linter":"mnd","Code":"\t\t\tLoginMaxRetries: 3,"},{"Title":"Magic number: 900, in \u003cassign\u003e detected","Pos":"internal/model/config.go:36:19","Linter":"mnd","Code":"\t\t\tGroupCacheTTL: 900, // 15 minutes"},{"Title":"`if userContext.Authenticated` has complex nested blocks (complexity: 26)","Pos":"internal/controller/proxy_controller.go:175:1","Linter":"nestif","Code":"\tif userContext.Authenticated {"},{"Title":"`if search.Type == model.UserLocal` has complex nested blocks (complexity: 8)","Pos":"internal/controller/user_controller.go:122:1","Linter":"nestif","Code":"\tif search.Type == model.UserLocal {"},{"Title":"`if errors.Is(err, os.ErrNotExist)` has complex nested blocks (complexity: 6)","Pos":"internal/service/oidc_service.go:180:1","Linter":"nestif","Code":"\tif errors.Is(err, os.ErrNotExist) {"},{"Title":"`if errors.Is(err, os.ErrNotExist)` has complex nested blocks (complexity: 6)","Pos":"internal/service/oidc_service.go:226:1","Linter":"nestif","Code":"\tif errors.Is(err, os.ErrNotExist) {"},{"Title":"`if entry.TokenExpiresAt \u003c time.Now().Unix()` has complex nested blocks (complexity: 5)","Pos":"internal/service/oidc_service.go:670:1","Linter":"nestif","Code":"\tif entry.TokenExpiresAt \u003c time.Now().Unix() {"},{"Title":"return both a `nil` error and an invalid value: use a sentinel error instead","Pos":"internal/service/auth_service.go:362:3","Linter":"nilnil","Code":"\t\treturn nil, nil"},{"Title":"return both a `nil` error and an invalid value: use a sentinel error instead","Pos":"internal/service/docker_service.go:67:3","Linter":"nilnil","Code":"\t\treturn nil, nil"},{"Title":"return both a `nil` error and an invalid value: use a sentinel error instead","Pos":"internal/service/docker_service.go:103:2","Linter":"nilnil","Code":"\treturn nil, nil"},{"Title":"net/http.NewRequest must not be called. use net/http.NewRequestWithContext","Pos":"internal/bootstrap/app_bootstrap.go:283:30","Linter":"noctx","Code":"\t\treq, err := http.NewRequest(http.MethodPost, heartbeatURL, bytes.NewReader(bodyJson))"},{"Title":"net/http.NewRequest must not be called. use net/http.NewRequestWithContext","Pos":"internal/controller/context_controller_test.go:134:35","Linter":"noctx","Code":"\t\t\trequest, err := http.NewRequest(http.MethodGet, test.path, nil)"},{"Title":"net/http.NewRequest must not be called. use net/http.NewRequestWithContext","Pos":"internal/controller/health_controller_test.go:68:35","Linter":"noctx","Code":"\t\t\trequest, err := http.NewRequest(test.method, test.path, nil)"},{"Title":"net/http/httptest.NewRequest must not be called. use net/http/httptest.NewRequestWithContext","Pos":"internal/controller/oidc_controller_test.go:86:31","Linter":"noctx","Code":"\t\t\t\treq := httptest.NewRequest(http.MethodGet, \"/api/oidc/clients/some-client-id\", nil)"},{"Title":"net/http/httptest.NewRequest must not be called. use net/http/httptest.NewRequestWithContext","Pos":"internal/controller/oidc_controller_test.go:95:31","Linter":"noctx","Code":"\t\t\t\treq := httptest.NewRequest(http.MethodGet, \"/api/oidc/clients/non-existent-client-id\", nil)"},{"Title":"net/http/httptest.NewRequest must not be called. use net/http/httptest.NewRequestWithContext","Pos":"internal/controller/oidc_controller_test.go:104:31","Linter":"noctx","Code":"\t\t\t\treq := httptest.NewRequest(http.MethodPost, \"/api/oidc/authorize\", nil)"},{"Title":"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`","Pos":"internal/bootstrap/app_bootstrap.go:223:9","Linter":"noinlineerr","Code":"\t\tif _, err := os.Stat(app.config.Server.SocketPath); err == nil {"},{"Title":"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`","Pos":"internal/bootstrap/app_bootstrap.go:246:5","Linter":"noinlineerr","Code":"\tif err := router.Run(address); err != nil {"},{"Title":"avoid inline error handling using `if err := ...; err != nil`; use plain assignment `err := ...`","Pos":"internal/controller/user_controller.go:108:5","Linter":"noinlineerr","Code":"\tif err := controller.auth.CheckUserPassword(*search, req.Password); err != nil {"},{"Title":"Function TestContextController missing the call to method parallel","Pos":"internal/controller/context_controller_test.go:17:1","Linter":"paralleltest","Code":"func TestContextController(t *testing.T) {"},{"Title":"Range statement for test TestContextController missing the call to method parallel in test Run","Pos":"internal/controller/context_controller_test.go:117:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Function TestHealthController missing the call to method parallel","Pos":"internal/controller/health_controller_test.go:15:1","Linter":"paralleltest","Code":"func TestHealthController(t *testing.T) {"},{"Title":"Range statement for test TestHealthController missing the call to method parallel in test Run","Pos":"internal/controller/health_controller_test.go:56:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Range statement for test TestOIDCController missing the call to method parallel in test Run","Pos":"internal/controller/oidc_controller_test.go:904:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Range statement for test TestProxyController missing the call to method parallel in test Run","Pos":"internal/controller/proxy_controller_test.go:430:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Function TestResourcesController missing the call to method parallel","Pos":"internal/controller/resources_controller_test.go:17:1","Linter":"paralleltest","Code":"func TestResourcesController(t *testing.T) {"},{"Title":"Range statement for test TestResourcesController missing the call to method parallel in test Run","Pos":"internal/controller/resources_controller_test.go:74:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Range statement for test TestUserController missing the call to method parallel in test Run","Pos":"internal/controller/user_controller_test.go:482:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Function TestWellKnownController missing the call to method parallel","Pos":"internal/controller/well_known_controller_test.go:21:1","Linter":"paralleltest","Code":"func TestWellKnownController(t *testing.T) {"},{"Title":"Range statement for test TestWellKnownController missing the call to method parallel in test Run","Pos":"internal/controller/well_known_controller_test.go:116:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Range statement for test TestContextMiddleware missing the call to method parallel in test Run","Pos":"internal/middleware/context_middleware_test.go:300:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Range statement for test TestContext missing the call to method parallel in test Run","Pos":"internal/model/context_test.go:280:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Function TestKubernetesService missing the call to method parallel","Pos":"internal/service/kubernetes_service_test.go:13:1","Linter":"paralleltest","Code":"func TestKubernetesService(t *testing.T) {"},{"Title":"Range statement for test TestKubernetesService missing the call to method parallel in test Run","Pos":"internal/service/kubernetes_service_test.go:176:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Function TestCompileUserinfo missing the call to method parallel","Pos":"internal/service/oidc_service_test.go:49:1","Linter":"paralleltest","Code":"func TestCompileUserinfo(t *testing.T) {"},{"Title":"Range statement for test TestCompileUserinfo missing the call to method parallel in test Run","Pos":"internal/service/oidc_service_test.go:188:2","Linter":"paralleltest","Code":"\tfor _, test := range tests {"},{"Title":"Function TestGetRootDomain missing the call to method parallel","Pos":"internal/utils/app_utils_test.go:10:1","Linter":"paralleltest","Code":"func TestGetRootDomain(t *testing.T) {"},{"Title":"Function TestParseFileToLine missing the call to method parallel","Pos":"internal/utils/app_utils_test.go:60:1","Linter":"paralleltest","Code":"func TestParseFileToLine(t *testing.T) {"},{"Title":"Function TestFilter missing the call to method parallel","Pos":"internal/utils/app_utils_test.go:92:1","Linter":"paralleltest","Code":"func TestFilter(t *testing.T) {"},{"Title":"Function TestIsRedirectSafe missing the call to method parallel","Pos":"internal/utils/app_utils_test.go:129:1","Linter":"paralleltest","Code":"func TestIsRedirectSafe(t *testing.T) {"},{"Title":"Function TestGetStandaloneCookieDomain missing the call to method parallel","Pos":"internal/utils/app_utils_test.go:184:1","Linter":"paralleltest","Code":"func TestGetStandaloneCookieDomain(t *testing.T) {"},{"Title":"Function TestDecodeLabels missing the call to method parallel","Pos":"internal/utils/decoders/label_decoder_test.go:11:1","Linter":"paralleltest","Code":"func TestDecodeLabels(t *testing.T) {"},{"Title":"Function TestReadFile missing the call to method parallel","Pos":"internal/utils/fs_utils_test.go:11:1","Linter":"paralleltest","Code":"func TestReadFile(t *testing.T) {"},{"Title":"Function TestParseHeaders missing the call to method parallel","Pos":"internal/utils/label_utils_test.go:10:1","Linter":"paralleltest","Code":"func TestParseHeaders(t *testing.T) {"},{"Title":"Function TestSanitizeHeader missing the call to method parallel","Pos":"internal/utils/label_utils_test.go:67:1","Linter":"paralleltest","Code":"func TestSanitizeHeader(t *testing.T) {"},{"Title":"Function TestGetSecret missing the call to method parallel","Pos":"internal/utils/security_utils_test.go:12:1","Linter":"paralleltest","Code":"func TestGetSecret(t *testing.T) {"},{"Title":"Function TestParseSecretFile missing the call to method parallel","Pos":"internal/utils/security_utils_test.go:41:1","Linter":"paralleltest","Code":"func TestParseSecretFile(t *testing.T) {"},{"Title":"Function TestEncodeBasicAuth missing the call to method parallel","Pos":"internal/utils/security_utils_test.go:59:1","Linter":"paralleltest","Code":"func TestEncodeBasicAuth(t *testing.T) {"},{"Title":"Function TestFilterIP missing the call to method parallel","Pos":"internal/utils/security_utils_test.go:79:1","Linter":"paralleltest","Code":"func TestFilterIP(t *testing.T) {"},{"Title":"Function TestCheckFilter missing the call to method parallel","Pos":"internal/utils/security_utils_test.go:121:1","Linter":"paralleltest","Code":"func TestCheckFilter(t *testing.T) {"},{"Title":"Function TestGenerateUUID missing the call to method parallel","Pos":"internal/utils/security_utils_test.go:141:1","Linter":"paralleltest","Code":"func TestGenerateUUID(t *testing.T) {"},{"Title":"Function TestCapitalize missing the call to method parallel","Pos":"internal/utils/string_utils_test.go:11:1","Linter":"paralleltest","Code":"func TestCapitalize(t *testing.T) {"},{"Title":"Function TestCoalesceToString missing the call to method parallel","Pos":"internal/utils/string_utils_test.go:32:1","Linter":"paralleltest","Code":"func TestCoalesceToString(t *testing.T) {"},{"Title":"Function TestCompileUserEmail missing the call to method parallel","Pos":"internal/utils/string_utils_test.go:52:1","Linter":"paralleltest","Code":"func TestCompileUserEmail(t *testing.T) {"},{"Title":"Function TestParseNonEmptyLines missing the call to method parallel","Pos":"internal/utils/string_utils_test.go:60:1","Linter":"paralleltest","Code":"func TestParseNonEmptyLines(t *testing.T) {"},{"Title":"Function TestGetStringList missing the call to method parallel","Pos":"internal/utils/string_utils_test.go:66:1","Linter":"paralleltest","Code":"func TestGetStringList(t *testing.T) {"},{"Title":"Function TestNewLogger missing the call to method parallel","Pos":"internal/utils/tlog/log_wrapper_test.go:15:1","Linter":"paralleltest","Code":"func TestNewLogger(t *testing.T) {"},{"Title":"Function TestNewSimpleLogger missing the call to method parallel","Pos":"internal/utils/tlog/log_wrapper_test.go:34:1","Linter":"paralleltest","Code":"func TestNewSimpleLogger(t *testing.T) {"},{"Title":"Function TestLoggerInit missing the call to method parallel","Pos":"internal/utils/tlog/log_wrapper_test.go:42:1","Linter":"paralleltest","Code":"func TestLoggerInit(t *testing.T) {"},{"Title":"Function TestLoggerWithDisabledStreams missing the call to method parallel","Pos":"internal/utils/tlog/log_wrapper_test.go:49:1","Linter":"paralleltest","Code":"func TestLoggerWithDisabledStreams(t *testing.T) {"},{"Title":"Function TestLogStreamField missing the call to method parallel","Pos":"internal/utils/tlog/log_wrapper_test.go:67:1","Linter":"paralleltest","Code":"func TestLogStreamField(t *testing.T) {"},{"Title":"Function TestGetUsers missing the call to method parallel","Pos":"internal/utils/user_utils_test.go:13:1","Linter":"paralleltest","Code":"func TestGetUsers(t *testing.T) {"},{"Title":"Function TestParseUser missing the call to method parallel","Pos":"internal/utils/user_utils_test.go:102:1","Linter":"paralleltest","Code":"func TestParseUser(t *testing.T) {"},{"Title":"package-comments: should have a package comment","Pos":"internal/assets/assets.go:1:1","Linter":"revive","Code":"package assets"},{"Title":"exported: comment on exported var FrontendAssets should be of the form \"FrontendAssets ...\"","Pos":"internal/assets/assets.go:7:1","Linter":"revive","Code":"// Frontend"},{"Title":"exported: comment on exported var Migrations should be of the form \"Migrations ...\"","Pos":"internal/assets/assets.go:12:1","Linter":"revive","Code":"// Migrations"},{"Title":"package-comments: should have a package comment","Pos":"internal/model/config.go:1:1","Linter":"revive","Code":"package model"},{"Title":"exported: comment on exported function NewDefaultConfiguration should be of the form \"NewDefaultConfiguration ...\"","Pos":"internal/model/config.go:3:1","Linter":"revive","Code":"// Default configuration."},{"Title":"exported: exported type Config should have comment or be unexported","Pos":"internal/model/config.go:67:6","Linter":"revive","Code":"type Config struct {"},{"Title":"exported: exported type DatabaseConfig should have comment or be unexported","Pos":"internal/model/config.go:84:6","Linter":"revive","Code":"type DatabaseConfig struct {"},{"Title":"exported: exported type AnalyticsConfig should have comment or be unexported","Pos":"internal/model/config.go:88:6","Linter":"revive","Code":"type AnalyticsConfig struct {"},{"Title":"exported: exported type ResourcesConfig should have comment or be unexported","Pos":"internal/model/config.go:92:6","Linter":"revive","Code":"type ResourcesConfig struct {"},{"Title":"exported: exported type ServerConfig should have comment or be unexported","Pos":"internal/model/config.go:97:6","Linter":"revive","Code":"type ServerConfig struct {"},{"Title":"exported: exported type AuthConfig should have comment or be unexported","Pos":"internal/model/config.go:103:6","Linter":"revive","Code":"type AuthConfig struct {"},{"Title":"exported: exported type UserAttributes should have comment or be unexported","Pos":"internal/model/config.go:117:6","Linter":"revive","Code":"type UserAttributes struct {"},{"Title":"exported: exported type AddressClaim should have comment or be unexported","Pos":"internal/model/config.go:135:6","Linter":"revive","Code":"type AddressClaim struct {"},{"Title":"exported: exported type IPConfig should have comment or be unexported","Pos":"internal/model/config.go:144:6","Linter":"revive","Code":"type IPConfig struct {"},{"Title":"exported: exported type OAuthConfig should have comment or be unexported","Pos":"internal/model/config.go:149:6","Linter":"revive","Code":"type OAuthConfig struct {"},{"Title":"exported: exported type OIDCConfig should have comment or be unexported","Pos":"internal/model/config.go:156:6","Linter":"revive","Code":"type OIDCConfig struct {"},{"Title":"exported: exported type UIConfig should have comment or be unexported","Pos":"internal/model/config.go:162:6","Linter":"revive","Code":"type UIConfig struct {"},{"Title":"exported: exported type LDAPConfig should have comment or be unexported","Pos":"internal/model/config.go:169:6","Linter":"revive","Code":"type LDAPConfig struct {"},{"Title":"exported: exported type LogConfig should have comment or be unexported","Pos":"internal/model/config.go:181:6","Linter":"revive","Code":"type LogConfig struct {"},{"Title":"exported: exported type LogStreams should have comment or be unexported","Pos":"internal/model/config.go:187:6","Linter":"revive","Code":"type LogStreams struct {"},{"Title":"exported: exported type LogStreamConfig should have comment or be unexported","Pos":"internal/model/config.go:193:6","Linter":"revive","Code":"type LogStreamConfig struct {"},{"Title":"exported: exported type ExperimentalConfig should have comment or be unexported","Pos":"internal/model/config.go:198:6","Linter":"revive","Code":"type ExperimentalConfig struct {"},{"Title":"exported: exported type OAuthServiceConfig should have comment or be unexported","Pos":"internal/model/config.go:202:6","Linter":"revive","Code":"type OAuthServiceConfig struct {"},{"Title":"exported: exported type OIDCClientConfig should have comment or be unexported","Pos":"internal/model/config.go:215:6","Linter":"revive","Code":"type OIDCClientConfig struct {"},{"Title":"exported: exported type Apps should have comment or be unexported","Pos":"internal/model/config.go:226:6","Linter":"revive","Code":"type Apps struct {"},{"Title":"exported: exported type App should have comment or be unexported","Pos":"internal/model/config.go:230:6","Linter":"revive","Code":"type App struct {"},{"Title":"exported: exported type AppConfig should have comment or be unexported","Pos":"internal/model/config.go:240:6","Linter":"revive","Code":"type AppConfig struct {"},{"Title":"exported: exported type AppUsers should have comment or be unexported","Pos":"internal/model/config.go:244:6","Linter":"revive","Code":"type AppUsers struct {"},{"Title":"exported: exported type AppOAuth should have comment or be unexported","Pos":"internal/model/config.go:249:6","Linter":"revive","Code":"type AppOAuth struct {"},{"Title":"exported: exported type AppLDAP should have comment or be unexported","Pos":"internal/model/config.go:254:6","Linter":"revive","Code":"type AppLDAP struct {"},{"Title":"exported: exported type AppIP should have comment or be unexported","Pos":"internal/model/config.go:258:6","Linter":"revive","Code":"type AppIP struct {"},{"Title":"exported: exported type AppResponse should have comment or be unexported","Pos":"internal/model/config.go:264:6","Linter":"revive","Code":"type AppResponse struct {"},{"Title":"exported: exported type AppBasicAuth should have comment or be unexported","Pos":"internal/model/config.go:269:6","Linter":"revive","Code":"type AppBasicAuth struct {"},{"Title":"exported: exported type AppPath should have comment or be unexported","Pos":"internal/model/config.go:275:6","Linter":"revive","Code":"type AppPath struct {"},{"Title":"exported: exported const DefaultNamePrefix should have comment or be unexported","Pos":"internal/model/constants.go:3:7","Linter":"revive","Code":"const DefaultNamePrefix = \"TINYAUTH_\""},{"Title":"exported: exported const APIServer should have comment or be unexported","Pos":"internal/model/constants.go:5:7","Linter":"revive","Code":"const APIServer = \"https://api.tinyauth.app\""},{"Title":"exported: exported type Claims should have comment or be unexported","Pos":"internal/model/constants.go:7:6","Linter":"revive","Code":"type Claims struct {"},{"Title":"exported: exported var OverrideProviders should have comment or be unexported","Pos":"internal/model/constants.go:15:5","Linter":"revive","Code":"var OverrideProviders = map[string]string{"},{"Title":"exported: exported const SessionCookieName should have comment or be unexported","Pos":"internal/model/constants.go:20:7","Linter":"revive","Code":"const SessionCookieName = \"tinyauth-session\""},{"Title":"exported: exported const CSRFCookieName should have comment or be unexported","Pos":"internal/model/constants.go:21:7","Linter":"revive","Code":"const CSRFCookieName = \"tinyauth-csrf\""},{"Title":"exported: exported const RedirectCookieName should have comment or be unexported","Pos":"internal/model/constants.go:22:7","Linter":"revive","Code":"const RedirectCookieName = \"tinyauth-redirect\""},{"Title":"exported: exported const OAuthSessionCookieName should have comment or be unexported","Pos":"internal/model/constants.go:23:7","Linter":"revive","Code":"const OAuthSessionCookieName = \"tinyauth-oauth\""},{"Title":"exported: exported type ProviderType should have comment or be unexported","Pos":"internal/model/context.go:11:6","Linter":"revive","Code":"type ProviderType int"},{"Title":"exported: exported const ProviderLocal should have comment (or a comment on this block) or be unexported","Pos":"internal/model/context.go:14:2","Linter":"revive","Code":"\tProviderLocal ProviderType = iota"},{"Title":"exported: exported type UserContext should have comment or be unexported","Pos":"internal/model/context.go:20:6","Linter":"revive","Code":"type UserContext struct {"},{"Title":"exported: exported var Version should have comment or be unexported","Pos":"internal/model/version.go:3:5","Linter":"revive","Code":"var Version = \"development\""},{"Title":"exported: exported var CommitHash should have comment or be unexported","Pos":"internal/model/version.go:4:5","Linter":"revive","Code":"var CommitHash = \"development\""},{"Title":"exported: exported var BuildTimestamp should have comment or be unexported","Pos":"internal/model/version.go:5:5","Linter":"revive","Code":"var BuildTimestamp = \"0000-00-00T00:00:00Z\""},{"Title":"package-comments: should have a package comment","Pos":"internal/utils/decoders/label_decoder.go:1:1","Linter":"revive","Code":"package decoders"},{"Title":"exported: exported function DecodeLabels should have comment or be unexported","Pos":"internal/utils/decoders/label_decoder.go:7:1","Linter":"revive","Code":"func DecodeLabels[T any](labels map[string]string, root string) (T, error) {"},{"Title":"require-error: for error assertions use require","Pos":"internal/controller/user_controller_test.go:224:5","Linter":"testifylint","Code":"\t\t\t\tassert.NoError(t, err)"},{"Title":"require-error: for error assertions use require","Pos":"internal/controller/user_controller_test.go:235:5","Linter":"testifylint","Code":"\t\t\t\tassert.NoError(t, err)"},{"Title":"require-error: for error assertions use require","Pos":"internal/controller/well_known_controller_test.go:90:5","Linter":"testifylint","Code":"\t\t\t\tassert.NoError(t, err)"},{"Title":"package should be `service_test` instead of `service`","Pos":"internal/service/kubernetes_service_test.go:1:9","Linter":"testpackage","Code":"package service"},{"Title":"package should be `utils_test` instead of `utils`","Pos":"internal/utils/fs_utils_test.go:1:9","Linter":"testpackage","Code":"package utils"},{"Title":"test helper function should start from t.Helper()","Pos":"internal/controller/oidc_controller_test.go:85:9","Linter":"thelper","Code":"\t\t\trun: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {"},{"Title":"test helper function should start from t.Helper()","Pos":"internal/controller/oidc_controller_test.go:94:9","Linter":"thelper","Code":"\t\t\trun: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {"},{"Title":"test helper function should start from t.Helper()","Pos":"internal/controller/oidc_controller_test.go:103:9","Linter":"thelper","Code":"\t\t\trun: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) {"},{"Title":"variable name 'sl' is too short for the scope of its usage","Pos":"gen/gen_env.go:63:3","Linter":"varnamelen","Code":"\t\tsl, ok := value.([]string)"},{"Title":"variable name 'st' is too short for the scope of its usage","Pos":"gen/gen_env.go:72:3","Linter":"varnamelen","Code":"\t\tst, ok := value.(string)"},{"Title":"variable name 'sl' is too short for the scope of its usage","Pos":"gen/gen_md.go:65:3","Linter":"varnamelen","Code":"\t\tsl, ok := value.([]string)"},{"Title":"variable name 'id' is too short for the scope of its usage","Pos":"internal/bootstrap/app_bootstrap.go:96:6","Linter":"varnamelen","Code":"\tfor id, provider := range app.context.oauthProviders {"},{"Title":"variable name 'db' is too short for the scope of its usage","Pos":"internal/bootstrap/app_bootstrap.go:148:2","Linter":"varnamelen","Code":"\tdb, err := app.SetupDatabase(app.config.Database.Path)"},{"Title":"variable name 'db' is too short for the scope of its usage","Pos":"internal/bootstrap/db_bootstrap.go:25:2","Linter":"varnamelen","Code":"\tdb, err := sql.Open(\"sqlite\", databasePath)"},{"Title":"parameter name 'c' is too short for the scope of its usage","Pos":"internal/controller/context_controller.go:107:56","Linter":"varnamelen","Code":"func (controller *ContextController) appContextHandler(c *gin.Context) {"},{"Title":"variable name 'ok' is too short for the scope of its usage","Pos":"internal/controller/oidc_controller_test.go:322:5","Linter":"varnamelen","Code":"\t\t\t\t_, ok := tokenRes[\"refresh_token\"]"},{"Title":"parameter name 'c' is too short for the scope of its usage","Pos":"internal/controller/proxy_controller.go:385:58","Linter":"varnamelen","Code":"func (controller *ProxyController) getForwardAuthContext(c *gin.Context) (ProxyContext, error) {"},{"Title":"variable name 'ok' is too short for the scope of its usage","Pos":"internal/controller/proxy_controller.go:386:2","Linter":"varnamelen","Code":"\thost, ok := controller.getHeader(c, \"x-forwarded-host\")"},{"Title":"parameter name 'c' is too short for the scope of its usage","Pos":"internal/controller/proxy_controller.go:524:52","Linter":"varnamelen","Code":"func (controller *ProxyController) getProxyContext(c *gin.Context) (ProxyContext, error) {"},{"Title":"variable name 'db' is too short for the scope of its usage","Pos":"internal/controller/well_known_controller_test.go:107:2","Linter":"varnamelen","Code":"\tdb, err := app.SetupDatabase(path.Join(tempDir, \"tinyauth.db\"))"},{"Title":"variable name 'do' is too short for the scope of its usage","Pos":"internal/middleware/context_middleware_test.go:305:4","Linter":"varnamelen","Code":"\t\t\tdo := func(req *http.Request) (*model.UserContext, *httptest.ResponseRecorder) {"},{"Title":"variable name 'ui' is too short for the scope of its usage","Pos":"internal/middleware/ui_middleware.go:27:2","Linter":"varnamelen","Code":"\tui, err := fs.Sub(assets.FrontendAssets, \"dist\")"},{"Title":"variable name 'id' is too short for the scope of its usage","Pos":"internal/service/auth_service.go:792:8","Linter":"varnamelen","Code":"\t\t\tfor id, session := range auth.oauthPendingSessions {"},{"Title":"variable name 'ok' is too short for the scope of its usage","Pos":"internal/service/kubernetes_service.go:199:8","Linter":"varnamelen","Code":"\t\tcase event, ok := \u003c-w.ResultChan():"},{"Title":"variable name 'dn' is too short for the scope of its usage","Pos":"internal/service/ldap_service.go:218:6","Linter":"varnamelen","Code":"\tfor _, dn := range groupDNs {"},{"Title":"variable name 'id' is too short for the scope of its usage","Pos":"internal/service/oidc_service.go:288:6","Linter":"varnamelen","Code":"\tfor id, client := range service.clients {"},{"Title":"variable name 'v' is too short for the scope of its usage","Pos":"internal/utils/string_utils.go:16:9","Linter":"varnamelen","Code":"\tswitch v := value.(type) {"},{"Title":"variable name 'i' is too short for the scope of its usage","Pos":"internal/utils/user_utils.go:59:6","Linter":"varnamelen","Code":"\tfor i, part := range parts {"},{"Title":"variable name 'u' is too short for the scope of its usage","Pos":"internal/utils/user_utils_test.go:78:6","Linter":"varnamelen","Code":"\tfor _, u := range *users {"},{"Title":"error returned from external package is unwrapped: sig: func net/url.Parse(rawURL string) (*net/url.URL, error)","Pos":"internal/bootstrap/app_bootstrap.go:56:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/tinyauthapp/tinyauth/internal/utils.GetUsers(usersCfg []string, usersPath string, userAttributes map[string]github.com/tinyauthapp/tinyauth/internal/model.UserAttributes) (*[]github.com/tinyauthapp/tinyauth/internal/model.LocalUser, error)","Pos":"internal/bootstrap/app_bootstrap.go:69:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/tinyauthapp/tinyauth/internal/utils.GetStringList(valuesCfg []string, valuesPath string) ([]string, error)","Pos":"internal/bootstrap/app_bootstrap.go:76:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/service.KubernetesService).Init() error","Pos":"internal/bootstrap/service_bootstrap.go:59:23","Linter":"wrapcheck","Code":"\t\t\treturn Services{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/service.DockerService).Init() error","Pos":"internal/bootstrap/service_bootstrap.go:71:23","Linter":"wrapcheck","Code":"\t\t\treturn Services{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/service.AccessControlsService).Init() error","Pos":"internal/bootstrap/service_bootstrap.go:82:22","Linter":"wrapcheck","Code":"\t\treturn Services{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/service.OAuthBrokerService).Init() error","Pos":"internal/bootstrap/service_bootstrap.go:91:22","Linter":"wrapcheck","Code":"\t\treturn Services{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/service.AuthService).Init() error","Pos":"internal/bootstrap/service_bootstrap.go:113:22","Linter":"wrapcheck","Code":"\t\treturn Services{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/service.OIDCService).Init() error","Pos":"internal/bootstrap/service_bootstrap.go:128:22","Linter":"wrapcheck","Code":"\t\treturn Services{}, err"},{"Title":"error returned from external package is unwrapped: sig: func net/url.Parse(rawURL string) (*net/url.URL, error)","Pos":"internal/controller/proxy_controller.go:426:26","Linter":"wrapcheck","Code":"\t\treturn ProxyContext{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/gin-gonic/gin.Context).BindUri(obj any) error","Pos":"internal/controller/proxy_controller.go:529:26","Linter":"wrapcheck","Code":"\t\treturn ProxyContext{}, err"},{"Title":"error returned from external package is unwrapped: sig: func io/fs.Sub(fsys io/fs.FS, dir string) (io/fs.FS, error)","Pos":"internal/middleware/ui_middleware.go:29:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from interface method should be wrapped: sig: func (github.com/tinyauthapp/tinyauth/internal/service.LabelProvider).GetLabels(appDomain string) (*github.com/tinyauthapp/tinyauth/internal/model.App, error)","Pos":"internal/service/access_controls_service.go:67:9","Linter":"wrapcheck","Code":"\treturn acls.labelProvider.GetLabels(domain)"},{"Title":"error returned from external package is unwrapped: sig: func golang.org/x/crypto/bcrypt.CompareHashAndPassword(hashedPassword []byte, password []byte) error","Pos":"internal/service/auth_service.go:155:10","Linter":"wrapcheck","Code":"\t\treturn bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/repository.Queries).DeleteSession(ctx context.Context, uuid string) error","Pos":"internal/service/auth_service.go:404:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/repository.Queries).GetSession(ctx context.Context, uuid string) (github.com/tinyauthapp/tinyauth/internal/repository.Session, error)","Pos":"internal/service/auth_service.go:427:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func regexp.Compile(expr string) (*regexp.Regexp, error)","Pos":"internal/service/auth_service.go:550:17","Linter":"wrapcheck","Code":"\t\t\treturn true, err"},{"Title":"error returned from external package is unwrapped: sig: func regexp.Compile(expr string) (*regexp.Regexp, error)","Pos":"internal/service/auth_service.go:562:17","Linter":"wrapcheck","Code":"\t\t\treturn true, err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/docker/docker/client.NewClientWithOpts(ops ...github.com/docker/docker/client.Opt) (*github.com/docker/docker/client.Client, error)","Pos":"internal/service/docker_service.go:28:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/docker/docker/client.Client).ContainerList(ctx context.Context, options github.com/docker/docker/api/types/container.ListOptions) ([]github.com/docker/docker/api/types/container.Summary, error)","Pos":"internal/service/docker_service.go:56:9","Linter":"wrapcheck","Code":"\treturn docker.client.ContainerList(docker.context, container.ListOptions{})"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/docker/docker/client.Client).ContainerInspect(ctx context.Context, containerID string) (github.com/docker/docker/api/types/container.InspectResponse, error)","Pos":"internal/service/docker_service.go:60:9","Linter":"wrapcheck","Code":"\treturn docker.client.ContainerInspect(docker.context, containerId)"},{"Title":"error returned from interface method should be wrapped: sig: func (k8s.io/client-go/dynamic.ResourceInterface).List(ctx context.Context, opts k8s.io/apimachinery/pkg/apis/meta/v1.ListOptions) (*k8s.io/apimachinery/pkg/apis/meta/v1/unstructured.UnstructuredList, error)","Pos":"internal/service/kubernetes_service.go:178:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/go-ldap/ldap/v3.DialURL(addr string, opts ...github.com/go-ldap/ldap/v3.DialOpt) (*github.com/go-ldap/ldap/v3.Conn, error)","Pos":"internal/service/ldap_service.go:147:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/go-ldap/ldap/v3.Conn).Search(searchRequest *github.com/go-ldap/ldap/v3.SearchRequest) (*github.com/go-ldap/ldap/v3.SearchResult, error)","Pos":"internal/service/ldap_service.go:178:14","Linter":"wrapcheck","Code":"\t\treturn \"\", err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/go-ldap/ldap/v3.Conn).Search(searchRequest *github.com/go-ldap/ldap/v3.SearchRequest) (*github.com/go-ldap/ldap/v3.SearchResult, error)","Pos":"internal/service/ldap_service.go:206:22","Linter":"wrapcheck","Code":"\t\treturn []string{}, err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/go-ldap/ldap/v3.ParseDN(str string) (*github.com/go-ldap/ldap/v3.DN, error)","Pos":"internal/service/ldap_service.go:221:23","Linter":"wrapcheck","Code":"\t\t\treturn []string{}, err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/go-ldap/ldap/v3.Conn).ExternalBind() error","Pos":"internal/service/ldap_service.go:242:10","Linter":"wrapcheck","Code":"\t\treturn ldap.conn.ExternalBind()"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/go-ldap/ldap/v3.Conn).Bind(username string, password string) error","Pos":"internal/service/ldap_service.go:245:9","Linter":"wrapcheck","Code":"\treturn ldap.conn.Bind(ldap.config.BindDN, ldap.config.BindPassword)"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/go-ldap/ldap/v3.Conn).Bind(username string, password string) error","Pos":"internal/service/ldap_service.go:254:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/go-ldap/ldap/v3.Conn).Search(searchRequest *github.com/go-ldap/ldap/v3.SearchRequest) (*github.com/go-ldap/ldap/v3.SearchResult, error)","Pos":"internal/service/ldap_service.go:276:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/cenkalti/backoff/v5.Retry[T any](ctx context.Context, operation github.com/cenkalti/backoff/v5.Operation[T], opts ...github.com/cenkalti/backoff/v5.RetryOption) (T, error)","Pos":"internal/service/ldap_service.go:305:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func net/http.NewRequest(method string, url string, body io.Reader) (*net/http.Request, error)","Pos":"internal/service/oauth_extractors.go:86:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func (*net/http.Client).Do(req *net/http.Request) (*net/http.Response, error)","Pos":"internal/service/oauth_extractors.go:95:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func io.ReadAll(r io.Reader) ([]byte, error)","Pos":"internal/service/oauth_extractors.go:105:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func encoding/json.Unmarshal(data []byte, v any) error","Pos":"internal/service/oauth_extractors.go:110:15","Linter":"wrapcheck","Code":"\t\treturn nil, err"},{"Title":"error returned from external package is unwrapped: sig: func (*golang.org/x/oauth2.Config).Exchange(ctx context.Context, code string, opts ...golang.org/x/oauth2.AuthCodeOption) (*golang.org/x/oauth2.Token, error)","Pos":"internal/service/oauth_service.go:80:9","Linter":"wrapcheck","Code":"\treturn s.config.Exchange(s.ctx, code, oauth2.VerifierOption(verifier))"},{"Title":"error returned from external package is unwrapped: sig: func net/url.Parse(rawURL string) (*net/url.URL, error)","Pos":"internal/service/oidc_service.go:157:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func os.ReadFile(name string) ([]byte, error)","Pos":"internal/service/oidc_service.go:177:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func crypto/rsa.GenerateKey(random io.Reader, bits int) (*crypto/rsa.PrivateKey, error)","Pos":"internal/service/oidc_service.go:183:11","Linter":"wrapcheck","Code":"\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func os.WriteFile(name string, data []byte, perm os.FileMode) error","Pos":"internal/service/oidc_service.go:200:11","Linter":"wrapcheck","Code":"\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func crypto/x509.ParsePKCS1PrivateKey(der []byte) (*crypto/rsa.PrivateKey, error)","Pos":"internal/service/oidc_service.go:214:11","Linter":"wrapcheck","Code":"\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func os.ReadFile(name string) ([]byte, error)","Pos":"internal/service/oidc_service.go:223:10","Linter":"wrapcheck","Code":"\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func os.WriteFile(name string, data []byte, perm os.FileMode) error","Pos":"internal/service/oidc_service.go:243:11","Linter":"wrapcheck","Code":"\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func crypto/x509.ParsePKCS1PublicKey(der []byte) (*crypto/rsa.PublicKey, error)","Pos":"internal/service/oidc_service.go:259:12","Linter":"wrapcheck","Code":"\t\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func crypto/x509.ParsePKIXPublicKey(derBytes []byte) (pub any, err error)","Pos":"internal/service/oidc_service.go:266:12","Linter":"wrapcheck","Code":"\t\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func (*github.com/tinyauthapp/tinyauth/internal/repository.Queries).CreateOidcCode(ctx context.Context, arg github.com/tinyauthapp/tinyauth/internal/repository.CreateOidcCodeParams) (github.com/tinyauthapp/tinyauth/internal/repository.OidcCode, error)","Pos":"internal/service/oidc_service.go:390:9","Linter":"wrapcheck","Code":"\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func encoding/json.Marshal(v any) ([]byte, error)","Pos":"internal/service/oidc_service.go:405:11","Linter":"wrapcheck","Code":"\t\t\treturn err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/tinyauthapp/paerser/parser.Decode(labels map[string]string, element interface{}, rootName string, filters ...string) error","Pos":"internal/utils/decoders/label_decoder.go:12:25","Linter":"wrapcheck","Code":"\t\treturn labelsDecoded, err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/tinyauthapp/paerser/flag.Parse(args []string, element interface{}) (map[string]string, error)","Pos":"internal/utils/loaders/loader_file.go:17:17","Linter":"wrapcheck","Code":"\t\treturn false, err"},{"Title":"error returned from external package is unwrapped: sig: func github.com/tinyauthapp/paerser/file.Decode(filePath string, element interface{}) error","Pos":"internal/utils/loaders/loader_file.go:36:17","Linter":"wrapcheck","Code":"\t\treturn false, err"}]};
|
|
</script>
|
|
<script type="text/babel">
|
|
class Highlight extends React.Component {
|
|
componentDidMount() {
|
|
hljs.highlightElement(ReactDOM.findDOMNode(this));
|
|
}
|
|
|
|
render() {
|
|
return <pre className="go"><code>{this.props.code}</code></pre>;
|
|
}
|
|
}
|
|
|
|
class Issue extends React.Component {
|
|
render() {
|
|
return (
|
|
<div className="issue box">
|
|
<div>
|
|
<div className="columns">
|
|
<div className="column is-four-fifths">
|
|
<h5 className="title is-5 has-text-danger-dark">{this.props.data.Title}</h5>
|
|
</div>
|
|
<div className="column is-one-fifth">
|
|
<h6 className="title is-6">{this.props.data.Linter}</h6>
|
|
</div>
|
|
</div>
|
|
<strong>{this.props.data.Pos}</strong>
|
|
</div>
|
|
<div className="highlight">
|
|
<Highlight code={this.props.data.Code}/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
class Issues extends React.Component {
|
|
render() {
|
|
if (!this.props.data.Issues || this.props.data.Issues.length === 0) {
|
|
return (
|
|
<div>
|
|
<div className="notification">
|
|
No issues found!
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className="issues">
|
|
{this.props.data.Issues.map(issue => (<Issue data={issue}/>))}
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
ReactDOM.render(
|
|
<div className="content">
|
|
<div className="columns is-centered">
|
|
<div className="column is-three-quarters">
|
|
<Issues data={data}/>
|
|
</div>
|
|
</div>
|
|
</div>,
|
|
document.getElementById("content")
|
|
);
|
|
</script>
|
|
</body>
|
|
</html> |