示例#1
0
    def handle_object(self, obj):

        if type(obj) == dict and len(obj.keys()) == 1 and obj.has_key('_ref'):

            L.info("ReferenceFetcher: Attempting to fetch %r" % obj)

            url = obj['_ref']
            if url.strip() == '':
                return None

            data = None
            try:
                data = internal_find(url, follow=False, lang=self.token.lang)
                if data != None:
                    return data
            except Exception:
                L.exception("ReferenceFetcher: Failed to fetch %r" % obj)

        elif type(obj) == dict:
            return dict([(k, self.handle_object(v))
                         for k, v in obj.iteritems()])

        elif type(obj) == list:
            return [self.handle_object(el) for el in obj]

        return obj
示例#2
0
def noslug(path):
    L.info("dbserver::noslug::%s:%s, %s" % (request.method, path, request.url))
    response, content_type, headers = process(path, None)
    L.info("%s %s %s" % (snip(response), content_type, headers))
    return Response(response=response,
                    content_type=content_type,
                    headers=headers)
示例#3
0
    def handle_object(self,obj):
        
        if type(obj) == dict and len(obj.keys())==1 and obj.has_key('_ref'):
            
            L.info("ReferenceFetcher: Attempting to fetch %r" % obj)
            
            url = obj['_ref']
            if url.strip() == '':
                return None
            
            data = None
            try:
                data = internal_find(url,follow=False,lang=self.token.lang)
                if data != None:
                    return data
            except Exception:
                L.exception("ReferenceFetcher: Failed to fetch %r" % obj)
            
        elif type(obj) == dict:
            return dict([ (k,self.handle_object(v)) for k,v in obj.iteritems()])

        elif type(obj) == list:
            return [ self.handle_object(el) for el in obj]
        
        return obj
示例#4
0
 def get(self):
     def get_data(rec):
         x = rec.get(self.DATA_EL,{})
         x[self.SOURCE_EL] = "%s/%s" % (rec[self.META_EL][self.PATH_EL], rec[self.META_EL][self.ID_EL])
         x[self.SOURCE_SLUG_EL] = x[self.SOURCE_EL].replace('/','__')
         return x
     
     if self.token.slug != None:
         rec = g.db.find_one( {self.META_PATH : self.token.path,
                               self.META_ID   : self.token.slug } )
         if rec != None:
             ret = get_data(rec)
         else:
             ret = None
         self.token.response = ret
     else:
         if self.query != None:
             self.query.update({self.META_PATH : self.token.path })
         else:
             self.query = {self.META_PATH : self.token.path }
         L.debug("DBOperation:: find using query=%r" % self.query)
         if self.count == 0:
             recs = g.db.find(self.query,fields=self.fields,limit=self.limit,start=self.start)
             recs = [ get_data(rec) for rec in recs ]
             ret = recs
         else:
             ret = g.db.count(self.query,fields=self.fields,limit=self.limit,start=self.start)
         self.token.response = ret
示例#5
0
    def get(self):
        def get_data(rec):
            x = rec.get(self.DATA_EL, {})
            x[self.SOURCE_EL] = "%s/%s" % (rec[self.META_EL][self.PATH_EL], rec[self.META_EL][self.ID_EL])
            x[self.SOURCE_SLUG_EL] = x[self.SOURCE_EL].replace("/", "__")
            return x

        if self.token.slug != None:
            rec = g.db.find_one({self.META_PATH: self.token.path, self.META_ID: self.token.slug})
            if rec != None:
                ret = get_data(rec)
            else:
                ret = None
            self.token.response = ret
        else:
            if self.query != None:
                self.query.update({self.META_PATH: self.token.path})
            else:
                self.query = {self.META_PATH: self.token.path}
            L.debug("DBOperation:: find using query=%r" % self.query)
            if self.count == 0:
                recs = g.db.find(self.query, fields=self.fields, limit=self.limit, start=self.start)
                recs = [get_data(rec) for rec in recs]
                ret = recs
            else:
                ret = g.db.count(self.query, fields=self.fields, limit=self.limit, start=self.start)
            self.token.response = ret
示例#6
0
 def process(self):
     data = json.dumps(self.token.response)
     if self.token.request.method == "GET":
         if data != 'null':
             L.info("CacheSetter: storing in %s <== %s" %
                    (self.token.cache_key, snip(str(data))))
             store_in_cache(self.token.cache_key, data)
示例#7
0
def slug(path, slug):
    L.info("dbserver::slug::%s:%s, %s, %s" %
           (request.method, path, slug, request.url))
    response, content_type, headers = process(path, slug)
    return Response(response=response,
                    content_type=content_type,
                    headers=headers)
