From 387a0b7e5ae110b84785d25ec9d91475574f8f65 Mon Sep 17 00:00:00 2001 From: Chteufleur Date: Wed, 6 Apr 2016 22:24:09 +0200 Subject: [PATCH] Add Ad-Hoc command to get Steam Auth Code --- main.go | 15 +++++++- servers.addr | 2 +- steam/steam.go | 2 +- xmpp/commands.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ xmpp/xmpp.go | 9 +++++ xmpp4steam.cfg | 2 - 6 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 xmpp/commands.go diff --git a/main.go b/main.go index 2e3756f..2e32847 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,7 @@ import ( ) const ( - Version = "go-xmpp4steam v0.1.4.1" + Version = "go-xmpp4steam v0.1.5" configurationFilePath = "xmpp4steam.cfg" ) @@ -40,7 +40,7 @@ func init() { // Steam config steam.Username = mapConfig["steam_login"] steam.Password = mapConfig["steam_password"] - steam.AuthCode = mapConfig["steam_auth_code"] + steam.AuthCode = "" } func main() { @@ -49,6 +49,7 @@ func main() { go gatewayXmppSteamPresence() go gatewayXmppSteamMessage() + go gatewayXmppSteamAuthCode() go gatewaySteamXmppMessage() go gatewaySteamXmppPresence() @@ -125,6 +126,16 @@ func gatewayXmppSteamMessage() { } } +func gatewayXmppSteamAuthCode() { + for { + authCode := <- xmpp.ChanAuthCode + steam.AuthCode = authCode + steam.Disconnect() + time.Sleep(2 * time.Second) + go steam.Run() + } +} + // /XMPP -> Steam gateways // Steam -> XMPP gateways diff --git a/servers.addr b/servers.addr index fbef869..60315e2 100644 --- a/servers.addr +++ b/servers.addr @@ -1 +1 @@ -{"Addresses":[{"IP":"162.254.196.42","Port":27021},{"IP":"162.254.196.42","Port":27020},{"IP":"162.254.196.40","Port":27020},{"IP":"162.254.196.43","Port":27020},{"IP":"162.254.196.41","Port":27021},{"IP":"162.254.196.42","Port":27019},{"IP":"162.254.196.42","Port":27018},{"IP":"162.254.196.40","Port":27019},{"IP":"162.254.196.40","Port":27021},{"IP":"162.254.196.43","Port":27017},{"IP":"162.254.197.41","Port":27019},{"IP":"162.254.196.41","Port":27018},{"IP":"162.254.196.41","Port":27020},{"IP":"162.254.196.40","Port":27018},{"IP":"162.254.196.43","Port":27019},{"IP":"162.254.196.43","Port":27021},{"IP":"146.66.152.10","Port":27017},{"IP":"162.254.197.41","Port":27021},{"IP":"162.254.197.41","Port":27020},{"IP":"162.254.197.42","Port":27019},{"IP":"162.254.197.42","Port":27018},{"IP":"146.66.152.10","Port":27020},{"IP":"146.66.152.11","Port":27018},{"IP":"146.66.152.10","Port":27019},{"IP":"162.254.196.41","Port":27019},{"IP":"162.254.196.42","Port":27017},{"IP":"162.254.196.40","Port":27017},{"IP":"162.254.197.42","Port":27020},{"IP":"162.254.197.40","Port":27018},{"IP":"162.254.197.40","Port":27021},{"IP":"146.66.152.11","Port":27017},{"IP":"146.66.152.11","Port":27020},{"IP":"162.254.196.41","Port":27017},{"IP":"162.254.196.43","Port":27018},{"IP":"162.254.197.40","Port":27017},{"IP":"162.254.197.40","Port":27019},{"IP":"162.254.197.41","Port":27017},{"IP":"146.66.152.11","Port":27019},{"IP":"146.66.152.10","Port":27018},{"IP":"162.254.197.40","Port":27020},{"IP":"162.254.197.42","Port":27017},{"IP":"162.254.197.41","Port":27018},{"IP":"162.254.197.42","Port":27021},{"IP":"185.25.180.14","Port":27017},{"IP":"155.133.242.9","Port":27020},{"IP":"155.133.242.8","Port":27017},{"IP":"185.25.180.14","Port":27020},{"IP":"185.25.180.14","Port":27018},{"IP":"155.133.242.9","Port":27017},{"IP":"155.133.242.8","Port":27020},{"IP":"185.25.180.15","Port":27017},{"IP":"155.133.242.8","Port":27019},{"IP":"155.133.242.9","Port":27018},{"IP":"146.66.155.8","Port":27020},{"IP":"146.66.155.8","Port":27018},{"IP":"146.66.155.8","Port":27019},{"IP":"155.133.242.8","Port":27018},{"IP":"155.133.242.9","Port":27019},{"IP":"185.25.180.15","Port":27019},{"IP":"185.25.180.15","Port":27018},{"IP":"185.25.180.15","Port":27020},{"IP":"185.25.182.10","Port":27018},{"IP":"185.25.182.10","Port":27020},{"IP":"185.25.180.14","Port":27019},{"IP":"185.25.182.10","Port":27017},{"IP":"146.66.155.8","Port":27017},{"IP":"185.25.182.10","Port":27019},{"IP":"208.78.164.13","Port":27017},{"IP":"208.78.164.14","Port":27019},{"IP":"208.78.164.9","Port":27018},{"IP":"208.78.164.9","Port":27017},{"IP":"208.78.164.14","Port":27018},{"IP":"208.78.164.10","Port":27019},{"IP":"208.78.164.11","Port":27019},{"IP":"208.78.164.10","Port":27017},{"IP":"208.78.164.12","Port":27019},{"IP":"208.78.164.11","Port":27018},{"IP":"208.78.164.12","Port":27018},{"IP":"208.78.164.10","Port":27018},{"IP":"208.78.164.12","Port":27017}]} \ No newline at end of file +{"Addresses":[{"IP":"162.254.197.41","Port":27020},{"IP":"146.66.152.10","Port":27017},{"IP":"146.66.152.11","Port":27020},{"IP":"146.66.152.11","Port":27019},{"IP":"146.66.152.10","Port":27018},{"IP":"162.254.197.40","Port":27018},{"IP":"146.66.152.10","Port":27019},{"IP":"146.66.152.11","Port":27018},{"IP":"146.66.152.11","Port":27017},{"IP":"146.66.152.10","Port":27020},{"IP":"162.254.197.41","Port":27019},{"IP":"162.254.197.41","Port":27017},{"IP":"162.254.197.40","Port":27019},{"IP":"162.254.197.42","Port":27021},{"IP":"162.254.197.42","Port":27017},{"IP":"162.254.197.42","Port":27019},{"IP":"162.254.197.41","Port":27021},{"IP":"162.254.197.42","Port":27018},{"IP":"162.254.197.40","Port":27021},{"IP":"162.254.197.40","Port":27017},{"IP":"162.254.197.41","Port":27018},{"IP":"162.254.197.42","Port":27020},{"IP":"162.254.197.40","Port":27020},{"IP":"162.254.196.43","Port":27017},{"IP":"162.254.196.43","Port":27020},{"IP":"162.254.196.42","Port":27020},{"IP":"162.254.196.40","Port":27021},{"IP":"162.254.196.42","Port":27021},{"IP":"162.254.196.40","Port":27020},{"IP":"162.254.196.40","Port":27019},{"IP":"162.254.196.43","Port":27018},{"IP":"162.254.196.41","Port":27020},{"IP":"162.254.196.42","Port":27017},{"IP":"185.25.182.10","Port":27020},{"IP":"162.254.196.41","Port":27017},{"IP":"162.254.196.42","Port":27019},{"IP":"162.254.196.40","Port":27018},{"IP":"162.254.196.43","Port":27019},{"IP":"162.254.196.41","Port":27019},{"IP":"162.254.196.42","Port":27018},{"IP":"162.254.196.41","Port":27021},{"IP":"162.254.196.40","Port":27017},{"IP":"146.66.155.8","Port":27017},{"IP":"185.25.182.10","Port":27019},{"IP":"155.133.242.8","Port":27019},{"IP":"185.25.182.10","Port":27018},{"IP":"146.66.155.8","Port":27018},{"IP":"185.25.180.15","Port":27019},{"IP":"155.133.242.8","Port":27020},{"IP":"185.25.180.15","Port":27018},{"IP":"155.133.242.9","Port":27020},{"IP":"162.254.196.41","Port":27018},{"IP":"146.66.155.8","Port":27019},{"IP":"155.133.242.8","Port":27018},{"IP":"146.66.155.8","Port":27020},{"IP":"185.25.182.10","Port":27017},{"IP":"155.133.242.8","Port":27017},{"IP":"185.25.180.15","Port":27017},{"IP":"185.25.180.15","Port":27020},{"IP":"155.133.242.9","Port":27017},{"IP":"185.25.180.14","Port":27020},{"IP":"155.133.242.9","Port":27018},{"IP":"162.254.196.43","Port":27021},{"IP":"155.133.242.9","Port":27019},{"IP":"185.25.180.14","Port":27017},{"IP":"185.25.180.14","Port":27018},{"IP":"185.25.180.14","Port":27019},{"IP":"208.78.164.11","Port":27017},{"IP":"208.78.164.11","Port":27019},{"IP":"208.78.164.9","Port":27019},{"IP":"208.78.164.12","Port":27019},{"IP":"208.78.164.9","Port":27017},{"IP":"208.78.164.12","Port":27018},{"IP":"208.78.164.13","Port":27019},{"IP":"208.78.164.13","Port":27018},{"IP":"208.78.164.10","Port":27017},{"IP":"208.78.164.14","Port":27018},{"IP":"208.78.164.14","Port":27019},{"IP":"208.78.164.14","Port":27017},{"IP":"208.78.164.12","Port":27017}]} \ No newline at end of file diff --git a/steam/steam.go b/steam/steam.go index aa0b7ae..7584bed 100644 --- a/steam/steam.go +++ b/steam/steam.go @@ -116,7 +116,7 @@ func setLoginInfos() { log.Printf("%sAuthentification by SentryFileHash", LogDebug) } else if AuthCode != "" { myLoginInfo.AuthCode = AuthCode - log.Printf("%sAuthentification by AuthCode", LogDebug) + log.Printf("%sAuthentification by AuthCode (%s)", LogDebug, AuthCode) } else { log.Printf("%sFirst authentification", LogDebug) } diff --git a/xmpp/commands.go b/xmpp/commands.go new file mode 100644 index 0000000..894dd2d --- /dev/null +++ b/xmpp/commands.go @@ -0,0 +1,95 @@ +package xmpp + +import ( + "git.kingpenguin.tk/chteufleur/go-xmpp.git" + + "log" +) + + + +const ( + CommandAuthcode = "steamAuthCodeCommand" +) + +var ( + ChanAuthCode = make(chan string) +) + +func execDiscoCommand(iq *xmpp.Iq) { + log.Printf("%sDiscovery item iq received", LogInfo) + reply := iq.Response(xmpp.IqTypeResult) + discoItem := &xmpp.DiscoItems{Node: xmpp.NodeAdHocCommand} + + // Add available commands + discoI := &xmpp.DiscoItem{JID: jid.Domain, Node: CommandAuthcode, Name: "Add Auth Code"} + discoItem.Item = append(discoItem.Item, *discoI) + + + reply.PayloadEncode(discoItem) + comp.Out <- reply +} + +func execCommandAdHoc(iq *xmpp.Iq) { + adHoc := &xmpp.AdHocCommand{} + iq.PayloadDecode(adHoc) + + if adHoc.SessionId == "" && adHoc.Action == xmpp.ActionAdHocExecute { + // First step in the command + log.Printf("%sAd-Hoc command (Node : %s). First step.", LogInfo, adHoc.Node) + + reply := iq.Response(xmpp.IqTypeResult) + cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocExecute, SessionId: xmpp.SessionId()} + if adHoc.Node == CommandAuthcode { + // Command Auth Code + cmdXForm := &xmpp.AdHocXForm{Type: xmpp.TypeAdHocForm, Title: "Steam Auth Code", Instructions: "Please provide the auth code that Steam sended to you."} + + field := &xmpp.AdHocField{Var: "code", Label: "Auth Code", Type: xmpp.TypeAdHocFieldTextSingle} + cmdXForm.Fields = append(cmdXForm.Fields, *field) + cmd.XForm = *cmdXForm + + } + reply.PayloadEncode(cmd) + comp.Out <- reply + } else if adHoc.Action == xmpp.ActionAdHocExecute { + // Last step in the command + log.Printf("%sAd-Hoc command (Node : %s). Last step.", LogInfo, adHoc.Node) + reply := iq.Response(xmpp.IqTypeResult) + cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocCompleted, SessionId: adHoc.SessionId} + + if adHoc.Node == CommandAuthcode && adHoc.XForm.Type == xmpp.TypeAdHocSubmit { + cmdXForm := &xmpp.AdHocXForm{Type: xmpp.TypeAdHocResult, Title: "Steam Auth Code "} + cmd.XForm = *cmdXForm + note := &xmpp.AdHocNote{Type: xmpp.TypeAdHocNoteInfo} + + // Command Auth Code + authCode := "" + fields := adHoc.XForm.Fields + for _, field := range fields { + if field.Var == "code" { + authCode = field.Value + break + } + } + if authCode != "" { + // Succeded + ChanAuthCode <- authCode + note.Value = "Commande effectuée avec succes !" + } else { + // Failed + note.Value = "Une erreur c'est produite à l'exécution de la commande…" + } + cmd.Note = *note + } + + reply.PayloadEncode(cmd) + comp.Out <- reply + } else if adHoc.Action == xmpp.ActionAdHocCancel { + // command canceled + log.Printf("%sAd-Hoc command (Node : %s). Command canceled.", LogInfo, adHoc.Node) + reply := iq.Response(xmpp.IqTypeResult) + cmd := &xmpp.AdHocCommand{Node: adHoc.Node, Status: xmpp.StatusAdHocCanceled, SessionId: adHoc.SessionId} + reply.PayloadEncode(cmd) + comp.Out <- reply + } +} diff --git a/xmpp/xmpp.go b/xmpp/xmpp.go index 95dc1e7..05e441a 100644 --- a/xmpp/xmpp.go +++ b/xmpp/xmpp.go @@ -94,6 +94,15 @@ func mainXMPP() { ChanMessage <- steamID ChanMessage <- v.Body + case *xmpp.Iq: + switch v.PayloadName().Space { + case xmpp.NsDiscoItems: + execDiscoCommand(v) + + case xmpp.NodeAdHocCommand: + execCommandAdHoc(v) + } + default: log.Printf("%srecv: %v", LogDebug, x) } diff --git a/xmpp4steam.cfg b/xmpp4steam.cfg index e4aff89..0efbbf8 100644 --- a/xmpp4steam.cfg +++ b/xmpp4steam.cfg @@ -9,5 +9,3 @@ xmpp_debug=true # Steam informations steam_login=toto steam_password=toto_password123$ -# steam_auth_code must be blank the first time. Then Valve will send the auth code to give here. -steam_auth_code=CXD7J