krz/gitbay

A CLI-first git forge.

clone: git clone https://gitbay.org/krz/gitbay.git

main: internal/control/web.go · raw

 1package control
 2
 3import (
 4	"fmt"
 5	"io"
 6	"time"
 7
 8	"gitbay.org/gitbay/internal/protocol"
 9	"gitbay.org/gitbay/internal/store"
10)
11
12func newStoredToken() (token, hash string, err error) { return store.NewToken() }
13
14func init() {
15	register(Command{Path: []string{"web", "login"},
16		Summary: "mint a one-time browser login URL", Run: runWebLogin})
17}
18
19func runWebLogin(c *Ctx, args []string) int {
20	if len(args) != 0 {
21		return c.fail(protocol.ExitUsage, "usage: web login [--json]")
22	}
23	if c.Cfg.Web.Mode != "accounts" {
24		return c.fail(protocol.ExitDenied,
25			"this instance runs the web in view-only mode (web.mode = %q); there is nothing to log in to", c.Cfg.Web.Mode)
26	}
27	token, hash, err := newStoredToken()
28	if err != nil {
29		return c.fail(protocol.ExitFailure, "%v", err)
30	}
31	if err := c.Store.CreateLoginToken(c.User.ID, hash, 5*time.Minute); err != nil {
32		return c.fail(protocol.ExitFailure, "%v", err)
33	}
34	url := c.Cfg.Server.SiteURL + "/login?token=" + token
35	return c.emit(map[string]string{"url": url, "expires_in": "5m"}, func(w io.Writer) {
36		fmt.Fprintf(w, "open within 5 minutes (single use):\n%s\n", url)
37	})
38}