OLD | NEW |
| (Empty) |
1 """ | |
2 Copyright (c) 2011 The Native Client Authors. All rights reserved. | |
3 Use of this source code is governed by a BSD-style license that can be | |
4 found in the LICENSE file. | |
5 """ | |
6 | |
7 import cgi | |
8 import datetime | |
9 import urllib | |
10 import wsgiref.handlers | |
11 import os | |
12 import logging | |
13 | |
14 from google.appengine.ext import db | |
15 from google.appengine.api import users | |
16 from google.appengine.ext import webapp | |
17 from google.appengine.ext.webapp.util import run_wsgi_app | |
18 from google.appengine.ext.webapp import template | |
19 from google.appengine.ext.webapp import Request | |
20 from google.appengine.ext.db import Key | |
21 | |
22 | |
23 """ | |
24 This script is an example server backend for use with the App Engine | |
25 mount type in nacl-mounts. | |
26 """ | |
27 | |
28 | |
29 class File(db.Model): | |
30 owner = db.UserProperty() | |
31 filename = db.StringProperty() | |
32 data = db.BlobProperty() | |
33 | |
34 | |
35 class MainPage(webapp.RequestHandler): | |
36 def get(self): | |
37 # Require the user to login. | |
38 user = users.get_current_user() | |
39 if not user: | |
40 self.redirect(users.create_login_url(self.request.uri)) | |
41 return | |
42 | |
43 template_values = { | |
44 } | |
45 path = os.path.join(os.path.dirname(__file__), 'index.html') | |
46 self.response.out.write(template.render(path, template_values)) | |
47 | |
48 | |
49 def FileKey(filename, user): | |
50 if not user: | |
51 u_id = -1 | |
52 else: | |
53 u_id = user.user_id() | |
54 return Key.from_path('File', '%s_%s' % (filename, u_id)) | |
55 | |
56 | |
57 class FileHandlingPage(webapp.RequestHandler): | |
58 def post(self): | |
59 user = users.get_current_user() | |
60 | |
61 split = self.request.path.rsplit('/', 1) | |
62 assert (len(split) > 1) | |
63 method = split[1] | |
64 | |
65 self.response.headers['Content-Type'] = 'application/octet-stream' | |
66 | |
67 if method == 'read': | |
68 filename = self.request.get(u'filename') | |
69 assert filename | |
70 k = FileKey(filename, user) | |
71 f = File.get(k) | |
72 if f: | |
73 self.response.out.write(f.data) | |
74 self.response.out.write('1') | |
75 else: | |
76 self.response.out.write('0') | |
77 | |
78 elif method == 'write': | |
79 self.response.out.write('1') | |
80 data = self.request.get(u'data') | |
81 filename = self.request.get(u'filename') | |
82 assert filename | |
83 assert data | |
84 def create_or_update(filename, data, owner): | |
85 k = FileKey(filename, user) | |
86 f = File.get(k) | |
87 if not f: | |
88 f = File(key=k) | |
89 f.owner = owner | |
90 f.filename = filename | |
91 f.data = data | |
92 return f | |
93 | |
94 f = db.run_in_transaction(create_or_update, filename, data, user) | |
95 | |
96 def db_put(file): | |
97 f.put() | |
98 | |
99 db.run_in_transaction(db_put, f) | |
100 | |
101 elif method == 'list': | |
102 prefix = self.request.get(u'prefix') | |
103 assert prefix | |
104 # First make sure that the file is there | |
105 k = FileKey(prefix, user) | |
106 f = File.get(k) | |
107 if not f: | |
108 return | |
109 q = File.all() | |
110 q.filter('owner =', user) | |
111 q.filter('filename >', prefix) | |
112 q.filter('filename <', prefix + u'ffff') | |
113 prefixslash = prefix | |
114 if prefixslash[-1] != '/': | |
115 prefixslash += '/' | |
116 depth = len(prefixslash.split('/')) | |
117 results = q.fetch(limit=100) | |
118 for r in results: | |
119 # make sure the file is directly under prefixslash | |
120 if len(r.filename.split('/')) != depth: | |
121 continue | |
122 self.response.out.write('%s\n' % r.filename) | |
123 | |
124 elif method == 'remove': | |
125 filename = self.request.get(u'filename') | |
126 assert filename | |
127 k = FileKey(filename, user) | |
128 try: | |
129 db.delete(k) | |
130 self.response.out.write('1') | |
131 except: | |
132 self.response.out.write('0') | |
133 return | |
134 | |
135 else: | |
136 assert False | |
137 | |
138 | |
139 application = webapp.WSGIApplication([ | |
140 ('/', MainPage), | |
141 ('/_file/.*', FileHandlingPage), | |
142 | |
143 ], debug=True) | |
144 | |
145 | |
146 def main(): | |
147 run_wsgi_app(application) | |
148 | |
149 | |
150 if __name__ == '__main__': | |
151 main() | |
OLD | NEW |