Skip to content

Commit 2b3ad7b

Browse files
committed
first real commit
1 parent db6181b commit 2b3ad7b

12 files changed

+816
-0
lines changed

app.yaml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
application: yammerfall
2+
version: 1-3
3+
runtime: python
4+
api_version: 1
5+
6+
handlers:
7+
- url: /styles
8+
static_dir: static/styles
9+
10+
- url: /images
11+
static_dir: static/images
12+
13+
- url: /js
14+
static_dir: static/js
15+
16+
- url: .*
17+
script: main.py

index.yaml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
indexes:
2+
3+
# AUTOGENERATED
4+
5+
# This index.yaml is automatically updated whenever the dev_appserver
6+
# detects that a new type of query is run. If you want to manage the
7+
# index.yaml file manually, remove the above marker line (the line
8+
# saying "# AUTOGENERATED"). If you want to manage some indexes
9+
# manually, move them above the marker line. The index.yaml file is
10+
# automatically uploaded to the admin console when you next deploy
11+
# your application using appcfg.py.

main.py

+192
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
#!/usr/bin/env python
2+
3+
import os
4+
import logging
5+
import urllib
6+
from time import time
7+
from random import getrandbits
8+
from google.appengine.api import urlfetch
9+
from google.appengine.ext.webapp import RequestHandler, WSGIApplication, template, wsgiref
10+
from django.utils import simplejson
11+
12+
from yammerConfig import CONSUMER_KEY, CONSUMER_SECRET
13+
14+
REQUEST_TOKEN_URL = 'https://www.yammer.com/oauth/request_token'
15+
ACCESS_TOKEN_URL = 'https://www.yammer.com/oauth/access_token'
16+
USER_AUTH_URL = 'https://www.yammer.com/oauth/authorize'
17+
DEFAULT_API_PREFIX = 'https://www.yammer.com/api/v1/'
18+
DEFAULT_API_SUFFIX = '.json'
19+
20+
HEADERS = {
21+
'Content-Type': 'application/x-www-form-urlencoded',
22+
'Accept': '*/*',
23+
'Accept-Language': 'en-us',
24+
'Accept-Encoding': 'gzip, deflate',
25+
'Connection': 'keep-alive',
26+
}
27+
28+
def getOAuthHeaders(token=None, token_secret='', verifier=None):
29+
OAuthHeaders = 'OAuth realm=""'
30+
OAuthHeaders += ', oauth_consumer_key="%s"' % CONSUMER_KEY
31+
32+
if token:
33+
OAuthHeaders += ', oauth_token="%s"' % token
34+
35+
OAuthHeaders += ', oauth_signature_method="PLAINTEXT"'
36+
OAuthHeaders += ', oauth_signature="%s%%26%s"' % (CONSUMER_SECRET, token_secret)
37+
currentTime = int(time())
38+
OAuthHeaders += ', oauth_timestamp="%s"' % currentTime
39+
OAuthHeaders += ', oauth_nonce="%s"' % currentTime
40+
41+
if verifier:
42+
OAuthHeaders += ', oauth_verifier="%s"' % verifier
43+
44+
OAuthHeaders += ', oauth_version="1.0"'
45+
return str(OAuthHeaders)
46+
47+
class MainHandler(RequestHandler):
48+
49+
def get_cookie(self):
50+
return self.request.cookies.get('oauth.yammerfall', '')
51+
52+
def set_cookie(self, value, path='/'):
53+
self.response.headers.add_header(
54+
'Set-Cookie',
55+
'%s=%s; path=%s; expires="Fri, 31-Dec-2021 23:59:59 GMT"' %
56+
('oauth.yammerfall', value, path)
57+
)
58+
59+
def expire_cookie(self, path='/'):
60+
self.response.headers.add_header(
61+
'Set-Cookie',
62+
'%s=; path=%s; expires="Fri, 31-Dec-1999 23:59:59 GMT"' %
63+
('oauth.yammerfall', path)
64+
)
65+
66+
def get(self):
67+
68+
if self.request.get('expire_cookie', None) == 'now':
69+
logging.debug('EXPIRING COOKIE')
70+
self.expire_cookie()
71+
self.redirect('/')
72+
return
73+
74+
if self.get_cookie():
75+
logging.debug('GOT COOKIE! %s' % self.get_cookie())
76+
template_values = {
77+
'messagesUrl': '/messages?%s' % self.get_cookie(),
78+
}
79+
path = os.path.join(os.path.dirname(__file__), "templates/home.html")
80+
self.response.out.write(template.render(path, template_values))
81+
return
82+
83+
logging.debug('NO COOKIE!')
84+
85+
HEADERS['Authorization'] = getOAuthHeaders()
86+
result = urlfetch.fetch(
87+
url=REQUEST_TOKEN_URL,
88+
payload='',
89+
method=urlfetch.POST,
90+
headers=HEADERS,
91+
)
92+
93+
data = {}
94+
for nv in result.content.split('&'):
95+
(n, v) = nv.split('=')
96+
data[n] = v
97+
98+
template_values = {
99+
'user_auth_url': USER_AUTH_URL,
100+
'oauth_token': data['oauth_token'],
101+
'oauth_token_secret': data['oauth_token_secret'],
102+
}
103+
path = os.path.join(os.path.dirname(__file__), "templates/login.html")
104+
self.response.out.write(template.render(path, template_values))
105+
return
106+
107+
108+
109+
def post(self):
110+
111+
logging.debug('AUTHORIZE WITH VERIFY CODE: %s' % self.request.get('oauth_verifier'))
112+
113+
HEADERS['Authorization'] = getOAuthHeaders(
114+
token = self.request.get('oauth_token'),
115+
token_secret = self.request.get('oauth_token_secret'),
116+
verifier = self.request.get('oauth_verifier'))
117+
118+
result = urlfetch.fetch(
119+
url=ACCESS_TOKEN_URL,
120+
method=urlfetch.POST,
121+
headers=HEADERS,
122+
)
123+
124+
logging.debug('AUTHORIZED: %s' % result.content)
125+
126+
self.set_cookie(result.content)
127+
self.redirect('/')
128+
129+
130+
class MessagesHandler(RequestHandler):
131+
def get(self):
132+
133+
HEADERS['Authorization'] = getOAuthHeaders(
134+
token = self.request.get('oauth_token'),
135+
token_secret = self.request.get('oauth_token_secret'))
136+
MSGS_URL = '%smessages%s' % (DEFAULT_API_PREFIX, DEFAULT_API_SUFFIX)
137+
138+
result = urlfetch.fetch(
139+
url=MSGS_URL,
140+
method=urlfetch.GET,
141+
headers=HEADERS,
142+
)
143+
144+
data = simplejson.loads(result.content)
145+
146+
#self.response.out.write(data)
147+
148+
users = {}
149+
ref_msgs = {}
150+
for r in data['references']:
151+
if r['type'] == 'user':
152+
users[r['id']] = r
153+
users[r['name']] = r
154+
elif r['type'] == 'message':
155+
ref_msgs[r['id']] = r
156+
157+
for m in data['messages']:
158+
m['mugshot_url'] = users[m['sender_id']]['mugshot_url']
159+
m['full_name'] = users[m['sender_id']]['full_name']
160+
m['like_list'] = []
161+
if m['liked_by']['count'] > 0:
162+
for liked_by_name in m['liked_by']['names']:
163+
try:
164+
m['like_list'].append((liked_by_name['full_name'], users[liked_by_name['permalink']]['mugshot_url']))
165+
except:
166+
pass
167+
if m['replied_to_id']:
168+
in_reply_to = users[ref_msgs[m['replied_to_id']]['sender_id']]
169+
m['in_reply_to'] = (in_reply_to['full_name'], in_reply_to['mugshot_url'])
170+
171+
template_values = {
172+
'messages' : data['messages'],
173+
}
174+
path = os.path.join(os.path.dirname(__file__), "templates/messagelist.html")
175+
self.response.out.write(template.render(path, template_values))
176+
177+
178+
# ------------------------------------------------------------------------------
179+
# self runner -- gae cached main() function
180+
# ------------------------------------------------------------------------------
181+
182+
def main():
183+
logging.getLogger().setLevel(logging.DEBUG)
184+
application = WSGIApplication([
185+
('/', MainHandler),
186+
('/messages', MessagesHandler),
187+
], debug=True)
188+
189+
wsgiref.handlers.CGIHandler().run(application)
190+
191+
if __name__ == '__main__':
192+
main()

0 commit comments

Comments
 (0)