telegabber/xmpp/loginwizard.go
2025-04-30 19:44:28 -04:00

101 lines
2.4 KiB
Go

package xmpp
import (
"fmt"
"dev.narayana.im/narayana/telegabber/telegram"
"dev.narayana.im/narayana/telegabber/xmpp/gateway"
log "github.com/sirupsen/logrus"
"gosrc.io/xmpp"
"gosrc.io/xmpp/stanza"
)
func loginWizardPayload(bare string, requestForm *stanza.Form, resource string) (payload *stanza.Command, cancelSend bool, returnSession *telegram.Client) {
payload = &stanza.Command{
SessionId: "loginwizard",
Node: "loginwizard",
}
session, ok := sessions[bare]
if ok {
returnSession = session
if requestForm == nil {
session.StartLoginWizard(false)
cancelSend = true
} else {
if len(requestForm.Fields) != 1 {
setCommandPayloadError(payload, "Hey, don't tinker with the form!")
return
}
field := requestForm.Fields[0]
if field != nil {
if len(field.ValuesList) < 1 {
setCommandPayloadError(payload, "No value")
return
}
switch field.Var {
case "login", "code", "password":
default:
setCommandPayloadError(payload, "Unknown field")
return
}
session.StartLoginWizard(true)
response, success := session.ProcessTransportCommand(fmt.Sprintf("/%v %v", field.Var, field.ValuesList[0]), resource)
if !success {
setCommandPayloadError(payload, response)
session.StopLoginWizard()
return
}
cancelSend = true
}
}
} else {
setCommandPayloadError(payload, fmt.Sprintf("Session is not initialized, add the transport (%v) to contacts first", gateway.Jid.Bare()))
}
return
}
func sendLoginWizardResponse(component *xmpp.Component, answer *stanza.IQ, session *telegram.Client) {
payload := &stanza.Command{
SessionId: "loginwizard",
Node: "loginwizard",
}
nextStage := "login"
if session != nil {
nextStage = session.GetLoginWizardNextStage()
}
log.Debugf("nextStage: %v", nextStage)
if nextStage == "cancel" {
setCommandPayloadError(payload, "Cancelled")
session.StopLoginWizard()
} else if nextStage == "success" {
payload.Status = stanza.CommandStatusCompleted
session.StopLoginWizard()
} else {
required := ""
form := stanza.Form{
Type: stanza.FormTypeForm,
Title: "Login Wizard",
Fields: []*stanza.Field{
&stanza.Field{
Var: nextStage,
Label: nextStage,
Required: &required,
},
},
}
payload.Status = stanza.CommandStatusExecuting
payload.CommandElements = append(payload.CommandElements, &form)
}
answer.Payload = payload
gateway.ResumableSend(component, answer)
}