You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.9 KiB
67 lines
1.9 KiB
#!/usr/bin/python
|
|
|
|
import xmpp, os, hashlib, time
|
|
from datetime import datetime
|
|
|
|
ID=0
|
|
|
|
JINGLE_NS = 'urn:xmpp:jingle:1'
|
|
JINGLE_FT_NS = 'urn:xmpp:jingle:apps:file-transfer:3'
|
|
JINGLE_TRANSPORT_S5B_NS = 'urn:xmpp:jingle:transports:s5b:1'
|
|
HASHES_NS = 'urn:xmpp:hashes:1'
|
|
|
|
|
|
def create_init_message(mfrom,to,path,desc,host,port):
|
|
global ID
|
|
ID+=1
|
|
iq=xmpp.Iq(xmlns=None,
|
|
attrs={'to':to,'id':"jin_ft_iq_%d" % ID,'type':'set'})
|
|
jingle=__create_jingle_node(mfrom,'session-initiate',"jin_ft_%d" % ID)
|
|
iq.getChildren().append(jingle)
|
|
|
|
cont=__create_content_node('initiator',time.time(),path,desc)
|
|
jingle.getChildren().append(cont)
|
|
tr = __create_transport_tcp_direct(mfrom,host,port,126<<8+127,ID)
|
|
cont.getChildren().append(tr)
|
|
return iq
|
|
|
|
def __create_jingle_node(initiator,action,sid):
|
|
return xmpp.Protocol(name="jingle",xmlns=JINGLE_NS,
|
|
attrs={'initiator':initiator,'action':action,'sid':sid})
|
|
|
|
|
|
def __create_content_node(creator,date,path,txt):
|
|
mfile=open(path,"r")
|
|
datefmt = datetime.fromtimestamp(date).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
name=os.path.basename(path)
|
|
size=os.path.getsize(path)
|
|
mhash=hashlib.sha1()
|
|
mhash.update(mfile.read())
|
|
mfile.close()
|
|
|
|
cont= xmpp.Protocol(name="content",attrs={'creator':creator,'name':name})
|
|
desc = cont.addChild(name="description",namespace=JINGLE_FT_NS)
|
|
offer = desc.addChild(name="offer")
|
|
mfile = offer.addChild(name="file")
|
|
|
|
mfile.addChild(name="date",payload=[datefmt])
|
|
mfile.addChild(name="desc",payload=[txt])
|
|
mfile.addChild(name="name",payload=[name])
|
|
mfile.addChild(name="size",payload=[size])
|
|
mfile.addChild(name="hash",payload=[mhash.hexdigest()],
|
|
attrs={'algo':'sha-1'},namespace=HASHES_NS)
|
|
|
|
return cont
|
|
|
|
def __create_transport_tcp_direct(mfrom,host,port,priority,id):
|
|
tr = xmpp.Protocol(name="transport",
|
|
attrs={'mode':'tcp','sid':"jin_ft_tr_%d" % id})
|
|
tr.addChild(name="candidate",attrs={
|
|
'cid':"jin_ft_cd_%d" % id,
|
|
'host':host,
|
|
'jid':mfrom,
|
|
'port':port,
|
|
'priority':priority,
|
|
'type':'direct'})
|
|
return tr
|
|
|
|
|