From f8d362352db980a757e5469fa509ec09bdb2dbe6 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Mon, 9 Dec 2024 18:19:46 -0500 Subject: [PATCH] refactor: consolidate authentication and DID handling logic --- cmd/motr/main.go | 9 +- pkg/blocks/forms/create_profile.templ | 50 +---------- pkg/blocks/forms/create_profile_templ.go | 25 ------ pkg/blocks/forms/setup_wallet.templ | 46 ++++++++++ pkg/blocks/forms/setup_wallet_templ.go | 87 +++++++++++++++++++ pkg/common/{controller => dids}/config.go | 2 +- pkg/common/{controller => dids}/middleware.go | 2 +- pkg/common/passkeys/codec.go | 47 ---------- pkg/common/passkeys/credentials_create.go | 59 ------------- pkg/common/passkeys/credentials_link.go | 15 ---- pkg/common/passkeys/credentials_retreive.go | 1 - pkg/gateway/handlers/index_handler.go | 2 +- pkg/gateway/handlers/register_handler.go | 12 +-- .../{internal => }/pages/index/error.templ | 0 .../{internal => }/pages/index/error_templ.go | 0 .../{internal => }/pages/index/page.templ | 0 .../{internal => }/pages/index/page_templ.go | 0 .../{internal => }/pages/login/model.go | 0 .../{internal => }/pages/register/model.go | 0 .../{internal => }/pages/register/page.templ | 0 .../pages/register/page_templ.go | 0 {cmd/motr/internal => pkg/vault}/fetch.go | 2 +- {cmd/motr/internal => pkg/vault}/wasm.go | 2 +- 23 files changed, 144 insertions(+), 217 deletions(-) create mode 100644 pkg/blocks/forms/setup_wallet.templ create mode 100644 pkg/blocks/forms/setup_wallet_templ.go rename pkg/common/{controller => dids}/config.go (98%) rename pkg/common/{controller => dids}/middleware.go (99%) delete mode 100644 pkg/common/passkeys/codec.go delete mode 100644 pkg/common/passkeys/credentials_create.go delete mode 100644 pkg/common/passkeys/credentials_link.go delete mode 100644 pkg/common/passkeys/credentials_retreive.go rename pkg/gateway/{internal => }/pages/index/error.templ (100%) rename pkg/gateway/{internal => }/pages/index/error_templ.go (100%) rename pkg/gateway/{internal => }/pages/index/page.templ (100%) rename pkg/gateway/{internal => }/pages/index/page_templ.go (100%) rename pkg/gateway/{internal => }/pages/login/model.go (100%) rename pkg/gateway/{internal => }/pages/register/model.go (100%) rename pkg/gateway/{internal => }/pages/register/page.templ (100%) rename pkg/gateway/{internal => }/pages/register/page_templ.go (100%) rename {cmd/motr/internal => pkg/vault}/fetch.go (99%) rename {cmd/motr/internal => pkg/vault}/wasm.go (97%) diff --git a/cmd/motr/main.go b/cmd/motr/main.go index e87058e14..fa8936612 100644 --- a/cmd/motr/main.go +++ b/cmd/motr/main.go @@ -8,8 +8,7 @@ import ( "syscall/js" "github.com/labstack/echo/v4" - "github.com/onsonr/sonr/cmd/motr/internal" - "github.com/onsonr/sonr/pkg/common/controller" + "github.com/onsonr/sonr/pkg/common/dids" "github.com/onsonr/sonr/pkg/vault" "github.com/onsonr/sonr/pkg/vault/types" ) @@ -48,8 +47,8 @@ func main() { js.Global().Set("processConfig", js.FuncOf(processConfig)) e := echo.New() - e.Use(internal.WasmContextMiddleware) - e.Use(controller.Middleware(nil)) + e.Use(vault.WasmContextMiddleware) + e.Use(dids.Middleware(nil)) vault.RegisterRoutes(e, config) - internal.ServeFetch(e) + vault.ServeFetch(e) } diff --git a/pkg/blocks/forms/create_profile.templ b/pkg/blocks/forms/create_profile.templ index 764ab1a00..4747b988e 100644 --- a/pkg/blocks/forms/create_profile.templ +++ b/pkg/blocks/forms/create_profile.templ @@ -2,8 +2,6 @@ package forms import ( "fmt" - "strconv" - "errors" "github.com/onsonr/sonr/pkg/blocks/layout" ) @@ -17,30 +15,6 @@ func (d CreateProfileData) IsHumanLabel() string { return fmt.Sprintf("What is %d + %d?", d.FirstNumber, d.LastNumber) } -func ValidateCreateProfileForm(formData map[string][]string) error { - // Validate ishuman slider - ishumanValues := formData["is_human"] - if len(ishumanValues) == 0 { - return errors.New("human verification is required") - } - - ishumanSum, err := strconv.Atoi(ishumanValues[0]) - if err != nil { - return errors.New("invalid human verification value") - } - - // Get the expected sum from the form data - firstNum, _ := strconv.Atoi(formData["first_number"][0]) - lastNum, _ := strconv.Atoi(formData["last_number"][0]) - expectedSum := firstNum + lastNum - - if ishumanSum != expectedSum { - return errors.New("incorrect sum for human verification") - } - - return nil -} - // ProfileForm is a standard form styled like a card templ CreateProfile(action string, method string, data CreateProfileData) {
@@ -61,26 +35,7 @@ templ CreateProfile(action string, method string, data CreateProfileData) { @layout.Spacer() - - +
@@ -101,6 +56,3 @@ templ CreateProfile(action string, method string, data CreateProfileData) { } - -templ isHumanSlider(targetSum string) { -} diff --git a/pkg/blocks/forms/create_profile_templ.go b/pkg/blocks/forms/create_profile_templ.go index df0730bc7..d6270eeaa 100644 --- a/pkg/blocks/forms/create_profile_templ.go +++ b/pkg/blocks/forms/create_profile_templ.go @@ -126,29 +126,4 @@ func CreateProfile(action string, method string, data CreateProfileData) templ.C }) } -func isHumanSlider(targetSum string) templ.Component { - return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { - return templ_7745c5c3_CtxErr - } - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var6 := templ.GetChildren(ctx) - if templ_7745c5c3_Var6 == nil { - templ_7745c5c3_Var6 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - return templ_7745c5c3_Err - }) -} - var _ = templruntime.GeneratedTemplate diff --git a/pkg/blocks/forms/setup_wallet.templ b/pkg/blocks/forms/setup_wallet.templ new file mode 100644 index 000000000..dd8ca56fa --- /dev/null +++ b/pkg/blocks/forms/setup_wallet.templ @@ -0,0 +1,46 @@ +package forms + +import "github.com/onsonr/sonr/pkg/blocks/layout" + +type SetupWalletData struct { + TurnstileSiteKey string + FirstNumber int + LastNumber int +} + +// SetupWallet is a standard form styled like a card +templ SetupWallet(action string, method string, data CreateProfileData) { +
+ +
+
+ +
+
+ @layout.Spacer() + +
+ +
+
+ @layout.Spacer() +
+ + + Skip for now + + + Done + + +
+ +
+
+} diff --git a/pkg/blocks/forms/setup_wallet_templ.go b/pkg/blocks/forms/setup_wallet_templ.go new file mode 100644 index 000000000..9dc9359eb --- /dev/null +++ b/pkg/blocks/forms/setup_wallet_templ.go @@ -0,0 +1,87 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.793 +package forms + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import "github.com/onsonr/sonr/pkg/blocks/layout" + +type SetupWalletData struct { + TurnstileSiteKey string + FirstNumber int + LastNumber int +} + +// SetupWallet is a standard form styled like a card +func SetupWallet(action string, method string, data CreateProfileData) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = layout.Spacer().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = layout.Spacer().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
Skip for now Done
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/pkg/common/controller/config.go b/pkg/common/dids/config.go similarity index 98% rename from pkg/common/controller/config.go rename to pkg/common/dids/config.go index 7c86443fa..ffffc2ebc 100644 --- a/pkg/common/controller/config.go +++ b/pkg/common/dids/config.go @@ -1,4 +1,4 @@ -package controller +package dids import ( "github.com/labstack/echo/v4" diff --git a/pkg/common/controller/middleware.go b/pkg/common/dids/middleware.go similarity index 99% rename from pkg/common/controller/middleware.go rename to pkg/common/dids/middleware.go index 41bccac1e..117dfb087 100644 --- a/pkg/common/controller/middleware.go +++ b/pkg/common/dids/middleware.go @@ -1,7 +1,7 @@ //go:build js && wasm // +build js,wasm -package controller +package dids import ( "fmt" diff --git a/pkg/common/passkeys/codec.go b/pkg/common/passkeys/codec.go deleted file mode 100644 index 3339540ca..000000000 --- a/pkg/common/passkeys/codec.go +++ /dev/null @@ -1,47 +0,0 @@ -package passkeys - -import ( - "github.com/go-webauthn/webauthn/protocol" - "github.com/go-webauthn/webauthn/protocol/webauthncose" -) - -func defaultPrimaryAttestationFormats() []protocol.AttestationFormat { - return []protocol.AttestationFormat{ - protocol.AttestationFormatApple, - protocol.AttestationFormatAndroidKey, - protocol.AttestationFormatAndroidSafetyNet, - protocol.AttestationFormatFIDOUniversalSecondFactor, - } -} - -func defaultSecondaryAttestationFormats() []protocol.AttestationFormat { - return []protocol.AttestationFormat{ - protocol.AttestationFormatPacked, - protocol.AttestationFormatTPM, - } -} - -func defaultAuthenticatorSelection() protocol.AuthenticatorSelection { - return protocol.AuthenticatorSelection{ - AuthenticatorAttachment: protocol.Platform, - ResidentKey: protocol.ResidentKeyRequirementRequired, - UserVerification: protocol.VerificationRequired, - } -} - -func buildCredentialParameters() []protocol.CredentialParameter { - return []protocol.CredentialParameter{ - { - Type: "public-key", - Algorithm: webauthncose.AlgES256, - }, - { - Type: "public-key", - Algorithm: webauthncose.AlgES256K, - }, - { - Type: "public-key", - Algorithm: webauthncose.AlgEdDSA, - }, - } -} diff --git a/pkg/common/passkeys/credentials_create.go b/pkg/common/passkeys/credentials_create.go deleted file mode 100644 index 1e3020c51..000000000 --- a/pkg/common/passkeys/credentials_create.go +++ /dev/null @@ -1,59 +0,0 @@ -package passkeys - -import ( - "github.com/go-webauthn/webauthn/protocol" - "github.com/labstack/echo/v4" - "github.com/onsonr/sonr/crypto/mpc" - "github.com/onsonr/sonr/pkg/common" -) - -func Create(c echo.Context, handle string, ks mpc.Keyset) protocol.PublicKeyCredentialCreationOptions { - origin := c.Request().Host - svcName := c.Request().Host - addr := ks.Address() - return buildRegisterOptions(addr, handle, ks, origin, svcName) -} - -func buildRegisterOptions(addr string, handle string, ks mpc.Keyset, origin string, svcName string) protocol.PublicKeyCredentialCreationOptions { - return protocol.PublicKeyCredentialCreationOptions{ - Attestation: protocol.PreferDirectAttestation, - AttestationFormats: defaultPrimaryAttestationFormats(), - AuthenticatorSelection: defaultAuthenticatorSelection(), - RelyingParty: buildServiceEntity(origin, svcName), - Extensions: buildExtensions(ks), - Parameters: buildCredentialParameters(), - Timeout: 10000, - User: buildUserEntity(addr, handle), - } -} - -func buildExtensions(ks mpc.Keyset) protocol.AuthenticationExtensions { - return protocol.AuthenticationExtensions{ - "largeBlob": common.LargeBlob{ - Support: "required", - Write: ks.UserJSON(), - }, - "payment": common.Payment{ - IsPayment: true, - }, - } -} - -func buildServiceEntity(name string, host string) protocol.RelyingPartyEntity { - return protocol.RelyingPartyEntity{ - CredentialEntity: protocol.CredentialEntity{ - Name: name, - }, - ID: host, - } -} - -func buildUserEntity(userAddress string, userHandle string) protocol.UserEntity { - return protocol.UserEntity{ - ID: userAddress, - DisplayName: userHandle, - CredentialEntity: protocol.CredentialEntity{ - Name: userAddress, - }, - } -} diff --git a/pkg/common/passkeys/credentials_link.go b/pkg/common/passkeys/credentials_link.go deleted file mode 100644 index 70ce09b2c..000000000 --- a/pkg/common/passkeys/credentials_link.go +++ /dev/null @@ -1,15 +0,0 @@ -package passkeys - -// -// import ( -// "github.com/go-webauthn/webauthn/protocol" -// "github.com/labstack/echo/v4" -// "github.com/onsonr/sonr/crypto/mpc" -// ) -// -// func Link(c echo.Context, handle string, ks mpc.Keyset) protocol.PublicKeyCredentialCreationOptions { -// origin := c.Request().Host -// svcName := c.Request().Host -// addr := ks.Address() -// return c.String(200, origin+" "+svcName+" "+addr+" "+handle) -// } diff --git a/pkg/common/passkeys/credentials_retreive.go b/pkg/common/passkeys/credentials_retreive.go deleted file mode 100644 index 1dc98f49d..000000000 --- a/pkg/common/passkeys/credentials_retreive.go +++ /dev/null @@ -1 +0,0 @@ -package passkeys diff --git a/pkg/gateway/handlers/index_handler.go b/pkg/gateway/handlers/index_handler.go index 24ac87f91..93b3dd002 100644 --- a/pkg/gateway/handlers/index_handler.go +++ b/pkg/gateway/handlers/index_handler.go @@ -3,8 +3,8 @@ package handlers import ( "github.com/labstack/echo/v4" "github.com/onsonr/sonr/pkg/common/response" - "github.com/onsonr/sonr/pkg/gateway/internal/pages/index" "github.com/onsonr/sonr/pkg/gateway/internal/session" + "github.com/onsonr/sonr/pkg/gateway/pages/index" ) func HandleIndex(c echo.Context) error { diff --git a/pkg/gateway/handlers/register_handler.go b/pkg/gateway/handlers/register_handler.go index 89bf94fb3..9481d4942 100644 --- a/pkg/gateway/handlers/register_handler.go +++ b/pkg/gateway/handlers/register_handler.go @@ -12,7 +12,7 @@ import ( "github.com/onsonr/sonr/pkg/blocks/forms" "github.com/onsonr/sonr/pkg/common/response" "github.com/onsonr/sonr/pkg/gateway/internal/database" - "github.com/onsonr/sonr/pkg/gateway/internal/pages/register" + "github.com/onsonr/sonr/pkg/gateway/pages/register" ) func HandleRegisterView(c echo.Context) error { @@ -24,16 +24,6 @@ func HandleRegisterView(c echo.Context) error { } func HandleRegisterStart(c echo.Context) error { - // Validate the form submission - formData := make(map[string][]string) - for key, values := range c.Request().Form { - formData[key] = values - } - - if err := forms.ValidateCreateProfileForm(formData); err != nil { - return echo.NewHTTPError(http.StatusBadRequest, err.Error()) - } - challenge, _ := protocol.CreateChallenge() handle := c.FormValue("handle") firstName := c.FormValue("first_name") diff --git a/pkg/gateway/internal/pages/index/error.templ b/pkg/gateway/pages/index/error.templ similarity index 100% rename from pkg/gateway/internal/pages/index/error.templ rename to pkg/gateway/pages/index/error.templ diff --git a/pkg/gateway/internal/pages/index/error_templ.go b/pkg/gateway/pages/index/error_templ.go similarity index 100% rename from pkg/gateway/internal/pages/index/error_templ.go rename to pkg/gateway/pages/index/error_templ.go diff --git a/pkg/gateway/internal/pages/index/page.templ b/pkg/gateway/pages/index/page.templ similarity index 100% rename from pkg/gateway/internal/pages/index/page.templ rename to pkg/gateway/pages/index/page.templ diff --git a/pkg/gateway/internal/pages/index/page_templ.go b/pkg/gateway/pages/index/page_templ.go similarity index 100% rename from pkg/gateway/internal/pages/index/page_templ.go rename to pkg/gateway/pages/index/page_templ.go diff --git a/pkg/gateway/internal/pages/login/model.go b/pkg/gateway/pages/login/model.go similarity index 100% rename from pkg/gateway/internal/pages/login/model.go rename to pkg/gateway/pages/login/model.go diff --git a/pkg/gateway/internal/pages/register/model.go b/pkg/gateway/pages/register/model.go similarity index 100% rename from pkg/gateway/internal/pages/register/model.go rename to pkg/gateway/pages/register/model.go diff --git a/pkg/gateway/internal/pages/register/page.templ b/pkg/gateway/pages/register/page.templ similarity index 100% rename from pkg/gateway/internal/pages/register/page.templ rename to pkg/gateway/pages/register/page.templ diff --git a/pkg/gateway/internal/pages/register/page_templ.go b/pkg/gateway/pages/register/page_templ.go similarity index 100% rename from pkg/gateway/internal/pages/register/page_templ.go rename to pkg/gateway/pages/register/page_templ.go diff --git a/cmd/motr/internal/fetch.go b/pkg/vault/fetch.go similarity index 99% rename from cmd/motr/internal/fetch.go rename to pkg/vault/fetch.go index c5e715efc..c26d3b972 100644 --- a/cmd/motr/internal/fetch.go +++ b/pkg/vault/fetch.go @@ -1,7 +1,7 @@ //go:build js && wasm // +build js,wasm -package internal +package vault import ( "bytes" diff --git a/cmd/motr/internal/wasm.go b/pkg/vault/wasm.go similarity index 97% rename from cmd/motr/internal/wasm.go rename to pkg/vault/wasm.go index 6d381c151..041264420 100644 --- a/cmd/motr/internal/wasm.go +++ b/pkg/vault/wasm.go @@ -1,7 +1,7 @@ //go:build js && wasm // +build js,wasm -package internal +package vault import ( "encoding/base64"