home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / msn / p11 / MSNP11Notification.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  8.8 KB  |  227 lines

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