home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / msn / p11 / MSNP11Notification.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  8.9 KB  |  229 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import logging
  5. import hashlib
  6. import rfc822
  7. import struct
  8. import string
  9. import re
  10. import util
  11. import util.primitives.funcs as funcs
  12. import util.xml_tag as util
  13. import msn
  14. from util.Events import event
  15. from msn.p10 import Notification as Super
  16. log = logging.getLogger('msn.p11.ns')
  17. defcb = dict(trid = True, callback = sentinel)
  18. MAX_SINT = 2147483647
  19. psmurl_re = re.compile('\\<PSMUrl\\>(.*?)\\</PSMUrl\\>', re.IGNORECASE)
  20. format_re = re.compile('%\\((.*?)\\)s')
  21.  
  22. def psm_url_fix(datatag_str):
  23.     match = psmurl_re.search(datatag_str)
  24.     if match:
  25.         url = match.group(1)
  26.         (start, end) = match.span()
  27.         newmsg = datatag_str[:start] + datatag_str[end:]
  28.     else:
  29.         url = ''
  30.         newmsg = datatag_str
  31.     return (newmsg, url)
  32.  
  33.  
  34. def transform_format_groups(fmtstring):
  35.     fixed = []
  36.     keys = []
  37.     last_end = 0
  38.     match = format_re.search(fmtstring, last_end)
  39.     while match:
  40.         key = match.group(1)
  41.         if key not in keys:
  42.             keys.append(key)
  43.         
  44.         fixed.append(fmtstring[last_end:match.start()])
  45.         fixed.append('{%d}' % keys.index(key))
  46.         last_end = match.end()
  47.         match = format_re.search(fmtstring, last_end)
  48.     fixed.append(fmtstring[last_end:])
  49.     return (''.join(fixed), keys)
  50.  
  51.  
  52. def format_mediainfo(info):
  53.     return repr(info)
  54.  
  55.  
  56. class MSNP11Notification(Super):
  57.     versions = [
  58.         'MSNP11']
  59.     client_chl_id = challenge_id = 'PROD0090YUAUV{2B'
  60.     client_chl_code = 'YMM8C_H7KCQ2S_KL'
  61.     events = Super.events | set(('contact_status_msg', 'received_oims'))
  62.     
  63.     def __init__(self, *a, **k):
  64.         self.oims = []
  65.         Super.__init__(self, *a, **k)
  66.  
  67.     
  68.     def recv_sbs(self, msg):
  69.         log.warning('Got SBS command')
  70.  
  71.     
  72.     def recv_ubx(self, msmsg):
  73.         (bname,) = msmsg.args
  74.         msg = msmsg.payload
  75.         log.info('Got UBX for %s: %r', bname, str(msg))
  76.         if not msg:
  77.             msg = '<data />'
  78.         
  79.         (msg, url) = psm_url_fix(msg)
  80.         
  81.         try:
  82.             msg = util.xml_tag.tag(msg)
  83.         except Exception:
  84.             import traceback
  85.             traceback.print_exc()
  86.             msg = util.xml_tag.tag('<data />')
  87.  
  88.         status_message = ''
  89.         now_playing = ''
  90.         if msg.PSM:
  91.             status_message = msg.PSM._cdata.decode('xml')
  92.             log.info('%r has status message of: %r', bname, status_message)
  93.         
  94.         if status_message and now_playing:
  95.             status_message = u'%s\n%s' % (status_message, now_playing)
  96.         elif not status_message:
  97.             pass
  98.         status_message = now_playing
  99.         self.event('contact_status_msg', bname, status_message)
  100.         return msg
  101.  
  102.     
  103.     def recv_chl(self, msg):
  104.         log.debug('got chl')
  105.         self.event('challenge', msg.args[0])
  106.  
  107.     
  108.     def recv_uux(self, msg):
  109.         unused_message = msg.payload
  110.  
  111.     
  112.     def send_uux(self, message = None, mediainfo = None, url = None, callback = None):
  113.         mtag = util.xml_tag.tag('Data')
  114.         if message is not None:
  115.             mtag.PSM._cdata = message
  116.         else:
  117.             mtag.PSM._cdata = ''
  118.         if mediainfo is not None:
  119.             mtag.CurrentMedia._cdata = mediainfo
  120.         else:
  121.             mtag.CurrentMedia._cdata = ''
  122.         if url is not None:
  123.             mtag.PSMUrl._cdata = url
  124.         else:
  125.             mtag.PSMUrl._cdata = ''
  126.         message = mtag._to_xml(pretty = False).encode('utf-8')
  127.         self.socket.send(msn.Message('UUX', payload = message), trid = True, callback = callback)
  128.  
  129.     
  130.     def _set_status_message(self, *a, **k):
  131.         return self.send_uux(*a, **k)
  132.  
  133.     
  134.     def set_message_object(self, messageobj, callback):
  135.         media = getattr(messageobj, 'media', None)
  136.         log.debug('set_message_object got this for (messageobj, media): %r', (messageobj, media))
  137.         if media is not None:
  138.             fmt = funcs.get(media, 'format_string', '')
  139.             args = funcs.get(media, 'format_args', { })
  140.             if fmt and args:
  141.                 (fmtstring, keys) = transform_format_groups(fmt)
  142.                 values = [ args[key] for key in keys ]
  143.                 application = media.get('app', '')
  144.                 type = media.get('type', 'Music')
  145.                 enabled = '1'
  146.                 array = '\\0'.join([
  147.                     application,
  148.                     type,
  149.                     enabled,
  150.                     fmtstring] + values + [
  151.                     ''])
  152.                 self.send_uux(mediainfo = array, callback = callback)
  153.             else:
  154.                 log.debug('msn not sending CurrentMedia because no fmt or args. (fmt=%r, args=%r)', fmt, args)
  155.                 self.send_uux(message = messageobj.message, callback = callback)
  156.         else:
  157.             log.debug('msn not sending CurrentMedia because media is None')
  158.             self.send_uux(messageobj.message, callback = callback)
  159.  
  160.     
  161.     def recv_msg_notification(self, msg):
  162.         if msg.name == 'Hotmail':
  163.             MD = self.extract_oim_info(msg)
  164.             self.oims = msn.oim.OIMMessages(self, MD)
  165.         else:
  166.             log.warning('unknown msg/notification')
  167.  
  168.     
  169.     def extract_oim_info(self, oim_info_msg):
  170.         msg_obj = rfc822.Message(oim_info_msg.payload.body())
  171.         maildata = msg_obj['Mail-Data']
  172.         if 'too-large' in maildata:
  173.             MD = None
  174.         else:
  175.             MD = util.xml_tag.tag(maildata)
  176.         return MD
  177.  
  178.     
  179.     def recv_msg_oims(self, msg):
  180.         if msg.name == 'Hotmail':
  181.             MD = self.extract_oim_info(msg)
  182.             self.oims += msn.oim.OIMMessages(self, MD)
  183.         
  184.  
  185.     
  186.     def received_oims(self, oims):
  187.         return oims
  188.  
  189.     received_oims = event(received_oims)
  190.     
  191.     def _challenge_response(self, chl_str, challenge_key, mystery_num = 242854337):
  192.         hash = hashlib.md5(chl_str + challenge_key).digest()
  193.         hash_ints = struct.unpack('<llll', hash)
  194.         hash_ints = [ x & MAX_SINT for x in hash_ints ]
  195.         chl_str += self.challenge_id
  196.         chl_str += string.zfill('', 8 - len(chl_str) % 8)
  197.         chl_nums = struct.unpack('<%di' % len(chl_str) / 4, chl_str)
  198.         while i < len(chl_nums) - 1:
  199.             j = chl_nums[i]
  200.             j = mystery_num * j % MAX_SINT
  201.             j += hi
  202.             j = hash_ints[0] * j + hash_ints[1]
  203.             j = j % MAX_SINT
  204.             hi = (chl_nums[i + 1] + j) % MAX_SINT
  205.             hi = hash_ints[2] * hi + hash_ints[3]
  206.             hi = hi % MAX_SINT
  207.             lo = lo + hi + j
  208.             i += 2
  209.             continue
  210.             hi = lo = i = 0
  211.         
  212.         byteswap = lambda i, f: struct.unpack('>' + f, struct.pack('<' + f, i))[0]
  213.         hi = byteswap((hi + hash_ints[1]) % MAX_SINT, 'L')
  214.         lo = byteswap((lo + hash_ints[3]) % MAX_SINT, 'L')
  215.         key = byteswap((hi << 0x20L) + lo, 'Q')
  216.         ls = [ byteswap(abs(byteswap(x, 'Q') ^ key), 'Q') for x in struct.unpack('>QQ', hash) ]
  217.         return ''.join((lambda .0: for x in .0:
  218. ('%x' % x).zfill(16).lower())(ls))
  219.  
  220.  
  221.  
  222. def __test():
  223.     import doctest
  224.     doctest.testmod(verbose = True)
  225.  
  226. if __name__ == '__main__':
  227.     __test()
  228.  
  229.