fixed line endings

This commit is contained in:
Norman Rasmussen 2006-01-20 13:23:38 +00:00
parent 882555b538
commit f0adbc9892
9 changed files with 121 additions and 121 deletions

View File

@ -26,6 +26,6 @@ and use only methods for access all values you should not have any problems.
""" """
import simplexml,protocol,debug,auth,transports,roster,dispatcher,features,browser,filetransfer,commands import simplexml,protocol,debug,auth,transports,roster,dispatcher,features,browser,filetransfer,commands
from client import * from client import *
from protocol import * from protocol import *

View File

@ -12,7 +12,7 @@
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details. ## GNU General Public License for more details.
# $Id: auth.py,v 1.35 2006/01/18 19:26:43 normanr Exp $ # $Id: auth.py,v 1.35 2006/01/18 19:26:43 normanr Exp $
""" """
Provides library with all Non-SASL and SASL authentication mechanisms. Provides library with all Non-SASL and SASL authentication mechanisms.
@ -174,7 +174,7 @@ class SASL(PlugIn):
data=base64.decodestring(incoming_data) data=base64.decodestring(incoming_data)
self.DEBUG('Got challenge:'+data,'ok') self.DEBUG('Got challenge:'+data,'ok')
for pair in data.split(','): for pair in data.split(','):
key,value=pair.split('=', 1) key,value=pair.split('=', 1)
if value[:1]=='"' and value[-1:]=='"': value=value[1:-1] if value[:1]=='"' and value[-1:]=='"': value=value[1:-1]
chal[key]=value chal[key]=value
if chal.has_key('qop') and chal['qop']=='auth': if chal.has_key('qop') and chal['qop']=='auth':
@ -199,7 +199,7 @@ class SASL(PlugIn):
if key in ['nc','qop','response','charset']: sasl_data+="%s=%s,"%(key,resp[key]) if key in ['nc','qop','response','charset']: sasl_data+="%s=%s,"%(key,resp[key])
else: sasl_data+='%s="%s",'%(key,resp[key]) else: sasl_data+='%s="%s",'%(key,resp[key])
########################################3333 ########################################3333
node=Node('response',attrs={'xmlns':NS_SASL},payload=[base64.encodestring(sasl_data[:-1]).replace('\r','').replace('\n','')]) node=Node('response',attrs={'xmlns':NS_SASL},payload=[base64.encodestring(sasl_data[:-1]).replace('\r','').replace('\n','')])
self._owner.send(node.__str__()) self._owner.send(node.__str__())
elif chal.has_key('rspauth'): self._owner.send(Node('response',attrs={'xmlns':NS_SASL}).__str__()) elif chal.has_key('rspauth'): self._owner.send(Node('response',attrs={'xmlns':NS_SASL}).__str__())
else: else:
@ -259,48 +259,48 @@ class Bind(PlugIn):
else: else:
self.DEBUG('Binding failed: timeout expired.','error') self.DEBUG('Binding failed: timeout expired.','error')
return '' return ''
class ComponentBind(PlugIn): class ComponentBind(PlugIn):
""" ComponentBind some JID to the current connection to allow router know of our location.""" """ ComponentBind some JID to the current connection to allow router know of our location."""
def __init__(self): def __init__(self):
PlugIn.__init__(self) PlugIn.__init__(self)
self.DBG_LINE='bind' self.DBG_LINE='bind'
self.bound=None self.bound=None
self.needsUnregister=None self.needsUnregister=None
def plugin(self,owner): def plugin(self,owner):
""" Start resource binding, if allowed at this time. Used internally. """ """ Start resource binding, if allowed at this time. Used internally. """
if self._owner.Dispatcher.Stream.features: if self._owner.Dispatcher.Stream.features:
try: self.FeaturesHandler(self._owner.Dispatcher,self._owner.Dispatcher.Stream.features) try: self.FeaturesHandler(self._owner.Dispatcher,self._owner.Dispatcher.Stream.features)
except NodeProcessed: pass except NodeProcessed: pass
else: else:
self._owner.RegisterHandler('features',self.FeaturesHandler,xmlns=NS_STREAMS) self._owner.RegisterHandler('features',self.FeaturesHandler,xmlns=NS_STREAMS)
self.needsUnregister=1 self.needsUnregister=1
def plugout(self): def plugout(self):
""" Remove ComponentBind handler from owner's dispatcher. Used internally. """ """ Remove ComponentBind handler from owner's dispatcher. Used internally. """
if self.needsUnregister: if self.needsUnregister:
self._owner.UnregisterHandler('features',self.FeaturesHandler,xmlns=NS_STREAMS) self._owner.UnregisterHandler('features',self.FeaturesHandler,xmlns=NS_STREAMS)
def FeaturesHandler(self,conn,feats): def FeaturesHandler(self,conn,feats):
""" Determine if server supports resource binding and set some internal attributes accordingly. """ """ Determine if server supports resource binding and set some internal attributes accordingly. """
if not feats.getTag('bind',namespace=NS_BIND): if not feats.getTag('bind',namespace=NS_BIND):
self.bound='failure' self.bound='failure'
self.DEBUG('Server does not requested binding.','error') self.DEBUG('Server does not requested binding.','error')
return return
if feats.getTag('session',namespace=NS_SESSION): self.session=1 if feats.getTag('session',namespace=NS_SESSION): self.session=1
else: self.session=-1 else: self.session=-1
self.bound=[] self.bound=[]
def Bind(self,domain=None): def Bind(self,domain=None):
""" Perform binding. Use provided domain name (if not provided). """ """ Perform binding. Use provided domain name (if not provided). """
while self.bound is None and self._owner.Process(1): pass while self.bound is None and self._owner.Process(1): pass
resp=self._owner.SendAndWaitForResponse(Protocol('bind',attrs={'name':domain},xmlns=NS_COMPONENT_1)) resp=self._owner.SendAndWaitForResponse(Protocol('bind',attrs={'name':domain},xmlns=NS_COMPONENT_1))
if resp and resp.getAttr('error'): if resp and resp.getAttr('error'):
self.DEBUG('Binding failed: %s.'%resp.getAttr('error'),'error') self.DEBUG('Binding failed: %s.'%resp.getAttr('error'),'error')
elif resp: elif resp:
self.DEBUG('Successfully bound.','ok') self.DEBUG('Successfully bound.','ok')
return 'ok' return 'ok'
else: else:
self.DEBUG('Binding failed: timeout expired.','error') self.DEBUG('Binding failed: timeout expired.','error')
return '' return ''