示例#8
0
 def process(self):
     data = json.dumps(self.token.response)
     if data != 'null':
         L.info("CacheSetter: storing in %s <== %s" %
                (self.token.cache_key, snip(str(data))))
         store_in_cache(
             self.token.cache_key.encode('utf8').encode('hex'),
             data.encode('utf8').encode('hex'))
示例#9
0
 def process(self):
     
     if self.token.request.method in ['PUT', 'POST' ]:
         try:
             self.token.data = json.loads(self.token.data)
         except:
             self.token.data = dict( [ (k,v) for k,v in self.token.request.form.iteritems() ] )
         L.debug("DataLoader:: data=%r" % self.token.data)
示例#10
0
    def process(self):
        self.token.cache_key = json.dumps(self.token.path) + '|' + json.dumps(self.token.slug) + '|' + '|'.join([ self.token.request.args.get(arg,'') for arg in self.ARGS_FOR_KEY ])
        if self.token.request.args.get('hitcache',"1") == "0":
            L.info("Skipping cache as requested for %s/%s" % (self.token.path,self.token.slug))
            return 

        data = hit_cache(self.token.cache_key.encode('utf8').encode('hex'))
        L.info("Data for key %s == %s" % (self.token.cache_key,snip(repr(data))))
        if data != None:
            self.token.response = json.loads(data.decode('hex').decode('utf8'))
            self.should_stop = True
            self.skip_to = "DataFormatter"
示例#11
0
def create_or_login(resp):
    session['openid'] = resp.identity_url
    openid_key = urllib.quote(urllib.quote(session['openid'],safe=''))
    user = internal_find('/data/admin/users/%s' % openid_key)
    if user != None:
        L.info(u'Successfully signed in fullname=%s, email=%s (%r)' % (resp.fullname, resp.email, resp.__dict__))
    else:
        data = { "fullname"     : resp.fullname,
                 "email"        : resp.email,
                 "key"          : openid_key }
        user = internal_save('/data/admin/users/%s' % openid_key, data)
        L.info(u'Successfully created fullname=%s, email=%s (%r)' % (resp.fullname, resp.email, resp.__dict__))
    g.user = user        
    return redirect(oid.get_next_url())
 def validate_api(self,api_key):
     try:
         L.info('PermissionChecker:: api_key = %s' % api_key)
         api_key = api_key.decode('base64')
         api_key = json.loads(api_key)
         app = api_key['a']
         referrer = api_key['r']
         request_referrer = self.token.request.referrer
         request_referrer = urlparse.urlparse(request_referrer).netloc
         L.info('PermissionChecker:: app = %s, referrer = %s, req.referrer = %s' % (app, referrer, request_referrer))
         assert( referrer == request_referrer )
         secret = api_key['s']
         assert( secret == md5().update("%s:%s:p4tpp" % (app,referrer)).hexdigest()[:8] )
         self.app = "%s@%s" % (app,referrer)
     except:
         return False 
示例#13
0
def internal_find(url,follow=True,lang=None,query=None,apikey=None,fields=None):
    params = { 'o' : 'json',
               'limit' : 0 }
    params['follow'] = "yes" if follow else "no"
    if lang:    params['lang'] = lang
    if query:   params['query'] = json.dumps(query)
    if apikey:  params['apikey'] = apikey
    if fields:  params['fields'] = json.dumps(fields)
    L.info("internal_find: Attempting to fetch %s with %s" % (url,params))
    
    params = urlencode(params)
    url += "?" + params
    data = g.app.test_client().get(url).data
    data = json.loads(data)

    return data
示例#14
0
def create_or_login(resp):
    session['openid'] = resp.identity_url
    openid_key = urllib.quote(urllib.quote(session['openid'], safe=''))
    user = internal_find('/data/admin/users/%s' % openid_key)
    if user != None:
        L.info(u'Successfully signed in fullname=%s, email=%s (%r)' %
               (resp.fullname, resp.email, resp.__dict__))
    else:
        data = {
            "fullname": resp.fullname,
            "email": resp.email,
            "key": openid_key
        }
        user = internal_save('/data/admin/users/%s' % openid_key, data)
        L.info(u'Successfully created fullname=%s, email=%s (%r)' %
               (resp.fullname, resp.email, resp.__dict__))
    g.user = user
    return redirect(oid.get_next_url())
