From 28e8ca71f39ba26bd127934ab15df00d33f48059 Mon Sep 17 00:00:00 2001 From: krishna2803 Date: Wed, 1 Jan 2025 13:10:16 +0530 Subject: [PATCH 1/8] Remove unnecessary `strconv` usage --- api/application.go | 9 ++++----- api/login.go | 4 +--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/api/application.go b/api/application.go index 8de3c53..be1c481 100644 --- a/api/application.go +++ b/api/application.go @@ -2,7 +2,6 @@ package api import ( "net/http" - "strconv" "strings" "github.com/gin-gonic/gin" @@ -52,7 +51,7 @@ func HandlePostApplication(c *gin.Context) { if err != nil { log.ErrorLogger("Create application failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": strings.Split(err.Error(), " ")[1], "message": "Create application failed", @@ -86,7 +85,7 @@ func HandlePutApplication(c *gin.Context) { if err != nil { log.ErrorLogger("Update application failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": strings.Split(err.Error(), " ")[1], "message": "Update application failed", @@ -120,7 +119,7 @@ func HandleDeleteApplication(c *gin.Context) { if err != nil { log.ErrorLogger("Delete application failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": strings.Split(err.Error(), " ")[1], "message": "Delete application failed", @@ -154,7 +153,7 @@ func HandleUpdateClientSecret(c *gin.Context) { if err != nil { log.ErrorLogger("Client Secret update failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": strings.Split(err.Error(), " ")[1], "message": "Client Secret update failed", diff --git a/api/login.go b/api/login.go index c076044..1e9fdfe 100644 --- a/api/login.go +++ b/api/login.go @@ -2,8 +2,6 @@ package api import ( "net/http" - "strconv" - "strings" "github.com/gin-gonic/gin" @@ -70,7 +68,7 @@ func HandlePostLoginFlow(c *gin.Context) { if session == "" { log.ErrorLogger("Post login flow failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), "message": errMsg, From 4f748bd973e83a501feba7632324fcf8dd119b8d Mon Sep 17 00:00:00 2001 From: krishna2803 Date: Wed, 1 Jan 2025 13:12:18 +0530 Subject: [PATCH 2/8] Fix Kratos Response Unmarshalling --- helper/extracter.go | 106 +++++++++++++++++++++++++++++++++++++++++--- helper/types.go | 58 +++++++++++++++++++++--- 2 files changed, 153 insertions(+), 11 deletions(-) diff --git a/helper/extracter.go b/helper/extracter.go index a228b6a..8504ae4 100644 --- a/helper/extracter.go +++ b/helper/extracter.go @@ -24,6 +24,86 @@ func ExtractErrorCode(Error error) int { return errCode } +func ExtractSuccessMessage(r *http.Response) string { + + body, err := io.ReadAll(r.Body) + + if err != nil { + log.ErrorLogger("Success message extractor failed: ", err) + return "Error: " + err.Error() + } + + var resp KratosHttpResponseBody + err = json.Unmarshal(body, &resp) + + if err != nil { + log.ErrorLogger("Info message extractor failed: ", err) + return "Info message unmarshal error" + } + + if len(resp.UI.Nodes) == 0 { + log.Logger.Warn(string(body)) + log.ErrorLogger("Invalid response from Kratos.", err) + return "Invalid response from Kratos." + } + + msg := "" + for _, node := range resp.UI.Nodes { + for _, message := range node.Messages { + if message.Type == "success" { + msg += message.Text + ", " + } + } + } + for _, message := range resp.UI.Messages { + if message.Type == "success" { + msg += message.Text + ", " + } + } + + return strings.Trim(msg, ", ") +} + +func ExtractInfoMessage(r *http.Response) string { + + body, err := io.ReadAll(r.Body) + + if err != nil { + log.ErrorLogger("Info message extractor failed: ", err) + return "Error: " + err.Error() + } + + var resp KratosHttpResponseBody + err = json.Unmarshal(body, &resp) + + if err != nil { + log.ErrorLogger("Info message extractor failed: ", err) + return "Info message unmarshal error" + } + + if len(resp.UI.Nodes) == 0 { + log.Logger.Warn(string(body)) + log.ErrorLogger("Invalid response from Kratos.", err) + return "Invalid response from Kratos." + } + + msg := "" + for _, node := range resp.UI.Nodes { + for _, message := range node.Messages { + if message.Type == "info" { + msg += message.Text + ", " + } + } + } + for _, message := range resp.UI.Messages { + if message.Type == "info" { + msg += message.Text + ", " + } + } + + return strings.Trim(msg, ", ") +} + func ExtractErrorMessage(r *http.Response) string { body, err := io.ReadAll(r.Body) @@ -33,17 +113,33 @@ func ExtractErrorMessage(r *http.Response) string { return "Error" } - var resp HttpResponseBody + var resp KratosHttpResponseBody err = json.Unmarshal(body, &resp) if err != nil { log.ErrorLogger("Error message extractor failed: ", err) - return "Error" + return "Error message unmarshal error" } - if len(resp.UI.Messages) == 0 { - return "Error" + if len(resp.UI.Nodes) == 0 { + log.Logger.Warn(string(body)) + log.ErrorLogger("Invalid response from Kratos.", err) + return "Invalid response from Kratos." } - return resp.UI.Messages[0].Text + msg := "" + for _, node := range resp.UI.Nodes { + for _, message := range node.Messages { + if message.Type == "error" { + msg += message.Text + ", " + } + } + } + + for _, message := range resp.UI.Messages { + if message.Type == "error" { + msg += message.Text + ", " + } + } + return strings.Trim(msg, ", ") } diff --git a/helper/types.go b/helper/types.go index 185e2e8..fe4fc7f 100644 --- a/helper/types.go +++ b/helper/types.go @@ -1,9 +1,55 @@ package helper -type HttpResponseBody struct { - UI struct { - Messages []struct { - Text string `json:"text"` - } `json:"messages"` - } `json:"ui"` +type KratosHttpResponseBody struct { + ID string `json:"id"` + Type string `json:"type"` + ExpiresAt string `json:"expires_at"` + IssuedAt string `json:"issued_at"` + RequestURL string `json:"request_url"` + UI KratosHttpReponseUI `json:"ui"` + OrganizationID *string `json:"organization_id"` + State string `json:"state"` +} + +type KratosHttpReponseUI struct { + Action string `json:"action"` + Method string `json:"method"` + Nodes []KratosHttpResponseNode `json:"nodes"` + Messages []KratosHttpReponseMessage `json:"messages"` +} + +type KratosHttpResponseNode struct { + Type string `json:"type"` + Group string `json:"group"` + Attributes KratosHttpResponseAttributes `json:"attributes"` + Messages []KratosHttpReponseMessage `json:"messages"` + Meta KratosHttpResponseMeta `json:"meta"` +} + +type KratosHttpResponseAttributes struct { + Name string `json:"name"` + Type string `json:"type"` + Value interface{} `json:"value"` // Can be string, boolean, or other types + Required bool `json:"required,omitempty"` + Disabled bool `json:"disabled,omitempty"` + NodeType string `json:"node_type"` + Autocomplete string `json:"autocomplete,omitempty"` +} + +type KratosHttpReponseMessage struct { + ID int `json:"id"` + Text string `json:"text"` + Type string `json:"type"` + Context map[string]interface{} `json:"context"` +} + +type KratosHttpResponseMeta struct { + Label *KratosHttpResponseLabel `json:"label"` +} + +type KratosHttpResponseLabel struct { + ID int `json:"id"` + Text string `json:"text"` + Type string `json:"type"` + Context map[string]interface{} `json:"context"` } From 95cca57392b44a529abb2b2fd5cee5cc6cf2f5cc Mon Sep 17 00:00:00 2001 From: krishna2803 Date: Wed, 1 Jan 2025 13:12:38 +0530 Subject: [PATCH 3/8] Fix error messages --- api/settings.go | 14 ++++++------- pkg/wrapper/kratos/login/login.go | 4 ++-- pkg/wrapper/kratos/settings/settings.go | 28 +++++++++++++++++-------- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/api/settings.go b/api/settings.go index d2bd20d..82272b9 100644 --- a/api/settings.go +++ b/api/settings.go @@ -2,8 +2,6 @@ package api import ( "net/http" - "strconv" - "strings" "github.com/gin-gonic/gin" @@ -148,7 +146,7 @@ func HandleUpdateProfile(c *gin.Context) { if err != nil { log.ErrorLogger("Kratos post settings update profile flow failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), "message": "Kratos post settings update profile flow failed", @@ -205,7 +203,7 @@ func HandleChangePassword(c *gin.Context) { if err != nil { log.ErrorLogger("Kratos post settings change password flow failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), "message": "Kratos post settings change password flow failed", @@ -235,7 +233,7 @@ func HandleChangePassword(c *gin.Context) { if err != nil { log.ErrorLogger("Kratos post settings update profile flow failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), "message": "Kratos post settings update profile flow failed", @@ -291,10 +289,10 @@ func HandleToggleTOTP(c *gin.Context) { if err != nil { log.ErrorLogger("Kratos post settings toggle totp flow failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), - "message": "Kratos post settings toggle totp flow failed", + "message": msg, }) return } @@ -323,7 +321,7 @@ func HandleToggleTOTP(c *gin.Context) { if err != nil { log.ErrorLogger("Kratos post settings update profile flow failed", err) - errCode, _ := strconv.Atoi((strings.Split(err.Error(), " "))[0]) + errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), "message": "Kratos post settings update profile flow failed", diff --git a/pkg/wrapper/kratos/login/login.go b/pkg/wrapper/kratos/login/login.go index 6d443b6..4d38075 100644 --- a/pkg/wrapper/kratos/login/login.go +++ b/pkg/wrapper/kratos/login/login.go @@ -47,11 +47,11 @@ func SubmitLoginFlowWrapper(cookie string, flowID string, csrfToken string, pass responseCookies := r.Header["Set-Cookie"] if err != nil { + msg := helper.ExtractErrorMessage(r) if responseCookies == nil { - msg := helper.ExtractErrorMessage(r) return *client.NewSessionWithDefaults(), "", msg, err } - return *client.NewSessionWithDefaults(), responseCookies[1], "", err + return *client.NewSessionWithDefaults(), responseCookies[1], msg, err } return resp.Session, responseCookies[1], "", nil diff --git a/pkg/wrapper/kratos/settings/settings.go b/pkg/wrapper/kratos/settings/settings.go index b4f686d..319a253 100644 --- a/pkg/wrapper/kratos/settings/settings.go +++ b/pkg/wrapper/kratos/settings/settings.go @@ -9,6 +9,7 @@ import ( client "github.com/ory/client-go" "github.com/sdslabs/nymeria/config" + "github.com/sdslabs/nymeria/helper" ) func InitializeSettingsFlowWrapper(session_cookie string) (client.SettingsFlow, string, error) { @@ -41,12 +42,15 @@ func SubmitSettingsFlowPasswordMethod(flow_cookie string, session_cookie string, _, r, err := apiClient.FrontendAPI.UpdateSettingsFlow(context.Background()).Flow(flowID).Cookie(cookie).UpdateSettingsFlowBody(submitFlowBody).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `V0alpha2Api.SubmitSelfServiceVerificationFlow``: %v\n", err) + msg := helper.ExtractErrorMessage(r) + fmt.Fprintf(os.Stderr, "Error when calling `SubmitSettingsFlowPasswordMethod`: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - return "", err + return msg, err } - return "Password Changed", nil + msg := helper.ExtractSuccessMessage(r) + + return msg + " Password Changed", nil } func SubmitSettingsFlowProfileMethod(flow_cookie string, session_cookie string, flowID string, csrfToken string, traits map[string]interface{}) (string, error) { @@ -62,12 +66,15 @@ func SubmitSettingsFlowProfileMethod(flow_cookie string, session_cookie string, _, r, err := apiClient.FrontendAPI.UpdateSettingsFlow(context.Background()).Flow(flowID).Cookie(cookie).UpdateSettingsFlowBody(submitFlowBody).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `V0alpha2Api.SubmitSelfServiceVerificationFlow``: %v\n", err) + msg := helper.ExtractErrorMessage(r) + fmt.Fprintf(os.Stderr, "Error when calling `SubmitSettingsFlowProfileMethod`: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - return "", err + return msg, err } - return "Profile Updated", nil + msg := helper.ExtractSuccessMessage(r) + + return msg + " Profile Updated", nil } func SubmitSettingsFlowTOTPMethod(flow_cookie string, session_cookie string, flowID string, csrfToken string, TOTPcode string, TOTPUnlink bool) (string, error) { @@ -85,10 +92,13 @@ func SubmitSettingsFlowTOTPMethod(flow_cookie string, session_cookie string, flo _, r, err := apiClient.FrontendAPI.UpdateSettingsFlow(context.Background()).Flow(flowID).Cookie(cookie).UpdateSettingsFlowBody(submitFlowBody).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `V0alpha2Api.SubmitSelfServiceVerificationFlow``: %v\n", err) + msg := helper.ExtractErrorMessage(r) + fmt.Fprintf(os.Stderr, "Error when calling `SubmitSettingsFlowTOTPMethod`: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - return "", err + return msg, err } - return "Totp Toggled", nil + msg := helper.ExtractSuccessMessage(r) + + return msg + " Totp Toggled", nil } From d8b47d8fbd9aeebd588c5668550a481149909300 Mon Sep 17 00:00:00 2001 From: krishna2803 Date: Wed, 1 Jan 2025 13:40:01 +0530 Subject: [PATCH 4/8] Update packages --- go.mod | 32 +++++++++++++------------- go.sum | 71 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 2ad17d6..2a22847 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/sdslabs/nymeria go 1.23 require ( - github.com/gin-contrib/cors v1.7.2 + github.com/gin-contrib/cors v1.7.3 github.com/gin-gonic/gin v1.10.0 github.com/lib/pq v1.10.9 - github.com/ory/client-go v1.14.3 + github.com/ory/client-go v1.15.17 github.com/sirupsen/logrus v1.9.3 gopkg.in/yaml.v2 v2.4.0 ) @@ -14,18 +14,18 @@ require ( require github.com/rogpeppe/go-internal v1.12.0 // indirect require ( - github.com/bytedance/sonic v1.12.1 // indirect - github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/bytedance/sonic v1.12.6 // indirect + github.com/bytedance/sonic/loader v0.2.1 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.5 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.7 // indirect + github.com/gin-contrib/sse v1.0.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.22.0 // indirect - github.com/goccy/go-json v0.10.3 // indirect + github.com/go-playground/validator/v10 v10.23.0 // indirect + github.com/goccy/go-json v0.10.4 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -34,12 +34,12 @@ require ( github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect - golang.org/x/arch v0.9.0 // indirect - golang.org/x/crypto v0.26.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.17.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/arch v0.12.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/protobuf v1.36.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 440ab2d..0cbe7c9 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ -github.com/bytedance/sonic v1.12.1 h1:jWl5Qz1fy7X1ioY74WqO0KjAMtAGQs4sYnjiEBiyX24= -github.com/bytedance/sonic v1.12.1/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic v1.12.6 h1:/isNmCUF2x3Sh8RAp/4mh4ZGkcFAX/hLrzrK3AvpRzk= +github.com/bytedance/sonic v1.12.6/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= -github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E= +github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= @@ -11,12 +11,12 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= -github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= -github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= -github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= +github.com/gin-contrib/cors v1.7.3 h1:hV+a5xp8hwJoTw7OY+a70FsL8JkVVFTXw9EcfrYUdns= +github.com/gin-contrib/cors v1.7.3/go.mod h1:M3bcKZhxzsvI+rlRSkkxHyljJt1ESd93COUvemZ79j4= +github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= +github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -25,18 +25,18 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= -github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= +github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= -github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -53,8 +53,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/ory/client-go v1.14.3 h1:jNMzO0kNgSvemeN5miWgVm+F+DtrqR71PAUR0jVQajY= -github.com/ory/client-go v1.14.3/go.mod h1:GSRIUSsTcnMnRnj2Dd0fLc1XQ4juvkrA3aQW0gWlqtk= +github.com/ory/client-go v1.15.17 h1:Od1y6/xnS7dHY3vGe0c9BVWWAbGvImF8tFE70NK64lA= +github.com/ory/client-go v1.15.17/go.mod h1:eTjNBXE5wwL6UleLwGZTEdLg9VRZKsZjJ9HSr6X6aEE= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -66,34 +66,35 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= -golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/arch v0.12.0 h1:UsYJhbzPYGsT0HbEdmYcqtCv8UNGvnaL561NnIUvaKg= +golang.org/x/arch v0.12.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 5081abe6294eb1d1ae6378ff0ea67f92d1c1ae2a Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 1 Jan 2025 15:33:03 +0530 Subject: [PATCH 5/8] Fix unhandled null responses --- helper/extracter.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/helper/extracter.go b/helper/extracter.go index 8504ae4..8ef2d58 100644 --- a/helper/extracter.go +++ b/helper/extracter.go @@ -2,6 +2,7 @@ package helper import ( "encoding/json" + "errors" "io" "net/http" "strconv" @@ -25,6 +26,11 @@ func ExtractErrorCode(Error error) int { } func ExtractSuccessMessage(r *http.Response) string { + + if r == nil { + log.ErrorLogger("Error message extractor failed: ", errors.New("response is nil")) + return "Kratos Connection Refused" + } body, err := io.ReadAll(r.Body) @@ -65,6 +71,11 @@ func ExtractSuccessMessage(r *http.Response) string { } func ExtractInfoMessage(r *http.Response) string { + + if r == nil { + log.ErrorLogger("Error message extractor failed: ", errors.New("response is nil")) + return "Kratos Connection Refused" + } body, err := io.ReadAll(r.Body) @@ -106,6 +117,11 @@ func ExtractInfoMessage(r *http.Response) string { func ExtractErrorMessage(r *http.Response) string { + if r == nil { + log.ErrorLogger("Error message extractor failed: ", errors.New("response is nil")) + return "Kratos Connection Refused" + } + body, err := io.ReadAll(r.Body) if err != nil { From 9240f591dc16a6dff03143cb2e88e9ef900566c0 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 1 Jan 2025 16:04:50 +0530 Subject: [PATCH 6/8] Formatting and linting --- helper/extracter.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helper/extracter.go b/helper/extracter.go index 8ef2d58..89e03e2 100644 --- a/helper/extracter.go +++ b/helper/extracter.go @@ -26,7 +26,7 @@ func ExtractErrorCode(Error error) int { } func ExtractSuccessMessage(r *http.Response) string { - + if r == nil { log.ErrorLogger("Error message extractor failed: ", errors.New("response is nil")) return "Kratos Connection Refused" @@ -71,7 +71,7 @@ func ExtractSuccessMessage(r *http.Response) string { } func ExtractInfoMessage(r *http.Response) string { - + if r == nil { log.ErrorLogger("Error message extractor failed: ", errors.New("response is nil")) return "Kratos Connection Refused" From 89c946547e7255ee1346fd873091fe90f9412e13 Mon Sep 17 00:00:00 2001 From: krishna2803 Date: Mon, 3 Feb 2025 23:09:17 +0530 Subject: [PATCH 7/8] nit: add empty line --- api/mfa.go | 5 +++-- api/recovery.go | 10 +++++++++- api/settings.go | 2 +- helper/extracter.go | 1 + helper/types.go | 42 +++++++++++++++++++++++------------------- 5 files changed, 37 insertions(+), 23 deletions(-) diff --git a/api/mfa.go b/api/mfa.go index cdf7322..da99501 100644 --- a/api/mfa.go +++ b/api/mfa.go @@ -83,12 +83,13 @@ func HandlePostMFAFlow(c *gin.Context) { csrfToken := req_body.CsrfToken cookie := strings.Split(flow_cookie, ";")[0] + "; " + strings.Split(session_cookie, ";")[0] + "; x-csrf-token=" + csrfToken - identity, session, err := login.SubmitLoginWithMFAWrapper(cookie, req_body.FlowID, req_body.CsrfToken, req_body.TOTP) + identity, session, errMsg, err := login.SubmitLoginWithMFAWrapper(cookie, req_body.FlowID, req_body.CsrfToken, req_body.TOTP) if err != nil { log.ErrorLogger("Kratos post MFA flow failed", err) c.JSON(http.StatusInternalServerError, gin.H{ - "error": "internal server error", + "error": "MFA Failed", + "message": errMsg, }) return } diff --git a/api/recovery.go b/api/recovery.go index 0474b46..76d9a6e 100644 --- a/api/recovery.go +++ b/api/recovery.go @@ -104,7 +104,7 @@ func HandlePostRecoveryCodeFlow(c *gin.Context) { return } - session, err := recovery.SubmitRecoveryCodeFlowWrapper(cookie, t.FlowID, t.CsrfToken, t.RecoveryCode) + session, errMsg, err := recovery.SubmitRecoveryCodeFlowWrapper(cookie, t.FlowID, t.CsrfToken, t.RecoveryCode) if err != nil { log.ErrorLogger("POST Recovery flow failed", err) @@ -116,6 +116,14 @@ func HandlePostRecoveryCodeFlow(c *gin.Context) { return } + if session == "" { + c.JSON(http.StatusBadRequest, gin.H{ + "error": errMsg, + "message": "POST Recovery Code flow failed", + }) + return + } + c.SetCookie("sdslabs_session", session, 3600, "/", config.NymeriaConfig.URL.Domain, true, true) c.JSON(http.StatusOK, gin.H{ diff --git a/api/settings.go b/api/settings.go index 82272b9..95296ea 100644 --- a/api/settings.go +++ b/api/settings.go @@ -206,7 +206,7 @@ func HandleChangePassword(c *gin.Context) { errCode := helper.ExtractErrorCode(err) c.JSON(errCode, gin.H{ "error": err.Error(), - "message": "Kratos post settings change password flow failed", + "message": msg, }) return } diff --git a/helper/extracter.go b/helper/extracter.go index 89e03e2..d5585ca 100644 --- a/helper/extracter.go +++ b/helper/extracter.go @@ -157,5 +157,6 @@ func ExtractErrorMessage(r *http.Response) string { msg += message.Text + ", " } } + return strings.Trim(msg, ", ") } diff --git a/helper/types.go b/helper/types.go index fe4fc7f..210798e 100644 --- a/helper/types.go +++ b/helper/types.go @@ -1,55 +1,59 @@ package helper type KratosHttpResponseBody struct { - ID string `json:"id"` - Type string `json:"type"` - ExpiresAt string `json:"expires_at"` - IssuedAt string `json:"issued_at"` - RequestURL string `json:"request_url"` - UI KratosHttpReponseUI `json:"ui"` - OrganizationID *string `json:"organization_id"` - State string `json:"state"` + ID string `json:"id"` + Type string `json:"type"` + ExpiresAt string `json:"expires_at"` + IssuedAt string `json:"issued_at"` + RequestURL string `json:"request_url"` + UI KratosHttpResponseUI `json:"ui"` + OrganizationID *string `json:"organization_id"` + State string `json:"state"` + Active string `json:"active,omitempty"` + TransientPayload interface{} `json:"transient_payload,omitempty"` } -type KratosHttpReponseUI struct { - Action string `json:"action"` - Method string `json:"method"` - Nodes []KratosHttpResponseNode `json:"nodes"` - Messages []KratosHttpReponseMessage `json:"messages"` +type KratosHttpResponseUI struct { + Action string `json:"action"` + Method string `json:"method"` + Nodes []KratosHttpResponseNode `json:"nodes"` + Messages []KratosHttpResponseMessage `json:"messages"` } type KratosHttpResponseNode struct { Type string `json:"type"` Group string `json:"group"` Attributes KratosHttpResponseAttributes `json:"attributes"` - Messages []KratosHttpReponseMessage `json:"messages"` + Messages []KratosHttpResponseMessage `json:"messages"` Meta KratosHttpResponseMeta `json:"meta"` } type KratosHttpResponseAttributes struct { Name string `json:"name"` Type string `json:"type"` - Value interface{} `json:"value"` // Can be string, boolean, or other types + Value interface{} `json:"value"` Required bool `json:"required,omitempty"` Disabled bool `json:"disabled,omitempty"` NodeType string `json:"node_type"` Autocomplete string `json:"autocomplete,omitempty"` + Maxlength int `json:"maxlength,omitempty"` + Pattern string `json:"pattern,omitempty"` } -type KratosHttpReponseMessage struct { +type KratosHttpResponseMessage struct { ID int `json:"id"` Text string `json:"text"` Type string `json:"type"` - Context map[string]interface{} `json:"context"` + Context map[string]interface{} `json:"context,omitempty"` } type KratosHttpResponseMeta struct { - Label *KratosHttpResponseLabel `json:"label"` + Label *KratosHttpResponseLabel `json:"label,omitempty"` } type KratosHttpResponseLabel struct { ID int `json:"id"` Text string `json:"text"` Type string `json:"type"` - Context map[string]interface{} `json:"context"` + Context map[string]interface{} `json:"context,omitempty"` } From aa877b8f3cdaf3248e91586c2b2c05f52d38e052 Mon Sep 17 00:00:00 2001 From: krishna2803 Date: Mon, 3 Feb 2025 23:09:49 +0530 Subject: [PATCH 8/8] chore: add error messages --- pkg/wrapper/kratos/login/login.go | 9 +++++---- pkg/wrapper/kratos/recovery/recovery.go | 12 +++++++++--- pkg/wrapper/kratos/settings/settings.go | 6 +++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/pkg/wrapper/kratos/login/login.go b/pkg/wrapper/kratos/login/login.go index 4d38075..bf080e5 100644 --- a/pkg/wrapper/kratos/login/login.go +++ b/pkg/wrapper/kratos/login/login.go @@ -41,7 +41,6 @@ func SubmitLoginFlowWrapper(cookie string, flowID string, csrfToken string, pass submitDataBody.UpdateLoginFlowWithPasswordMethod.SetCsrfToken(csrfToken) apiClient := client.NewAPIClient(config.KratosClientConfig) - resp, r, err := apiClient.FrontendAPI.UpdateLoginFlow(context.Background()).Cookie(cookie).Flow(flowID).XSessionToken("").UpdateLoginFlowBody(submitDataBody).Execute() responseCookies := r.Header["Set-Cookie"] @@ -57,7 +56,7 @@ func SubmitLoginFlowWrapper(cookie string, flowID string, csrfToken string, pass return resp.Session, responseCookies[1], "", nil } -func SubmitLoginWithMFAWrapper(cookie string, flowID string, csrfToken string, totp string) (client.Session, string, error) { +func SubmitLoginWithMFAWrapper(cookie string, flowID string, csrfToken string, totp string) (client.Session, string, string, error) { submitDataBody := client.UpdateLoginFlowBody{UpdateLoginFlowWithTotpMethod: client.NewUpdateLoginFlowWithTotpMethod("totp", totp)} // SubmitSelfServiceLoginFlowBody | submitDataBody.UpdateLoginFlowWithTotpMethod.SetCsrfToken(csrfToken) @@ -66,11 +65,13 @@ func SubmitLoginWithMFAWrapper(cookie string, flowID string, csrfToken string, t resp, r, err := apiClient.FrontendAPI.UpdateLoginFlow(context.Background()).Flow(flowID).UpdateLoginFlowBody(submitDataBody).XSessionToken("").Cookie(cookie).Execute() + errMsg := helper.ExtractErrorMessage(r) + if err != nil { - return *client.NewSessionWithDefaults(), "", err + return *client.NewSessionWithDefaults(), "", errMsg, err } responseCookies := r.Header["Set-Cookie"] - return resp.Session, responseCookies[0], nil + return resp.Session, responseCookies[0], "", nil } diff --git a/pkg/wrapper/kratos/recovery/recovery.go b/pkg/wrapper/kratos/recovery/recovery.go index e94d307..f5bf45d 100644 --- a/pkg/wrapper/kratos/recovery/recovery.go +++ b/pkg/wrapper/kratos/recovery/recovery.go @@ -8,6 +8,7 @@ import ( client "github.com/ory/client-go" "github.com/sdslabs/nymeria/config" + "github.com/sdslabs/nymeria/helper" ) func InitializeRecoveryFlowWrapper() (string, string, string, error) { @@ -65,7 +66,7 @@ func SubmitRecoveryFlowWrapper(cookie string, flowID string, csrfToken string, e return csrf_token, nil } -func SubmitRecoveryCodeFlowWrapper(cookie string, flowID string, csrfToken string, recoveryCode string) (string, error) { +func SubmitRecoveryCodeFlowWrapper(cookie string, flowID string, csrfToken string, recoveryCode string) (string, string, error) { submitFlowBody := client.UpdateRecoveryFlowBody{ UpdateRecoveryFlowWithCodeMethod: client.NewUpdateRecoveryFlowWithCodeMethod("code"), } @@ -78,10 +79,15 @@ func SubmitRecoveryCodeFlowWrapper(cookie string, flowID string, csrfToken strin if err != nil { fmt.Fprintf(os.Stderr, "Error when calling `V0alpha2Api.SubmitSelfServiceRecoveryFlow``: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) - return "", err + return "", "internal server error", err } responseCookies := r.Header["Set-Cookie"] - return responseCookies[1], nil + if len(responseCookies) < 2 { + errMsg := helper.ExtractErrorMessage(r) + return "", errMsg, nil + } + + return responseCookies[1], "", nil } diff --git a/pkg/wrapper/kratos/settings/settings.go b/pkg/wrapper/kratos/settings/settings.go index 319a253..6254fa0 100644 --- a/pkg/wrapper/kratos/settings/settings.go +++ b/pkg/wrapper/kratos/settings/settings.go @@ -45,6 +45,7 @@ func SubmitSettingsFlowPasswordMethod(flow_cookie string, session_cookie string, msg := helper.ExtractErrorMessage(r) fmt.Fprintf(os.Stderr, "Error when calling `SubmitSettingsFlowPasswordMethod`: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) + fmt.Fprintf(os.Stderr, "Error Message: %v\n", msg) return msg, err } @@ -100,5 +101,8 @@ func SubmitSettingsFlowTOTPMethod(flow_cookie string, session_cookie string, flo msg := helper.ExtractSuccessMessage(r) - return msg + " Totp Toggled", nil + if TOTPUnlink { + return msg + " Totp Unlinked", nil + } + return msg + " Totp Linked", nil }