def member(self): if not hasattr(self, "_member"): ip = False member = False if 'X-Real-IP' in self.request.headers: ip = self.request.headers['X-Real-IP'] else: ip = self.request.remote_ip #cookies = Cookies(self, max_age = 86400 * 14, path = '/') auth = self.get_cookie('auth') #if 'auth' in cookies: if auth is not None: #auth = cookies['auth'] member_num = memcache.get(auth) if member_num > 0: member = memcache.get('Member_' + str(member_num)) if member is None: #q = db.GqlQuery("SELECT * FROM Member WHERE num = :1", member_num) q = Member.selectBy(num=member_num) if q.count() == 1: member = q[0] memcache.set('Member_' + str(member_num), member, 86400 * 14) if member: member.ip = ip else: #q = db.GqlQuery("SELECT * FROM Member WHERE auth = :1", auth) q = Member.selectBy(auth=auth) if (q.count() == 1): member_num = q[0].num member = q[0] memcache.set(auth, member_num, 86400 * 14) memcache.set('Member_' + str(member_num), member, 86400 * 14) member.ip = ip self._member = member return self._member
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_members = member.favorited_members - 1 member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str(member.num) memcache.delete(n) one = Member.get(one.id) one.followers_count = one.followers_count - 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set('Member::' + str(one.username_lower), one, 86400) self.redirect(go)
def CheckAuth(handler): ip = GetIP(handler) cookies = handler.request.cookies if 'auth' in cookies: auth = cookies['auth'].value member_num = memcache.get(auth) if (member_num > 0): member = memcache.get('Member_' + str(member_num)) if member is None: #q = db.GqlQuery("SELECT * FROM Member WHERE num = :1", member_num) q = Member.selectBy(num=member_num) if q.count() == 1: member = q[0] memcache.set(auth, member.num) memcache.set('Member_' + str(member_num), member) else: member = False if member: member.ip = ip return member else: #q = db.GqlQuery("SELECT * FROM Member WHERE auth = :1", auth) q = Member.selectBy(auth=auth) if (q.count() == 1): member_num = q[0].num member = q[0] memcache.set(auth, member_num) memcache.set('Member_' + str(member_num), member) member.ip = ip return member else: return False else: return False
def get(self, node_name): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): node = GetKindByName('Node', node_name) if node is not False: #q = db.GqlQuery("SELECT * FROM NodeBookmark WHERE node = :1 AND member = :2", node, member) q = NodeBookmark.selectBy(node=node, member=member) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_nodes = member.favorited_nodes - 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/n' + str(node.num) + '/m' + str(member.num) memcache.delete(n) self.redirect(go)
def get(self, topic_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0].strip() if member: if member.username_lower_md5 == t: topic = GetKindByNum('Topic', int(topic_num)) if topic is not False: #q = db.GqlQuery("SELECT * FROM TopicBookmark WHERE topic = :1 AND member = :2", topic, member) q = TopicBookmark.selectBy(topic=topic, member=member) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_topics = member.favorited_topics - 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/t' + str(topic.num) + '/m' + str(member.num) memcache.delete(n) #taskqueue.add(url='/minus/star/topic/' + str(topic.id)) topic.stars = topic.stars - 1 topic.sync() store.commit() #jon add memcache.set('Topic_' + str(topic.num), topic, 86400) self.redirect(go)
def get(self, topic_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0].strip() if member: if member.username_lower_md5 == t: topic = GetKindByNum('Topic', int(topic_num)) if topic is not False: #q = db.GqlQuery("SELECT * FROM TopicBookmark WHERE topic = :1 AND member = :2", topic, member) q = TopicBookmark.selectBy(topic=topic,member=member) if q.count() == 0: bookmark = TopicBookmark(member=member) bookmark.topic = topic bookmark.member = member bookmark.sync() member = Member.get(member.id) member.favorited_topics = member.favorited_topics + 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/t' + str(topic.num) + '/m' + str(member.num) memcache.set(n, True, 86400 * 14) #taskqueue.add(url='/add/star/topic/' + str(topic.id)) topic.stars = topic.stars + 1 topic.sync() store.commit() #jon add memcache.set('Topic_' + str(topic.num), topic, 86400) self.redirect(go)
def get(self, private_token): n = memcache.get('n_' + private_token) if n is not None: self.values['notification'] = n self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['member'] = self.member self.finalize(template_name='notifications', template_root='feed', template_type='xml') else: #q = db.GqlQuery("SELECT * FROM Member WHERE private_token = :1", private_token) q = Member.selectBy(private_token=private_token) count = q.count() if count > 0: member = q[0] #q = db.GqlQuery("SELECT * FROM Notification WHERE for_member_num = :1 ORDER BY num DESC LIMIT 20", member.num) q = Notification.selectBy(for_member_num=member.num).orderBy('-num').limit(20) notifications = [] i = 0 for n in q: if n.type == 'reply': n.title = u'' + n.member.username + u' 在 ' + self.escape(n.label1) + u' 里回复了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 里回复了你' notifications.append(n) if n.type == 'mention_reply': n.title = u'' + n.member.username + u' 在回复 ' + self.escape(n.label1) + u' 时提到了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 时提到了你' notifications.append(n) i = i + 1 self.values['notifications'] = notifications memcache.set('n_' + private_token, notifications, 600) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['site'] = GetSite() self.values['member'] = member self.finalize(template_name='notifications', template_root='feed', template_type='xml')
def get(self, node_name): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): node = GetKindByName('Node', node_name) if node is not False: #q = db.GqlQuery("SELECT * FROM NodeBookmark WHERE node = :1 AND member = :2", node, member) q = NodeBookmark.selectBy(node=node, member=member) if q.count() == 0: bookmark = NodeBookmark(member=member) bookmark.node = node bookmark.member = member bookmark.sync() member = Member.get(member.id) member.favorited_nodes = member.favorited_nodes + 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/n' + str(node.num) + '/m' + str(member.num) memcache.set(n, True, 86400 * 14) self.redirect(go)
def receive(self, message): bodies = message.bodies(content_type='text/plain') for body in bodies: to = extract_address(message.to) sender = extract_address(message.sender.lower()) if to[0:5].lower() == 'tweet': #q = db.GqlQuery("SELECT * FROM Member WHERE email = :1", sender) q = Member.selectBy(email=sender) if q.count() == 1: member = q[0] if member.twitter_oauth == 1: access_token = OAuthToken.from_string( member.twitter_oauth_string) twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) status = body[1].decode() if len(status) > 140: status = status[0:140] try: logging.info("About to send tweet: " + status) twitter.PostUpdate(status.encode('utf-8')) logging.info("Successfully tweet: " + status) except: logging.error("Failed to tweet for " + member.username) else: logging.error("User " + sender + " doesn't have Twitter link.")
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() == 0: member = Member.get(member.id) member.favorited_members = member.favorited_members + 1 if member.favorited_members > 30: self.session = Session() self.session['message'] = '最多只能添加 30 位特别关注' else: bookmark = MemberBookmark(member=member) bookmark.one = one bookmark.member_num = member.num bookmark.sync() member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str( member.num) memcache.set(n, True, 86400 * 14) one = Member.get(one.id) one.followers_count = one.followers_count + 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set( 'Member::' + str(one.username_lower), one, 86400) self.session = Session() self.session[ 'message'] = '特别关注添加成功,还可以添加 ' + str( 30 - member.favorited_members) + ' 位' self.redirect(go)
def get(self, key): go = '/' member = CheckAuth(self) if member: member = Member.get(member.id) one = Member.get(key) if one: if one.num != member.num: try: blocked = pickle.loads(member.blocked.encode('utf-8')) except: blocked = [] if len(blocked) == 0: blocked = [] if one.num in blocked: blocked.remove(one.num) member.blocked = pickle.dumps(blocked) member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) self.redirect(go)
def GetMemberByUsername(name): one = memcache.get('Member::' + str(name).lower()) if one: return one else: #q = db.GqlQuery("SELECT * FROM Member WHERE username_lower = :1", str(name).lower()) q = Member.selectBy(username_lower=str(name).lower()) if q.count() == 1: one = q[0] memcache.set('Member::' + str(name).lower(), one, 86400) return one else: return False
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() == 0: member = Member.get(member.id) member.favorited_members = member.favorited_members + 1 if member.favorited_members > 30: self.session = Session() self.session['message'] = '最多只能添加 30 位特别关注' else: bookmark = MemberBookmark(member=member) bookmark.one = one bookmark.member_num = member.num bookmark.sync() member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str(member.num) memcache.set(n, True, 86400 * 14) one = Member.get(one.id) one.followers_count = one.followers_count + 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set('Member::' + str(one.username_lower), one, 86400) self.session = Session() self.session['message'] = '特别关注添加成功,还可以添加 ' + str(30 - member.favorited_members) + ' 位' self.redirect(go)
def GetMemberByEmail(email): cache = 'Member::email::' + hashlib.md5(email.lower()).hexdigest() one = memcache.get(cache) if one: return one else: #q = db.GqlQuery("SELECT * FROM Member WHERE email = :1", str(email).lower()) q = Member.selectBy(email=str(email).lower()) if q.count() == 1: one = q[0] memcache.set(cache, one, 86400) return one else: return False
def get(self, member_key): member = Member.get(member_key) if member: if member.notification_position is None: member.notification_position = 0 #q = db.GqlQuery("SELECT __key__ FROM Notification WHERE for_member_num = :1 AND num > :2 ORDER BY num DESC", member.num, member.notification_position) q = Notification.select(AND(Notification.q.for_m==member.num, Notification.q.num>member.notification_position)).orderBy('-num') count = q.count() if count > 0: member.notifications = count member.sync() store.commit() #jon add memcache.delete('nn::' + member.username_lower) memcache.set('Member_' + str(member.num), member, 86400)
def get(self, member_key): member = Member.get(member_key) if member: if member.notification_position is None: member.notification_position = 0 #q = db.GqlQuery("SELECT __key__ FROM Notification WHERE for_member_num = :1 AND num > :2 ORDER BY num DESC", member.num, member.notification_position) q = Notification.select( AND(Notification.q.for_m == member.num, Notification.q.num > member.notification_position)).orderBy('-num') count = q.count() if count > 0: member.notifications = count member.sync() store.commit() #jon add memcache.delete('nn::' + member.username_lower) memcache.set('Member_' + str(member.num), member, 86400)
def get(self, private_token): n = memcache.get('n_' + private_token) if n is not None: self.values['notification'] = n self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['member'] = self.member self.finalize(template_name='notifications', template_root='feed', template_type='xml') else: #q = db.GqlQuery("SELECT * FROM Member WHERE private_token = :1", private_token) q = Member.selectBy(private_token=private_token) count = q.count() if count > 0: member = q[0] #q = db.GqlQuery("SELECT * FROM Notification WHERE for_member_num = :1 ORDER BY num DESC LIMIT 20", member.num) q = Notification.selectBy( for_member_num=member.num).orderBy('-num').limit(20) notifications = [] i = 0 for n in q: if n.type == 'reply': n.title = u'' + n.member.username + u' 在 ' + self.escape( n.label1) + u' 里回复了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 里回复了你' notifications.append(n) if n.type == 'mention_reply': n.title = u'' + n.member.username + u' 在回复 ' + self.escape( n.label1) + u' 时提到了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 时提到了你' notifications.append(n) i = i + 1 self.values['notifications'] = notifications memcache.set('n_' + private_token, notifications, 600) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['site'] = GetSite() self.values['member'] = member self.finalize(template_name='notifications', template_root='feed', template_type='xml')
def receive(self, message): bodies = message.bodies(content_type = 'text/plain') for body in bodies: to = extract_address(message.to) sender = extract_address(message.sender.lower()) if to[0:5].lower() == 'tweet': #q = db.GqlQuery("SELECT * FROM Member WHERE email = :1", sender) q = Member.selectBy(email=sender) if q.count() == 1: member = q[0] if member.twitter_oauth == 1: access_token = OAuthToken.from_string(member.twitter_oauth_string) twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) status = body[1].decode() if len(status) > 140: status = status[0:140] try: logging.info("About to send tweet: " + status) twitter.PostUpdate(status.encode('utf-8')) logging.info("Successfully tweet: " + status) except: logging.error("Failed to tweet for " + member.username) else: logging.error("User " + sender + " doesn't have Twitter link.")
def post(self): browser = detect(self.request) template_values = {} template_values['system_version'] = SYSTEM_VERSION errors = 0 # Verification: username member_username_error = 0 member_username_error_messages = ['', u'请输入你的用户名', u'用户名长度不能超过 32 个字符', u'用户名只能由 a-Z 0-9 及 - 和 _ 组成', u'抱歉这个用户名已经有人使用了'] member_username = self.request.get('username').strip() if (len(member_username) == 0): errors = errors + 1 member_username_error = 1 else: if (len(member_username) > 32): errors = errors + 1 member_username_error = 2 else: if (re.search('^[a-zA-Z0-9\-\_]+$', member_username)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE username_lower = :1', member_username.lower()) if (q.count() > 0): errors = errors + 1 member_username_error = 4 else: errors = errors + 1 member_username_error = 3 template_values['member_username'] = member_username template_values['member_username_error'] = member_username_error template_values['member_username_error_message'] = member_username_error_messages[member_username_error] # Verification: password member_password_error = 0 member_password_error_messages = ['', u'请输入你的密码', u'密码长度不能超过 32 个字符' ] member_password = self.request.get('password').strip() if (len(member_password) == 0): errors = errors + 1 member_password_error = 1 else: if (len(member_password) > 32): errors = errors + 1 member_password_error = 2 template_values['member_password'] = member_password template_values['member_password_error'] = member_password_error template_values['member_password_error_message'] = member_password_error_messages[member_password_error] # Verification: email member_email_error = 0 member_email_error_messages = ['', u'请输入你的电子邮件地址', u'电子邮件地址长度不能超过 32 个字符', u'你输入的电子邮件地址不符合规则', u'抱歉这个电子邮件地址已经有人注册过了'] member_email = self.request.get('email').strip() if (len(member_email) == 0): errors = errors + 1 member_email_error = 1 else: if (len(member_email) > 32): errors = errors + 1 member_email_error = 2 else: p = re.compile(r"(?:^|\s)[-a-z0-9_.]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) if (p.search(member_email)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE email = :1', member_email.lower()) if (q.count() > 0): errors = errors + 1 member_email_error = 4 else: errors = errors + 1 member_email_error = 3 template_values['member_email'] = member_email template_values['member_email_error'] = member_email_error template_values['member_email_error_message'] = member_email_error_messages[member_email_error] template_values['errors'] = errors if (errors == 0): member = Member() q = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.max') if (q.count() == 1): counter = q[0] counter.value = counter.value + 1 else: counter = Counter() counter.name = 'member.max' counter.value = 1 q2 = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.total') if (q2.count() == 1): counter2 = q2[0] counter2.value = counter2.value + 1 else: counter2 = Counter() counter2.name = 'member.total' counter2.value = 1 member.num = counter.value member.username = member_username member.username_lower = member_username.lower() member.password = hashlib.sha1(member_password).hexdigest() member.email = member_email.lower() member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() member.put() counter.put() counter2.put() self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/' self.redirect('/') else: if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'signup.html') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'signup.html') output = template.render(path, template_values) self.response.out.write(output)
def post(self): self.session = Session() site = GetSite() browser = detect(self.request) template_values = {} template_values['site'] = site template_values['system_version'] = SYSTEM_VERSION errors = 0 member = CheckAuth(self) l10n = GetMessages(self, member, site) template_values['l10n'] = l10n template_values['page_title'] = site.title + u' › ' + l10n.settings.decode('utf-8') if (member): template_values['member'] = member template_values['member_username'] = member.username template_values['member_email'] = member.email template_values['member_website'] = member.website template_values['member_twitter'] = member.twitter # Verification: password password_error = 0 password_update = False password_error_messages = ['', '新密码长度不能超过 32 个字符', '请输入当前密码', '当前密码不正确' ] password_new = self.request.arguments['password_new'][0].strip() if (len(password_new) > 0): password_update = True if (len(password_new) > 32): password_error = 1 else: password_current = self.request.arguments['password_current'][0].strip() if (len(password_current) == 0): password = 2 else: password_current_sha1 = hashlib.sha1(password_current).hexdigest() if (password_current_sha1 != member.password): password_error = 3 template_values['password_error'] = password_error template_values['password_error_message'] = password_error_messages[password_error] if ((password_error == 0) and (password_update == True)): member.password = hashlib.sha1(password_new).hexdigest() member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() member.sync() store.commit() #jon add self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now(pytz.timezone('Asia/Shanghai')) + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/' self.redirect('/settings') # Verification: email member_email_error = 0 member_email_error_messages = ['', u'请输入你的电子邮件地址', u'电子邮件地址长度不能超过 32 个字符', u'你输入的电子邮件地址不符合规则', u'抱歉这个电子邮件地址已经有人注册过了'] member_email = self.request.arguments['email'][0].strip() if (len(member_email) == 0): errors = errors + 1 member_email_error = 1 else: if (len(member_email) > 32): errors = errors + 1 member_email_error = 2 else: p = re.compile(r"(?:^|\s)[-a-z0-9_.+]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) if (p.search(member_email)): #q = db.GqlQuery('SELECT * FROM Member WHERE email = :1 AND num != :2', member_email.lower(), member.num) q = Member.select(AND(Member.q.email==member_email.lower(), Member.q.num!=member.num)) if (q.count() > 0): errors = errors + 1 member_email_error = 4 else: errors = errors + 1 member_email_error = 3 template_values['member_email'] = member_email template_values['member_email_error'] = member_email_error template_values['member_email_error_message'] = member_email_error_messages[member_email_error] # Verification: website member_website_error = 0 member_website_error_messages = ['', u'个人网站地址长度不能超过 200 个字符', u'这个网站地址不符合规则' ] member_website = self.request.arguments['website'][0].strip() if (len(member_website) == 0): member_website = '' else: if (len(member_website) > 200): errors = errors + 1 member_website_error = 1 else: p = re.compile('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') if (p.search(member_website)): errors = errors else: errors = errors + 1 member_website_error = 2 template_values['member_website'] = member_website template_values['member_website_error'] = member_website_error template_values['member_website_error_message'] = member_website_error_messages[member_website_error] # Verification: Twitter member_twitter_error = 0 member_twitter_error_messages = ['', u'Twitter 用户名长度不能超过 20 个字符', u'Twitter 用户名不符合规则' ] member_twitter = self.request.arguments['twitter'][0].strip() if (len(member_twitter) == 0): member_twitter = '' else: if (len(member_twitter) > 20): errors = errors + 1 member_twitter_error = 1 else: p = re.compile('[a-zA-Z0-9\_]+') if (p.search(member_twitter)): errors = errors else: errors = errors + 1 member_twitter_error = 2 template_values['member_twitter'] = member_twitter template_values['member_twitter_error'] = member_twitter_error template_values['member_twitter_error_message'] = member_twitter_error_messages[member_twitter_error] # Verification: psn member_psn_error = 0 member_psn_error_messages = ['', u'PSN ID 长度不能超过 20 个字符', u'PSN ID 不符合规则' ] member_psn = self.request.arguments['psn'][0].strip() if (len(member_psn) == 0): member_psn = '' else: if (len(member_psn) > 20): errors = errors + 1 member_psn_error = 1 else: p = re.compile('^[a-zA-Z0-9\-\_]+$') if (p.search(member_psn)): errors = errors else: errors = errors + 1 member_psn_error = 2 template_values['member_psn'] = member_psn template_values['member_psn_error'] = member_psn_error template_values['member_psn_error_message'] = member_psn_error_messages[member_psn_error] # Verification: my_home member_my_home_error = 0 member_my_home_error_messages = ['', u'不是一个合法的自定义首页跳转位置', u'自定义首页跳转位置长度不能超过 32 个字符', u'自定义首页跳转位置必须以 / 开头' ] member_my_home = self.request.arguments['my_home'][0].strip() if len(member_my_home) > 0: if member_my_home == '/' or member_my_home.startswith('/signout'): member_my_home_error = 1 errors = errors + 1 else: if len(member_my_home) > 32: member_my_home_error = 2 errors = errors + 1 else: if member_my_home.startswith('/') is not True: member_my_home_error = 3 errors = errors + 1 template_values['member_my_home'] = member_my_home template_values['member_my_home_error'] = member_my_home_error template_values['member_my_home_error_message'] = member_my_home_error_messages[member_my_home_error] # Verification: btc member_btc_error = 0 member_btc_error_messages = ['', u'BTC 收款地址长度不能超过 40 个字符', u'BTC 收款地址不符合规则' ] member_btc = self.request.arguments['btc'][0].strip() if (len(member_btc) == 0): member_btc = '' else: if (len(member_btc) > 40): errors = errors + 1 member_btc_error = 1 else: p = re.compile('^[a-zA-Z0-9]+$') if (p.search(member_btc)): errors = errors else: errors = errors + 1 member_btc_error = 2 template_values['member_btc'] = member_btc template_values['member_btc_error'] = member_btc_error template_values['member_btc_error_message'] = member_btc_error_messages[member_btc_error] # Verification: github member_github_error = 0 member_github_error_messages = ['', u'GitHub 用户名长度不能超过 40 个字符', u'GitHub 用户名不符合规则' ] member_github = self.request.arguments['github'][0].strip() if (len(member_github) == 0): member_github = '' else: if (len(member_github) > 40): errors = errors + 1 member_github_error = 1 else: p = re.compile('^[a-zA-Z0-9\_]+$') if (p.search(member_github)): errors = errors else: errors = errors + 1 member_github_error = 2 template_values['member_github'] = member_github template_values['member_github_error'] = member_github_error template_values['member_github_error_message'] = member_github_error_messages[member_github_error] # Verification: location member_location_error = 0 member_location_error_messages = ['', u'所在地长度不能超过 40 个字符' ] member_location = self.request.arguments['location'][0].strip() if (len(member_location) == 0): member_location = '' else: if (len(member_location) > 40): errors = errors + 1 member_location_error = 1 template_values['member_location'] = member_location template_values['member_location_error'] = member_location_error template_values['member_location_error_message'] = member_location_error_messages[member_location_error] # Verification: tagline member_tagline_error = 0 member_tagline_error_messages = ['', u'个人签名长度不能超过 70 个字符' ] member_tagline = self.request.arguments['tagline'][0].strip() if (len(member_tagline) == 0): member_tagline = '' else: if (len(member_tagline) > 70): errors = errors + 1 member_tagline_error = 1 template_values['member_tagline'] = member_tagline template_values['member_tagline_error'] = member_tagline_error template_values['member_tagline_error_message'] = member_tagline_error_messages[member_tagline_error] # Verification: bio member_bio_error = 0 member_bio_error_messages = ['', u'个人简介长度不能超过 2000 个字符' ] member_bio = self.request.arguments['bio'][0].strip() if (len(member_bio) == 0): member_bio = '' else: if (len(member_bio) > 2000): errors = errors + 1 member_bio_error = 1 template_values['member_bio'] = member_bio template_values['member_bio_error'] = member_bio_error template_values['member_bio_error_message'] = member_bio_error_messages[member_bio_error] # Verification: show_home_top and show_quick_post try: member_show_home_top = int(self.request.arguments['show_home_top'][0]) except: member_show_home_top = 1 try: member_show_quick_post = int(self.request.arguments['show_quick_post'][0]) except: member_show_quick_post = 0 if member_show_home_top not in [0, 1]: member_show_home_top = 1 if member_show_quick_post not in [0, 1]: member_show_quick_post = 0 # Verification: l10n member_l10n = self.request.arguments['l10n'][0].strip() supported = GetSupportedLanguages() if member_l10n == '': member_l10n = site.l10n else: if member_l10n not in supported: member_l10n = site.l10n s = GetLanguageSelect(member_l10n) template_values['s'] = s template_values['member_l10n'] = member_l10n # Verification: twitter_sync if member.twitter_oauth == 1: member_twitter_sync = self.request.arguments['twitter_sync'][0] if member_twitter_sync == 'on': member_twitter_sync = 1 else: member_twitter_sync = 0 template_values['member_twitter_sync'] = member_twitter_sync # Verification: use_my_css member_use_my_css = self.request.arguments['use_my_css'][0] if member_use_my_css == 'on': member_use_my_css = 1 else: member_use_my_css = 0 template_values['member_use_my_css'] = member_use_my_css # Verification: my_css member_my_css_error = 0 member_my_css_error_messages = ['', u'CSS Hack cannot be longer than 2000 characters' ] member_my_css = self.request.arguments['my_css'][0].strip() if (len(member_my_css) == 0): member_my_css = '' else: if (len(member_my_css) > 2000): errors = errors + 1 member_my_css_error = 1 template_values['member_my_css'] = member_my_css template_values['member_my_css_error'] = member_my_css_error template_values['member_my_css_error_message'] = member_my_css_error_messages[member_my_css_error] template_values['errors'] = errors if (errors == 0): member.email = member_email.lower() member.website = member_website member.twitter = member_twitter member.psn = member_psn member.btc = member_btc member.github = member_github member.location = member_location member.tagline = member_tagline if member.twitter_oauth == 1: member.twitter_sync = member_twitter_sync member.use_my_css = member_use_my_css member.my_css = member_my_css if member_my_home_error == 0 and len(member_my_home) > 0: member.my_home = member_my_home else: if member_my_home_error == 0: member.my_home = None member.bio = member_bio member.show_home_top = member_show_home_top member.show_quick_post = member_show_quick_post member.l10n = member_l10n member.sync() store.commit() #jon add memcache.delete('Member::' + str(member.username)) memcache.delete('Member::' + str(member.username_lower)) memcache.set('Member_' + str(member.num), member, 86400) self.session['message'] = '个人设置成功更新' self.redirect('/settings') else: if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t=self.get_template(path, 'member_settings.html') self.finish(t.render(template_values)) else: self.redirect('/signin')
def post(self): site = GetSite() member = False browser = detect(self.request) template_values = {} template_values['site'] = site template_values['page_title'] = site.title + u' › 注册' template_values['system_version'] = SYSTEM_VERSION l10n = GetMessages(self, member, site) template_values['l10n'] = l10n errors = 0 # Verification: username member_username_error = 0 member_username_error_messages = ['', l10n.username_empty, l10n.username_too_long, l10n.username_invalid, l10n.username_taken] member_username = self.request.get('username').strip() if (len(member_username) == 0): errors = errors + 1 member_username_error = 1 else: if (len(member_username) > 32): errors = errors + 1 member_username_error = 2 else: if (re.search('^[a-zA-Z0-9\_]+$', member_username)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE username_lower = :1', member_username.lower()) if (q.count() > 0): errors = errors + 1 member_username_error = 4 else: errors = errors + 1 member_username_error = 3 template_values['member_username'] = member_username template_values['member_username_error'] = member_username_error template_values['member_username_error_message'] = member_username_error_messages[member_username_error] # Verification: password member_password_error = 0 member_password_error_messages = ['', u'请输入你的密码', u'密码长度不能超过 32 个字符' ] member_password = self.request.get('password').strip() if (len(member_password) == 0): errors = errors + 1 member_password_error = 1 else: if (len(member_password) > 32): errors = errors + 1 member_password_error = 2 template_values['member_password'] = member_password template_values['member_password_error'] = member_password_error template_values['member_password_error_message'] = member_password_error_messages[member_password_error] # Verification: email member_email_error = 0 member_email_error_messages = ['', u'请输入你的电子邮件地址', u'电子邮件地址长度不能超过 32 个字符', u'你输入的电子邮件地址不符合规则', u'抱歉这个电子邮件地址已经有人注册过了'] member_email = self.request.get('email').strip() if (len(member_email) == 0): errors = errors + 1 member_email_error = 1 else: if (len(member_email) > 32): errors = errors + 1 member_email_error = 2 else: p = re.compile(r"(?:^|\s)[-a-z0-9_.]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) if (p.search(member_email)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE email = :1', member_email.lower()) if (q.count() > 0): errors = errors + 1 member_email_error = 4 else: errors = errors + 1 member_email_error = 3 template_values['member_email'] = member_email template_values['member_email_error'] = member_email_error template_values['member_email_error_message'] = member_email_error_messages[member_email_error] # Verification: invitation invitation = self.request.get('invitation').strip() q = db.GqlQuery('SELECT * FROM Invitation WHERE code = :1', invitation) if q.count() > 0: invi = q[0] logging.info('invitation code %s used.' % invitation) template_values['invitation_error'] = 0 else: errors = errors + 1 template_values['invitation_error'] = 1 template_values['invitation_error_message'] = "无效的邀请码" # Verification: reCAPTCHA challenge = self.request.get('recaptcha_challenge_field') response = self.request.get('recaptcha_response_field') remoteip = os.environ['REMOTE_ADDR'] cResponse = captcha.submit( challenge, response, config.recaptcha_private_key, remoteip) if cResponse.is_valid: logging.info('reCAPTCHA verification passed') template_values['recaptcha_error'] = 0 else: errors = errors + 1 error = cResponse.error_code chtml = captcha.displayhtml( public_key = config.recaptcha_public_key, use_ssl = False, error = cResponse.error_code) template_values['captchahtml'] = chtml template_values['recaptcha_error'] = 1 template_values['recaptcha_error_message'] = '请重新输入 reCAPTCHA 验证码' template_values['errors'] = errors if (errors == 0): member = Member() q = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.max') if (q.count() == 1): counter = q[0] counter.value = counter.value + 1 else: counter = Counter() counter.name = 'member.max' counter.value = 1 q2 = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.total') if (q2.count() == 1): counter2 = q2[0] counter2.value = counter2.value + 1 else: counter2 = Counter() counter2.name = 'member.total' counter2.value = 1 member.num = counter.value member.username = member_username member.username_lower = member_username.lower() member.password = hashlib.sha1(member_password).hexdigest() member.email = member_email.lower() member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() member.put() counter.put() counter2.put() invi.used = True invi.put() self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/' self.redirect('/') else: if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'signup.html') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'signup.html') output = template.render(path, template_values) self.response.out.write(output)
def post(self): site = GetSite() member = False browser = detect(self.request) template_values = {} template_values['site'] = site template_values['page_title'] = site.title + u' › 注册' template_values['system_version'] = SYSTEM_VERSION l10n = GetMessages(self, member, site) template_values['l10n'] = l10n errors = 0 # Verification: username member_username_error = 0 member_username_error_messages = ['', l10n.username_empty, l10n.username_too_long, l10n.username_invalid, l10n.username_taken] member_username = self.request.get('username').strip() if (len(member_username) == 0): errors = errors + 1 member_username_error = 1 else: if (len(member_username) > 32): errors = errors + 1 member_username_error = 2 else: if (re.search('^[a-zA-Z0-9\_]+$', member_username)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE username_lower = :1', member_username.lower()) if (q.count() > 0): errors = errors + 1 member_username_error = 4 else: errors = errors + 1 member_username_error = 3 template_values['member_username'] = member_username template_values['member_username_error'] = member_username_error template_values['member_username_error_message'] = member_username_error_messages[member_username_error] # Verification: password member_password_error = 0 member_password_error_messages = ['', u'请输入你的密码', u'密码长度不能超过 32 个字符' ] member_password = self.request.get('password').strip() if (len(member_password) == 0): errors = errors + 1 member_password_error = 1 else: if (len(member_password) > 32): errors = errors + 1 member_password_error = 2 template_values['member_password'] = member_password template_values['member_password_error'] = member_password_error template_values['member_password_error_message'] = member_password_error_messages[member_password_error] # Verification: email member_email_error = 0 member_email_error_messages = ['', u'请输入你的电子邮件地址', u'电子邮件地址长度不能超过 32 个字符', u'你输入的电子邮件地址不符合规则', u'抱歉这个电子邮件地址已经有人注册过了'] member_email = self.request.get('email').strip() if (len(member_email) == 0): errors = errors + 1 member_email_error = 1 else: if (len(member_email) > 32): errors = errors + 1 member_email_error = 2 else: p = re.compile(r"(?:^|\s)[-a-z0-9_.]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) if (p.search(member_email)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE email = :1', member_email.lower()) if (q.count() > 0): errors = errors + 1 member_email_error = 4 else: errors = errors + 1 member_email_error = 3 template_values['member_email'] = member_email template_values['member_email_error'] = member_email_error template_values['member_email_error_message'] = member_email_error_messages[member_email_error] # Verification: reCAPTCHA challenge = self.request.get('recaptcha_challenge_field') response = self.request.get('recaptcha_response_field') remoteip = os.environ['REMOTE_ADDR'] cResponse = captcha.submit( challenge, response, config.recaptcha_private_key, remoteip) if cResponse.is_valid: logging.info('reCAPTCHA verification passed') template_values['recaptcha_error'] = 0 else: errors = errors + 1 error = cResponse.error_code chtml = captcha.displayhtml( public_key = config.recaptcha_public_key, use_ssl = False, error = cResponse.error_code) template_values['captchahtml'] = chtml template_values['recaptcha_error'] = 1 template_values['recaptcha_error_message'] = '请重新输入 reCAPTCHA 验证码' template_values['errors'] = errors if (errors == 0): member = Member() q = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.max') if (q.count() == 1): counter = q[0] counter.value = counter.value + 1 else: counter = Counter() counter.name = 'member.max' counter.value = 1 q2 = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.total') if (q2.count() == 1): counter2 = q2[0] counter2.value = counter2.value + 1 else: counter2 = Counter() counter2.name = 'member.total' counter2.value = 1 member.num = counter.value member.username = member_username member.username_lower = member_username.lower() member.password = hashlib.sha1(member_password).hexdigest() member.email = member_email.lower() member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() member.l10n = site.l10n member.put() counter.put() counter2.put() self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/' self.redirect('/') else: if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'signup.html') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'signup.html') output = template.render(path, template_values) self.response.out.write(output)
def post(self): site = GetSite() member = False browser = detect(self.request) template_values = {} template_values["site"] = site template_values["page_title"] = site.title + u" › 注册" template_values["system_version"] = SYSTEM_VERSION l10n = GetMessages(self, member, site) template_values["l10n"] = l10n errors = 0 # Verification: username member_username_error = 0 member_username_error_messages = [ "", l10n.username_empty, l10n.username_too_long, l10n.username_invalid, l10n.username_taken, ] member_username = self.request.get("username").strip() if len(member_username) == 0: errors = errors + 1 member_username_error = 1 else: if len(member_username) > 32: errors = errors + 1 member_username_error = 2 else: if re.search("^[a-zA-Z0-9\_]+$", member_username): q = db.GqlQuery("SELECT __key__ FROM Member WHERE username_lower = :1", member_username.lower()) if q.count() > 0: errors = errors + 1 member_username_error = 4 else: errors = errors + 1 member_username_error = 3 template_values["member_username"] = member_username template_values["member_username_error"] = member_username_error template_values["member_username_error_message"] = member_username_error_messages[member_username_error] # Verification: password member_password_error = 0 member_password_error_messages = ["", u"请输入你的密码", u"密码长度不能超过 32 个字符"] member_password = self.request.get("password").strip() if len(member_password) == 0: errors = errors + 1 member_password_error = 1 else: if len(member_password) > 32: errors = errors + 1 member_password_error = 2 template_values["member_password"] = member_password template_values["member_password_error"] = member_password_error template_values["member_password_error_message"] = member_password_error_messages[member_password_error] # Verification: email member_email_error = 0 member_email_error_messages = [ "", u"请输入你的电子邮件地址", u"电子邮件地址长度不能超过 32 个字符", u"你输入的电子邮件地址不符合规则", u"抱歉这个电子邮件地址已经有人注册过了", ] member_email = self.request.get("email").strip() if len(member_email) == 0: errors = errors + 1 member_email_error = 1 else: if len(member_email) > 32: errors = errors + 1 member_email_error = 2 else: p = re.compile(r"(?:^|\s)[-a-z0-9_.]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) if p.search(member_email): q = db.GqlQuery("SELECT __key__ FROM Member WHERE email = :1", member_email.lower()) if q.count() > 0: errors = errors + 1 member_email_error = 4 else: errors = errors + 1 member_email_error = 3 template_values["member_email"] = member_email template_values["member_email_error"] = member_email_error template_values["member_email_error_message"] = member_email_error_messages[member_email_error] # Verification: invitation invitation = self.request.get("invitation").strip() q = db.GqlQuery("SELECT * FROM Invitation WHERE code = :1", invitation) if q.count() > 0: invi = q[0] logging.info("invitation code %s used." % invitation) template_values["invitation_error"] = 0 else: errors = errors + 1 template_values["invitation_error"] = 1 template_values["invitation_error_message"] = "无效的邀请码" # Verification: reCAPTCHA challenge = self.request.get("recaptcha_challenge_field") response = self.request.get("recaptcha_response_field") remoteip = os.environ["REMOTE_ADDR"] cResponse = captcha.submit(challenge, response, config.recaptcha_private_key, remoteip) if cResponse.is_valid: logging.info("reCAPTCHA verification passed") template_values["recaptcha_error"] = 0 else: errors = errors + 1 error = cResponse.error_code chtml = captcha.displayhtml( public_key=config.recaptcha_public_key, use_ssl=False, error=cResponse.error_code ) template_values["captchahtml"] = chtml template_values["recaptcha_error"] = 1 template_values["recaptcha_error_message"] = "请重新输入 reCAPTCHA 验证码" template_values["errors"] = errors if errors == 0: member = Member() q = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "member.max") if q.count() == 1: counter = q[0] counter.value = counter.value + 1 else: counter = Counter() counter.name = "member.max" counter.value = 1 q2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "member.total") if q2.count() == 1: counter2 = q2[0] counter2.value = counter2.value + 1 else: counter2 = Counter() counter2.name = "member.total" counter2.value = 1 member.num = counter.value member.username = member_username member.username_lower = member_username.lower() member.password = hashlib.sha1(member_password).hexdigest() member.email = member_email.lower() member.auth = hashlib.sha1(str(member.num) + ":" + member.password).hexdigest() member.put() counter.put() counter2.put() invi.used = True invi.put() self.response.headers["Set-Cookie"] = ( "auth=" + member.auth + "; expires=" + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + "; path=/" ) self.redirect("/") else: if browser["ios"]: path = os.path.join(os.path.dirname(__file__), "tpl", "mobile", "signup.html") else: path = os.path.join(os.path.dirname(__file__), "tpl", "desktop", "signup.html") output = template.render(path, template_values) self.response.out.write(output)
def post(self): if self.member is not None: self.abort(404) errors = 0 # Verification: username member_username_error = 0 member_username_error_messages = ['' , self.l10n.username_empty, self.l10n.username_too_long, self.l10n.username_too_short, self.l10n.username_invalid, self.l10n.username_taken] member_username = self.request.get('username').strip() # Special cases if (len(member_username) == 0): errors = errors + 1 member_username_error = 1 else: if (len(member_username) > 16): errors = errors + 1 member_username_error = 2 else: if (len(member_username) < 3): errors = errors + 1 member_username_error = 3 else: if (re.search('^[a-zA-Z0-9\_]+$', member_username)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE username_lower = :1', member_username.lower()) if (q.count() > 0): errors = errors + 1 member_username_error = 5 else: errors = errors + 1 member_username_error = 4 self.template_values['member_username'] = member_username self.template_values['member_username_error'] = member_username_error self.template_values['member_username_error_message'] = member_username_error_messages[member_username_error] # Verification: password member_password_error = 0 member_password_error_messages = ['', u'請輸入您的密碼', u'密碼長度不能超過32個字母' ] member_password = self.request.get('password').strip() if (len(member_password) == 0): errors = errors + 1 member_password_error = 1 else: if (len(member_password) > 32): errors = errors + 1 member_password_error = 2 self.template_values['member_password'] = member_password self.template_values['member_password_error'] = member_password_error self.template_values['member_password_error_message'] = member_password_error_messages[member_password_error] # Verification: email member_email_error = 0 member_email_error_messages = ['', u'請輸入您的電子郵件帳號', u'電子郵件帳號長度不能超過32的字母', u'您輸入的電子郵件帳號不符合規則', u'很抱歉, 這個電子郵件已被註冊'] member_email = self.request.get('email').strip() if (len(member_email) == 0): errors = errors + 1 member_email_error = 1 else: if (len(member_email) > 32): errors = errors + 1 member_email_error = 2 else: p = re.compile(r"(?:^|\s)[-a-z0-9_.+]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) if (p.search(member_email)): q = db.GqlQuery('SELECT __key__ FROM Member WHERE email = :1', member_email.lower()) if (q.count() > 0): errors = errors + 1 member_email_error = 4 else: errors = errors + 1 member_email_error = 3 self.template_values['member_email'] = member_email self.template_values['member_email_error'] = member_email_error self.template_values['member_email_error_message'] = member_email_error_messages[member_email_error] # Verification: reCAPTCHA challenge = self.request.get('recaptcha_challenge_field') response = self.request.get('recaptcha_response_field') try: remoteip = os.environ['REMOTE_ADDR'] except: remoteip = self.request.remote_addr cResponse = captcha.submit( challenge, response, config.recaptcha_private_key, remoteip) if cResponse.is_valid: logging.info('reCAPTCHA verification passed') self.template_values['recaptcha_error'] = 0 else: errors = errors + 1 error = cResponse.error_code chtml = captcha.displayhtml( public_key = config.recaptcha_public_key, use_ssl = False, error = cResponse.error_code) self.template_values['captchahtml'] = chtml self.template_values['recaptcha_error'] = 1 self.template_values['recaptcha_error_message'] = '請重新輸入 reCAPTCHA 驗證碼' self.template_values['errors'] = errors if (errors == 0): member = Member() q = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.max') if (q.count() == 1): counter = q[0] counter.value = counter.value + 1 else: counter = Counter() counter.name = 'member.max' counter.value = 1 q2 = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'member.total') if (q2.count() == 1): counter2 = q2[0] counter2.value = counter2.value + 1 else: counter2 = Counter() counter2.name = 'member.total' counter2.value = 1 member.num = counter.value member.username = member_username member.username_lower = member_username.lower() member.password = hashlib.sha1(member_password).hexdigest() member.email = member_email.lower() member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() member.l10n = self.site.l10n member.newbie = 1 member.noob = 0 if member.num == 1: member.level = 0 else: member.level = 1000 member.put() counter.put() counter2.put() self.response.headers['Set-Cookie'] = str('auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/') memcache.delete('member_total') self.redirect('/') else: self.finalize(template_name='signup')