diff --git a/Dockerfile b/Dockerfile index df4b9d7..9b39a07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,8 @@ FROM python:3.9.1-buster WORKDIR /code ENV FLASK_APP=main.py ENV FLASK_RUN_HOST=0.0.0.0 +ENV FLASK_DEBUG=1 + RUN apt install gcc RUN apt-get update && apt-get install -y \ @@ -14,4 +16,4 @@ COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . -CMD ["flask", "run"] \ No newline at end of file +CMD ["flask", "run","--debugger"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 97aea6d..895fc5f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,9 +21,11 @@ services: ME_CONFIG_BASICAUTH_PASSWORD: 4dun4710 web: build: . + ports: - "5000:5000" environment: ADUNATIO_PRIV_KEY: /code/privkey.pem + FLASK_DEBUG: 1 volumes: - .:/code diff --git a/internal_lib/EncryptedField.py b/internal_lib/EncryptedField.py index 04d0a54..10ee028 100644 --- a/internal_lib/EncryptedField.py +++ b/internal_lib/EncryptedField.py @@ -1,3 +1,4 @@ +import binascii import re from mongoengine.base import BaseField @@ -17,17 +18,36 @@ class EncryptedStringField(BaseField): super().__init__(**kwargs) def __get__(self, instance, owner): - value = instance._data.get(self.name) - encryptor = PKCS1_OAEP.new(self.keyPair.publickey()) - return encryptor.decrypt(value) + from flask import current_app as app + app.logger.error(self.name) + import binascii + if instance: + value = instance._data.get(self.name) + if value: + app.logger.error(value) + encryptor = PKCS1_OAEP.new(self.keyPair) + return encryptor.decrypt(binascii.unhexlify(value)).decode("utf-8") + else: + return None def __set__(self, instance, value): - - key = self.name - encryptor = PKCS1_OAEP.new(self.keyPair.publickey()) - - instance._data[key] = encryptor.encrypt(value) - instance._mark_as_changed(key) + super().__set__(instance, value) + if value is not None: + from flask import current_app as app + app.logger.error(self.name) + app.logger.error(instance._data) + app.logger.error("data : {} ".format(value)) + print(self.name) + print(instance._data) + print(value) + key = self.name + try: + encryptor = PKCS1_OAEP.new(self.keyPair.publickey()) + instance._data[key] = binascii.hexlify(encryptor.encrypt(value.encode('utf-8'))) + instance._mark_as_changed(key) + except: + instance._data[key] = value + instance._mark_as_changed(key) def to_python(self, value): if isinstance(value, str): diff --git a/main.py b/main.py index 9b75b33..5c6a2de 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ from flask import Flask from flask_admin.contrib.mongoengine import ModelView from mongoengine import connect +from models.Group import Group from models.Union import Union from models.User import User from restapi import MongoApi @@ -19,6 +20,7 @@ api.register_model(User,uri="/api/user") adm = Admin(app) adm.add_view(ModelView(User)) adm.add_view(ModelView(Union)) +adm.add_view(ModelView(Group)) if __name__ == '__main__': app.run(host="0.0.0.0",port=5000,debug=True) \ No newline at end of file diff --git a/models/Group.py b/models/Group.py index 7c2772d..6fa0aa6 100644 --- a/models/Group.py +++ b/models/Group.py @@ -7,6 +7,8 @@ class Group(Document): union = ReferenceField(Union) name = StringField() rights = ListField(StringField()) + def __unicode__(self): + return "{} {}".format(self.union.name,self.name) class PaymentGroup(Document): diff --git a/models/Union.py b/models/Union.py index f8a2c71..ecd88c9 100644 --- a/models/Union.py +++ b/models/Union.py @@ -22,6 +22,7 @@ class Union(Document): group.rights = ["*::*::{}/*".format(self.id)] group.save() user = User() + user.gov_id = 'root' user.username = "{}@root".format(self.legal_registration_number) user.user_group = group user.union = self diff --git a/models/User.py b/models/User.py index f8f820a..083dd40 100644 --- a/models/User.py +++ b/models/User.py @@ -3,7 +3,7 @@ from mongoengine import * from internal_lib.EncryptedField import EncryptedStringField from models.EmbededDocuments import Descriptions -from models.Group import Group +from models.Group import Group, PaymentGroup from models.Union import Union from restapi import Methods @@ -14,19 +14,20 @@ class User(Document): 'index_cls': False, 'auto_create_index': True, 'can_query': True, + 'with_sub_docs': True, "quyery": {}, 'ignore_fields': ['password'], 'methods': [Methods.Get, Methods.List, Methods.Create], "indexes": [ ('union'), - ('username','union'), + ('username', 'union'), ('accept_date') ] } union = ReferenceField(Union) member_no = LongField() username = StringField() - photo = ImageField(thumbnail_size=(85,120)) + photo = ImageField(thumbnail_size=(85, 120)) password = StringField() name = StringField() middle_name = StringField() @@ -105,14 +106,16 @@ class User(Document): )) gnupg_fingerprint = StringField() user_group = ReferenceField(Group) - payment_group = ReferenceField(Group) - - def save(self,*args, **kwargs): - self.union = current_user.union - self.member_no = User.objects.filter(union=self.union).count() + 1 - super(User, self).save(*args, **kwargs) - - - + payment_group = ReferenceField(PaymentGroup) + def __unicode__(self): + try: + return ' '.join([self.name, self.middle_name, self.last_name]) + except: + return str(self.id) + def save(self, *args, **kwargs): + if current_user: + self.union = current_user.union + self.member_no = User.objects.filter(union=self.union).count() + super(User, self).save(*args, **kwargs)