View File

@ -149,11 +149,11 @@ class CommonClient:
""" Example of reconnection method. In fact, it can be used to batch connection and auth as well. """ """ Example of reconnection method. In fact, it can be used to batch connection and auth as well. """
handlerssave=self.Dispatcher.dumpHandlers() handlerssave=self.Dispatcher.dumpHandlers()
self.Dispatcher.PlugOut() self.Dispatcher.PlugOut()
if self.__dict__.has_key('NonSASL'): self.NonSASL.PlugOut() if self.__dict__.has_key('NonSASL'): self.NonSASL.PlugOut()
if self.__dict__.has_key('SASL'): self.SASL.PlugOut() if self.__dict__.has_key('SASL'): self.SASL.PlugOut()
if self.__dict__.has_key('TLS'): self.TLS.PlugOut() if self.__dict__.has_key('TLS'): self.TLS.PlugOut()
if self.__dict__.has_key('HTTPPROXYsocket'): self.HTTPPROXYsocket.PlugOut() if self.__dict__.has_key('HTTPPROXYsocket'): self.HTTPPROXYsocket.PlugOut()
if self.__dict__.has_key('TCPsocket'): self.TCPsocket.PlugOut() if self.__dict__.has_key('TCPsocket'): self.TCPsocket.PlugOut()
if not self.connect(server=self._Server,proxy=self._Proxy): return if not self.connect(server=self._Server,proxy=self._Proxy): return
if not self.auth(self._User,self._Password,self._Resource): return if not self.auth(self._User,self._Password,self._Resource): return
self.Dispatcher.restoreHandlers(handlerssave) self.Dispatcher.restoreHandlers(handlerssave)

View File

