1 from enigma import eTimer, eTPM, eEnv
2 from Screens.Screen import Screen
3 from Components.ActionMap import ActionMap, NumberActionMap
4 from Components.Pixmap import Pixmap,MultiPixmap
5 from Components.Label import Label
6 from Components.Sources.StaticText import StaticText
7 from Components.Sources.List import List
8 from Components.MenuList import MenuList
9 from Components.config import config, getConfigListEntry, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
10 from Components.ConfigList import ConfigListScreen
11 from Components.Network import iNetwork
12 from Components.Console import Console
13 from Plugins.Plugin import PluginDescriptor
14 from os import system, path as os_path, listdir
15 from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
16 from Tools.LoadPixmap import LoadPixmap
17 from Tools.HardwareInfo import HardwareInfo
18 from Wlan import iWlan, wpaSupplicant, iStatus, getWlanConfigName
21 from os import urandom, system
23 plugin_path = eEnv.resolve("${libdir}/enigma2/python/Plugins/SystemPlugins/WirelessLan")
29 list.append("WPA/WPA2")
32 weplist.append("ASCII")
35 config.plugins.wlan = ConfigSubsection()
36 config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False))
37 config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False))
39 config.plugins.wlan.encryption = ConfigSubsection()
40 config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = False))
41 config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2" ))
42 config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII"))
43 config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False))
46 class WlanStatus(Screen):
48 <screen name="WlanStatus" position="center,center" size="560,400" title="Wireless Network State" >
49 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
50 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
52 <widget source="LabelBSSID" render="Label" position="10,60" size="250,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
53 <widget source="LabelESSID" render="Label" position="10,100" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
54 <widget source="LabelQuality" render="Label" position="10,140" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
55 <widget source="LabelSignal" render="Label" position="10,180" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
56 <widget source="LabelBitrate" render="Label" position="10,220" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
57 <widget source="LabelEnc" render="Label" position="10,260" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
59 <widget source="BSSID" render="Label" position="320,60" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
60 <widget source="ESSID" render="Label" position="320,100" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
61 <widget source="quality" render="Label" position="320,140" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
62 <widget source="signal" render="Label" position="320,180" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
63 <widget source="bitrate" render="Label" position="320,220" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
64 <widget source="enc" render="Label" position="320,260" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
66 <ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />
67 <widget source="IFtext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
68 <widget source="IF" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
69 <widget source="Statustext" render="Label" position="10,375" size="115,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1"/>
70 <widget name="statuspic" pixmaps="skin_default/buttons/button_green.png,skin_default/buttons/button_green_off.png" position="130,380" zPosition="10" size="15,16" transparent="1" alphatest="on"/>
73 def __init__(self, session, iface):
74 Screen.__init__(self, session)
75 self.session = session
78 self["LabelBSSID"] = StaticText(_('Accesspoint:'))
79 self["LabelESSID"] = StaticText(_('SSID:'))
80 self["LabelQuality"] = StaticText(_('Link Quality:'))
81 self["LabelSignal"] = StaticText(_('Signal Strength:'))
82 self["LabelBitrate"] = StaticText(_('Bitrate:'))
83 self["LabelEnc"] = StaticText(_('Encryption:'))
85 self["BSSID"] = StaticText()
86 self["ESSID"] = StaticText()
87 self["quality"] = StaticText()
88 self["signal"] = StaticText()
89 self["bitrate"] = StaticText()
90 self["enc"] = StaticText()
92 self["IFtext"] = StaticText()
93 self["IF"] = StaticText()
94 self["Statustext"] = StaticText()
95 self["statuspic"] = MultiPixmap()
96 self["statuspic"].hide()
97 self["key_red"] = StaticText(_("Close"))
100 self.updateStatusbar()
102 self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions", "ShortcutActions"],
108 self.timer = eTimer()
109 self.timer.timeout.get().append(self.resetList)
110 self.onShown.append(lambda: self.timer.start(5000))
111 self.onLayoutFinish.append(self.layoutFinished)
112 self.onClose.append(self.cleanup)
115 iStatus.stopWlanConsole()
117 def layoutFinished(self):
118 self.setTitle(_("Wireless Network State"))
121 iStatus.getDataForInterface(self.iface,self.getInfoCB)
123 def getInfoCB(self,data,status):
126 if status is not None:
127 self["BSSID"].setText(status[self.iface]["acesspoint"])
128 self["ESSID"].setText(status[self.iface]["essid"])
129 self["quality"].setText(status[self.iface]["quality"])
130 self["signal"].setText(status[self.iface]["signal"])
131 self["bitrate"].setText(status[self.iface]["bitrate"])
132 self["enc"].setText(status[self.iface]["encryption"])
133 self.updateStatusLink(status)
139 def updateStatusbar(self):
140 self["BSSID"].setText(_("Please wait..."))
141 self["ESSID"].setText(_("Please wait..."))
142 self["quality"].setText(_("Please wait..."))
143 self["signal"].setText(_("Please wait..."))
144 self["bitrate"].setText(_("Please wait..."))
145 self["enc"].setText(_("Please wait..."))
146 self["IFtext"].setText(_("Network:"))
147 self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface))
148 self["Statustext"].setText(_("Link:"))
150 def updateStatusLink(self,status):
151 if status is not None:
152 if status[self.iface]["acesspoint"] == "No Connection" or status[self.iface]["acesspoint"] == "Not-Associated" or status[self.iface]["acesspoint"] == False:
153 self["statuspic"].setPixmapNum(1)
155 self["statuspic"].setPixmapNum(0)
156 self["statuspic"].show()
159 class WlanScan(Screen):
161 <screen name="WlanScan" position="center,center" size="560,400" title="Choose a Wireless Network" >
162 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
163 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
164 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
165 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
166 <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
167 <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
168 <widget source="list" render="Listbox" position="5,40" size="550,300" scrollbarMode="showOnDemand">
169 <convert type="TemplatedMultiContent">
171 MultiContentEntryText(pos = (0, 0), size = (550, 30), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the essid
172 MultiContentEntryText(pos = (0, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 5), # index 5 is the interface
173 MultiContentEntryText(pos = (175, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 4), # index 0 is the encryption
174 MultiContentEntryText(pos = (350, 0), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 0 is the signal
175 MultiContentEntryText(pos = (350, 30), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 3), # index 0 is the maxrate
176 MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (550, 2), png = 6), # index 6 is the div pixmap
178 "fonts": [gFont("Regular", 28),gFont("Regular", 18)],
183 <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />
184 <widget source="info" render="Label" position="0,350" size="560,50" font="Regular;24" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
187 def __init__(self, session, iface):
188 Screen.__init__(self, session)
189 self.session = session
191 self.skin_path = plugin_path
192 self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
194 self.newAPList = None
196 self.cleanList = None
198 self.listLength = None
199 self.rescanTimer = eTimer()
200 self.rescanTimer.callback.append(self.rescanTimerFired)
202 self["info"] = StaticText()
205 self["list"] = List(self.list)
207 self["key_red"] = StaticText(_("Close"))
208 self["key_green"] = StaticText(_("Connect"))
209 self["key_yellow"] = StaticText()
211 self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
217 self["shortcuts"] = ActionMap(["ShortcutActions"],
220 "green": self.select,
222 iWlan.setInterface(self.iface)
223 self.w = iWlan.getInterface()
224 self.onLayoutFinish.append(self.layoutFinished)
225 self.getAccessPoints(refresh = False)
227 def layoutFinished(self):
228 self.setTitle(_("Choose a wireless network"))
231 cur = self["list"].getCurrent()
233 iWlan.stopGetNetworkList()
234 self.rescanTimer.stop()
236 if cur[1] is not None:
237 if cur[1] == 'hidden...':
241 self.close(essid,self.getWlanList())
243 self.close(None,None)
245 iWlan.stopGetNetworkList()
246 self.rescanTimer.stop()
248 self.close(None,None)
251 iWlan.stopGetNetworkList()
252 self.rescanTimer.stop()
256 def rescanTimerFired(self):
257 self.rescanTimer.stop()
260 def buildEntryComponent(self, essid, bssid, encrypted, iface, maxrate, signal):
261 divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
262 encryption = encrypted and _("Yes") or _("No")
263 if bssid == 'hidden...':
264 return((essid, bssid, None, None, None, None, divpng))
266 return((essid, bssid, _("Signal: ") + str(signal), _("Max. Bitrate: ") + str(maxrate), _("Encrypted: ") + encryption, _("Interface: ") + str(iface), divpng))
268 def updateAPList(self):
270 newList = self.getAccessPoints(refresh = True)
274 currentListEntry = None
275 currentListIndex = None
277 for ap in self.oldlist.keys():
278 data = self.oldlist[ap]['data']
283 if "hidden..." not in tmpList:
284 tmpList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
286 for entry in tmpList:
287 self.newAPList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ))
289 currentListEntry = self["list"].getCurrent()
291 for entry in self.newAPList:
292 if entry[0] == currentListEntry[0]:
295 self['list'].setList(self.newAPList)
296 self["list"].setIndex(newListIndex)
297 self["list"].updateList(self.newAPList)
298 self.listLength = len(self.newAPList)
302 def getAccessPoints(self, refresh = False):
305 aps = iWlan.getNetworkList()
307 print "[WirelessLan.py] got Accespoints!"
313 tmpList.append( (a['essid'], a['bssid']) )
314 compList.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
316 for entry in tmpList:
318 for compentry in compList:
319 if compentry[1] == entry[1]:
320 compList.remove(compentry)
321 for entry in compList:
322 self.cleanList.append( ( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ) )
323 if not self.oldlist.has_key(entry[0]):
324 self.oldlist[entry[0]] = { 'data': entry }
326 self.oldlist[entry[0]]['data'] = entry
328 if "hidden..." not in self.cleanList:
329 self.cleanList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
331 for entry in self.cleanList:
332 self.APList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ))
335 self['list'].setList(self.APList)
336 self.listLength = len(self.APList)
338 self.rescanTimer.start(5000)
339 return self.cleanList
342 length = self.getLength()
344 self["info"].setText(_("No wireless networks found! Please refresh."))
346 self["info"].setText(_("1 wireless network found!"))
348 self["info"].setText(str(length-1)+_(" wireless networks found!"))
350 def buildWlanList(self):
352 for entry in self['list'].list:
353 if entry[1] == "hidden...":
354 self.WlanList.append(( "hidden...",_("enter hidden network SSID") ))
356 self.WlanList.append( (entry[0], entry[0]) )
359 return self.listLength
361 def getWlanList(self):
362 if self.WlanList is None:
368 return reduce( lambda x,y:(x<<8L)+y, map(ord, s))
372 for byte in range(128):
373 res += chr((l >> (1024 - (byte + 1) * 8)) & 0xff)
376 def rsa_pub1024(src, mod):
377 return long2bin(pow(bin2long(src), 65537, bin2long(mod)))
379 def decrypt_block(src, mod):
380 if len(src) != 128 and len(src) != 202:
382 dest = rsa_pub1024(src[:128], mod)
383 hash = hashlib.sha1(dest[1:107])
385 hash.update(src[131:192])
386 result = hash.digest()
387 if result == dest[107:127]:
391 def validate_certificate(cert, key):
392 buf = decrypt_block(cert[8:], key)
395 return buf[36:107] + cert[139:196]
399 xor = lambda a,b: ''.join(chr(ord(c)^ord(d)) for c,d in zip(a,b*100))
402 result = xor(random, x)
408 def WlanStatusScreenMain(session, iface):
409 session.open(WlanStatus, iface)
411 def callFunction(iface):
412 iWlan.setInterface(iface)
413 i = iWlan.getWirelessInterfaces()
415 if iface in i or iNetwork.isWirelessInterface(iface):
416 return WlanStatusScreenMain
420 def configStrings(iface):
421 hardware_info = HardwareInfo()
422 if hardware_info.device_name != "dm7025":
423 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', ':', '?']
425 l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
428 l2key = validate_certificate(l2cert, rootkey)
431 l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
434 l3key = validate_certificate(l3cert, l2key)
440 val = etpm.challenge(rnd)
441 result = decrypt_block(val, l3key)
442 if hardware_info.device_name == "dm7025" or result[80:88] == rnd:
443 driver = iNetwork.detectWlanModule(iface)
446 print 'Using "%s" as wpa-supplicant driver' % (driver)
448 if driver == 'madwifi' and config.plugins.wlan.essid.value == "hidden...":
449 ret += "\tpre-up iwconfig " + iface + " essid \"" + config.plugins.wlan.hiddenessid.value + "\" || true\n"
450 ret += "\tpre-up wpa_supplicant -i" + iface + " -c" + getWlanConfigName(iface) + " -B -dd -D" + driver + " || true\n"
451 ret += "\tpre-down wpa_cli -i" + iface + " terminate || true\n"
454 def Plugins(**kwargs):
455 return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, needsRestart = False, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."})