diff --git a/frontends/wix/gateways.py b/frontends/wix/gateways.py
index 37adf79b..63728f77 100644
--- a/frontends/wix/gateways.py
+++ b/frontends/wix/gateways.py
@@ -31,15 +31,18 @@ WARNING_MSG = u"""Be careful ! Gateways allow you to use an external IM (legacy
But when you do this, all your messages go throught the external legacy IM server, it is a huge privacy issue (i.e.: all your messages throught the gateway can be monitored, recorded, analyzed by the external server, most of time a private company)."""
class GatewaysManager(wx.Frame):
- def __init__(self, host, gateways, title="Gateways manager"):
+ def __init__(self, host, gateways, title="Gateways manager", server=None):
super(GatewaysManager, self).__init__(None, title=title)
self.host = host
+ if server:
+ self.SetTitle(title+" (%s)" % server)
#Fonts
self.normal_font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
self.bold_font = wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD)
self.italic_font = wx.Font(8, wx.DEFAULT, wx.FONTSTYLE_ITALIC, wx.NORMAL)
+ self.button_font = wx.Font(6, wx.DEFAULT, wx.NORMAL, wx.BOLD)
self.modified = {} # dict of modified data (i.e. what we have to save)
@@ -77,14 +80,40 @@ class GatewaysManager(wx.Frame):
for gateway in gateways:
self.addGateway(gateway, gateways[gateway])
+ self.ext_server_panel = wx.Panel(self)
+ self.ext_server_panel.sizer = wx.BoxSizer(wx.HORIZONTAL)
+ self.ext_server_panel.SetSizer(self.ext_server_panel.sizer)
+ self.ext_server_panel.SetAutoLayout(True)
+ self.sizer.Add(self.ext_server_panel, 0, flag=wx.EXPAND)
+
+ ext_server_label = wx.StaticText(self.ext_server_panel, -1, "Use external XMPP server: ")
+ ext_server_label.SetFont(wx.ITALIC_FONT)
+ self.ext_server_text = wx.TextCtrl(self.ext_server_panel, -1)
+ ext_server_button = wx.Button(self.ext_server_panel, -1, "GO !")
+ self.ext_server_panel.Bind(wx.EVT_BUTTON, self.browseExternalServer, ext_server_button)
+
+ self.ext_server_panel.sizer.Add(ext_server_label)
+ self.ext_server_panel.sizer.Add(self.ext_server_text, 1, flag=wx.EXPAND)
+ self.ext_server_panel.sizer.Add(ext_server_button)
#self.panel.sizer.Fit(self)
self.sizer.Fit(self)
self.Show()
+ def browseExternalServer(self, event):
+ """Open the gateway manager on given server"""
+ server = self.ext_server_text.GetValue()
+ debug("Opening gateways manager on [%s]" % server)
+ id = self.host.bridge.findGateways(server)
+ self.host.current_action_ids.add(id)
+ self.host.current_action_ids_cb[id] = self.host.onGatewaysFound
+ self.MakeModal(False)
+ self.Destroy()
+
+
def addGateway(self, gateway, param):
-
+
#First The icon
@@ -133,7 +162,6 @@ class GatewaysManager(wx.Frame):
print "register id:",id
self.MakeModal(False)
self.Destroy()
- event.Skip()
def unregister_cb(event):
"""Called when unregister button is clicked"""
@@ -143,15 +171,13 @@ class GatewaysManager(wx.Frame):
print "unregister id:",id
self.MakeModal(False)
self.Destroy()
- event.Skip()
- button_font = wx.Font(6, wx.DEFAULT, wx.NORMAL, wx.BOLD)
reg_button = wx.Button(self.panel, -1, "Register", size=wx.Size(-1, 8))
- reg_button.SetFont(button_font)
+ reg_button.SetFont(self.button_font)
reg_button.gateway_jid = JID(gateway)
self.panel.Bind(wx.EVT_BUTTON, register_cb, reg_button)
unreg_button = wx.Button(self.panel, -1, "Unregister", size=wx.Size(-1, 8))
- unreg_button.SetFont(button_font)
+ unreg_button.SetFont(self.button_font)
unreg_button.gateway_jid = JID(gateway)
self.panel.Bind(wx.EVT_BUTTON, unregister_cb, unreg_button)
diff --git a/plugins/plugin_xep_0077.py b/plugins/plugin_xep_0077.py
index 776ec55f..cfff0fec 100755
--- a/plugins/plugin_xep_0077.py
+++ b/plugins/plugin_xep_0077.py
@@ -20,7 +20,8 @@ along with this program. If not, see .
"""
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})
diff --git a/plugins/plugin_xep_0096.py b/plugins/plugin_xep_0096.py
index 1d581314..ac41eb28 100755
--- a/plugins/plugin_xep_0096.py
+++ b/plugins/plugin_xep_0096.py
@@ -22,7 +22,8 @@ along with this program. If not, see .
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
diff --git a/plugins/plugin_xep_0100.py b/plugins/plugin_xep_0100.py
index a1b0aae2..fee24cad 100755
--- a/plugins/plugin_xep_0100.py
+++ b/plugins/plugin_xep_0100.py
@@ -21,7 +21,8 @@ along with this program. If not, see .
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"""
diff --git a/sat.tac b/sat.tac
index e128a264..806e976a 100644
--- a/sat.tac
+++ b/sat.tac
@@ -26,7 +26,8 @@ from twisted.application import internet, service
from twisted.internet import glib2reactor, protocol, task
glib2reactor.install()
-from twisted.words.protocols.jabber import jid, xmlstream, error
+from twisted.words.protocols.jabber import jid, xmlstream
+from twisted.words.protocols.jabber import error as jab_error
from twisted.words.xish import domish
from twisted.internet import reactor
diff --git a/tools/xml_tools.py b/tools/xml_tools.py
index 2f7242fb..72cb038b 100644
--- a/tools/xml_tools.py
+++ b/tools/xml_tools.py
@@ -52,17 +52,16 @@ class XMLTools:
__field_type = "password"
else:
error (u"FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType)
- __field_type = "string_field"
+ __field_type = "string"
elem = doc.createElement('elem')
elem.setAttribute('name', field.var)
elem.setAttribute('type', __field_type)
- elem.setAttribute('label', field.label)
+ elem.setAttribute('label', field.label or "")
if field.value:
text = doc.createTextNode(field.value)
elem.appendChild(text)
top_element.appendChild(elem)
-
result = doc.toxml()
doc.unlink()
return result