示例#15
0
    def process(self):
        self.token.cache_key = json.dumps(self.token.path) + '|' + json.dumps(
            self.token.slug) + '|' + '|'.join([
                self.token.request.args.get(arg, '')
                for arg in self.ARGS_FOR_KEY
            ])
        if self.token.request.args.get('hitcache', "1") == "0":
            L.info("Skipping cache as requested for %s/%s" %
                   (self.token.path, self.token.slug))
            return

        data = hit_cache(self.token.cache_key.encode('utf8').encode('hex'))
        L.info("Data for key %s == %s" %
               (self.token.cache_key, snip(repr(data))))
        if data != None:
            self.token.response = json.loads(data.decode('hex').decode('utf8'))
            self.should_stop = True
            self.skip_to = "DataFormatter"
 def validate_api(self, api_key):
     try:
         L.info('PermissionChecker:: api_key = %s' % api_key)
         api_key = api_key.decode('base64')
         api_key = json.loads(api_key)
         app = api_key['a']
         referrer = api_key['r']
         request_referrer = self.token.request.referrer
         request_referrer = urlparse.urlparse(request_referrer).netloc
         L.info(
             'PermissionChecker:: app = %s, referrer = %s, req.referrer = %s'
             % (app, referrer, request_referrer))
         assert (referrer == request_referrer)
         secret = api_key['s']
         assert (secret == md5().update("%s:%s:p4tpp" %
                                        (app, referrer)).hexdigest()[:8])
         self.app = "%s@%s" % (app, referrer)
     except:
         return False
示例#17
0
    def post(self):
        try:
            rec = g.db.find_one({self.META_PATH: self.token.path, self.META_ID: self.token.slug})

            if rec == None:
                g.db.save(
                    {
                        self.META_EL: {self.PATH_EL: self.token.path, self.ID_EL: self.token.slug},
                        self.DATA_EL: self.token.data,
                    }
                )
            else:
                rec[self.DATA_EL] = self.token.data
                g.db.save(rec)

            self.token.response = True
        except:
            L.exception("db_op::post")
            self.token.response = False
示例#18
0
 def post(self):
     if self.token.slug == None:
         self.token.slug = uuid.uuid4()
     try:
         rec = g.db.find_one({self.META_PATH : self.token.path,
                              self.META_ID   : self.token.slug })
         
         if rec == None:
             g.db.save( { self.META_EL : { self.PATH_EL : self.token.path,
                                           self.ID_EL   : self.token.slug },
                          self.DATA_EL : self.token.data })
         else:
             rec[self.DATA_EL] = self.token.data
             g.db.save(rec)
             
         self.token.response = True, self.token.path, self.token.slug
     except:
         L.exception('db_op::post')
         self.token.response = False
示例#19
0
def internal_find(url,
                  follow=True,
                  lang=None,
                  query=None,
                  apikey=None,
                  fields=None):
    params = {'o': 'json', 'limit': 0}
    params['follow'] = "yes" if follow else "no"
    if lang: params['lang'] = lang
    if query: params['query'] = json.dumps(query)
    if apikey: params['apikey'] = apikey
    if fields: params['fields'] = json.dumps(fields)
    L.info("internal_find: Attempting to fetch %s with %s" % (url, params))

    params = urlencode(params)
    url += "?" + params
    data = g.app.test_client().get(url).data
    data = json.loads(data)

    return data
示例#20
0
 def process(self):
     self.token.cache_key = json.dumps(self.token.path) + '|' + json.dumps(
         self.token.slug) + '|' + '|'.join([
             self.token.request.args.get(arg, '')
             for arg in self.ARGS_FOR_KEY
         ])
     if self.token.request.args.get('hitcache', "1") == "0":
         L.info("Skipping cache as requested for %s/%s" %
                (self.token.path, self.token.slug))
         return
     if self.token.request.method == "GET":
         data = hit_cache(self.token.cache_key)
         L.info("Data for key %s == %s" %
                (self.token.cache_key, snip(repr(data))))
         if data != None:
             self.token.response = json.loads(data)
             self.should_stop = True
             self.skip_to = "DataFormatter"
     else:
         clear_cache(self.token.cache_key)
         clear_cache_for_path(self.token.path)
 def process(self):
     self.token.cache_key = (
         json.dumps(self.token.path)
         + "|"
         + json.dumps(self.token.slug)
         + "|"
         + "|".join([self.token.request.args.get(arg, "") for arg in self.ARGS_FOR_KEY])
     )
     if self.token.request.args.get("hitcache", "1") == "0":
         L.info("Skipping cache as requested for %s/%s" % (self.token.path, self.token.slug))
         return
     if self.token.request.method == "GET":
         data = hit_cache(self.token.cache_key)
         L.info("Data for key %s == %s" % (self.token.cache_key, snip(repr(data))))
         if data != None:
             self.token.response = json.loads(data)
             self.should_stop = True
             self.skip_to = "DataFormatter"
     else:
         clear_cache(self.token.cache_key)
         clear_cache_for_path(self.token.path)
