-
Notifications
You must be signed in to change notification settings - Fork 0
/
registerCam.py
executable file
·119 lines (93 loc) · 3.34 KB
/
registerCam.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import sys, re, json, time
from hashlib import md5
from twisted.python.filepath import FilePath
from PacketAES import AESCipher
from twisted.internet import threads, defer
from twisted.web.server import Session, NOT_DONE_YET
from zope.interface import implements
from twisted.cred import portal, checkers, credentials, error as credError
from twisted.web.resource import IResource, Resource, NoResource
from twisted.web.guard import HTTPAuthSessionWrapper
from twisted.web.guard import DigestCredentialFactory
import googledatastore as datastore
datastore.set_options(dataset='packetservo')
class Verify(object):
def cbquery(self,camid,field):
camkey = datastore.Key()
path = camkey.path_element.add()
path.kind = 'PSCams'
path.name = camid
req = datastore.LookupRequest()
req.key.extend([camkey])
resp = datastore.lookup(req)
if resp.found:
pscam = resp.found[0].entity
password_property = datastore.Property()
password_property.name = field
for prop in pscam.property:
if prop.name == field:
val = prop.value.string_value
result = [camid,val]
else:
result = [camid,field]
return result
def query(self,camid,field):
d = defer.Deferred()
d.callback(self.cbquery(camid,field))
return d
class DBCredentialChecker:
implements(checkers.ICredentialsChecker)
credentialInterfaces = (credentials.IUsernamePassword,credentials.IUsernameDigestHash)
def requestAvatarId(self,credentials):
verify = Verify()
dbDeferred = verify.query(credentials.username,field='password')
deferred = defer.Deferred()
dbDeferred.addCallbacks(self._cbAuthenticate, self._ebAuthenticate,
callbackArgs=(credentials, deferred),
errbackArgs=(credentials, deferred))
return deferred
def _cbAuthenticate(self, result, credentials, deferred):
if len(result) == 0:
deferred.errback(credError.UnauthorizedLogin("No such user"))
else:
username, password = result
if credentials.checkHash(password):
deferred.callback(credentials.username)
else:
deferred.errback(credError.UnauthorizedLogin('Password mismatch'))
def _ebAuthenticate(self,message,credentials,deferred):
deferred.errback(credError.LoginFailed(message))
class WSRealm(object):
implements(portal.IRealm)
def requestAvatar(self,user,mind,*interfaces):
if IResource in interfaces:
return(IResource,SendToken(),lambda: None)
raise NotImplementedError()
p12_file = FilePath('/home/chetan/pscore/protected/PacketServo-267cefd0c2d6.p12')
f = p12_file.open('r')
key = f.read()
f.close()
class SendToken(Resource):
isLeaf = True
maxAge = 86400
def cbDBRes(self,result,cambot,request):
if len(result) == 0:
master = None
else:
camid, master = result
myAES = AESCipher(key)
cambot['master'] = master
expiry = time.strftime("%a, %d-%b-%Y %T GMT", time.gmtime(time.time()+self.maxAge))
cambot['expiry'] = expiry
request.addCookie('wsid',myAES.encrypt(json.dumps(cambot)),expires=expiry,path=b"/")
request.finish()
def generateCookie(self,request):
cambot = json.loads(request.content.read())
verify = Verify()
ds1 = verify.query(cambot['id'],field='master')
ds1.addCallbacks(self.cbDBRes, callbackArgs=(cambot,request))
return ds1
def render_POST(self,request):
d = self.generateCookie(request)
#d.addCallback(self.cbDBRes, callbackArgs=(cambot,request))
return NOT_DONE_YET