From 91eab2d7720711e23d5acd91cb75ede396ca98c9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 13 Jan 2023 14:09:39 +0200 Subject: [PATCH] Add token login provisioning API --- provisioning.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/provisioning.go b/provisioning.go index bce7bc0..e41576e 100644 --- a/provisioning.go +++ b/provisioning.go @@ -45,6 +45,7 @@ func newProvisioningAPI(br *DiscordBridge) *ProvisioningAPI { r.HandleFunc("/disconnect", p.disconnect).Methods(http.MethodPost) r.HandleFunc("/ping", p.ping).Methods(http.MethodGet) r.HandleFunc("/login/qr", p.qrLogin).Methods(http.MethodGet) + r.HandleFunc("/login/token", p.tokenLogin).Methods(http.MethodPost) r.HandleFunc("/logout", p.logout).Methods(http.MethodPost) r.HandleFunc("/reconnect", p.reconnect).Methods(http.MethodPost) @@ -348,6 +349,47 @@ type respLogin struct { Discriminator string `json:"discriminator"` } +type reqTokenLogin struct { + Token string `json:"token"` +} + +func (p *ProvisioningAPI) tokenLogin(w http.ResponseWriter, r *http.Request) { + userID := r.URL.Query().Get("user_id") + user := p.bridge.GetUserByMXID(id.UserID(userID)) + log := p.log.Sub("TokenLogin").Sub(user.MXID.String()) + if user.IsLoggedIn() { + jsonResponse(w, http.StatusConflict, Error{ + Error: "You're already logged into Discord", + ErrCode: "already logged in", + }) + return + } + var body reqTokenLogin + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + log.Errorln("Failed to parse login request:", err) + jsonResponse(w, http.StatusBadRequest, Error{ + Error: "Failed to parse request body", + ErrCode: "bad request", + }) + return + } + if err := user.Login(body.Token); err != nil { + log.Errorln("Failed to connect with provided token:", err) + jsonResponse(w, http.StatusUnauthorized, Error{ + Error: "Failed to connect to Discord", + ErrCode: "connect fail", + }) + return + } + log.Infoln("Successfully logged in") + jsonResponse(w, http.StatusOK, respLogin{ + Success: true, + ID: user.DiscordID, + Username: user.Session.State.User.Username, + Discriminator: user.Session.State.User.Discriminator, + }) +} + func (p *ProvisioningAPI) reconnect(w http.ResponseWriter, r *http.Request) { user := r.Context().Value("user").(*User)