internal/control/web.go
39 lines · 1146 bytes
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",
17 Usage: "web login", Run: runWebLogin})
18}
19
20func runWebLogin(c *Ctx, args []string) int {
21 if len(args) != 0 {
22 return c.fail(protocol.ExitUsage, "usage: web login [--json]")
23 }
24 if c.Cfg.Web.Mode != "accounts" {
25 return c.fail(protocol.ExitDenied,
26 "this instance runs the web in view-only mode (web.mode = %q); there is nothing to log in to", c.Cfg.Web.Mode)
27 }
28 token, hash, err := newStoredToken()
29 if err != nil {
30 return c.fail(protocol.ExitFailure, "%v", err)
31 }
32 if err := c.Store.CreateLoginToken(c.User.ID, hash, 5*time.Minute); err != nil {
33 return c.fail(protocol.ExitFailure, "%v", err)
34 }
35 url := c.Cfg.Server.SiteURL + "/login?token=" + token
36 return c.emit(map[string]string{"url": url, "expires_in": "5m"}, func(w io.Writer) {
37 fmt.Fprintf(w, "open within 5 minutes (single use):\n%s\n", url)
38 })
39}