forked from nirea/collardata
-
Notifications
You must be signed in to change notification settings - Fork 0
/
removesub.py
134 lines (115 loc) · 6.24 KB
/
removesub.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/python
#Licensed under the GPLv2 (not later versions)
#see LICENSE.txt for details
from google.appengine.api import urlfetch
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from model import AvTokenValue, AppSettings
import lindenip
import logging
import os
import relations
g_owner = "owner" #token for owner
g_secowner= "secowners" #tokes for secowner
sharedpass = AppSettings.get_or_insert("sharedpass", value="sharedpassword").value
cmdurl = AppSettings.get_or_insert("cmdurl", value="http://yourcmdapp.appspot.com").value
class MainPage(webapp.RequestHandler):
def delete(self):
if lindenip.inrange(os.environ['REMOTE_ADDR']) != 'Production':#only allow access from sl
self.error(403)
elif self.request.headers['X-SecondLife-Shard'] != 'Production':
logging.warning("Attempt while on beta grid %s" % (self.request.headers['X-SecondLife-Shard']))
self.response.set_status(305)
else:
av = self.request.headers['X-SecondLife-Owner-Key']#get owner av key
avname = self.request.headers['X-SecondLife-Owner-Name']#get owner av name
subbie = self.request.path.split("/")[-1] #get key of sub from path
if avname != "(Loading...)":
relations.update_av(av, avname)#resolve key 2 name for owner
logging.info("Remove sub request from %s (%s) for sub (%s)" % (av,avname,subbie))
answer=0
# first check if owner
record = AvTokenValue.gql("WHERE av = :1 AND token = :2", subbie, g_owner).get() # request owner record of subbie
if record is not None:
#found a record for that subbie
if av in record.value:
# and the av is stil the owner, so remove it
ownerlist=record.value.split(",")
owner_index=ownerlist.index(av)
del ownerlist[owner_index:owner_index+2]
if ownerlist == []:
#list is emty, so just delete the record
record.delete()
logging.info("Remove sub request from %s for %s: Primary owner record deleted" % (avname,subbie))
else:
#build the new secowner list and save it
s=""
for x in ownerlist:
s += x+","
logging.info(s.rstrip(','))
# update the records value
record.value=s.rstrip(',')
# and save it
record.put()
logging.info("Remove sub request from %s for %s: Primary record updated: %s" % (avname,subbie, record.value))
#update the reealtion db
relations.delete(av,"owns",subbie)
# and prepare the answer for sl
answer+=1
#now we do the same for the secowner
record = AvTokenValue.gql("WHERE av = :1 AND token = :2", subbie, g_secowner).get() # request owner record of subbie
if record is not None:
#found a record for that subbie
if av in record.value:
# and the av is stil the owner, so remove it
ownerlist=record.value.split(",")
owner_index=ownerlist.index(av)
del ownerlist[owner_index:owner_index+2]
if ownerlist == []:
#list is emty, so just delete the record
record.delete()
logging.info("Remove sub request from %s for %s: Secower owner record deleted" % (avname,subbie))
else:
#build the new secowner list and save it
s=""
for x in ownerlist:
s += x+","
logging.info(s.rstrip(','))
# update the records value
record.value=s.rstrip(',')
# and save it
record.put()
logging.info("Remove sub request from %s for %s: Secower record updated: %s" % (avname,subbie, record.value))
#update the reealtion db
relations.delete(av,"secowns",subbie)
# and prepare the answer for sl
answer+=2
# updating relation again due to the bug 716: the relations got not always properly updated, so we need to be sure it happens now
if ((answer==0)|(answer==2)):
if (relations.delete(av,"owns",subbie)==1):
logging.info("Remove sub request from %s for %s: Not in subbies db, but primary owner relation removed" % (avname,subbie))
answer+=1
if ((answer==0)|(answer==1)):
if (relations.delete(av,"secowns",subbie)==1):
logging.info("Remove sub request from %s for %s: Not in subbies db, but secondary owner relation removed" % (avname,subbie))
answer+=2
# in case the answer is 0, something is wrong and the DBs from cmds and data drifted appart. We send a delete request to cmds, which hopfully fixex it
if answer==0:
logging.info('Relation not found, sending safety request to cmds')
result = urlfetch.fetch(cmdurl + '/relation/?safety/%s/%s' % (subbie, av), method="DELETE", headers={'sharedpass': sharedpass})
if result.status_code == 202:
logging.info('Answer from cmds received: %s' % result.content)
answer = int(result.content)
else:
logging.info('Problem with answer from cmds, status %d\n%s' % (result.status_code, result.content))
#answer to sl so we know what happened
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("%d" % answer)
self.response.set_status(200)
application = webapp.WSGIApplication(
[('/.*', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()