Add token login provisioning API

This commit is contained in:
Tulir Asokan
2023-01-13 14:09:39 +02:00
parent 91c3fae7cb
commit 91eab2d772

View File

@@ -45,6 +45,7 @@ func newProvisioningAPI(br *DiscordBridge) *ProvisioningAPI {
r.HandleFunc("/disconnect", p.disconnect).Methods(http.MethodPost) r.HandleFunc("/disconnect", p.disconnect).Methods(http.MethodPost)
r.HandleFunc("/ping", p.ping).Methods(http.MethodGet) r.HandleFunc("/ping", p.ping).Methods(http.MethodGet)
r.HandleFunc("/login/qr", p.qrLogin).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("/logout", p.logout).Methods(http.MethodPost)
r.HandleFunc("/reconnect", p.reconnect).Methods(http.MethodPost) r.HandleFunc("/reconnect", p.reconnect).Methods(http.MethodPost)
@@ -348,6 +349,47 @@ type respLogin struct {
Discriminator string `json:"discriminator"` 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) { func (p *ProvisioningAPI) reconnect(w http.ResponseWriter, r *http.Request) {
user := r.Context().Value("user").(*User) user := r.Context().Value("user").(*User)