mirror of
https://github.com/onsonr/sonr.git
synced 2025-03-10 13:07:09 +00:00
feat: implement passkey-based authentication
This commit is contained in:
parent
dc6f02a000
commit
f366dd8cf2
13
internal/gateway/handlers/index/handlers.go
Normal file
13
internal/gateway/handlers/index/handlers.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package index
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/onsonr/sonr/pkg/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Handler(c echo.Context) error {
|
||||||
|
if isExpired(c) {
|
||||||
|
return response.TemplEcho(c, ReturningView())
|
||||||
|
}
|
||||||
|
return response.TemplEcho(c, InitialView())
|
||||||
|
}
|
@ -1,23 +1,10 @@
|
|||||||
package handlers
|
package index
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/onsonr/sonr/internal/gateway/pages/index"
|
|
||||||
"github.com/onsonr/sonr/internal/gateway/session"
|
"github.com/onsonr/sonr/internal/gateway/session"
|
||||||
"github.com/onsonr/sonr/pkg/common/response"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func HandleIndex(c echo.Context) error {
|
|
||||||
if isExpired(c) {
|
|
||||||
return response.TemplEcho(c, index.ReturningView())
|
|
||||||
}
|
|
||||||
return response.TemplEcho(c, index.InitialView())
|
|
||||||
}
|
|
||||||
|
|
||||||
// ╭─────────────────────────────────────────────────────────╮
|
|
||||||
// │ Utility Functions │
|
|
||||||
// ╰─────────────────────────────────────────────────────────╯
|
|
||||||
|
|
||||||
// Initial users have no authorization, user handle, or vault address
|
// Initial users have no authorization, user handle, or vault address
|
||||||
func isInitial(c echo.Context) bool {
|
func isInitial(c echo.Context) bool {
|
||||||
sess, err := session.Get(c)
|
sess, err := session.Get(c)
|
189
internal/gateway/handlers/register/forms.templ
Normal file
189
internal/gateway/handlers/register/forms.templ
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
package register
|
||||||
|
|
||||||
|
import "github.com/onsonr/sonr/pkg/common/styles/layout"
|
||||||
|
|
||||||
|
templ formCreateProfile(action string, method string, data CreateProfileData) {
|
||||||
|
<form action={ templ.SafeURL(action) } method={ method }>
|
||||||
|
<sl-card class="card-form gap-4 w-full max-w-lg mx-auto px-4 sm:px-6">
|
||||||
|
<div slot="header">
|
||||||
|
<div class="w-full py-1">
|
||||||
|
<sl-progress-bar value="50"></sl-progress-bar>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@layout.Rows() {
|
||||||
|
<sl-input name="first_name" placeholder="Satoshi" type="text" label="First Name" required autofocus></sl-input>
|
||||||
|
<sl-input name="last_name" placeholder="N" maxlength="1" type="text" label="Last Initial"></sl-input>
|
||||||
|
}
|
||||||
|
@layout.Spacer()
|
||||||
|
<sl-input name="handle" placeholder="digitalgold" type="text" label="Handle" minlength="4" maxlength="12" required>
|
||||||
|
<div slot="prefix">
|
||||||
|
<sl-icon name="at-sign" library="sonr"></sl-icon>
|
||||||
|
</div>
|
||||||
|
</sl-input>
|
||||||
|
@layout.Spacer()
|
||||||
|
<sl-range name="is_human" label={ data.IsHumanLabel() } help-text="Prove you are a human." min="0" max="9" step="1"></sl-range>
|
||||||
|
<div slot="footer">
|
||||||
|
<sl-button href="/" outline>
|
||||||
|
<sl-icon slot="prefix" name="arrow-left" library="sonr"></sl-icon>
|
||||||
|
Cancel
|
||||||
|
</sl-button>
|
||||||
|
<sl-button type="submit">
|
||||||
|
Next
|
||||||
|
<sl-icon slot="suffix" name="arrow-right" library="sonr"></sl-icon>
|
||||||
|
</sl-button>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
.card-form {
|
||||||
|
margin: 1rem;
|
||||||
|
}
|
||||||
|
.card-form [slot='footer'] {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.card-form {
|
||||||
|
margin: 0.5rem;
|
||||||
|
}
|
||||||
|
.card-form [slot='footer'] {
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.card-form [slot='footer'] sl-button {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</sl-card>
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
|
||||||
|
templ formRegisterPasskey(action, method string, data RegisterPasskeyData) {
|
||||||
|
<form action={ templ.SafeURL(action) } method={ method } id="passkey-form">
|
||||||
|
<input type="hidden" name="credential" id="credential-data" required/>
|
||||||
|
<sl-card class="card-form gap-4 max-w-lg">
|
||||||
|
<div slot="header">
|
||||||
|
<div class="w-full py-2">
|
||||||
|
@sonrProfile(data.Address, data.Name, data.Handle, data.CreationBlock)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<sl-select
|
||||||
|
label="Accounts"
|
||||||
|
value="SNR BTC ETH"
|
||||||
|
help-text="Select Blockchains to connect with your Vault"
|
||||||
|
multiple
|
||||||
|
class="custom-tag py-2"
|
||||||
|
>
|
||||||
|
@cryptoWalletOption("SNR", "Sonr", true)
|
||||||
|
@cryptoWalletOption("BTC", "Bitcoin", true)
|
||||||
|
@cryptoWalletOption("ETH", "Ethereum", true)
|
||||||
|
@cryptoWalletOption("SOL", "Solana", false)
|
||||||
|
@cryptoWalletOption("LTC", "Litecoin", false)
|
||||||
|
@cryptoWalletOption("DOGE", "Dogecoin", false)
|
||||||
|
@cryptoWalletOption("XRP", "Ripple", false)
|
||||||
|
@cryptoWalletOption("OSMO", "Osmosis", false)
|
||||||
|
@cryptoWalletOption("ATOM", "Cosmos", false)
|
||||||
|
@cryptoWalletOption("STARZ", "Stargaze", false)
|
||||||
|
@cryptoWalletOption("AKT", "Akash", false)
|
||||||
|
@cryptoWalletOption("EVMOS", "Evmos", false)
|
||||||
|
@cryptoWalletOption("FIL", "Filecoin", false)
|
||||||
|
@cryptoWalletOption("AXL", "Axelar", false)
|
||||||
|
</sl-select>
|
||||||
|
<script type="module">
|
||||||
|
const select = document.querySelector('.custom-tag');
|
||||||
|
|
||||||
|
select.getTag = (option, index) => {
|
||||||
|
// Use the same icon used in the <sl-option>
|
||||||
|
const name = option.querySelector('sl-icon[slot="prefix"]').name;
|
||||||
|
|
||||||
|
// You can return a string, a Lit Template, or an HTMLElement here
|
||||||
|
return `
|
||||||
|
<sl-tag removable>
|
||||||
|
<sl-icon name="${name}" library="crypto" style="padding-inline-end: .5rem;"></sl-icon>
|
||||||
|
${option.getTextLabel()}
|
||||||
|
</sl-tag>
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<div slot="footer" class="space-y-2">
|
||||||
|
@passkeyDropzone(data.Address, data.Handle, data.Challenge)
|
||||||
|
<sl-button href="/" style="width: 100%;" outline>
|
||||||
|
<sl-icon slot="prefix" name="x-lg"></sl-icon>
|
||||||
|
Cancel
|
||||||
|
</sl-button>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
.card-form [slot='footer'] {
|
||||||
|
justify-content: space-evenly;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</sl-card>
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
|
||||||
|
templ formRegisterPasskey(action, method string, data RegisterPasskeyData) {
|
||||||
|
<form action={ templ.SafeURL(action) } method={ method } id="passkey-form">
|
||||||
|
<input type="hidden" name="credential" id="credential-data" required/>
|
||||||
|
<sl-card class="card-form gap-4 max-w-lg">
|
||||||
|
<div slot="header">
|
||||||
|
<div class="w-full py-2">
|
||||||
|
@sonrProfile(data.Address, data.Name, data.Handle, data.CreationBlock)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<sl-select
|
||||||
|
label="Accounts"
|
||||||
|
value="SNR BTC ETH"
|
||||||
|
help-text="Select Blockchains to connect with your Vault"
|
||||||
|
multiple
|
||||||
|
class="custom-tag py-2"
|
||||||
|
>
|
||||||
|
@cryptoWalletOption("SNR", "Sonr", true)
|
||||||
|
@cryptoWalletOption("BTC", "Bitcoin", true)
|
||||||
|
@cryptoWalletOption("ETH", "Ethereum", true)
|
||||||
|
@cryptoWalletOption("SOL", "Solana", false)
|
||||||
|
@cryptoWalletOption("LTC", "Litecoin", false)
|
||||||
|
@cryptoWalletOption("DOGE", "Dogecoin", false)
|
||||||
|
@cryptoWalletOption("XRP", "Ripple", false)
|
||||||
|
@cryptoWalletOption("OSMO", "Osmosis", false)
|
||||||
|
@cryptoWalletOption("ATOM", "Cosmos", false)
|
||||||
|
@cryptoWalletOption("STARZ", "Stargaze", false)
|
||||||
|
@cryptoWalletOption("AKT", "Akash", false)
|
||||||
|
@cryptoWalletOption("EVMOS", "Evmos", false)
|
||||||
|
@cryptoWalletOption("FIL", "Filecoin", false)
|
||||||
|
@cryptoWalletOption("AXL", "Axelar", false)
|
||||||
|
</sl-select>
|
||||||
|
<script type="module">
|
||||||
|
const select = document.querySelector('.custom-tag');
|
||||||
|
|
||||||
|
select.getTag = (option, index) => {
|
||||||
|
// Use the same icon used in the <sl-option>
|
||||||
|
const name = option.querySelector('sl-icon[slot="prefix"]').name;
|
||||||
|
|
||||||
|
// You can return a string, a Lit Template, or an HTMLElement here
|
||||||
|
return `
|
||||||
|
<sl-tag removable>
|
||||||
|
<sl-icon name="${name}" library="crypto" style="padding-inline-end: .5rem;"></sl-icon>
|
||||||
|
${option.getTextLabel()}
|
||||||
|
</sl-tag>
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<div slot="footer" class="space-y-2">
|
||||||
|
@passkeyDropzone(data.Address, data.Handle, data.Challenge)
|
||||||
|
<sl-button href="/" style="width: 100%;" outline>
|
||||||
|
<sl-icon slot="prefix" name="x-lg"></sl-icon>
|
||||||
|
Cancel
|
||||||
|
</sl-button>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
.card-form [slot='footer'] {
|
||||||
|
justify-content: space-evenly;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</sl-card>
|
||||||
|
</form>
|
||||||
|
}
|
369
internal/gateway/handlers/register/forms_templ.go
Normal file
369
internal/gateway/handlers/register/forms_templ.go
Normal file
@ -0,0 +1,369 @@
|
|||||||
|
// Code generated by templ - DO NOT EDIT.
|
||||||
|
|
||||||
|
// templ: version: v0.2.793
|
||||||
|
package register
|
||||||
|
|
||||||
|
//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/common/styles/layout"
|
||||||
|
|
||||||
|
func formCreateProfile(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("<form action=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var2 templ.SafeURL = templ.SafeURL(action)
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2)))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" method=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var3 string
|
||||||
|
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(method)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/forms.templ`, Line: 6, Col: 55}
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><sl-card class=\"card-form gap-4 w-full max-w-lg mx-auto px-4 sm:px-6\"><div slot=\"header\"><div class=\"w-full py-1\"><sl-progress-bar value=\"50\"></sl-progress-bar></div></div>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
||||||
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
||||||
|
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_Err = templ_7745c5c3_Buffer.WriteString("<sl-input name=\"first_name\" placeholder=\"Satoshi\" type=\"text\" label=\"First Name\" required autofocus></sl-input> <sl-input name=\"last_name\" placeholder=\"N\" maxlength=\"1\" type=\"text\" label=\"Last Initial\"></sl-input>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
templ_7745c5c3_Err = layout.Rows().Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
|
||||||
|
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("<sl-input name=\"handle\" placeholder=\"digitalgold\" type=\"text\" label=\"Handle\" minlength=\"4\" maxlength=\"12\" required><div slot=\"prefix\"><sl-icon name=\"at-sign\" library=\"sonr\"></sl-icon></div></sl-input>")
|
||||||
|
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("<sl-range name=\"is_human\" label=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var5 string
|
||||||
|
templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(data.IsHumanLabel())
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/forms.templ`, Line: 24, Col: 56}
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" help-text=\"Prove you are a human.\" min=\"0\" max=\"9\" step=\"1\"></sl-range><div slot=\"footer\"><sl-button href=\"/\" outline><sl-icon slot=\"prefix\" name=\"arrow-left\" library=\"sonr\"></sl-icon> Cancel</sl-button> <sl-button type=\"submit\">Next <sl-icon slot=\"suffix\" name=\"arrow-right\" library=\"sonr\"></sl-icon></sl-button></div><style>\n\t\t\t\t.card-form {\n\t\t\t\t\tmargin: 1rem;\n\t\t\t\t}\n\t\t\t\t.card-form [slot='footer'] {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: space-between;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\tgap: 1rem;\n\t\t\t\t}\n\t\t\t\t@media (max-width: 640px) {\n\t\t\t\t\t.card-form {\n\t\t\t\t\t\tmargin: 0.5rem;\n\t\t\t\t\t}\n\t\t\t\t\t.card-form [slot='footer'] {\n\t\t\t\t\t\tflex-direction: column-reverse;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t\t.card-form [slot='footer'] sl-button {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</style></sl-card></form>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func formRegisterPasskey(action, method string, data RegisterPasskeyData) 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)
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<form action=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var7 templ.SafeURL = templ.SafeURL(action)
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var7)))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" method=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var8 string
|
||||||
|
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(method)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/forms.templ`, Line: 64, Col: 55}
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"passkey-form\"><input type=\"hidden\" name=\"credential\" id=\"credential-data\" required> <sl-card class=\"card-form gap-4 max-w-lg\"><div slot=\"header\"><div class=\"w-full py-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = sonrProfile(data.Address, data.Name, data.Handle, data.CreationBlock).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><sl-select label=\"Accounts\" value=\"SNR BTC ETH\" help-text=\"Select Blockchains to connect with your Vault\" multiple class=\"custom-tag py-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("SNR", "Sonr", true).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("BTC", "Bitcoin", true).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("ETH", "Ethereum", true).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("SOL", "Solana", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("LTC", "Litecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("DOGE", "Dogecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("XRP", "Ripple", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("OSMO", "Osmosis", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("ATOM", "Cosmos", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("STARZ", "Stargaze", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("AKT", "Akash", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("EVMOS", "Evmos", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("FIL", "Filecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("AXL", "Axelar", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</sl-select><script type=\"module\">\n const select = document.querySelector('.custom-tag');\n\n select.getTag = (option, index) => {\n // Use the same icon used in the <sl-option>\n const name = option.querySelector('sl-icon[slot=\"prefix\"]').name;\n\n // You can return a string, a Lit Template, or an HTMLElement here\n return `\n <sl-tag removable>\n <sl-icon name=\"${name}\" library=\"crypto\" style=\"padding-inline-end: .5rem;\"></sl-icon>\n ${option.getTextLabel()}\n </sl-tag>\n `;\n };\n </script><div slot=\"footer\" class=\"space-y-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = passkeyDropzone(data.Address, data.Handle, data.Challenge).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<sl-button href=\"/\" style=\"width: 100%;\" outline><sl-icon slot=\"prefix\" name=\"x-lg\"></sl-icon> Cancel</sl-button></div><style>\n \t\t.card-form [slot='footer'] {\n \t\tjustify-content: space-evenly;\n \t\talign-items: center;\n \t\t}\n\t\t</style></sl-card></form>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func formRegisterPasskey(action, method string, data RegisterPasskeyData) 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_Var9 := templ.GetChildren(ctx)
|
||||||
|
if templ_7745c5c3_Var9 == nil {
|
||||||
|
templ_7745c5c3_Var9 = templ.NopComponent
|
||||||
|
}
|
||||||
|
ctx = templ.ClearChildren(ctx)
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<form action=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var10 templ.SafeURL = templ.SafeURL(action)
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var10)))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" method=\"")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var11 string
|
||||||
|
templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(method)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/forms.templ`, Line: 128, Col: 55}
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"passkey-form\"><input type=\"hidden\" name=\"credential\" id=\"credential-data\" required> <sl-card class=\"card-form gap-4 max-w-lg\"><div slot=\"header\"><div class=\"w-full py-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = sonrProfile(data.Address, data.Name, data.Handle, data.CreationBlock).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><sl-select label=\"Accounts\" value=\"SNR BTC ETH\" help-text=\"Select Blockchains to connect with your Vault\" multiple class=\"custom-tag py-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("SNR", "Sonr", true).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("BTC", "Bitcoin", true).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("ETH", "Ethereum", true).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("SOL", "Solana", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("LTC", "Litecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("DOGE", "Dogecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("XRP", "Ripple", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("OSMO", "Osmosis", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("ATOM", "Cosmos", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("STARZ", "Stargaze", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("AKT", "Akash", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("EVMOS", "Evmos", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("FIL", "Filecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = cryptoWalletOption("AXL", "Axelar", false).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</sl-select><script type=\"module\">\n const select = document.querySelector('.custom-tag');\n\n select.getTag = (option, index) => {\n // Use the same icon used in the <sl-option>\n const name = option.querySelector('sl-icon[slot=\"prefix\"]').name;\n\n // You can return a string, a Lit Template, or an HTMLElement here\n return `\n <sl-tag removable>\n <sl-icon name=\"${name}\" library=\"crypto\" style=\"padding-inline-end: .5rem;\"></sl-icon>\n ${option.getTextLabel()}\n </sl-tag>\n `;\n };\n </script><div slot=\"footer\" class=\"space-y-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = passkeyDropzone(data.Address, data.Handle, data.Challenge).Render(ctx, templ_7745c5c3_Buffer)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<sl-button href=\"/\" style=\"width: 100%;\" outline><sl-icon slot=\"prefix\" name=\"x-lg\"></sl-icon> Cancel</sl-button></div><style>\n \t\t.card-form [slot='footer'] {\n \t\tjustify-content: space-evenly;\n \t\talign-items: center;\n \t\t}\n\t\t</style></sl-card></form>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = templruntime.GeneratedTemplate
|
52
internal/gateway/handlers/register/handlers.go
Normal file
52
internal/gateway/handlers/register/handlers.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package register
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/go-webauthn/webauthn/protocol"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/onsonr/sonr/crypto/mpc"
|
||||||
|
"github.com/onsonr/sonr/pkg/common/response"
|
||||||
|
)
|
||||||
|
|
||||||
|
func HandleCreateProfile(c echo.Context) error {
|
||||||
|
dat := CreateProfileData{
|
||||||
|
FirstNumber: 1,
|
||||||
|
LastNumber: 2,
|
||||||
|
}
|
||||||
|
return response.TemplEcho(c, ProfileFormView(dat))
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandlePasskeyStart(c echo.Context) error {
|
||||||
|
challenge, _ := protocol.CreateChallenge()
|
||||||
|
handle := c.FormValue("handle")
|
||||||
|
firstName := c.FormValue("first_name")
|
||||||
|
lastName := c.FormValue("last_name")
|
||||||
|
|
||||||
|
ks, err := mpc.NewKeyset()
|
||||||
|
if err != nil {
|
||||||
|
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
||||||
|
}
|
||||||
|
dat := RegisterPasskeyData{
|
||||||
|
Address: ks.Address(),
|
||||||
|
Handle: handle,
|
||||||
|
Name: fmt.Sprintf("%s %s", firstName, lastName),
|
||||||
|
Challenge: challenge.String(),
|
||||||
|
CreationBlock: "00001",
|
||||||
|
}
|
||||||
|
return response.TemplEcho(c, LinkCredentialView(dat))
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandlePasskeyFinish(c echo.Context) error {
|
||||||
|
// Get the raw credential JSON string
|
||||||
|
credentialJSON := c.FormValue("credential")
|
||||||
|
if credentialJSON == "" {
|
||||||
|
return echo.NewHTTPError(http.StatusBadRequest, "missing credential data")
|
||||||
|
}
|
||||||
|
_, err := extractCredentialDescriptor(credentialJSON)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return response.TemplEcho(c, LoadingVaultView())
|
||||||
|
}
|
@ -1,76 +1,5 @@
|
|||||||
package register
|
package register
|
||||||
|
|
||||||
type RegisterPasskeyData struct {
|
|
||||||
Address string
|
|
||||||
Handle string
|
|
||||||
Name string
|
|
||||||
Challenge string
|
|
||||||
CreationBlock string
|
|
||||||
}
|
|
||||||
|
|
||||||
templ formRegisterPasskey(action, method string, data RegisterPasskeyData) {
|
|
||||||
<form action={ templ.SafeURL(action) } method={ method } id="passkey-form">
|
|
||||||
<input type="hidden" name="credential" id="credential-data" required/>
|
|
||||||
<sl-card class="card-form gap-4 max-w-lg">
|
|
||||||
<div slot="header">
|
|
||||||
<div class="w-full py-2">
|
|
||||||
@sonrProfile(data.Address, data.Name, data.Handle, data.CreationBlock)
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<sl-select
|
|
||||||
label="Accounts"
|
|
||||||
value="SNR BTC ETH"
|
|
||||||
help-text="Select Blockchains to connect with your Vault"
|
|
||||||
multiple
|
|
||||||
class="custom-tag py-2"
|
|
||||||
>
|
|
||||||
@cryptoWalletOption("SNR", "Sonr", true)
|
|
||||||
@cryptoWalletOption("BTC", "Bitcoin", true)
|
|
||||||
@cryptoWalletOption("ETH", "Ethereum", true)
|
|
||||||
@cryptoWalletOption("SOL", "Solana", false)
|
|
||||||
@cryptoWalletOption("LTC", "Litecoin", false)
|
|
||||||
@cryptoWalletOption("DOGE", "Dogecoin", false)
|
|
||||||
@cryptoWalletOption("XRP", "Ripple", false)
|
|
||||||
@cryptoWalletOption("OSMO", "Osmosis", false)
|
|
||||||
@cryptoWalletOption("ATOM", "Cosmos", false)
|
|
||||||
@cryptoWalletOption("STARZ", "Stargaze", false)
|
|
||||||
@cryptoWalletOption("AKT", "Akash", false)
|
|
||||||
@cryptoWalletOption("EVMOS", "Evmos", false)
|
|
||||||
@cryptoWalletOption("FIL", "Filecoin", false)
|
|
||||||
@cryptoWalletOption("AXL", "Axelar", false)
|
|
||||||
</sl-select>
|
|
||||||
<script type="module">
|
|
||||||
const select = document.querySelector('.custom-tag');
|
|
||||||
|
|
||||||
select.getTag = (option, index) => {
|
|
||||||
// Use the same icon used in the <sl-option>
|
|
||||||
const name = option.querySelector('sl-icon[slot="prefix"]').name;
|
|
||||||
|
|
||||||
// You can return a string, a Lit Template, or an HTMLElement here
|
|
||||||
return `
|
|
||||||
<sl-tag removable>
|
|
||||||
<sl-icon name="${name}" library="crypto" style="padding-inline-end: .5rem;"></sl-icon>
|
|
||||||
${option.getTextLabel()}
|
|
||||||
</sl-tag>
|
|
||||||
`;
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<div slot="footer" class="space-y-2">
|
|
||||||
@passkeyDropzone(data.Address, data.Handle, data.Challenge)
|
|
||||||
<sl-button href="/" style="width: 100%;" outline>
|
|
||||||
<sl-icon slot="prefix" name="x-lg"></sl-icon>
|
|
||||||
Cancel
|
|
||||||
</sl-button>
|
|
||||||
</div>
|
|
||||||
<style>
|
|
||||||
.card-form [slot='footer'] {
|
|
||||||
justify-content: space-evenly;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</sl-card>
|
|
||||||
</form>
|
|
||||||
}
|
|
||||||
|
|
||||||
templ passkeyDropzone(addr string, userHandle string, challenge string) {
|
templ passkeyDropzone(addr string, userHandle string, challenge string) {
|
||||||
<sl-button style="width: 100%;" onclick={ createPasskey(addr, userHandle, challenge) }>
|
<sl-button style="width: 100%;" onclick={ createPasskey(addr, userHandle, challenge) }>
|
||||||
@ -208,11 +137,3 @@ templ cryptoWalletOption(ticker string, name string, isDefault bool) {
|
|||||||
<sl-divider></sl-divider>
|
<sl-divider></sl-divider>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to shorten address
|
|
||||||
func shortenAddress(address string) string {
|
|
||||||
if len(address) <= 20 {
|
|
||||||
return address
|
|
||||||
}
|
|
||||||
return address[:16] + "..." + address[len(address)-4:]
|
|
||||||
}
|
|
@ -8,15 +8,7 @@ package register
|
|||||||
import "github.com/a-h/templ"
|
import "github.com/a-h/templ"
|
||||||
import templruntime "github.com/a-h/templ/runtime"
|
import templruntime "github.com/a-h/templ/runtime"
|
||||||
|
|
||||||
type RegisterPasskeyData struct {
|
func passkeyDropzone(addr string, userHandle string, challenge string) templ.Component {
|
||||||
Address string
|
|
||||||
Handle string
|
|
||||||
Name string
|
|
||||||
Challenge string
|
|
||||||
CreationBlock string
|
|
||||||
}
|
|
||||||
|
|
||||||
func formRegisterPasskey(action, method string, data RegisterPasskeyData) templ.Component {
|
|
||||||
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
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
|
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
||||||
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
|
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
|
||||||
@ -37,133 +29,6 @@ func formRegisterPasskey(action, method string, data RegisterPasskeyData) templ.
|
|||||||
templ_7745c5c3_Var1 = templ.NopComponent
|
templ_7745c5c3_Var1 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<form action=\"")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
var templ_7745c5c3_Var2 templ.SafeURL = templ.SafeURL(action)
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2)))
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" method=\"")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
var templ_7745c5c3_Var3 string
|
|
||||||
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(method)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 12, Col: 55}
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" id=\"passkey-form\"><input type=\"hidden\" name=\"credential\" id=\"credential-data\" required> <sl-card class=\"card-form gap-4 max-w-lg\"><div slot=\"header\"><div class=\"w-full py-2\">")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = sonrProfile(data.Address, data.Name, data.Handle, data.CreationBlock).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div><sl-select label=\"Accounts\" value=\"SNR BTC ETH\" help-text=\"Select Blockchains to connect with your Vault\" multiple class=\"custom-tag py-2\">")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("SNR", "Sonr", true).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("BTC", "Bitcoin", true).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("ETH", "Ethereum", true).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("SOL", "Solana", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("LTC", "Litecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("DOGE", "Dogecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("XRP", "Ripple", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("OSMO", "Osmosis", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("ATOM", "Cosmos", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("STARZ", "Stargaze", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("AKT", "Akash", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("EVMOS", "Evmos", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("FIL", "Filecoin", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = cryptoWalletOption("AXL", "Axelar", false).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</sl-select><script type=\"module\">\n const select = document.querySelector('.custom-tag');\n\n select.getTag = (option, index) => {\n // Use the same icon used in the <sl-option>\n const name = option.querySelector('sl-icon[slot=\"prefix\"]').name;\n\n // You can return a string, a Lit Template, or an HTMLElement here\n return `\n <sl-tag removable>\n <sl-icon name=\"${name}\" library=\"crypto\" style=\"padding-inline-end: .5rem;\"></sl-icon>\n ${option.getTextLabel()}\n </sl-tag>\n `;\n };\n </script><div slot=\"footer\" class=\"space-y-2\">")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = passkeyDropzone(data.Address, data.Handle, data.Challenge).Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<sl-button href=\"/\" style=\"width: 100%;\" outline><sl-icon slot=\"prefix\" name=\"x-lg\"></sl-icon> Cancel</sl-button></div><style>\n \t\t.card-form [slot='footer'] {\n \t\tjustify-content: space-evenly;\n \t\talign-items: center;\n \t\t}\n\t\t</style></sl-card></form>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func passkeyDropzone(addr string, userHandle string, challenge 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_Var4 := templ.GetChildren(ctx)
|
|
||||||
if templ_7745c5c3_Var4 == nil {
|
|
||||||
templ_7745c5c3_Var4 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
templ_7745c5c3_Err = templ.RenderScriptItems(ctx, templ_7745c5c3_Buffer, createPasskey(addr, userHandle, challenge))
|
templ_7745c5c3_Err = templ.RenderScriptItems(ctx, templ_7745c5c3_Buffer, createPasskey(addr, userHandle, challenge))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
@ -172,8 +37,8 @@ func passkeyDropzone(addr string, userHandle string, challenge string) templ.Com
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var5 templ.ComponentScript = createPasskey(addr, userHandle, challenge)
|
var templ_7745c5c3_Var2 templ.ComponentScript = createPasskey(addr, userHandle, challenge)
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var5.Call)
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var2.Call)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -292,21 +157,21 @@ func sonrProfile(addr string, name string, handle string, creationBlock string)
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
templ_7745c5c3_Var6 := templ.GetChildren(ctx)
|
templ_7745c5c3_Var3 := templ.GetChildren(ctx)
|
||||||
if templ_7745c5c3_Var6 == nil {
|
if templ_7745c5c3_Var3 == nil {
|
||||||
templ_7745c5c3_Var6 = templ.NopComponent
|
templ_7745c5c3_Var3 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"profile-card min-w-[320px]\"><div class=\"text-white max-w-xs my-auto mx-auto bg-gradient-to-r from-cyan-700 to-cyan-300 p-4 py-5 px-5 rounded-xl\"><div class=\"flex justify-between\"><div><h2>sonr-testnet-1</h2><p class=\"text-2xl font-bold\">")
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"profile-card min-w-[320px]\"><div class=\"text-white max-w-xs my-auto mx-auto bg-gradient-to-r from-cyan-700 to-cyan-300 p-4 py-5 px-5 rounded-xl\"><div class=\"flex justify-between\"><div><h2>sonr-testnet-1</h2><p class=\"text-2xl font-bold\">")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var7 string
|
var templ_7745c5c3_Var4 string
|
||||||
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(handle)
|
templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(handle)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 173, Col: 43}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 102, Col: 43}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -314,12 +179,12 @@ func sonrProfile(addr string, name string, handle string, creationBlock string)
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var8 string
|
var templ_7745c5c3_Var5 string
|
||||||
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(shortenAddress(addr))
|
templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(shortenAddress(addr))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 180, Col: 58}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 109, Col: 58}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -327,12 +192,12 @@ func sonrProfile(addr string, name string, handle string, creationBlock string)
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var9 string
|
var templ_7745c5c3_Var6 string
|
||||||
templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(creationBlock)
|
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(creationBlock)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 185, Col: 55}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 114, Col: 55}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -340,12 +205,12 @@ func sonrProfile(addr string, name string, handle string, creationBlock string)
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var10 string
|
var templ_7745c5c3_Var7 string
|
||||||
templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(name)
|
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(name)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 189, Col: 32}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 118, Col: 32}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -373,9 +238,9 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
ctx = templ.InitializeContext(ctx)
|
ctx = templ.InitializeContext(ctx)
|
||||||
templ_7745c5c3_Var11 := templ.GetChildren(ctx)
|
templ_7745c5c3_Var8 := templ.GetChildren(ctx)
|
||||||
if templ_7745c5c3_Var11 == nil {
|
if templ_7745c5c3_Var8 == nil {
|
||||||
templ_7745c5c3_Var11 = templ.NopComponent
|
templ_7745c5c3_Var8 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
if isDefault {
|
if isDefault {
|
||||||
@ -383,12 +248,12 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var12 string
|
var templ_7745c5c3_Var9 string
|
||||||
templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 198, Col: 27}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 127, Col: 27}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -396,12 +261,12 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var13 string
|
var templ_7745c5c3_Var10 string
|
||||||
templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 199, Col: 39}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 128, Col: 39}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -409,12 +274,12 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var14 string
|
var templ_7745c5c3_Var11 string
|
||||||
templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(name)
|
templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(name)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 200, Col: 9}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 129, Col: 9}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -427,12 +292,12 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var15 string
|
var templ_7745c5c3_Var12 string
|
||||||
templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 204, Col: 27}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 133, Col: 27}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -440,12 +305,12 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var16 string
|
var templ_7745c5c3_Var13 string
|
||||||
templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(ticker)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 205, Col: 39}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 134, Col: 39}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -453,12 +318,12 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var17 string
|
var templ_7745c5c3_Var14 string
|
||||||
templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(name)
|
templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(name)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/creds.templ`, Line: 206, Col: 9}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/handlers/register/inputs.templ`, Line: 135, Col: 9}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -471,12 +336,4 @@ func cryptoWalletOption(ticker string, name string, isDefault bool) templ.Compon
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to shorten address
|
|
||||||
func shortenAddress(address string) string {
|
|
||||||
if len(address) <= 20 {
|
|
||||||
return address
|
|
||||||
}
|
|
||||||
return address[:16] + "..." + address[len(address)-4:]
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = templruntime.GeneratedTemplate
|
var _ = templruntime.GeneratedTemplate
|
72
internal/gateway/handlers/register/model.go
Normal file
72
internal/gateway/handlers/register/model.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package register
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/onsonr/sonr/internal/gateway/database"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateProfileData struct {
|
||||||
|
TurnstileSiteKey string
|
||||||
|
FirstNumber int
|
||||||
|
LastNumber int
|
||||||
|
}
|
||||||
|
|
||||||
|
type RegisterPasskeyData struct {
|
||||||
|
Address string
|
||||||
|
Handle string
|
||||||
|
Name string
|
||||||
|
Challenge string
|
||||||
|
CreationBlock string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to shorten address
|
||||||
|
func shortenAddress(address string) string {
|
||||||
|
if len(address) <= 20 {
|
||||||
|
return address
|
||||||
|
}
|
||||||
|
return address[:16] + "..." + address[len(address)-4:]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d CreateProfileData) IsHumanLabel() string {
|
||||||
|
return fmt.Sprintf("What is %d + %d?", d.FirstNumber, d.LastNumber)
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractCredentialDescriptor(jsonString string) (*database.Credential, error) {
|
||||||
|
cred := &database.Credential{}
|
||||||
|
// Unmarshal the credential JSON
|
||||||
|
if err := json.Unmarshal([]byte(jsonString), cred); err != nil {
|
||||||
|
return nil, echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("invalid credential format: %v", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate required fields
|
||||||
|
if cred.ID == "" || cred.RawID == "" {
|
||||||
|
return nil, echo.NewHTTPError(http.StatusBadRequest, "missing credential ID")
|
||||||
|
}
|
||||||
|
if cred.Type != "public-key" {
|
||||||
|
return nil, echo.NewHTTPError(http.StatusBadRequest, "invalid credential type")
|
||||||
|
}
|
||||||
|
if cred.Response.AttestationObject == "" || cred.Response.ClientDataJSON == "" {
|
||||||
|
return nil, echo.NewHTTPError(http.StatusBadRequest, "missing attestation data")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log detailed credential information
|
||||||
|
fmt.Printf("Credential Details:\n"+
|
||||||
|
"ID: %s\n"+
|
||||||
|
"Raw ID: %s\n"+
|
||||||
|
"Type: %s\n"+
|
||||||
|
"Authenticator Attachment: %s\n"+
|
||||||
|
"Transports: %v\n"+
|
||||||
|
"Attestation Object Size: %d bytes\n"+
|
||||||
|
"Client Data Size: %d bytes\n",
|
||||||
|
cred.ID,
|
||||||
|
cred.RawID,
|
||||||
|
cred.Type,
|
||||||
|
cred.AuthenticatorAttachment,
|
||||||
|
cred.Transports,
|
||||||
|
)
|
||||||
|
return cred, nil
|
||||||
|
}
|
@ -1,97 +0,0 @@
|
|||||||
package handlers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/go-webauthn/webauthn/protocol"
|
|
||||||
"github.com/labstack/echo/v4"
|
|
||||||
"github.com/onsonr/sonr/crypto/mpc"
|
|
||||||
"github.com/onsonr/sonr/internal/gateway/database"
|
|
||||||
"github.com/onsonr/sonr/internal/gateway/pages/register"
|
|
||||||
"github.com/onsonr/sonr/pkg/common/response"
|
|
||||||
)
|
|
||||||
|
|
||||||
func HandleRegisterView(c echo.Context) error {
|
|
||||||
dat := register.CreateProfileData{
|
|
||||||
FirstNumber: 1,
|
|
||||||
LastNumber: 2,
|
|
||||||
}
|
|
||||||
return response.TemplEcho(c, register.ProfileFormView(dat))
|
|
||||||
}
|
|
||||||
|
|
||||||
func HandleRegisterStart(c echo.Context) error {
|
|
||||||
challenge, _ := protocol.CreateChallenge()
|
|
||||||
handle := c.FormValue("handle")
|
|
||||||
firstName := c.FormValue("first_name")
|
|
||||||
lastName := c.FormValue("last_name")
|
|
||||||
|
|
||||||
ks, err := mpc.NewKeyset()
|
|
||||||
if err != nil {
|
|
||||||
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
||||||
}
|
|
||||||
dat := register.RegisterPasskeyData{
|
|
||||||
Address: ks.Address(),
|
|
||||||
Handle: handle,
|
|
||||||
Name: fmt.Sprintf("%s %s", firstName, lastName),
|
|
||||||
Challenge: challenge.String(),
|
|
||||||
CreationBlock: "00001",
|
|
||||||
}
|
|
||||||
return response.TemplEcho(c, register.LinkCredentialView(dat))
|
|
||||||
}
|
|
||||||
|
|
||||||
func HandleRegisterFinish(c echo.Context) error {
|
|
||||||
// Get the raw credential JSON string
|
|
||||||
credentialJSON := c.FormValue("credential")
|
|
||||||
if credentialJSON == "" {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "missing credential data")
|
|
||||||
}
|
|
||||||
cred := database.Credential{}
|
|
||||||
// Unmarshal the credential JSON
|
|
||||||
if err := json.Unmarshal([]byte(credentialJSON), &cred); err != nil {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("invalid credential format: %v", err))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate required fields
|
|
||||||
if cred.ID == "" || cred.RawID == "" {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "missing credential ID")
|
|
||||||
}
|
|
||||||
if cred.Type != "public-key" {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "invalid credential type")
|
|
||||||
}
|
|
||||||
if cred.Response.AttestationObject == "" || cred.Response.ClientDataJSON == "" {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "missing attestation data")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode attestation object and client data
|
|
||||||
attestationObj, err := base64.RawURLEncoding.DecodeString(cred.Response.AttestationObject)
|
|
||||||
if err != nil {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "invalid attestation object encoding")
|
|
||||||
}
|
|
||||||
|
|
||||||
clientData, err := base64.RawURLEncoding.DecodeString(cred.Response.ClientDataJSON)
|
|
||||||
if err != nil {
|
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "invalid client data encoding")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log detailed credential information
|
|
||||||
fmt.Printf("Credential Details:\n"+
|
|
||||||
"ID: %s\n"+
|
|
||||||
"Raw ID: %s\n"+
|
|
||||||
"Type: %s\n"+
|
|
||||||
"Authenticator Attachment: %s\n"+
|
|
||||||
"Transports: %v\n"+
|
|
||||||
"Attestation Object Size: %d bytes\n"+
|
|
||||||
"Client Data Size: %d bytes\n",
|
|
||||||
cred.ID,
|
|
||||||
cred.RawID,
|
|
||||||
cred.Type,
|
|
||||||
cred.AuthenticatorAttachment,
|
|
||||||
cred.Transports,
|
|
||||||
len(attestationObj),
|
|
||||||
len(clientData))
|
|
||||||
|
|
||||||
return response.TemplEcho(c, register.LoadingVaultView())
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
package handlers
|
|
||||||
|
|
||||||
//
|
|
||||||
// type SpawnVaultRequest struct {
|
|
||||||
// Name string `json:"name"`
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func SpawnVault(c echo.Context) error {
|
|
||||||
// ks, err := mpc.NewKeyset()
|
|
||||||
// if err != nil {
|
|
||||||
// return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
||||||
// }
|
|
||||||
// src, err := mpc.NewSource(ks)
|
|
||||||
// if err != nil {
|
|
||||||
// return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
||||||
// }
|
|
||||||
// tk, err := src.OriginToken()
|
|
||||||
// if err != nil {
|
|
||||||
// return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
||||||
// }
|
|
||||||
// // Create the vault keyshare auth token
|
|
||||||
// kscid, err := tk.CID()
|
|
||||||
// if err != nil {
|
|
||||||
// return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
||||||
// }
|
|
||||||
// // Create the vault config
|
|
||||||
// dir, err := config.NewFS(config.GetVaultConfig(src.Address(), kscid.String()))
|
|
||||||
// path, err := clients.IPFSAdd(c, dir)
|
|
||||||
// if err != nil {
|
|
||||||
// return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
||||||
// }
|
|
||||||
// return c.Redirect(http.StatusFound, path)
|
|
||||||
// }
|
|
@ -1,29 +0,0 @@
|
|||||||
package index
|
|
||||||
|
|
||||||
import "github.com/onsonr/sonr/pkg/common/styles/layout"
|
|
||||||
|
|
||||||
templ NoWebauthnErrorView() {
|
|
||||||
@layout.Root("Error | Sonr.ID") {
|
|
||||||
<div class="flex fixed inset-0 z-[99] w-screen h-screen bg-white">
|
|
||||||
<div class="relative flex flex-wrap items-center w-full h-full px-8">
|
|
||||||
<div class="relative w-full max-w-sm mx-auto lg:mb-0">
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<h1 class="text-3xl font-bold text-zinc-900 mb-4">
|
|
||||||
No WebAuthn Devices
|
|
||||||
</h1>
|
|
||||||
<p class="text-lg text-zinc-500">
|
|
||||||
You don't have any WebAuthn devices connected to your computer.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<button class="btn btn-sm text-zinc-100 bg-zinc-900 hover:bg-zinc-800 w-full shadow">
|
|
||||||
Get Started
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
// Code generated by templ - DO NOT EDIT.
|
|
||||||
|
|
||||||
// templ: version: v0.2.793
|
|
||||||
package index
|
|
||||||
|
|
||||||
//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/common/styles/layout"
|
|
||||||
|
|
||||||
func NoWebauthnErrorView() 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_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
||||||
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
||||||
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_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex fixed inset-0 z-[99] w-screen h-screen bg-white\"><div class=\"relative flex flex-wrap items-center w-full h-full px-8\"><div class=\"relative w-full max-w-sm mx-auto lg:mb-0\"><div class=\"flex flex-col items-center justify-center h-full\"><div class=\"flex flex-col items-center justify-center h-full\"><h1 class=\"text-3xl font-bold text-zinc-900 mb-4\">No WebAuthn Devices</h1><p class=\"text-lg text-zinc-500\">You don't have any WebAuthn devices connected to your computer.</p></div><div class=\"flex flex-col items-center justify-center h-full\"><button class=\"btn btn-sm text-zinc-100 bg-zinc-900 hover:bg-zinc-800 w-full shadow\">Get Started</button></div></div></div></div></div>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
templ_7745c5c3_Err = layout.Root("Error | Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = templruntime.GeneratedTemplate
|
|
@ -1,24 +0,0 @@
|
|||||||
package login
|
|
||||||
|
|
||||||
type LoginRequest struct {
|
|
||||||
Subject string
|
|
||||||
Action string
|
|
||||||
Origin string
|
|
||||||
Status string
|
|
||||||
Ping string
|
|
||||||
BlockSpeed string
|
|
||||||
BlockHeight string
|
|
||||||
}
|
|
||||||
|
|
||||||
type PublicKeyCredentialRequestOptions struct {
|
|
||||||
Challenge string `json:"challenge"`
|
|
||||||
RpID string `json:"rpId"`
|
|
||||||
Timeout int `json:"timeout,omitempty"`
|
|
||||||
UserVerification string `json:"userVerification,omitempty"`
|
|
||||||
AllowCredentials []CredentialDescriptor `json:"allowCredentials,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type CredentialDescriptor struct {
|
|
||||||
Type string `json:"type"`
|
|
||||||
ID string `json:"id"`
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
package register
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/a-h/templ"
|
|
||||||
"github.com/go-webauthn/webauthn/protocol"
|
|
||||||
)
|
|
||||||
|
|
||||||
type LinkCredentialRequest struct {
|
|
||||||
Platform string `json:"platform"`
|
|
||||||
Handle string `json:"handle"`
|
|
||||||
DeviceModel string `json:"deviceModel"`
|
|
||||||
Architecture string `json:"architecture"`
|
|
||||||
Address string `json:"address"`
|
|
||||||
RegisterOptions protocol.PublicKeyCredentialCreationOptions `json:"registerOptions"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r LinkCredentialRequest) GetCredentialOptions() string {
|
|
||||||
opts, _ := templ.JSONString(r.RegisterOptions)
|
|
||||||
return opts
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
package register
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/onsonr/sonr/pkg/common/styles/layout"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CreateProfileData struct {
|
|
||||||
TurnstileSiteKey string
|
|
||||||
FirstNumber int
|
|
||||||
LastNumber int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d CreateProfileData) IsHumanLabel() string {
|
|
||||||
return fmt.Sprintf("What is %d + %d?", d.FirstNumber, d.LastNumber)
|
|
||||||
}
|
|
||||||
|
|
||||||
templ formCreateProfile(action string, method string, data CreateProfileData) {
|
|
||||||
<form action={ templ.SafeURL(action) } method={ method }>
|
|
||||||
<sl-card class="card-form gap-4 w-full max-w-lg mx-auto px-4 sm:px-6">
|
|
||||||
<div slot="header">
|
|
||||||
<div class="w-full py-1">
|
|
||||||
<sl-progress-bar value="50"></sl-progress-bar>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@layout.Rows() {
|
|
||||||
<sl-input name="first_name" placeholder="Satoshi" type="text" label="First Name" required autofocus></sl-input>
|
|
||||||
<sl-input name="last_name" placeholder="N" maxlength="1" type="text" label="Last Initial"></sl-input>
|
|
||||||
}
|
|
||||||
@layout.Spacer()
|
|
||||||
<sl-input name="handle" placeholder="digitalgold" type="text" label="Handle" minlength="4" maxlength="12" required>
|
|
||||||
<div slot="prefix">
|
|
||||||
<sl-icon name="at-sign" library="sonr"></sl-icon>
|
|
||||||
</div>
|
|
||||||
</sl-input>
|
|
||||||
@layout.Spacer()
|
|
||||||
<sl-range name="is_human" label={ data.IsHumanLabel() } help-text="Prove you are a human." min="0" max="9" step="1"></sl-range>
|
|
||||||
<div slot="footer">
|
|
||||||
<sl-button href="/" outline>
|
|
||||||
<sl-icon slot="prefix" name="arrow-left" library="sonr"></sl-icon>
|
|
||||||
Cancel
|
|
||||||
</sl-button>
|
|
||||||
<sl-button type="submit">
|
|
||||||
Next
|
|
||||||
<sl-icon slot="suffix" name="arrow-right" library="sonr"></sl-icon>
|
|
||||||
</sl-button>
|
|
||||||
</div>
|
|
||||||
<style>
|
|
||||||
.card-form {
|
|
||||||
margin: 1rem;
|
|
||||||
}
|
|
||||||
.card-form [slot='footer'] {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 1rem;
|
|
||||||
}
|
|
||||||
@media (max-width: 640px) {
|
|
||||||
.card-form {
|
|
||||||
margin: 0.5rem;
|
|
||||||
}
|
|
||||||
.card-form [slot='footer'] {
|
|
||||||
flex-direction: column-reverse;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.card-form [slot='footer'] sl-button {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</sl-card>
|
|
||||||
</form>
|
|
||||||
}
|
|
||||||
|
|
||||||
// ╭──────────────────────────────────────────────────────╮
|
|
||||||
// │ Passkey Components │
|
|
||||||
// ╰──────────────────────────────────────────────────────╯
|
|
@ -1,131 +0,0 @@
|
|||||||
// Code generated by templ - DO NOT EDIT.
|
|
||||||
|
|
||||||
// templ: version: v0.2.793
|
|
||||||
package register
|
|
||||||
|
|
||||||
//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 (
|
|
||||||
"fmt"
|
|
||||||
"github.com/onsonr/sonr/pkg/common/styles/layout"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CreateProfileData struct {
|
|
||||||
TurnstileSiteKey string
|
|
||||||
FirstNumber int
|
|
||||||
LastNumber int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d CreateProfileData) IsHumanLabel() string {
|
|
||||||
return fmt.Sprintf("What is %d + %d?", d.FirstNumber, d.LastNumber)
|
|
||||||
}
|
|
||||||
|
|
||||||
func formCreateProfile(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("<form action=\"")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
var templ_7745c5c3_Var2 templ.SafeURL = templ.SafeURL(action)
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var2)))
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" method=\"")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
var templ_7745c5c3_Var3 string
|
|
||||||
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(method)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/profile.templ`, Line: 19, Col: 55}
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><sl-card class=\"card-form gap-4 w-full max-w-lg mx-auto px-4 sm:px-6\"><div slot=\"header\"><div class=\"w-full py-1\"><sl-progress-bar value=\"50\"></sl-progress-bar></div></div>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
||||||
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
||||||
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_Err = templ_7745c5c3_Buffer.WriteString("<sl-input name=\"first_name\" placeholder=\"Satoshi\" type=\"text\" label=\"First Name\" required autofocus></sl-input> <sl-input name=\"last_name\" placeholder=\"N\" maxlength=\"1\" type=\"text\" label=\"Last Initial\"></sl-input>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
templ_7745c5c3_Err = layout.Rows().Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
|
|
||||||
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("<sl-input name=\"handle\" placeholder=\"digitalgold\" type=\"text\" label=\"Handle\" minlength=\"4\" maxlength=\"12\" required><div slot=\"prefix\"><sl-icon name=\"at-sign\" library=\"sonr\"></sl-icon></div></sl-input>")
|
|
||||||
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("<sl-range name=\"is_human\" label=\"")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
var templ_7745c5c3_Var5 string
|
|
||||||
templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(data.IsHumanLabel())
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gateway/pages/register/profile.templ`, Line: 37, Col: 56}
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" help-text=\"Prove you are a human.\" min=\"0\" max=\"9\" step=\"1\"></sl-range><div slot=\"footer\"><sl-button href=\"/\" outline><sl-icon slot=\"prefix\" name=\"arrow-left\" library=\"sonr\"></sl-icon> Cancel</sl-button> <sl-button type=\"submit\">Next <sl-icon slot=\"suffix\" name=\"arrow-right\" library=\"sonr\"></sl-icon></sl-button></div><style>\n\t\t\t\t.card-form {\n\t\t\t\t\tmargin: 1rem;\n\t\t\t\t}\n\t\t\t\t.card-form [slot='footer'] {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: space-between;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\tgap: 1rem;\n\t\t\t\t}\n\t\t\t\t@media (max-width: 640px) {\n\t\t\t\t\t.card-form {\n\t\t\t\t\t\tmargin: 0.5rem;\n\t\t\t\t\t}\n\t\t\t\t\t.card-form [slot='footer'] {\n\t\t\t\t\t\tflex-direction: column-reverse;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t\t.card-form [slot='footer'] sl-button {\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</style></sl-card></form>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ╭──────────────────────────────────────────────────────╮
|
|
||||||
// │ Passkey Components │
|
|
||||||
// ╰──────────────────────────────────────────────────────╯
|
|
||||||
var _ = templruntime.GeneratedTemplate
|
|
@ -5,7 +5,8 @@ import (
|
|||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
"github.com/onsonr/sonr/internal/gateway/config"
|
"github.com/onsonr/sonr/internal/gateway/config"
|
||||||
"github.com/onsonr/sonr/internal/gateway/database"
|
"github.com/onsonr/sonr/internal/gateway/database"
|
||||||
"github.com/onsonr/sonr/internal/gateway/handlers"
|
"github.com/onsonr/sonr/internal/gateway/handlers/index"
|
||||||
|
"github.com/onsonr/sonr/internal/gateway/handlers/register"
|
||||||
"github.com/onsonr/sonr/internal/gateway/session"
|
"github.com/onsonr/sonr/internal/gateway/session"
|
||||||
"github.com/onsonr/sonr/pkg/common/response"
|
"github.com/onsonr/sonr/pkg/common/response"
|
||||||
)
|
)
|
||||||
@ -24,9 +25,9 @@ func RegisterRoutes(e *echo.Echo, env config.Env) error {
|
|||||||
e.Use(session.Middleware(db, env))
|
e.Use(session.Middleware(db, env))
|
||||||
|
|
||||||
// Register routes
|
// Register routes
|
||||||
e.GET("/", handlers.HandleIndex)
|
e.GET("/", index.Handler)
|
||||||
e.GET("/register", handlers.HandleRegisterView)
|
e.GET("/register", register.HandleCreateProfile)
|
||||||
e.POST("/register/start", handlers.HandleRegisterStart)
|
e.POST("/register/start", register.HandlePasskeyStart)
|
||||||
e.POST("/register/finish", handlers.HandleRegisterFinish)
|
e.POST("/register/finish", register.HandlePasskeyFinish)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
package handlers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/go-webauthn/webauthn/protocol"
|
|
||||||
"github.com/labstack/echo/v4"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ╭───────────────────────────────────────────────────────────╮
|
|
||||||
// │ Login Handlers │
|
|
||||||
// ╰───────────────────────────────────────────────────────────╯
|
|
||||||
|
|
||||||
// LoginSubjectCheck handles the login subject check.
|
|
||||||
func LoginSubjectCheck(e echo.Context) error {
|
|
||||||
return e.JSON(200, "HandleCredentialAssertion")
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoginSubjectStart handles the login subject start.
|
|
||||||
func LoginSubjectStart(e echo.Context) error {
|
|
||||||
opts := &protocol.PublicKeyCredentialRequestOptions{
|
|
||||||
UserVerification: "preferred",
|
|
||||||
Challenge: []byte("challenge"),
|
|
||||||
}
|
|
||||||
return e.JSON(200, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoginSubjectFinish handles the login subject finish.
|
|
||||||
func LoginSubjectFinish(e echo.Context) error {
|
|
||||||
var crr protocol.CredentialAssertionResponse
|
|
||||||
if err := e.Bind(&crr); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return e.JSON(200, crr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ╭───────────────────────────────────────────────────────────╮
|
|
||||||
// │ Register Handlers │
|
|
||||||
// ╰───────────────────────────────────────────────────────────╯
|
|
||||||
|
|
||||||
// RegisterSubjectCheck handles the register subject check.
|
|
||||||
func RegisterSubjectCheck(e echo.Context) error {
|
|
||||||
subject := e.FormValue("subject")
|
|
||||||
return e.JSON(200, subject)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterSubjectStart handles the register subject start.
|
|
||||||
func RegisterSubjectStart(e echo.Context) error {
|
|
||||||
// Get subject and address
|
|
||||||
// subject := e.FormValue("subject")
|
|
||||||
|
|
||||||
// Get challenge
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterSubjectFinish handles the register subject finish.
|
|
||||||
func RegisterSubjectFinish(e echo.Context) error {
|
|
||||||
// Deserialize the JSON into a temporary struct
|
|
||||||
var ccr protocol.CredentialCreationResponse
|
|
||||||
if err := e.Bind(&ccr); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// // Parse the CredentialCreationResponse
|
|
||||||
// parsedData, err := ccr.Parse()
|
|
||||||
// if err != nil {
|
|
||||||
// return e.JSON(500, err.Error())
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // Create the Credential
|
|
||||||
// // credential := orm.NewCredential(parsedData, e.Request().Host, "")
|
|
||||||
return e.JSON(201, ccr)
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package authorize
|
|
||||||
|
|
||||||
type AuthorizeRequest struct {
|
|
||||||
Subject string
|
|
||||||
Action string
|
|
||||||
Origin string
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package authorize
|
|
||||||
|
|
||||||
type AuthorizeRequest struct {
|
|
||||||
Subject string
|
|
||||||
Action string
|
|
||||||
Origin string
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
package dash
|
|
||||||
|
|
||||||
import "github.com/onsonr/sonr/pkg/common/styles/layout"
|
|
||||||
|
|
||||||
templ ProfileView() {
|
|
||||||
@layout.Root("Sonr.ID") {
|
|
||||||
<div class="flex fixed inset-0 z-[99] w-screen h-screen bg-white">
|
|
||||||
<div class="relative flex flex-wrap items-center w-full h-full px-8">
|
|
||||||
<div class="relative w-full max-w-sm mx-auto lg:mb-0">
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<h1 class="text-3xl font-bold text-zinc-900 mb-4">
|
|
||||||
Sonr.ID
|
|
||||||
</h1>
|
|
||||||
<p class="text-lg text-zinc-500">
|
|
||||||
The decentralized identity layer for the web.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<button class="btn btn-sm text-zinc-100 bg-zinc-900 hover:bg-zinc-800 w-full shadow">
|
|
||||||
Get Started
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{ children... }
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
templ FeedView() {
|
|
||||||
@layout.Root("Sonr.ID") {
|
|
||||||
<div class="flex fixed inset-0 z-[99] w-screen h-screen bg-white">
|
|
||||||
<div class="relative flex flex-wrap items-center w-full h-full px-8">
|
|
||||||
<div class="relative w-full max-w-sm mx-auto lg:mb-0">
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<h1 class="text-3xl font-bold text-zinc-900 mb-4">
|
|
||||||
Welcome Back!
|
|
||||||
</h1>
|
|
||||||
<p class="text-lg text-zinc-500">
|
|
||||||
Continue with your existing Sonr.ID.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col items-center justify-center h-full">
|
|
||||||
<button class="btn btn-sm text-zinc-100 bg-zinc-900 hover:bg-zinc-800 w-full shadow">
|
|
||||||
Login
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{ children... }
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,123 +0,0 @@
|
|||||||
// Code generated by templ - DO NOT EDIT.
|
|
||||||
|
|
||||||
// templ: version: v0.2.793
|
|
||||||
package dash
|
|
||||||
|
|
||||||
//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/common/styles/layout"
|
|
||||||
|
|
||||||
func ProfileView() 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_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
||||||
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
||||||
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_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex fixed inset-0 z-[99] w-screen h-screen bg-white\"><div class=\"relative flex flex-wrap items-center w-full h-full px-8\"><div class=\"relative w-full max-w-sm mx-auto lg:mb-0\"><div class=\"flex flex-col items-center justify-center h-full\"><div class=\"flex flex-col items-center justify-center h-full\"><h1 class=\"text-3xl font-bold text-zinc-900 mb-4\">Sonr.ID</h1><p class=\"text-lg text-zinc-500\">The decentralized identity layer for the web.</p></div><div class=\"flex flex-col items-center justify-center h-full\"><button class=\"btn btn-sm text-zinc-100 bg-zinc-900 hover:bg-zinc-800 w-full shadow\">Get Started</button></div></div>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = templ_7745c5c3_Var1.Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
templ_7745c5c3_Err = layout.Root("Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func FeedView() 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_Var3 := templ.GetChildren(ctx)
|
|
||||||
if templ_7745c5c3_Var3 == nil {
|
|
||||||
templ_7745c5c3_Var3 = templ.NopComponent
|
|
||||||
}
|
|
||||||
ctx = templ.ClearChildren(ctx)
|
|
||||||
templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
|
|
||||||
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
|
|
||||||
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_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"flex fixed inset-0 z-[99] w-screen h-screen bg-white\"><div class=\"relative flex flex-wrap items-center w-full h-full px-8\"><div class=\"relative w-full max-w-sm mx-auto lg:mb-0\"><div class=\"flex flex-col items-center justify-center h-full\"><div class=\"flex flex-col items-center justify-center h-full\"><h1 class=\"text-3xl font-bold text-zinc-900 mb-4\">Welcome Back!</h1><p class=\"text-lg text-zinc-500\">Continue with your existing Sonr.ID.</p></div><div class=\"flex flex-col items-center justify-center h-full\"><button class=\"btn btn-sm text-zinc-100 bg-zinc-900 hover:bg-zinc-800 w-full shadow\">Login</button></div></div>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
templ_7745c5c3_Err = templ_7745c5c3_Var3.Render(ctx, templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div></div></div>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
templ_7745c5c3_Err = layout.Root("Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = templruntime.GeneratedTemplate
|
|
@ -7,7 +7,6 @@ package vault
|
|||||||
import (
|
import (
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
|
|
||||||
"github.com/onsonr/sonr/internal/vault/handlers"
|
|
||||||
session "github.com/onsonr/sonr/internal/vault/session"
|
session "github.com/onsonr/sonr/internal/vault/session"
|
||||||
"github.com/onsonr/sonr/internal/vault/types"
|
"github.com/onsonr/sonr/internal/vault/types"
|
||||||
)
|
)
|
||||||
@ -15,14 +14,4 @@ import (
|
|||||||
// RegisterRoutes registers the Decentralized Web Node API routes.
|
// RegisterRoutes registers the Decentralized Web Node API routes.
|
||||||
func RegisterRoutes(e *echo.Echo, config *types.Config) {
|
func RegisterRoutes(e *echo.Echo, config *types.Config) {
|
||||||
e.Use(session.Middleware(config))
|
e.Use(session.Middleware(config))
|
||||||
|
|
||||||
e.GET("/register/:subject/start", handlers.RegisterSubjectStart)
|
|
||||||
e.POST("/register/:subject/finish", handlers.RegisterSubjectFinish)
|
|
||||||
|
|
||||||
e.GET("/login/:subject/start", handlers.LoginSubjectStart)
|
|
||||||
e.POST("/login/:subject/finish", handlers.LoginSubjectFinish)
|
|
||||||
|
|
||||||
e.GET("/authz/jwks", handlers.GetJWKS)
|
|
||||||
e.GET("/authz/token", handlers.GetToken)
|
|
||||||
e.POST("/:origin/grant/:subject", handlers.GrantAuthorization)
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user