bsod.cpp,CrashlogAutoSubmit: add active skin name to xml crashlogs. fixes #597
authoracid-burn <acid-burn@opendreambox.org>
Fri, 8 Oct 2010 14:40:44 +0000 (16:40 +0200)
committeracid-burn <acid-burn@opendreambox.org>
Fri, 8 Oct 2010 14:40:44 +0000 (16:40 +0200)
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/__init__.py
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py
main/bsod.cpp

index e69de29..cabaadd 100755 (executable)
@@ -0,0 +1,40 @@
+import sha\r
+\r
+def bin2long(s):\r
+       return reduce( lambda x,y:(x<<8L)+y, map(ord, s))\r
+\r
+def long2bin(l):\r
+       res = ""\r
+       for byte in range(128):\r
+               res += chr((l >> (1024 - (byte + 1) * 8)) & 0xff)\r
+       return res\r
+\r
+def rsa_pub1024(src, mod):\r
+       return long2bin(pow(bin2long(src), 65537, bin2long(mod)))\r
+       \r
+def decrypt_block(src, mod):\r
+       if len(src) != 128 and len(src) != 202:\r
+               return None\r
+       dest = rsa_pub1024(src[:128], mod)\r
+       hash = sha.new(dest[1:107])\r
+       if len(src) == 202:\r
+               hash.update(src[131:192])       \r
+       result = hash.digest()\r
+       if result == dest[107:127]:\r
+               return dest\r
+       return None\r
+\r
+def validate_cert(cert, key):\r
+       buf = decrypt_block(cert[8:], key) \r
+       if buf is None:\r
+               return None\r
+       return buf[36:107] + cert[139:196]\r
+\r
+def read_random():\r
+       try:\r
+               fd = open("/dev/urandom", "r")\r
+               buf = fd.read(8)\r
+               fd.close()\r
+               return buf\r
+       except:\r
+               return None
\ No newline at end of file
index 2563981..92c1628 100755 (executable)
@@ -8,12 +8,13 @@ from Screens.Screen import Screen
 from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.ChoiceBox import ChoiceBox
 from Screens.MessageBox import MessageBox
 from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.ChoiceBox import ChoiceBox
 from Screens.MessageBox import MessageBox
-from enigma import ePoint
+from enigma import ePoint, eTPM
 from Tools import Notifications
 
 import os
 from twisted.mail import smtp, relaymanager
 import MimeWriter, mimetools, StringIO
 from Tools import Notifications
 
 import os
 from twisted.mail import smtp, relaymanager
 import MimeWriter, mimetools, StringIO
+from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block, validate_cert, read_random
 
 config.plugins.crashlogautosubmit = ConfigSubsection()
 config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
 
 config.plugins.crashlogautosubmit = ConfigSubsection()
 config.plugins.crashlogautosubmit.sendmail = ConfigSelection(default = "send", choices = [
@@ -376,11 +377,36 @@ def callCrashMailer(result,session):
 
 def autostart(reason, **kwargs):
        print "[CrashlogAutoSubmit] - autostart"
 
 def autostart(reason, **kwargs):
        print "[CrashlogAutoSubmit] - autostart"
-       if "session" in kwargs:
-               try:
-                       startMailer(kwargs["session"])
-               except ImportError, e:
-                       print "[CrashlogAutoSubmit] Twisted-mail not available, not starting CrashlogAutoSubmitter", e
+       try:
+               device = open("/proc/stb/info/model", "r").readline().strip()
+       except:
+               device = ""     
+       if device != "dm7025":
+               rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?']
+               etpm = eTPM()
+               l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
+               if l2cert is None:
+                       return
+               l2key = validate_cert(l2cert, rootkey)
+               if l2key is None:
+                       return
+               l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
+               if l3cert is None:
+                       return
+               l3key = validate_cert(l3cert, l2key)
+               if l3key is None:
+                       return
+               rnd = read_random()
+               if rnd is None:
+                       return
+               val = etpm.challenge(rnd)
+               result = decrypt_block(val, l3key)
+       if device == "dm7025" or result[80:88] == rnd:
+               if "session" in kwargs:
+                       try:
+                               startMailer(kwargs["session"])
+                       except ImportError, e:
+                               print "[CrashlogAutoSubmit] Twisted-mail not available, not starting CrashlogAutoSubmitter", e
 
 
 def openconfig(session, **kwargs):
 
 
 def openconfig(session, **kwargs):
index 45f97c6..68b5d57 100755 (executable)
@@ -234,6 +234,13 @@ void bsodFatal(const char *component)
 #endif
                fprintf(f, "\t\t<contactemail>%s</contactemail>\n", crash_emailaddr);
                fprintf(f, "\t\t<!-- Please email this crashlog to above address -->\n");
 #endif
                fprintf(f, "\t\t<contactemail>%s</contactemail>\n", crash_emailaddr);
                fprintf(f, "\t\t<!-- Please email this crashlog to above address -->\n");
+               std::string activeSkin = getConfigFileValue("config.skin.primary_skin");
+               if (activeSkin != "Error")
+               {
+                       if (activeSkin == "")
+                               activeSkin = "Default Skin";
+                       fprintf(f, "\t\t<skin>%s</skin>\n", activeSkin.c_str());
+               }
                fprintf(f, "\t</enigma2>\n");
 
                fprintf(f, "\t<image>\n");
                fprintf(f, "\t</enigma2>\n");
 
                fprintf(f, "\t<image>\n");