package xmpp import ( "git.kingpenguin.tk/chteufleur/go-xmpp.git/src/xmpp" "crypto/rand" "log" "strconv" ) const ( dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" REPLY_UNREACHABLE = "reply_unreachable" REPLY_DENY = "reply_deny" REPLY_OK = "reply_ok" ) type Client struct { JID string Method string Domain string Transaction string ChanReply chan string } func (client *Client) QueryClient() { log.Printf("%sQuery JID %s", LogInfo, client.JID) isAutoGeneratedTranctionID := false if client.Transaction == "" { // Random transaction ID generation client.Transaction = xmpp.SessionID() isAutoGeneratedTranctionID = true } clientJID, _ := xmpp.ParseJID(client.JID) if clientJID.Resource == "" { client.askViaMessage(isAutoGeneratedTranctionID) } else { client.askViaIQ() } } func (client *Client) askViaIQ() { stanzaID++ stanzaIDstr := strconv.Itoa(stanzaID) m := xmpp.Iq{Type: xmpp.IQTypeGet, To: client.JID, From: jid.Domain, Id: stanzaIDstr} confirm := &xmpp.Confirm{Id: client.Transaction, Method: client.Method, URL: client.Domain} m.PayloadEncode(confirm) WaitIqMessages[stanzaIDstr] = client comp.Out <- m } func (client *Client) askViaMessage(isAutoGeneratedTranctionID bool) { m := xmpp.Message{From: jid.Domain, To: client.JID, Type: xmpp.MessageTypeNormal} m.Thread = xmpp.SessionID() m.Body = client.Domain + " (with method " + client.Method + ") need to validate your identity, do you agreeĀ ?" m.Body += "\nValidation codeĀ : " + client.Transaction if !isAutoGeneratedTranctionID { // Send only if the transaction ID is not autogenerated m.Body += "\nPlease check that this code is the same as on " + client.Domain } m.Body += "\n\nIf your client doesn't support that functionnality, please send back the validation code to confirm the request." m.Confir = &xmpp.Confirm{Id: client.Transaction, Method: client.Method, URL: client.Domain} log.Printf("%sSend message %v", LogInfo, m) WaitMessageAnswers[client.Transaction] = client comp.Out <- m } func SessionID() string { var bytes = make([]byte, 8) if _, err := rand.Read(bytes); err != nil { panic(err) } for k, v := range bytes { bytes[k] = dictionary[v%byte(len(dictionary))] } return string(bytes) }