1 from Components.config import config, ConfigSubsection, ConfigSelection, ConfigPIN, ConfigYesNo, ConfigSubList, ConfigInteger
2 from Screens.InputBox import PinInput
3 from Screens.MessageBox import MessageBox
4 from Tools.BoundFunction import boundFunction
5 from ServiceReference import ServiceReference
6 from Tools import Notifications
7 from Tools.Directories import resolveFilename, SCOPE_CONFIG
9 def InitParentalControl():
10 config.ParentalControl = ConfigSubsection()
11 config.ParentalControl.configured = ConfigYesNo(default = False)
12 config.ParentalControl.mode = ConfigSelection(default = "simple", choices = [("simple", _("simple")), ("complex", _("complex"))])
13 config.ParentalControl.storeservicepin = ConfigSelection(default = "never", choices = [("never", _("never")), ("5_minutes", _("5 minutes")), ("30_minutes", _("30 minutes")), ("60_minutes", _("60 minutes")), ("restart", _("until restart"))])
14 config.ParentalControl.servicepinactive = ConfigYesNo(default = False)
15 config.ParentalControl.setuppinactive = ConfigYesNo(default = False)
16 config.ParentalControl.type = ConfigSelection(default = "blacklist", choices = [("whitelist", _("whitelist")), ("blacklist", _("blacklist"))])
17 config.ParentalControl.setuppin = ConfigPIN(default = -1)
19 config.ParentalControl.retries = ConfigSubsection()
20 config.ParentalControl.retries.setuppin = ConfigSubsection()
21 config.ParentalControl.retries.setuppin.tries = ConfigInteger(default = 3)
22 config.ParentalControl.retries.setuppin.time = ConfigInteger(default = 3)
23 config.ParentalControl.retries.servicepin = ConfigSubsection()
24 config.ParentalControl.retries.servicepin.tries = ConfigInteger(default = 3)
25 config.ParentalControl.retries.servicepin.time = ConfigInteger(default = 3)
26 # config.ParentalControl.configured = configElement("config.ParentalControl.configured", configSelection, 1, (("yes", _("yes")), ("no", _("no"))))
27 #config.ParentalControl.mode = configElement("config.ParentalControl.mode", configSelection, 0, (("simple", _("simple")), ("complex", _("complex"))))
28 #config.ParentalControl.storeservicepin = configElement("config.ParentalControl.storeservicepin", configSelection, 0, (("never", _("never")), ("5_minutes", _("5 minutes")), ("30_minutes", _("30 minutes")), ("60_minutes", _("60 minutes")), ("restart", _("until restart"))))
29 #config.ParentalControl.servicepinactive = configElement("config.ParentalControl.servicepinactive", configSelection, 1, (("yes", _("yes")), ("no", _("no"))))
30 #config.ParentalControl.setuppinactive = configElement("config.ParentalControl.setuppinactive", configSelection, 1, (("yes", _("yes")), ("no", _("no"))))
31 #config.ParentalControl.type = configElement("config.ParentalControl.type", configSelection, 0, (("whitelist", _("whitelist")), ("blacklist", _("blacklist"))))
32 #config.ParentalControl.setuppin = configElement("config.ParentalControl.setuppin", configSequence, "0000", configSequenceArg().get("PINCODE", (4, "")))
34 config.ParentalControl.servicepin = ConfigSubList()
37 config.ParentalControl.servicepin.append(ConfigPIN(default = -1))
38 #config.ParentalControl.servicepin.append(configElement("config.ParentalControl.servicepin.level" + str(i), configSequence, "0000", configSequenceArg().get("PINCODE", (4, ""))))
40 class ParentalControl:
43 self.serviceLevel = {}
45 def addWhitelistService(self, service):
46 self.whitelist.append(service)
48 def addBlacklistService(self, service):
49 self.blacklist.append(service)
51 def setServiceLevel(self, service, level):
52 self.serviceLevel[service] = level
54 def deleteWhitelistService(self, service):
55 self.whitelist.remove(service)
56 if self.serviceLevel.has_key(service):
57 self.serviceLevel.remove(service)
59 def deleteBlacklistService(self, service):
60 self.blacklist.remove(service)
61 if self.serviceLevel.has_key(service):
62 self.serviceLevel.remove(service)
64 def isServicePlayable(self, ref, callback):
65 if not config.ParentalControl.configured.value or not config.ParentalControl.servicepinactive.value:
67 #print "whitelist:", self.whitelist
68 #print "blacklist:", self.blacklist
69 #print "config.ParentalControl.type.value:", config.ParentalControl.type.value
70 #print "not in whitelist:", (service not in self.whitelist)
71 #print "checking parental control for service:", ref.toString()
72 service = ref.toCompareString()
73 if (config.ParentalControl.type.value == "whitelist" and service not in self.whitelist) or (config.ParentalControl.type.value == "blacklist" and service in self.blacklist):
74 self.callback = callback
75 #print "service:", ServiceReference(service).getServiceName()
77 if self.serviceLevel.has_key(service):
78 levelNeeded = self.serviceLevel[service]
79 pinList = self.getPinList()[:levelNeeded + 1]
80 Notifications.AddNotificationWithCallback(boundFunction(self.servicePinEntered, ref), PinInput, triesEntry = config.ParentalControl.retries.servicepin, pinList = pinList, service = ServiceReference(ref).getServiceName(), title = _("this service is protected by a parental control pin"), windowTitle = _("Parental control"))
85 def protectService(self, service):
87 #print "config.ParentalControl.type.value:", config.ParentalControl.type.value
88 if config.ParentalControl.type.value == "whitelist":
89 if service in self.whitelist:
90 self.deleteWhitelistService(service)
92 if service not in self.blacklist:
93 self.addBlacklistService(service)
94 #print "whitelist:", self.whitelist
95 #print "blacklist:", self.blacklist
98 def unProtectService(self, service):
100 #print "config.ParentalControl.type.value:", config.ParentalControl.type.value
101 if config.ParentalControl.type.value == "whitelist":
102 if service not in self.whitelist:
103 self.addWhitelistService(service)
105 if service in self.blacklist:
106 self.deleteBlacklistService(service)
107 #print "whitelist:", self.whitelist
108 #print "blacklist:", self.blacklist
110 def getProtectionLevel(self, service):
111 if (config.ParentalControl.type.value == "whitelist" and service not in self.whitelist) or (config.ParentalControl.type.value == "blacklist" and service in self.blacklist):
112 if self.serviceLevel.has_key(service):
113 return self.serviceLevel[service]
119 def getPinList(self):
120 return [ x.value for x in config.ParentalControl.servicepin ]
122 def servicePinEntered(self, service, result):
124 #if self.serviceLevel.has_key(service):
125 #levelNeeded = self.serviceLevel[service]
127 #print "getPinList():", self.getPinList()
128 #pinList = self.getPinList()[:levelNeeded + 1]
129 #print "pinList:", pinList
131 # print "pin entered for service", service, "and pin was", pin
132 #if pin is not None and int(pin) in pinList:
133 if result is not None and result:
134 #print "pin ok, playing service"
135 self.callback(ref = service)
137 if result is not None:
138 Notifications.AddNotification(MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
139 #print "wrong pin entered"
141 def saveWhitelist(self):
142 file = open(resolveFilename(SCOPE_CONFIG, "whitelist"), 'w')
143 for x in self.whitelist:
147 def openWhitelist(self):
150 file = open(resolveFilename(SCOPE_CONFIG, "whitelist"), 'r')
151 lines = file.readlines()
153 ref = ServiceReference(x.strip())
154 self.whitelist.append(str(ref))
159 def saveBlacklist(self):
160 file = open(resolveFilename(SCOPE_CONFIG, "blacklist"), 'w')
161 for x in self.blacklist:
165 def openBlacklist(self):
168 file = open(resolveFilename(SCOPE_CONFIG, "blacklist"), 'r')
169 lines = file.readlines()
171 ref = ServiceReference(x.strip())
172 self.blacklist.append(str(ref))
185 parentalControl = ParentalControl()