diff --git a/handler/auth/totp/totp.go b/handler/auth/totp/totp.go index e095fb5..cce1782 100644 --- a/handler/auth/totp/totp.go +++ b/handler/auth/totp/totp.go @@ -2,7 +2,6 @@ package totpHandler import ( "errors" - "fmt" "github.com/fossyy/filekeeper/session" "github.com/fossyy/filekeeper/types" "github.com/fossyy/filekeeper/utils" @@ -19,7 +18,10 @@ func GET(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) return } - component := totpView.Main("Filekeeper - 2FA Page") + component := totpView.Main("Filekeeper - 2FA Page", types.Message{ + Code: 1, + Message: "", + }) err := component.Render(r.Context(), w) if err != nil { w.WriteHeader(http.StatusInternalServerError) @@ -73,7 +75,16 @@ func POST(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, cookie.Value, http.StatusSeeOther) return } else { - fmt.Fprint(w, "wrong") + component := totpView.Main("Filekeeper - 2FA Page", types.Message{ + Code: 0, + Message: "Incorrect code. Please try again with the latest code from your authentication app.", + }) + err := component.Render(r.Context(), w) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + } } diff --git a/handler/user/totp/setup.go b/handler/user/totp/setup.go index 065d8c6..6c60740 100644 --- a/handler/user/totp/setup.go +++ b/handler/user/totp/setup.go @@ -42,7 +42,10 @@ func GET(w http.ResponseWriter, r *http.Request) { return } - component := userTotpSetupView.Main("Filekeeper - 2FA Setup Page", base64Str, secret, userSession) + component := userTotpSetupView.Main("Filekeeper - 2FA Setup Page", base64Str, secret, userSession, types.Message{ + Code: 3, + Message: "", + }) if err := component.Render(r.Context(), w); err != nil { w.WriteHeader(http.StatusInternalServerError) return @@ -59,25 +62,34 @@ func POST(w http.ResponseWriter, r *http.Request) { secret := r.Form.Get("secret") totp := gotp.NewDefaultTOTP(secret) userSession := r.Context().Value("user").(types.User) + uri := totp.ProvisioningUri(userSession.Email, "filekeeper") + + base64Str, err := generateQRCode(uri) + if err != nil { + fmt.Printf("%v\n", err) + w.WriteHeader(http.StatusInternalServerError) + return + } if totp.Verify(code, time.Now().Unix()) { if err := db.DB.InitializeTotp(userSession.Email, secret); err != nil { w.WriteHeader(http.StatusInternalServerError) return } cache.DeleteUser(userSession.Email) - fmt.Fprint(w, "Authentication successful! Access granted.") - return - } else { - uri := totp.ProvisioningUri(userSession.Email, "filekeeper") - - base64Str, err := generateQRCode(uri) - if err != nil { - fmt.Printf("%v\n", err) + component := userTotpSetupView.Main("Filekeeper - 2FA Setup Page", base64Str, secret, userSession, types.Message{ + Code: 1, + Message: "Your TOTP setup is complete! Your account is now more secure.", + }) + if err := component.Render(r.Context(), w); err != nil { w.WriteHeader(http.StatusInternalServerError) return } - - component := userTotpSetupView.Main("Filekeeper - 2FA Setup Page", base64Str, secret, userSession) + return + } else { + component := userTotpSetupView.Main("Filekeeper - 2FA Setup Page", base64Str, secret, userSession, types.Message{ + Code: 0, + Message: "The code you entered is incorrect. Please double-check the code and try again.", + }) if err := component.Render(r.Context(), w); err != nil { w.WriteHeader(http.StatusInternalServerError) return diff --git a/view/totp/totp.templ b/view/totp/totp.templ index 3694d1c..a645c11 100644 --- a/view/totp/totp.templ +++ b/view/totp/totp.templ @@ -2,17 +2,30 @@ package totpView import ( "github.com/fossyy/filekeeper/view/layout" + "github.com/fossyy/filekeeper/types" ) -templ content(title string) { +templ content(title string, msg types.Message) { @layout.Base(title){
+ switch msg.Code { + case 0: + + }

Verify Your Identity

- Enter the 6-digit code sent to your registered device to complete the login process. + Please enter the 6-digit code generated by your authentication app to complete the login process.

@@ -36,7 +49,7 @@ templ content(title string) {
+ switch msg.Code { + case 0: + + case 1: + + }

Backup Code:

-
12345-67890
+
----|----

TOTP Secret:

{code} @@ -94,6 +116,6 @@ templ content(title string, qrcode string, code string, user types.User) { } } -templ Main(title string, qrcode string, code string, user types.User) { - @content(title, qrcode, code, user) +templ Main(title string, qrcode string, code string, user types.User, msg types.Message) { + @content(title, qrcode, code, user, msg) } \ No newline at end of file