-
Notifications
You must be signed in to change notification settings - Fork 0
/
Settings.py
142 lines (95 loc) · 4.65 KB
/
Settings.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
135
136
137
138
139
140
141
# -*- coding: utf-8 -*-
import os
import logging
import webapp2
import random
import string
import md5
from google.appengine.api import datastore_errors
from MasterHandler import MasterHandler, AjaxError
from DataModels import UserSettings, CardDAVLogin
from DataModels import availableLanguages
from Security import psinqueMD5
#-----------------------------------------------------------------------------
# Request handler
class Settings(MasterHandler):
#****************************
# Private methods
#
passwordCharacters = string.ascii_lowercase
def _getUserSettings(self):
return UserSettings.all(). \
ancestor(self.userProfile). \
get()
def _generateRandomSequence(self, passwordLength):
return "".join([random.SystemRandom().choice(self.passwordCharacters) for x in range(passwordLength)])
#****************************
# Views
#
def view(self):
if self.getUserProfile():
userSettings = self._getUserSettings()
carddavLogins = CardDAVLogin.all(). \
ancestor(self.userProfile). \
fetch(1000)
self.sendContent('templates/Settings.html',
activeEntry = "Settings",
templateVariables = {
'userSettings': userSettings,
'carddavLogins': carddavLogins,
'availableLanguages': availableLanguages,
})
#****************************
# AJAX methods
#
def updatesettings(self):
userSettings = self._getUserSettings()
if userSettings.parent().key() != self.userProfile.key():
raise AjaxError("You don't own these settings")
userSettings.preferredLanguage = self.getRequiredParameter('language')
userSettings.notifyNewsletter = self.getRequiredBoolParameter('newsletter')
userSettings.notifyEmails = self.getRequiredBoolParameter('emailnotifications')
userSettings.notifyStopsUsingMyPrivateData = self.getRequiredBoolParameter('notifystops')
userSettings.notifyAsksForPrivateData = self.getRequiredBoolParameter('notifyasks')
userSettings.notifyAllowsMePrivateData = self.getRequiredBoolParameter('notifyaccepts')
userSettings.notifyDisallowsMePrivateData = self.getRequiredBoolParameter('notifyrejects')
userSettings.notifyRequestDecision = self.getRequiredBoolParameter('notifyrevokes')
userSettings.cardDAVenabled = self.getRequiredBoolParameter('synccarddav')
#userSettings.syncWithGoogle = self.getRequiredBoolParameter('syncgoogle')
userSettings.put()
self.sendJsonOK()
def generatecarddavlogin(self):
carddavName = self.getRequiredParameter("name")
while True:
generatedUsername = self._generateRandomSequence(8)
if not CardDAVLogin.all().filter("generatedUsername =", generatedUsername).get():
break
generatedPassword = self._generateRandomSequence(16)
salt = self._generateRandomSequence(2)
cardDAVLogin = CardDAVLogin(parent = self.userProfile,
name = carddavName,
generatedUsername = generatedUsername,
generatedPasswordHash = md5.new(salt + generatedPassword).hexdigest(),
salt = salt)
cardDAVLogin.put()
# Enable CardDAV at the same time
self.userProfile.userSettings.cardDAVenabled = True
self.userProfile.userSettings.put()
self.sendJsonOK({
"key": str(cardDAVLogin.key()),
"username": generatedUsername,
"password": generatedPassword,
})
def deletecarddav(self):
try:
cardDAVLogin = CardDAVLogin.get(self.getRequiredParameter("key"))
if cardDAVLogin.parent().key() != self.userProfile.key():
raise AjaxError("You don't own these CardDAV credentials.")
cardDAVLogin.delete()
self.sendJsonOK()
except datastore_errors.BadKeyError:
raise AjaxError("CardDAV login does not exist.")
#-----------------------------------------------------------------------------
app = webapp2.WSGIApplication([
(r'/settings/(\w+)', Settings)
], debug=True)