diff --git a/login.go b/login.go index 216cb97..f09506d 100644 --- a/login.go +++ b/login.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "net/http" + "time" "github.com/gofiber/fiber/v2" ) @@ -15,6 +16,7 @@ import ( const EDGEDB_AUTH_BASE_URL = "http://127.0.0.1:10700/db/main/ext/auth" func generatePKCE() (string, string) { + fmt.Println("Generating PKCE") verifier := make([]byte, 32) _, err := rand.Read(verifier) if err != nil { @@ -22,7 +24,16 @@ func generatePKCE() (string, string) { } challenge := sha256.Sum256(verifier) - return base64.RawURLEncoding.EncodeToString(verifier), base64.RawURLEncoding.EncodeToString(challenge[:]) + + var URLEncoding = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_") + var RawURLEncoding = URLEncoding.WithPadding(base64.NoPadding) + encodedVerifier := RawURLEncoding.EncodeToString(verifier) + encodedChallenge := RawURLEncoding.EncodeToString(challenge[:]) + + fmt.Println("verifier: " + encodedVerifier) + fmt.Println("challenge: " + encodedChallenge) + + return encodedVerifier, encodedChallenge } func handleUiSignIn(c *fiber.Ctx) error { @@ -31,18 +42,13 @@ func handleUiSignIn(c *fiber.Ctx) error { fmt.Println("handleUiSignIn verifier: " + verifier) fmt.Println("handleUiSignIn challenge: " + challenge) - redirectURL := fmt.Sprintf("%s/ui/signin?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge) + cookie := new(fiber.Cookie) + cookie.Name = "jade-edgedb-pkce-verifier" + cookie.Value = verifier + cookie.Expires = time.Now().Add(10 * time.Minute) + c.Cookie(cookie) - c.Cookie(&fiber.Cookie{ - Name: "jade-edgedb-pkce-verifier", - Value: verifier, - HTTPOnly: true, - Path: "/", - Secure: true, - SameSite: "Strict", - }) - - return c.Redirect(redirectURL, fiber.StatusMovedPermanently) + return c.Redirect(fmt.Sprintf("%s/ui/signup?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge), fiber.StatusTemporaryRedirect) } func handleUiSignUp(c *fiber.Ctx) error { @@ -51,30 +57,13 @@ func handleUiSignUp(c *fiber.Ctx) error { fmt.Println("handleUiSignUp verifier: " + verifier) fmt.Println("handleUiSignUp challenge: " + challenge) - redirectURL := fmt.Sprintf("%s/ui/signup?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge) + cookie := new(fiber.Cookie) + cookie.Name = "jade-edgedb-pkce-verifier" + cookie.Value = verifier + cookie.Expires = time.Now().Add(10 * time.Minute) + c.Cookie(cookie) - c.Cookie(&fiber.Cookie{ - Name: "jade-edgedb-pkce-verifier", - Value: verifier, - HTTPOnly: true, - Path: "/", - Secure: true, - SameSite: "Strict", - }) - - return c.Redirect(redirectURL, fiber.StatusMovedPermanently) -} - -func handleCallbackSignup(c *fiber.Ctx) error { - code := c.Query("code") - fmt.Println("Callback signup code: " + code) - - verifier := c.Cookies("jade-edgedb-pkce-verifier") - if verifier == "" { - return c.Status(fiber.StatusBadRequest).SendString("Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?") - } - - return c.SendString("OK") + return c.Redirect(fmt.Sprintf("%s/ui/signup?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge), fiber.StatusTemporaryRedirect) } func handleCallback(c *fiber.Ctx) error { @@ -93,6 +82,7 @@ func handleCallback(c *fiber.Ctx) error { fmt.Println("handleCallback verifier: " + verifier) codeExchangeURL := fmt.Sprintf("%s/token?code=%s&verifier=%s", EDGEDB_AUTH_BASE_URL, code, verifier) + fmt.Println("codeExchangeURL: " + codeExchangeURL) resp, err := http.Get(codeExchangeURL) if err != nil { return c.Status(fiber.StatusBadRequest).SendString(fmt.Sprintf("Error from the auth server: %s", err.Error())) diff --git a/main.go b/main.go index 1d27929..9bf8d42 100644 --- a/main.go +++ b/main.go @@ -42,10 +42,9 @@ func main() { app.Get("/generateMultipleMessages", GenerateMultipleMessages) // Generate multiple messages app.Get("/messageContent", GetMessageContentHandler) - app.Get("/auth/ui/signin", handleUiSignIn) - app.Get("/auth/ui/signup", handleUiSignUp) - app.Get("/auth/callback", handleCallback) - app.Get("/auth/callbackSignup", handleCallbackSignup) + app.Get("/signin", handleUiSignIn) + app.Get("/signup", handleUiSignUp) + app.Get("/callback", handleCallback) app.Get("test", func(c *fiber.Ctx) error { fmt.Println("test") diff --git a/static/animations.css b/static/animations.css new file mode 100644 index 0000000..349d15e --- /dev/null +++ b/static/animations.css @@ -0,0 +1,17 @@ +.message-bot.htmx-added { + opacity: 0; +} + +.message-bot { + opacity: 1; + transition: opacity 1s ease-out; +} + +.message-user.htmx-added { + opacity: 0; +} + +.message-user { + opacity: 1; + transition: opacity 1s ease-out; +} \ No newline at end of file diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..3a511f3 --- /dev/null +++ b/static/style.css @@ -0,0 +1,109 @@ +.my-indicator { + display: none; +} + +.htmx-request .my-indicator { + display: inline; +} + +.htmx-request.my-indicator { + display: inline; +} + +svg text { + font-family: 'Russo One', sans-serif; + text-transform: uppercase; + fill: #000; + stroke: #000; + font-size: 240px; +} + +.message-content { + background-color: #303030; + border-radius: 5px; + padding: 10px; +} + +#chat-messages .message-content pre { + overflow-x: auto; + white-space: pre; + max-width: 662px; +} + +#chat-messages .message-content pre code { + display: inline-block; + min-width: 100%; + white-space: inherit; +} + +.content { + font-size: 14px; + line-height: 1.5; + color: #ffffff; +} + +.content pre { + font-family: monospace; + background-color: #363636 !important; + border-radius: 3px; +} + +#chat-messages { + max-width: 780px; + margin: auto; + width: 95%; + margin-bottom: 180px; +} + +#chat-input-form { + max-width: 900px; + margin: auto; + width: 98%; +} + +:root { + --bulma-body-background-color: #202020; + --bulma-primary: #126d0f; +} + +body, +html { + height: 100%; + margin: 0; +} + +.chat-input-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: fixed; + bottom: 10px; + left: 0; + right: 0; + padding: 10px; + max-width: 800px; + margin: 0 auto; + z-index: 1; +} + +.textarea-wrapper { + position: relative; + width: 100%; +} + +.textarea { + width: 100%; + padding-right: 140px; + /* Adjust this value based on the button and dropdown width */ + box-sizing: border-box; +} + +.button-group { + position: absolute; + bottom: 10px; + right: 10px; + display: flex; + align-items: center; + gap: 10px; +} \ No newline at end of file diff --git a/utils.go b/utils.go index f0433b0..39918ca 100644 --- a/utils.go +++ b/utils.go @@ -18,6 +18,7 @@ func markdownToHTML(markdownText string) string { if err := md.Convert([]byte(markdownText), &buf); err != nil { panic(err) // Handle the error appropriately } + return buf.String() } diff --git a/views/chat.html b/views/chat.html index d7bd512..c1a69b5 100644 --- a/views/chat.html +++ b/views/chat.html @@ -2,7 +2,6 @@ -
diff --git a/views/layouts/main.html b/views/layouts/main.html index 3180c44..d26ff71 100644 --- a/views/layouts/main.html +++ b/views/layouts/main.html @@ -9,50 +9,8 @@ - + + @@ -64,88 +22,6 @@ {{embed}} - - - - - - - - - \ No newline at end of file diff --git a/views/partials/message-user.html b/views/partials/message-user.html index b4838a8..f6325ae 100644 --- a/views/partials/message-user.html +++ b/views/partials/message-user.html @@ -14,8 +14,9 @@ {{ Content|safe }}
- + diff --git a/views/partials/navbar.html b/views/partials/navbar.html index 3b02ab6..4bf6c20 100644 --- a/views/partials/navbar.html +++ b/views/partials/navbar.html @@ -12,10 +12,10 @@