@ -1,4 +1,4 @@
## $Id: commands.py,v 1.11 2005/11/30 17:03:11 normanr Exp $ ## $Id: commands.py,v 1.11 2005/11/30 17:03:11 normanr Exp $
## Ad-Hoc Command manager ## Ad-Hoc Command manager
## Mike Albon (c) 5th January 2005 ## Mike Albon (c) 5th January 2005
@ -125,7 +125,7 @@ class Commands(PlugIn):
conn.send(Error(request,ERR_ITEM_NOT_FOUND)) conn.send(Error(request,ERR_ITEM_NOT_FOUND))
raise NodeProcessed raise NodeProcessed
elif typ == 'info': elif typ == 'info':
return {'ids':[{'category':'automation','type':'command-list'}],'features':[]} return {'ids':[{'category':'automation','type':'command-list'}],'features':[]}
def addCommand(self,name,cmddisco,cmdexecute,jid=''): def addCommand(self,name,cmddisco,cmdexecute,jid=''):
"""The method to call if adding a new command to the session, the requred parameters of cmddisco and cmdexecute are the methods to enable that command to be executed""" """The method to call if adding a new command to the session, the requred parameters of cmddisco and cmdexecute are the methods to enable that command to be executed"""
@ -197,7 +197,7 @@ class Command_Handler_Prototype(PlugIn):
self.sessioncount = 0 self.sessioncount = 0
self.sessions = {} self.sessions = {}
# Disco information for command list pre-formatted as a tuple # Disco information for command list pre-formatted as a tuple
self.discoinfo = {'ids':[{'category':'automation','type':'command-node','name':self.description}],'features': self.discofeatures} self.discoinfo = {'ids':[{'category':'automation','type':'command-node','name':self.description}],'features': self.discofeatures}
self._jid = jid self._jid = jid
def plugin(self,owner): def plugin(self,owner):

View File

@ -121,7 +121,7 @@ class Debug:
# #
# active_flags are those that will trigger output # active_flags are those that will trigger output
# #
active_flags = None, active_flags = None,
# #
# Log file should be file object or file namne # Log file should be file object or file namne
# #
@ -132,7 +132,7 @@ class Debug:
# with prefix = chr(27) + '[34m' # with prefix = chr(27) + '[34m'
# sufix = chr(27) + '[37;1m\n' # sufix = chr(27) + '[37;1m\n'
# #
prefix = 'DEBUG: ', prefix = 'DEBUG: ',
sufix = '\n', sufix = '\n',
# #
# If you want unix style timestamps, # If you want unix style timestamps,
@ -140,7 +140,7 @@ class Debug:
# 1 before prefix, good when prefix is a string # 1 before prefix, good when prefix is a string
# 2 after prefix, good when prefix is a color # 2 after prefix, good when prefix is a color
# #
time_stamp = 0, time_stamp = 0,
# #
# flag_show should normaly be of, but can be turned on to get a # flag_show should normaly be of, but can be turned on to get a
# good view of what flags are actually used for calls, # good view of what flags are actually used for calls,

View File

@ -124,7 +124,7 @@ class Dispatcher(PlugIn):
_pendingException = self._pendingExceptions.pop() _pendingException = self._pendingExceptions.pop()
raise _pendingException[0], _pendingException[1], _pendingException[2] raise _pendingException[0], _pendingException[1], _pendingException[2]
if self._owner.Connection.pending_data(timeout): if self._owner.Connection.pending_data(timeout):
try: data=self._owner.Connection.receive() try: data=self._owner.Connection.receive()
except IOError: return except IOError: return
self.Stream.Parse(data) self.Stream.Parse(data)
if len(self._pendingExceptions) > 0: if len(self._pendingExceptions) > 0:

View File

