class Inventory(db.Model):
    __tablename__ = "inventories"

    id = db.Column(UUID(as_uuid=True), primary_key=True)
    book = db.Column(db.String(32), nullable=False)
    author = db.Column(db.String(32), nullable=True)
    url = db.Column(db.String(128), unique=True, nullable=False)
    added_date = db.Column(db.DateTime(), default=datetime.utcnow)

    readings = db.relationship("Reading", back_populates="book")
    vacant_date = db.Column(db.DateTime(), default=datetime.utcnow)

    user_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'))
    user = db.relationship('User', back_populates="added_books")

    def __init__(self, book, author, url):
        self.id = uuid.uuid4()
        self.author = author
        self.book = book
        self.url = url

    def __repr__(self):
        if self.user is not None:
            return "<<%r>>(Added by: %s): %r" % (self.book, self.user.username, self.url)
        else:
            return "<<%r>>: %r" % (self.book, self.url)

    @staticmethod
    def exists(url):
        return Inventory.query.filter_by(url=url).count() > 0

    @staticmethod
    def get_book(book_name):
        return Inventory.query.filter_by(book=book_name).first()
Exemple #2
0
class Routes(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    end_lat = db.Column(db.Float(), nullable=False)
    end_lon = db.Column(db.Float(), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f'Route {self.id}: ({self.user_id}, end_lat: {self.end_lat}, end_lon: {self.end_lon})'
Exemple #3
0
class Reading(db.Model):
    __tablename__ = "reading"

    id = db.Column(UUID(as_uuid=True), primary_key=True)

    book_id = db.Column(UUID(as_uuid=True), db.ForeignKey('inventories.id'))
    book = db.relationship('Inventory', back_populates="readings")

    progress = db.Column(db.Integer(), nullable=False)
    user_id = db.Column(UUID(as_uuid=True),
                        db.ForeignKey("users.id"),
                        nullable=False)
    chapter_id = db.Column(UUID(as_uuid=True),
                           db.ForeignKey("chapters.id"),
                           nullable=False)

    def __init__(self, book, user_id):
        chapter = Chapters.get_first_chapter(book.book)
        self.book = book
        self.id = uuid.uuid4()
        self.user_id = user_id
        self.chapter_id, self.progress = chapter.id, chapter.index

    def __repr__(self):
        return "<User: %r>: 《%r》" % (self.user_id, self.book.book)

    def get_progress(self):
        chapter = Chapters.get(self.chapter_id)
        remains = Chapters.query.filter(
            Chapters.book == chapter.book,
            Chapters.index > chapter.index).count()
        return "%s_%s_%s_%s_%s" % (self.book.book, chapter.chapter,
                                   chapter.title, chapter.id, remains)

    @staticmethod
    def exists(book, user_id):
        return Reading.query.filter(Reading.book == book, Reading.user_id
                                    == user_id).count() > 0
Exemple #4
0
class Keeper(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    label = db.Column(db.String(32), nullable=False)
    account = db.Column(db.String(48), nullable=False)
    password = db.Column(db.String(48), nullable=False)
    password_original = db.Column(db.String(48))
    link = db.Column(db.Text, nullable=True)
    generated_date = db.Column(db.DateTime,
                               default=datetime.utcnow(),
                               nullable=False)
    modified_date = db.Column(db.DateTime,
                              default=datetime.utcnow(),
                              nullable=False)

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), index=True)

    def __repr__(self):
        return '<password in keeper with label: %s, account: %s, password: %s>' % (
            self.label, self.account, self.password)
Exemple #5
0
class Users(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    role_id = db.Column(
        db.String(32),
        db.ForeignKey('role.id'),
        index=True,
        default=lambda: Role.query.filter_by(name='user').first().id)
    state_id = db.Column(
        db.String(32),
        db.ForeignKey('user_status.id'),
        default=lambda: UserStatus.query.filter_by(state='reserve').first().id)

    email = db.Column(db.String(32), unique=True)
    username = db.Column(db.String(16))
    password = db.Column(db.String(128))

    finger_print = db.Column(
        db.String(28),
        default=lambda: ''.join(sample(ascii_letters + digits, 28)),
        nullable=False)
    keeper = db.relationship('Keeper', backref='owner', lazy='dynamic')
    keeper_key = db.Column(db.String(64))
    keeper_active = db.Column(db.Boolean, default=False)
    keeper_length = db.Column(db.SmallInteger, default=12)

    register_date = db.Column(db.DateTime, default=lambda: datetime.utcnow())
    last_signin_date = db.Column(db.DateTime,
                                 default=lambda: datetime.utcnow())

    @staticmethod
    def hash_password(password):
        return crypt.generate_password_hash(
            password, app.config['SECURITY']['iterations'])

    @staticmethod
    def pad(original):
        data = str(original).encode()
        padding_length = AES.block_size - len(data) % AES.block_size
        return original + padding_length * chr(padding_length)

    @staticmethod
    def unpad(padded):
        return padded[:-ord(padded[len(padded) - 1:])]

    def generate_keeper_key(self, pin):
        sha = SHA256.new()
        sha.update(("%s%s" % (self.finger_print, pin)).encode())
        return sha.hexdigest()

    def verify_keeper_key(self, pin):
        return self.generate_keeper_key(pin) == self.keeper_key

    def encrypt(self, data, pin, iv):
        cipher = AES.new("%s%s" % (self.finger_print, pin), AES.MODE_CBC,
                         self.pad(iv))
        return "{0}".format(b64encode(cipher.encrypt(self.pad(data))).decode())

    def decrypt(self, ciphered, pin, iv):
        cipher = AES.new("%s%s" % (self.finger_print, pin), AES.MODE_CBC,
                         self.pad(iv))
        return self.unpad(cipher.decrypt(b64decode(ciphered))).decode()

    def verify_password(self, _password):
        try:
            return crypt.check_password_hash(self.password, _password)
        except:
            return False

    def generate_auth_token(self):
        s = Serializer(app.config['SECRET_KEY'],
                       expires_in=app.config['SECURITY']['expiration'])
        return s.dumps({'id': self.id}).decode('utf-8')

    @staticmethod
    def verify_auth_token(token):
        s = Serializer(app.config['SECRET_KEY'])
        try:
            data = s.loads(token.encode('utf-8'))
            return Users.query.get(data['id'])
        except SignatureExpired and BadSignature:
            return None
        except:
            return None

    def user_info(self):
        return {
            'name': self.username,
            'access_key': self.role.generate_access_key(),
            'keeper_active': self.keeper_active,
            'keeper_length': self.keeper_length
        }

    def __repr__(self):
        return '<User %s>' % (self.username)
Exemple #6
0
__author__ = 'LimeQM'

from Server import app, db
from uuid import uuid4
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, SignatureExpired, BadSignature

authority = db.Table(
    'authorities', db.Model.metadata,
    db.Column('permission_id', db.Integer, db.ForeignKey('permission.id')),
    db.Column('role_id', db.String(32), db.ForeignKey('role.id')))


class Role(db.Model):
    id = db.Column(db.String(32),
                   default=lambda: str(uuid4()).replace('-', ''),
                   primary_key=True)
    name = db.Column(db.String(32), unique=True, nullable=False, index=True)
    permits = db.relationship('Permission',
                              secondary=authority,
                              backref=db.backref('roles', lazy='dynamic'))
    users = db.relationship('Users', backref='role', lazy='dynamic')

    def generate_access_key(self):
        s = Serializer(app.config['SECRET_KEY'],
                       expires_in=app.config['SECURITY']['expiration'])
        return s.dumps({'id': self.id}).decode('utf-8')

    @staticmethod
    def verify_access_authority(page, access_key):
        s = Serializer(app.config['SECRET_KEY'])
        try: