Skip to content

Commit

Permalink
Merging #1.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kit Cambridge committed Jul 1, 2015
2 parents ab6754c + b10c62f commit f2d8242
Show file tree
Hide file tree
Showing 28 changed files with 1,530 additions and 849 deletions.
373 changes: 373 additions & 0 deletions LICENSE

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -25,4 +25,4 @@ The server depends on the Python [cryptography](https://cryptography.io/en/lates

## License

MPL.
MPL2.
63 changes: 63 additions & 0 deletions development.ini
@@ -0,0 +1,63 @@
###
# app configuration
# http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/environment.html
###

[app:main]
use = egg:devmgr

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
pyramid.includes =
pyramid_debugtoolbar

# By default, the toolbar only appears for clients from IP addresses
# '127.0.0.1' and '::1'.
# debugtoolbar.hosts = 127.0.0.1 ::1

db_uri = sqlite:////tmp/devmgr.db
oauth_server_url = http://127.0.0.1:9010

###
# wsgi server configuration
###

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

###
# logging configuration
# http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/logging.html
###

[loggers]
keys = root, devmgr

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_devmgr]
level = DEBUG
handlers =
qualname = devmgr

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
5 changes: 1 addition & 4 deletions devmgr/__init__.py
@@ -1,4 +1 @@
import logging

__version__ = '0.0.1'
log = logging.getLogger('devmgr')
__version__ = '0.1'
54 changes: 54 additions & 0 deletions devmgr/app.py
@@ -0,0 +1,54 @@
import fxa.oauth
import pyramid.renderers
from pyramid.authorization import ACLAuthorizationPolicy
from pyramid.config import Configurator
from pyramid.events import NewRequest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

from devmgr.db import Base
from devmgr.resources import make_root
from devmgr.security import DevMgrAuthenticationPolicy, verify_auth


def db(request):
maker = request.registry.dbmaker
session = maker()

def cleanup(request):
if request.exception is not None:
session.rollback()
else:
session.commit()
session.close()
request.add_finished_callback(cleanup)
return session


def make_app(global_config, db_uri="sqlite:////tmp/devmgr.db", **settings):
# Security policies
authentication_policy = DevMgrAuthenticationPolicy()
authorization_policy = ACLAuthorizationPolicy()

config = Configurator(
settings=settings,
root_factory=make_root,
authentication_policy=authentication_policy,
authorization_policy=authorization_policy,
)
config.add_subscriber(verify_auth, NewRequest)
config.add_request_method(db, reify=True)

config.registry.fxa_oauth = fxa.oauth.Client(
server_url=settings["oauth_server_url"],
)

db_engine = create_engine(db_uri)
session_factory = sessionmaker(bind=db_engine)
config.registry.dbmaker = scoped_session(session_factory)
Base.metadata.create_all(db_engine)

json_renderer = pyramid.renderers.JSON()
config.add_renderer(None, json_renderer)
config.include('devmgr.views.include_views')
return config.make_wsgi_app()
57 changes: 0 additions & 57 deletions devmgr/context.py

This file was deleted.

43 changes: 43 additions & 0 deletions devmgr/db.py
@@ -0,0 +1,43 @@
import uuid

from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm.collections import attribute_mapped_collection


def new_uuid():
return str(uuid.uuid4())


Base = declarative_base()


class Device(Base):
__tablename__ = 'devices'

uuid = Column(String, primary_key=True, default=new_uuid)
account_id = Column(String, index=True, nullable=False)
name = Column(String, nullable=False)
endpoint = Column(String)
tokens = relationship(
"Token", collection_class=attribute_mapped_collection('token_hash'),
cascade="all, delete-orphan"
)

def __init__(self, **kwargs):
for key, val in kwargs.items():
setattr(self, key, val)

def to_json(self):
return dict(uuid=self.uuid, name=self.name, endpoint=self.endpoint)


class Token(Base):
__tablename__ = 'tokens'

token_hash = Column(String, primary_key=True)
device_uuid = Column(Integer, ForeignKey('devices.uuid'))

def __init__(self, token_hash):
self.token_hash = token_hash

0 comments on commit f2d8242

Please sign in to comment.