@ -12,7 +12,7 @@
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details. ## GNU General Public License for more details.
# $Id: features.py,v 1.22 2005/09/30 20:13:04 mikealbon Exp $ # $Id: features.py,v 1.22 2005/09/30 20:13:04 mikealbon Exp $
""" """
This module contains variable stuff that is not worth splitting into separate modules. This module contains variable stuff that is not worth splitting into separate modules.
@ -60,7 +60,7 @@ def discoverInfo(disp,jid,node=None):
""" Query remote object about info that it publishes. Returns identities and features lists.""" """ Query remote object about info that it publishes. Returns identities and features lists."""
""" According to JEP-0030: """ According to JEP-0030:
query MAY have node attribute query MAY have node attribute
identity: MUST HAVE category and name attributes and MAY HAVE type attribute. identity: MUST HAVE category and name attributes and MAY HAVE type attribute.
feature: MUST HAVE var attribute""" feature: MUST HAVE var attribute"""
identities , features = [] , [] identities , features = [] , []
for i in _discover(disp,NS_DISCO_INFO,jid,node): for i in _discover(disp,NS_DISCO_INFO,jid,node):

View File

@ -12,7 +12,7 @@
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details. ## GNU General Public License for more details.
# $Id: protocol.py,v 1.52 2006/01/09 22:08:57 normanr Exp $ # $Id: protocol.py,v 1.52 2006/01/09 22:08:57 normanr Exp $
""" """
Protocol module contains tools that is needed for processing of Protocol module contains tools that is needed for processing of
@ -21,64 +21,64 @@ xmpp-related data structures.
from simplexml import Node,ustr from simplexml import Node,ustr
import time import time
NS_ACTIVITY ='http://jabber.org/protocol/activity' # JEP-0108 NS_ACTIVITY ='http://jabber.org/protocol/activity' # JEP-0108
NS_ADDRESS ='http://jabber.org/protocol/address' # JEP-0033 NS_ADDRESS ='http://jabber.org/protocol/address' # JEP-0033
NS_AGENTS ='jabber:iq:agents' NS_AGENTS ='jabber:iq:agents'
NS_AMP ='http://jabber.org/protocol/amp' NS_AMP ='http://jabber.org/protocol/amp'
NS_AMP_ERRORS =NS_AMP+'#errors' NS_AMP_ERRORS =NS_AMP+'#errors'
NS_AUTH ='jabber:iq:auth' NS_AUTH ='jabber:iq:auth'
NS_BIND ='urn:ietf:params:xml:ns:xmpp-bind' NS_BIND ='urn:ietf:params:xml:ns:xmpp-bind'
NS_BROWSE ='jabber:iq:browse' NS_BROWSE ='jabber:iq:browse'
NS_BYTESTREAM ='http://jabber.org/protocol/bytestreams' # JEP-0065 NS_BYTESTREAM ='http://jabber.org/protocol/bytestreams' # JEP-0065
NS_CAPS ='http://jabber.org/protocol/caps' # JEP-0115 NS_CAPS ='http://jabber.org/protocol/caps' # JEP-0115
NS_CHATSTATES ='http://jabber.org/protocol/chatstates' # JEP-0085 NS_CHATSTATES ='http://jabber.org/protocol/chatstates' # JEP-0085
NS_CLIENT ='jabber:client' NS_CLIENT ='jabber:client'
NS_COMMANDS ='http://jabber.org/protocol/commands' NS_COMMANDS ='http://jabber.org/protocol/commands'
NS_COMPONENT_ACCEPT='jabber:component:accept' NS_COMPONENT_ACCEPT='jabber:component:accept'
NS_COMPONENT_1 ='http://jabberd.jabberstudio.org/ns/component/1.0' NS_COMPONENT_1 ='http://jabberd.jabberstudio.org/ns/component/1.0'
NS_COMPRESS ='http://jabber.org/protocol/compress' # JEP-0138 NS_COMPRESS ='http://jabber.org/protocol/compress' # JEP-0138
NS_CONFERENCE ='jabber:x:conference' NS_CONFERENCE ='jabber:x:conference'
NS_DATA ='jabber:x:data' # JEP-0004 NS_DATA ='jabber:x:data' # JEP-0004
NS_DELAY ='jabber:x:delay' NS_DELAY ='jabber:x:delay'
NS_DIALBACK ='jabber:server:dialback' NS_DIALBACK ='jabber:server:dialback'
NS_DISCO ='http://jabber.org/protocol/disco' NS_DISCO ='http://jabber.org/protocol/disco'
NS_DISCO_INFO =NS_DISCO+'#info' NS_DISCO_INFO =NS_DISCO+'#info'
NS_DISCO_ITEMS =NS_DISCO+'#items' NS_DISCO_ITEMS =NS_DISCO+'#items'
NS_ENCRYPTED ='jabber:x:encrypted' # JEP-0027 NS_ENCRYPTED ='jabber:x:encrypted' # JEP-0027
NS_EVENT ='jabber:x:event' # JEP-0022 NS_EVENT ='jabber:x:event' # JEP-0022
NS_FEATURE ='http://jabber.org/protocol/feature-neg' NS_FEATURE ='http://jabber.org/protocol/feature-neg'
NS_FILE ='http://jabber.org/protocol/si/profile/file-transfer' # JEP-0096 NS_FILE ='http://jabber.org/protocol/si/profile/file-transfer' # JEP-0096
NS_GEOLOC ='http://jabber.org/protocol/geoloc' # JEP-0080 NS_GEOLOC ='http://jabber.org/protocol/geoloc' # JEP-0080
NS_GROUPCHAT ='gc-1.0' NS_GROUPCHAT ='gc-1.0'
NS_HTTP_AUTH ='http://jabber.org/protocol/http-auth' # JEP-0070 NS_HTTP_AUTH ='http://jabber.org/protocol/http-auth' # JEP-0070
NS_HTTP_BIND ='http://jabber.org/protocol/httpbind' # JEP-0124 NS_HTTP_BIND ='http://jabber.org/protocol/httpbind' # JEP-0124
NS_IBB ='http://jabber.org/protocol/ibb' NS_IBB ='http://jabber.org/protocol/ibb'
NS_INVISIBLE ='presence-invisible' # Jabberd2 NS_INVISIBLE ='presence-invisible' # Jabberd2
NS_IQ ='iq' # Jabberd2 NS_IQ ='iq' # Jabberd2
NS_LAST ='jabber:iq:last' NS_LAST ='jabber:iq:last'
NS_MESSAGE ='message' # Jabberd2 NS_MESSAGE ='message' # Jabberd2
NS_MOOD ='http://jabber.org/protocol/mood' # JEP-0107 NS_MOOD ='http://jabber.org/protocol/mood' # JEP-0107
NS_MUC ='http://jabber.org/protocol/muc' NS_MUC ='http://jabber.org/protocol/muc'
NS_MUC_USER =NS_MUC+'#user' NS_MUC_USER =NS_MUC+'#user'
NS_MUC_ADMIN =NS_MUC+'#admin' NS_MUC_ADMIN =NS_MUC+'#admin'
NS_MUC_OWNER =NS_MUC+'#owner' NS_MUC_OWNER =NS_MUC+'#owner'
NS_OFFLINE ='http://www.jabber.org/jeps/jep-0030.html' # JEP-0013 NS_OFFLINE ='http://www.jabber.org/jeps/jep-0030.html' # JEP-0013
NS_PHYSLOC ='http://jabber.org/protocol/physloc' # JEP-0112 NS_PHYSLOC ='http://jabber.org/protocol/physloc' # JEP-0112
NS_PRESENCE ='presence' # Jabberd2 NS_PRESENCE ='presence' # Jabberd2
NS_PRIVACY ='jabber:iq:privacy' NS_PRIVACY ='jabber:iq:privacy'
NS_PRIVATE ='jabber:iq:private' NS_PRIVATE ='jabber:iq:private'
NS_PUBSUB ='http://jabber.org/protocol/pubsub' # JEP-0060 NS_PUBSUB ='http://jabber.org/protocol/pubsub' # JEP-0060
NS_REGISTER ='jabber:iq:register' NS_REGISTER ='jabber:iq:register'
NS_ROSTER ='jabber:iq:roster' NS_ROSTER ='jabber:iq:roster'
NS_ROSTERX ='http://jabber.org/protocol/rosterx' # JEP-0144 NS_ROSTERX ='http://jabber.org/protocol/rosterx' # JEP-0144
NS_RPC ='jabber:iq:rpc' # JEP-0009 NS_RPC ='jabber:iq:rpc' # JEP-0009
NS_SASL ='urn:ietf:params:xml:ns:xmpp-sasl' NS_SASL ='urn:ietf:params:xml:ns:xmpp-sasl'
NS_SEARCH ='jabber:iq:search' NS_SEARCH ='jabber:iq:search'
NS_SERVER ='jabber:server' NS_SERVER ='jabber:server'
NS_SESSION ='urn:ietf:params:xml:ns:xmpp-session' NS_SESSION ='urn:ietf:params:xml:ns:xmpp-session'
NS_SI ='http://jabber.org/protocol/si' # JEP-0096 NS_SI ='http://jabber.org/protocol/si' # JEP-0096
NS_SI_PUB ='http://jabber.org/protocol/sipub' # JEP-0137 NS_SI_PUB ='http://jabber.org/protocol/sipub' # JEP-0137
NS_SIGNED ='jabber:x:signed' # JEP-0027 NS_SIGNED ='jabber:x:signed' # JEP-0027
NS_STANZAS ='urn:ietf:params:xml:ns:xmpp-stanzas' NS_STANZAS ='urn:ietf:params:xml:ns:xmpp-stanzas'
NS_STREAM ='http://affinix.com/jabber/stream' NS_STREAM ='http://affinix.com/jabber/stream'
NS_STREAMS ='http://etherx.jabber.org/streams' NS_STREAMS ='http://etherx.jabber.org/streams'
@ -90,10 +90,10 @@ NS_GMAILNOTIFY ='google:mail:notify'
NS_GTALKSETTING ='google:setting' NS_GTALKSETTING ='google:setting'
NS_VCARD_UPDATE =NS_VCARD+':x:update' NS_VCARD_UPDATE =NS_VCARD+':x:update'
NS_VERSION ='jabber:iq:version' NS_VERSION ='jabber:iq:version'
NS_WAITINGLIST ='http://jabber.org/protocol/waitinglist' # JEP-0130 NS_WAITINGLIST ='http://jabber.org/protocol/waitinglist' # JEP-0130
NS_XHTML_IM ='http://jabber.org/protocol/xhtml-im' # JEP-0071 NS_XHTML_IM ='http://jabber.org/protocol/xhtml-im' # JEP-0071
NS_DATA_LAYOUT ='http://jabber.org/protocol/xdata-layout' # JEP-0141 NS_DATA_LAYOUT ='http://jabber.org/protocol/xdata-layout' # JEP-0141
NS_DATA_VALIDATE='http://jabber.org/protocol/xdata-validate' # JEP-0122 NS_DATA_VALIDATE='http://jabber.org/protocol/xdata-validate' # JEP-0122
NS_XMPP_STREAMS ='urn:ietf:params:xml:ns:xmpp-streams' NS_XMPP_STREAMS ='urn:ietf:params:xml:ns:xmpp-streams'
xmpp_stream_error_conditions=""" xmpp_stream_error_conditions="""
@ -695,7 +695,7 @@ class DataForm(Node):
for field in self.getTags('field'): for field in self.getTags('field'):
name=field.getAttr('var') name=field.getAttr('var')
typ=field.getType() typ=field.getType()
if type(typ) in [type(''),type(u'')] and typ[-6:]=='-multi': if type(typ) in [type(''),type(u'')] and typ[-6:]=='-multi':
val=[] val=[]
for i in field.getTags('value'): val.append(i.getData()) for i in field.getTags('value'): val.append(i.getData())
else: val=field.getTagData('value') else: val=field.getTagData('value')