示例#22
0
    def process(self):

        method = self.token.request.method

        self.query = self.token.request.args.get("query", "{}")
        self.query = json.loads(self.query)
        self.query = dict([("%s.%s" % (self.DATA_EL, k), v) for k, v in self.query.iteritems()])

        self.order = self.token.request.args.get("order", "[]")
        self.order = json.loads(self.order)
        self.order = [("%s.%s" % (self.DATA_EL, k), v) for k, v in self.order]

        self.start = self.token.request.args.get("start", 0)
        self.start = int(self.start)

        self.limit = self.token.request.args.get("limit", 1000)
        self.limit = int(self.limit)
        if self.limit == 0:
            self.limit = None

        self.fields = self.token.request.args.get("fields")
        if self.fields != None:
            self.fields = json.loads(self.fields)
            self.fields = ["%s.%s" % (self.DATA_EL, k) for k in self.fields]
            self.fields.append(self.META_EL)

        self.count = self.token.request.args.get("count", 0)
        self.count = int(self.count)

        L.debug("DBOperation:: method=%r" % method)
        L.debug("DBOperation:: path=%r slug=%r data=%r" % (self.token.path, self.token.slug, self.token.data))
        if method in ["GET", "PUT", "POST", "DELETE"]:
            getattr(self, method.lower())()
        L.debug("DBOperation:: result=%s" % snip(repr(self.token.response)))
示例#23
0
    def process(self):
        
        method = self.token.request.method

        self.query = self.token.request.args.get('query',"{}")
        self.query = json.loads(self.query)
        self.query=dict([("%s.%s" % (self.DATA_EL,k),v) for k,v in self.query.iteritems()])

        self.order = self.token.request.args.get('order',"[]")
        self.order = json.loads(self.order)
        self.order=[("%s.%s" % (self.DATA_EL,k),v) for k,v in self.order]

        self.start = self.token.request.args.get('start',0)
        self.start = int(self.start)
        
        self.limit = self.token.request.args.get('limit',1000)
        self.limit = int(self.limit)
        if self.limit == 0:
            self.limit = None

        self.fields = self.token.request.args.get('fields')
        if self.fields != None:
            self.fields = json.loads(self.fields)
            self.fields =[ "%s.%s" % (self.DATA_EL,k) for k in self.fields]
            self.fields.append(self.META_EL)

        self.count = self.token.request.args.get('count',0)
        self.count = int(self.count)

        L.debug("DBOperation:: method=%r" % method)
        L.debug("DBOperation:: path=%r slug=%r data=%r" % (self.token.path, self.token.slug, self.token.data))
        if method in ['GET', 'PUT', 'POST', 'DELETE']:
            getattr(self,method.lower())()
        L.debug("DBOperation:: result=%s" % snip(repr(self.token.response)))
    def process(self):

        method = self.token.request.method

        self.should_stop = False

        self.app = self.token.request.args.get('apikey', None)
        if self.app != None:
            if self.app == "admin":
                return

            if not self.validate_api(self.app):
                return

        self.user = None  ## TODO: '''<<getuser>>'''

        if self.token.slug != None:
            fullpath = os.path.join(self.token.path, self.token.slug)
        else:
            fullpath = self.token.path
        L.debug("PermissionChecker: full_path=%r" % fullpath)
        fullpath = fullpath.split('/')
        L.debug("PermissionChecker: full_path=%r" % fullpath)

        perms = set()

        for i in range(len(fullpath)):
            partial_path = fullpath[0:i + 1]
            L.debug("PermissionChecker: partial_path=%r" % partial_path)
            spec = json.dumps({"ref": "/" + "/".join(partial_path)})
            data = internal_find('/data/admin/permissions/',
                                 query=spec,
                                 apikey='admin')
            for rec in data:
                auth = rec.get('auth')
                if self.match_auth(auth):
                    perms.update(set(rec.get('perms', set())))
                    L.info("PermissionChecker: rule %s, perms=%r" %
                           (rec.get('_src'), set(rec.get('perms', set()))))

        if ((method == "POST" and "new" in perms)
                or (method == "DELETE" and "delete" in perms)
                or (method == "PUT" and "edit" in perms)
                or (method == "GET" and "read" in perms)):
            pass
        else:
            self.should_stop = True
    def process(self):
        
        method = self.token.request.method
        
        self.should_stop = False 

        self.app = self.token.request.args.get('apikey',None)
        if self.app != None:
            if self.app == "admin":
                return
            
            if not self.validate_api(self.app):
                return

        self.user = None ## TODO: '''<<getuser>>'''


        if self.token.slug != None:
            fullpath = os.path.join(self.token.path, self.token.slug)
        else:
            fullpath = self.token.path
        L.debug("PermissionChecker: full_path=%r" % fullpath)
        fullpath = fullpath.split('/')
        L.debug("PermissionChecker: full_path=%r" % fullpath)
        
        perms = set()
        
        for i in range(len(fullpath)):
            partial_path = fullpath[0:i+1]
            L.debug("PermissionChecker: partial_path=%r" % partial_path)
            spec = json.dumps({ "ref" : "/" + "/".join(partial_path) })
            data = internal_find('/data/admin/permissions/',query=spec,apikey='admin')
            for rec in data:
                auth = rec.get('auth')
                if self.match_auth(auth):
                    perms.update(set(rec.get('perms',set())))
                    L.info("PermissionChecker: rule %s, perms=%r" % (rec.get('_src'),set(rec.get('perms',set()))))
        
        if ( (method == "POST"   and "new"    in perms) or
             (method == "DELETE" and "delete" in perms) or
             (method == "PUT"    and "edit"   in perms) or
             (method == "GET"    and "read"   in perms) ):
            pass
        else:
            self.should_stop = True
