Wix: external server management in gateways manager, SàT: bug fixes in gateway management
- SàT: from twisted.words.protocols.jabber.error module imported as jab_error to avoir name colision with error log method - XEP_0100 plugin: added errback for disco info - XEP_0077 plugin: registration callback now look for "x" element (data form: see XEP-0004), and send an error message if it can't find it. - Wix: added fields for browsing external server gateways
This commit is contained in:
parent
989f660a53
commit
43d78f22e8
3 changed files with 75 additions and 24 deletions
|
|
@ -20,7 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
"""
|
||||
|
||||
from logging import debug, info, error
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream, error
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream
|
||||
from twisted.words.protocols.jabber import error as jab_error
|
||||
from twisted.words.protocols.jabber.xmlstream import IQ
|
||||
from twisted.internet import reactor
|
||||
from tools.xml_tools import XMLTools
|
||||
|
|
@ -54,7 +55,18 @@ class XEP_0077():
|
|||
|
||||
def reg_ok(self, answer):
|
||||
"""Called after the first get IQ"""
|
||||
form = data_form.Form.fromElement(answer.firstChildElement().firstChildElement())
|
||||
try:
|
||||
x_elem = filter (lambda x:x.name == "x", answer.firstChildElement().elements())[0] #We only want the "x" element (data form)
|
||||
except IndexError:
|
||||
info("No data form found")
|
||||
#TODO: manage registration without data form
|
||||
answer_data = {}
|
||||
answer_data={"reason": "unmanaged", "message":"This gateway can't be managed by SàT, sorry :("}
|
||||
answer_type = "ERROR"
|
||||
self.host.bridge.actionResult(answer_type, answer['id'], answer_data)
|
||||
return
|
||||
|
||||
form = data_form.Form.fromElement(x_elem)
|
||||
xml_data = XMLTools.dataForm2xml(form)
|
||||
self.host.bridge.actionResult("FORM", answer['id'], {"target":answer["from"], "type":"registration", "xml":xml_data})
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
from logging import debug, info, error
|
||||
from twisted.words.xish import domish
|
||||
from twisted.internet import protocol
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream, error
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream
|
||||
from twisted.words.protocols.jabber import error as jab_error
|
||||
import os.path
|
||||
from twisted.internet import reactor #FIXME best way ???
|
||||
import pdb
|
||||
|
|
|
|||
|
|
@ -21,7 +21,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
from logging import debug, info, error
|
||||
from twisted.internet import protocol
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream, error
|
||||
from twisted.words.protocols.jabber import client, jid, xmlstream
|
||||
from twisted.words.protocols.jabber import error as jab_error
|
||||
import pdb
|
||||
|
||||
from wokkel import disco, iwokkel
|
||||
|
|
@ -43,7 +44,17 @@ class XEP_0100():
|
|||
self.__gateways = {} #dict used to construct the answer to findGateways. Key = target jid
|
||||
host.bridge.addMethod("findGateways", ".communication", in_sign='s', out_sign='s', method=self.findGateways)
|
||||
host.bridge.addMethod("gatewayRegister", ".request", in_sign='ssa(ss)', out_sign='s', method=self.gatewayRegister)
|
||||
|
||||
|
||||
def __inc_handled_items(self, request_id):
|
||||
self.__gateways[request_id]['__handled_items']+=1
|
||||
|
||||
if self.__gateways[request_id]['__total_items'] == self.__gateways[request_id]['__handled_items']:
|
||||
debug ("All items checked for id [%s]" % str(request_id))
|
||||
|
||||
del self.__gateways[request_id]['__total_items']
|
||||
del self.__gateways[request_id]['__handled_items']
|
||||
self.host.actionResultExt(request_id,"DICT_DICT",self.__gateways[request_id])
|
||||
|
||||
def discoInfo(self, disco, entity, request_id):
|
||||
"""Find disco infos about entity, to check if it is a gateway"""
|
||||
|
||||
|
|
@ -55,14 +66,14 @@ class XEP_0100():
|
|||
'type':identity[1]
|
||||
}
|
||||
|
||||
self.__gateways[request_id]['__handled_items']+=1
|
||||
|
||||
if self.__gateways[request_id]['__total_items'] == self.__gateways[request_id]['__handled_items']:
|
||||
debug ("All items checked for id [%s]" % str(request_id))
|
||||
|
||||
del self.__gateways[request_id]['__total_items']
|
||||
del self.__gateways[request_id]['__handled_items']
|
||||
self.host.actionResultExt(request_id,"DICT_DICT",self.__gateways[request_id])
|
||||
self.__inc_handled_items(request_id)
|
||||
|
||||
def discoInfoErr(self, failure, entity, request_id):
|
||||
"""Something is going wrong with disco"""
|
||||
failure.trap(jab_error.StanzaError)
|
||||
error("Error when discovering [%s]: %s" % (entity.full(), failure.value.condition))
|
||||
self.__inc_handled_items(request_id)
|
||||
|
||||
|
||||
def discoItems(self, disco, request_id):
|
||||
"""Look for items with disco protocol, and ask infos for each one"""
|
||||
|
|
@ -76,6 +87,7 @@ class XEP_0100():
|
|||
for item in disco._items:
|
||||
debug ("item found: %s", item.name)
|
||||
self.host.disco.requestInfo(item.entity).addCallback(self.discoInfo, entity=item.entity, request_id=request_id)
|
||||
self.host.disco.requestInfo(item.entity).addErrback(self.discoInfoErr, entity=item.entity, request_id=request_id)
|
||||
|
||||
def registrationSuccessful(self, target):
|
||||
"""Called when in_band registration is ok, we must now follow the rest of procedure"""
|
||||
|
|
|
|||
Loading…
Reference in a new issue