View File

@ -66,7 +66,7 @@ class error:
class TCPsocket(PlugIn): class TCPsocket(PlugIn):
""" This class defines direct TCP connection method. """ """ This class defines direct TCP connection method. """
def __init__(self, server=None, use_srv=True): def __init__(self, server=None, use_srv=True):
""" Cache connection point 'server'. 'server' is the tuple of (host, port) """ Cache connection point 'server'. 'server' is the tuple of (host, port)
absolutely the same as standard tcp socket uses. """ absolutely the same as standard tcp socket uses. """
PlugIn.__init__(self) PlugIn.__init__(self)
@ -165,12 +165,12 @@ class HTTPPROXYsocket(TCPsocket):
""" HTTP (CONNECT) proxy connection class. Uses TCPsocket as the base class """ HTTP (CONNECT) proxy connection class. Uses TCPsocket as the base class
redefines only connect method. Allows to use HTTP proxies like squid with redefines only connect method. Allows to use HTTP proxies like squid with
(optionally) simple authentication (using login and password). """ (optionally) simple authentication (using login and password). """
def __init__(self,proxy,server,use_srv=True): def __init__(self,proxy,server,use_srv=True):
""" Caches proxy and target addresses. """ Caches proxy and target addresses.
'proxy' argument is a dictionary with mandatory keys 'host' and 'port' (proxy address) 'proxy' argument is a dictionary with mandatory keys 'host' and 'port' (proxy address)
and optional keys 'user' and 'password' to use for authentication. and optional keys 'user' and 'password' to use for authentication.
'server' argument is a tuple of host and port - just like TCPsocket uses. """ 'server' argument is a tuple of host and port - just like TCPsocket uses. """
TCPsocket.__init__(self,server,use_srv) TCPsocket.__init__(self,server,use_srv)
self.DBG_LINE=DBG_CONNECT_PROXY self.DBG_LINE=DBG_CONNECT_PROXY
self._proxy=proxy self._proxy=proxy
@ -196,23 +196,23 @@ class HTTPPROXYsocket(TCPsocket):
connector.append('Proxy-Authorization: Basic '+credentials) connector.append('Proxy-Authorization: Basic '+credentials)
connector.append('\r\n') connector.append('\r\n')
self.send('\r\n'.join(connector)) self.send('\r\n'.join(connector))
try: reply = self.receive().replace('\r','') try: reply = self.receive().replace('\r','')
except IOError: except IOError:
self.DEBUG('Proxy suddenly disconnected','error') self.DEBUG('Proxy suddenly disconnected','error')
self._owner.disconnected() self._owner.disconnected()
return return
try: proto,code,desc=reply.split('\n')[0].split(' ',2) try: proto,code,desc=reply.split('\n')[0].split(' ',2)
except: raise error('Invalid proxy reply') except: raise error('Invalid proxy reply')
if code<>'200': if code<>'200':
self.DEBUG('Invalid proxy reply: %s %s %s'%(proto,code,desc),'error') self.DEBUG('Invalid proxy reply: %s %s %s'%(proto,code,desc),'error')
self._owner.disconnected() self._owner.disconnected()
return return
while reply.find('\n\n') == -1: while reply.find('\n\n') == -1:
try: reply += self.receive().replace('\r','') try: reply += self.receive().replace('\r','')
except IOError: except IOError:
self.DEBUG('Proxy suddenly disconnected','error') self.DEBUG('Proxy suddenly disconnected','error')
self._owner.disconnected() self._owner.disconnected()
return return
self.DEBUG("Authentification successfull. Jabber server contacted.",'ok') self.DEBUG("Authentification successfull. Jabber server contacted.",'ok')
return 'ok' return 'ok'
@ -256,13 +256,13 @@ class TLS(PlugIn):
self._owner.Connection.send('<starttls xmlns="%s"/>'%NS_TLS) self._owner.Connection.send('<starttls xmlns="%s"/>'%NS_TLS)
raise NodeProcessed raise NodeProcessed
def pending_data(self,timeout=0): def pending_data(self,timeout=0):
""" Returns true if there possible is a data ready to be read. """ """ Returns true if there possible is a data ready to be read. """
return self._tcpsock._seen_data or select.select([self._tcpsock._sock],[],[],timeout)[0] return self._tcpsock._seen_data or select.select([self._tcpsock._sock],[],[],timeout)[0]
def _startSSL(self): def _startSSL(self):
""" Immidiatedly switch socket to TLS mode. Used internally.""" """ Immidiatedly switch socket to TLS mode. Used internally."""
""" Here we should switch pending_data to hint mode.""" """ Here we should switch pending_data to hint mode."""
tcpsock=self._owner.Connection tcpsock=self._owner.Connection
tcpsock._sslObj = socket.ssl(tcpsock._sock, None, None) tcpsock._sslObj = socket.ssl(tcpsock._sock, None, None)
tcpsock._sslIssuer = tcpsock._sslObj.issuer() tcpsock._sslIssuer = tcpsock._sslObj.issuer()