示例#26
0
 def process(self):
     
     for emitter in EMITTERS:
         E = Emitter.get_emitter(emitter)
         e = E(self.token)
         if e.condition():
             L.debug("DataFormatter:: using emitter %s" % emitter)
             e.format()
             break
     else:
         emitter = "HtmlFormatter"
         E = Emitter.get_emitter(emitter)
         e = E(self.token)
         L.debug("DataFormatter:: using default emitter %s" % emitter)
         e.format()
     L.debug("DataFormatter:: token.response=%s (%s)" % (snip(repr(self.token.response)),self.token.content_type))
示例#27
0
    def process(self):

        for emitter in EMITTERS:
            E = Emitter.get_emitter(emitter)
            e = E(self.token)
            if e.condition():
                L.debug("DataFormatter:: using emitter %s" % emitter)
                e.format()
                break
        else:
            emitter = "HtmlFormatter"
            E = Emitter.get_emitter(emitter)
            e = E(self.token)
            L.debug("DataFormatter:: using default emitter %s" % emitter)
            e.format()
        L.debug("DataFormatter:: token.response=%s (%s)" %
                (snip(repr(self.token.response)), self.token.content_type))
示例#28
0
 def process(self):
     data = json.dumps(self.token.response)
     if self.token.request.method == "GET":
         if data != 'null':
             L.info("CacheSetter: storing in %s <== %s" % (self.token.cache_key,snip(str(data))))
             store_in_cache(self.token.cache_key,data)
示例#29
0
def logout():
    session.pop('openid', None)
    L.info(u'You have been signed out')
    return redirect(oid.get_next_url())
示例#30
0
def logout():
    session.pop('openid', None)
    L.info(u'You have been signed out')
    return redirect(oid.get_next_url())
示例#31
0
def slug(path,slug):
    L.info("dbserver::slug::%s:%s, %s, %s" % (request.method,path,slug,request.url))
    response, content_type, headers = process(path,slug)
    return Response(response=response, content_type=content_type, headers=headers)
示例#32
0
def noslug(path):
    L.info("dbserver::noslug::%s:%s, %s" % (request.method,path,request.url))
    response, content_type, headers = process(path,None)
    L.info("%s %s %s" % (snip(response), content_type, headers))
    return Response(response=response, content_type=content_type, headers=headers)
示例#33
0
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "openid_db.settings"

from gevent import monkey
monkey.patch_all()
from gevent.pywsgi import WSGIServer
from dbserver import app
from log import L

L.info("Listening on 5555")
http_server = WSGIServer(('', 5555), app)
http_server.serve_forever()
示例#34
0
import os
os.environ["DJANGO_SETTINGS_MODULE"]="openid_db.settings"

from gevent import monkey; monkey.patch_all()
from gevent.pywsgi import WSGIServer
from dbserver import app
from log import L

L.info("Listening on 5555")
http_server = WSGIServer(('', 5555), app)
http_server.serve_forever()
示例#35
0
    def process(self):
        data = json.dumps(self.token.response)
	if data != 'null':
            L.info("CacheSetter: storing in %s <== %s" % (self.token.cache_key,snip(str(data))))
            store_in_cache(self.token.cache_key.encode('utf8').encode('hex'),data.encode('utf8').encode('hex'))