repo = Service(name='repo', path='/repo', description="Service to deal with " "the addition/deletion of repositories") repo_param = Service(name='repo', path='/repo/{rid}', description="Service to " "deal with the addition/deletion of repositories") repo_act = Service(name='repo', path='/repo/act/{rid}', description="Service to " "deal with the addition/deletion of repositories") kicker = Service(name='kicker', path='/kick', description="Force all repos to sync") @kicker.post() def kick_sync(request): cron.sync_tarballs(DBSession) return {"success": True} @repo_act.put(validators=[valid_body('message'), valid_user]) def commit_repo(request): """ commit whatever changes have been made """ cur_user = request.validated['ValidUser'] repo_query = DBSession.query(Repo).filter(Repo.id==request.matchdict['rid']) if repo_query.count() > 0: repo = repo_query.first() if repo.owner_id == cur_user.id or cur_user.admin: repo.commit_a(request.validated['message']) return {"success": True} raise _401() @repo_act.post(validators=valid_user)
login = Service(name='users', path='/users/login', description='User login endpoints') def gen_apikey(): """ Generate a unique api key """ for _ in range(10): newkey = str(uuid.uuid5(uuid.NAMESPACE_DNS, 'spacehub.org')).replace('-', '') if DBSession.query(APIKey).filter(APIKey.apikey==newkey).count() == 0: return newkey raise Exception("can't make a unique key... wat") @login.post(validators=valid_body('username', 'password')) def login_user(request): """ login a user privs: none {"username": "******", "password": "******"} """ password = hashlib.sha512(request.validated['password']).hexdigest() username = request.validated['username'] try: user = DBSession.query(User).filter(User.name==username).one() except: raise _401() if user and user.password == password: headers = remember(request, user.email) resp = Response(json.dumps({"success": True}))
"""Get all users, privs: admin""" users = DBSession.query(User).all() scrubbed_users = [] for user in users: scrubbed = { "username": user.name, "id": user.id, "repos": [r.to_dict() for r in user.repos], "apikeys": [a.apikey for a in user.apikeys], } scrubbed_users.append(scrubbed) return {"users": scrubbed_users} @users.post(validators=valid_body("username", "password", "email")) def create_user(request): """ Create a new User This is expected a username, password, and email privs: None """ new_user = User( name=request.validated['username'], password=hashlib.sha512(request.validated['password']).hexdigest(), email=request.validated['email'] ) if DBSession.query(User).filter(User.name==new_user.name).count() > 0: raise _401() DBSession.add(new_user) DBSession.commit()
def gen_apikey(): """ Generate a unique api key """ for _ in range(10): newkey = str(uuid.uuid5(uuid.NAMESPACE_DNS, 'spacehub.org')).replace('-', '') if DBSession.query(APIKey).filter( APIKey.apikey == newkey).count() == 0: return newkey raise Exception("can't make a unique key... wat") @login.post(validators=valid_body('username', 'password')) def login_user(request): """ login a user privs: none {"username": "******", "password": "******"} """ password = hashlib.sha512(request.validated['password']).hexdigest() username = request.validated['username'] try: user = DBSession.query(User).filter(User.name == username).one() except: raise _401() if user and user.password == password: headers = remember(request, user.email) resp = Response(json.dumps({"success": True}))