Skip to content

Commit

Permalink
api keys backend
Browse files Browse the repository at this point in the history
  • Loading branch information
Aurelien Bondis committed Sep 15, 2015
1 parent 79e90e9 commit e9e5d22
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 3 deletions.
30 changes: 30 additions & 0 deletions jeto/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from rq import Queue, Connection
import time
import json
import base64

from requests import get
import ansiconv
Expand All @@ -28,6 +29,7 @@
from jeto.services.teams import TeamApi
from jeto.services.users import UserApi, user_fields
from jeto.services.ssl import SSLApi
from jeto.services.api_keys import APIKeyApi
from jeto.models.user import User
from jeto.models.project import Project
from jeto.models.permission import ViewHostPermission, ViewHostNeed
Expand Down Expand Up @@ -229,6 +231,31 @@ def load_user(id):
return User.query.get(int(id))


@lm.request_loader
def api_user(request):
# first, try to login using the api_key url arg
api_key = request.args.get('api_key')
if api_key:
user = User.query.filter_by(api_key=api_key).first()
if user:
return user

# next, try to login using Basic Auth
api_key = request.headers.get('Authorization')
if api_key:
api_key = api_key.replace('Basic ', '', 1)
try:
api_key = base64.b64decode(api_key)
except TypeError:
pass
user = User.query.filter_by(api_key=api_key).first()
if user:
return user

# finally, return None if both methods did not login the user
return None


@lm.unauthorized_handler
def unauthorized_callback():
flash(_('Please login to use this page'))
Expand Down Expand Up @@ -413,6 +440,9 @@ def get_git_references(projectId):
api.add_resource(SSLApi, '/api/SSLKeys', endpoint='SSLKey')
api.add_resource(SSLApi, '/api/SSLKeys/<id>')

api.add_resource(APIKeyApi, '/api/APIKeys', endpoint='APIKeys')
api.add_resource(APIKeyApi, '/api/APIKeys/<id>')

api.add_resource(DomainControllerApi,
'/api/domainControllers',
endpoint='domainController')
Expand Down
15 changes: 15 additions & 0 deletions jeto/models/api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
from jeto import db


class APIKeys(db.Model):
__tablename__ = 'api_keys'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
comment = db.Column(db.String)
user_id = db.Column(
db.Integer,
db.ForeignKey('user.id')
)
49 changes: 49 additions & 0 deletions jeto/services/api_keys.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# -=- encoding: utf-8 -=-
from flask import request

from flask.ext.login import current_user
from flask.ext.restful import fields, marshal_with

from jeto import db

from jeto.models.api import APIKeys
from jeto.services import RestrictedResource # , adminAuthenticate
from jeto.services.users import user_fields
from uuid import uuid4


json_headers = {'Content-Type': 'application/json',
'Accept': 'application/json'}

api_key_fields = {
'id': fields.Integer,
'name': fields.String,
'user': fields.Nested(user_fields),
}


class APIKeyApi(RestrictedResource):
@marshal_with(api_key_fields, envelope='keys')
def get(self, id=None):
"""Retrieve a list of API keys"""
if id is not None:
return APIKeys.query.get(id)
marsh = APIKeys.query.all()
return marsh

def post(self):
query = request.args
comment = query.get('comment')
user = current_user
api_key = APIKeys()
api_key.name = unicode(uuid4())
api_key.user = user
api_key.name = comment or "Random API Key"
db.session.add(api_key)
db.session.commit()

def delete(self, id):
"""delete API Key"""
key = APIKeys.query.get(id)
db.session.delete(key)
db.session.commit()
Empty file modified manage.py
100644 → 100755
Empty file.
33 changes: 33 additions & 0 deletions migrations/versions/12edd6e32e34_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""empty message
Revision ID: 12edd6e32e34
Revises: 3c70b82ce4e8
Create Date: 2015-09-15 20:49:55.501088
"""

# revision identifiers, used by Alembic.
revision = '12edd6e32e34'
down_revision = '3c70b82ce4e8'

from alembic import op
import sqlalchemy as sa


def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('ssl_keys',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=255), nullable=True),
sa.Column('domaincontroller_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['domaincontroller_id'], ['domain_controller.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('name', 'domaincontroller_id', name='_ssl_dc_uc')
)
### end Alembic commands ###


def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_table('ssl_keys')
### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
"""empty message
"""Adding websockets proxying
Revision ID: 40c2706bfd53
Revises: 2b6315172fd1
Revises: 59194701b6e9
Create Date: 2015-06-26 19:05:00.989278
"""

# revision identifiers, used by Alembic.
revision = '40c2706bfd53'
down_revision = '2b6315172fd1'
down_revision = '59194701b6e9'

from alembic import op
import sqlalchemy as sa
Expand Down

0 comments on commit e9e5d22

Please sign in to comment.