From 17052a05d75d31bb88780336a19db3a3ec1f4d0a Mon Sep 17 00:00:00 2001 From: KhaledBousrih Date: Fri, 21 Feb 2020 11:01:20 +0100 Subject: [PATCH 1/3] Fix compute password change token expiry date --- concrete_datastore/concrete/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/concrete_datastore/concrete/models.py b/concrete_datastore/concrete/models.py index 6e4ccbd1..652b0348 100644 --- a/concrete_datastore/concrete/models.py +++ b/concrete_datastore/concrete/models.py @@ -63,7 +63,7 @@ def compute_auth_token_expiry(): def compute_pwd_change_token_expiry(): now = pendulum.now('utc') - return now.add(minutes=settings.PASSWORD_CHANGE_TOKEN_EXPIRY_HOURS) + return now.add(hours=settings.PASSWORD_CHANGE_TOKEN_EXPIRY_HOURS) class AuthToken(Token): From c6ef5b322e44841e205f6d9364bba057a4f2e825 Mon Sep 17 00:00:00 2001 From: KhaledBousrih Date: Fri, 21 Feb 2020 14:45:31 +0100 Subject: [PATCH 2/3] allow null values in RegisterSerializer for email_format and url_format --- .gitignore | 2 +- CHANGELOG.md | 3 ++- concrete_datastore/api/v1/serializers.py | 32 +++++++++++++++++------- concrete_datastore/api/v1/views.py | 6 +++-- concrete_datastore/settings/base.py | 2 +- development/settings.py | 14 ++++++----- 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index c77f8fc8..d2c9dec8 100644 --- a/.gitignore +++ b/.gitignore @@ -109,7 +109,7 @@ concrete_datastore/concrete/migrations/0* .virtualenv2-ci env-ci/ .integration-setup -datamodel/* +development/datamodel/* .installed-requirements.txt bin local-migrations/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ae60d38..f9fb8127 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ ### Changed -- nothing changed +- fixed password change token expiry computation +- fixed register serializer to allow null values of url_format and email_format ### Removed diff --git a/concrete_datastore/api/v1/serializers.py b/concrete_datastore/api/v1/serializers.py index a1f818c0..96423c0f 100644 --- a/concrete_datastore/api/v1/serializers.py +++ b/concrete_datastore/api/v1/serializers.py @@ -61,12 +61,10 @@ class SecureLoginSerializer(serializers.Serializer): class RegisterSerializer(serializers.Serializer): email = serializers.EmailField() - password1 = serializers.CharField(required=False) - password2 = serializers.CharField(required=False) - email_format = serializers.CharField(required=False) - url_format = serializers.CharField( - required=False, default='/#/set-password/{token}/{email}/' - ) + password1 = serializers.CharField(required=False, allow_null=True) + password2 = serializers.CharField(required=False, allow_null=True) + email_format = serializers.CharField(required=False, allow_null=True) + url_format = serializers.CharField(required=False, allow_null=True) class Meta: fields = ( @@ -77,16 +75,32 @@ class Meta: "url_format", ) + @property + def validated_data(self): + _validated_data = super().validated_data + if _validated_data.get('url_format') is None: + _validated_data['url_format'] = '/#/set-password/{token}/{email}/' + + return _validated_data + class ResetPasswordSerializer(serializers.Serializer): email = serializers.EmailField() - url_format = serializers.CharField( - required=False, default='/#/reset-password/{token}/{email}/' - ) + url_format = serializers.CharField(required=False, allow_null=True) class Meta: fields = ("email", "url_format") + @property + def validated_data(self): + _validated_data = super().validated_data + if _validated_data.get('url_format') is None: + _validated_data[ + 'url_format' + ] = '/#/reset-password/{token}/{email}/' + + return _validated_data + class UserSerializer(serializers.ModelSerializer): url = serializers.SerializerMethodField() diff --git a/concrete_datastore/api/v1/views.py b/concrete_datastore/api/v1/views.py index 76fc5462..a016cfff 100644 --- a/concrete_datastore/api/v1/views.py +++ b/concrete_datastore/api/v1/views.py @@ -966,9 +966,11 @@ def create_user(self, request, serializer, divider=None): 'HTTP_REFERER', settings.AUTH_CONFIRM_EMAIL_DEFAULT_REDIRECT_TO ) - email_format = serializer.validated_data.get( - 'email_format', settings.DEFAULT_REGISTER_EMAIL_FORMAT + email_format = ( + serializer.validated_data.get('email_format') + or settings.DEFAULT_REGISTER_EMAIL_FORMAT ) + link = urljoin(referer, uri) email_body = email_format.format(link=link) diff --git a/concrete_datastore/settings/base.py b/concrete_datastore/settings/base.py index 95f896ba..75abb79d 100644 --- a/concrete_datastore/settings/base.py +++ b/concrete_datastore/settings/base.py @@ -445,7 +445,7 @@ # Backend login group creation rule BACKEND_GROUP_CREATION_RULE = 'concrete_datastore.api.v1.authentication.default_backend_group_creation_rule' -ALLOW_SEND_EMAIL_ON_REGISTER = False +ALLOW_SEND_EMAIL_ON_REGISTER = True DEFAULT_REGISTER_EMAIL_FORMAT = """ diff --git a/development/settings.py b/development/settings.py index 5d6941eb..8d32407b 100644 --- a/development/settings.py +++ b/development/settings.py @@ -19,11 +19,13 @@ # ALTER DATABASE "db-concrete-datastore" OWNER TO "user-concrete-datastore"; # GRANT ALL PRIVILEGES ON DATABASE "db-concrete-datastore" to "user-concrete-datastore"; -POSTGRES_DB = os.environ.get('POSTGRES_DB', 'db-concrete-datastore-2') +POSTGRES_DB = os.environ.get('POSTGRES_DB', 'db-concrete-datastore') POSTGRES_USER = os.environ.get('POSTGRES_USER', 'user-concrete-datastore') -POSTGRES_PASSWORD = os.environ.get('POSTGRES_PASSWORD', 'pwd-concrete-datastore') +POSTGRES_PASSWORD = os.environ.get( + 'POSTGRES_PASSWORD', 'pwd-concrete-datastore' +) POSTGRES_HOST = os.environ.get('POSTGRES_HOST', 'localhost') @@ -55,16 +57,16 @@ META_MODEL_DEFINITIONS = load_datamodel( datamodel_path=os.path.join( - PROJECT_ROOT, - 'datamodel/current-datamodel.json') + PROJECT_ROOT, 'datamodel/current-datamodel.json' + ) ) DISABLED_MODELS = () -EMAIL_HOST = os.environ.get("EMAIL_HOST", '') +EMAIL_HOST = os.environ.get("EMAIL_HOST", 'localhost') EMAIL_HOST_USER = os.environ.get("EMAIL_HOST_USER", '') EMAIL_HOST_PASSWORD = os.environ.get("EMAIL_HOST_PASSWORD", '') -EMAIL_PORT = os.environ.get("EMAIL_PORT", 587) +EMAIL_PORT = os.environ.get("EMAIL_PORT", 1025) EMAIL_USE_TLS = True EMAIL_USE_SSL = False EMAIL_TIMEOUT = None From 181898676357415238d773ccc9e754ff1bbc2343 Mon Sep 17 00:00:00 2001 From: KhaledBousrih Date: Fri, 21 Feb 2020 15:10:39 +0100 Subject: [PATCH 3/3] use field validator for url_format in RegisterSerializer and ResetPasswordSerializer --- concrete_datastore/api/v1/serializers.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/concrete_datastore/api/v1/serializers.py b/concrete_datastore/api/v1/serializers.py index 96423c0f..2dcff7c4 100644 --- a/concrete_datastore/api/v1/serializers.py +++ b/concrete_datastore/api/v1/serializers.py @@ -75,13 +75,10 @@ class Meta: "url_format", ) - @property - def validated_data(self): - _validated_data = super().validated_data - if _validated_data.get('url_format') is None: - _validated_data['url_format'] = '/#/set-password/{token}/{email}/' - - return _validated_data + def validate_url_format(self, value): + if value is None: + return '/#/set-password/{token}/{email}/' + return value class ResetPasswordSerializer(serializers.Serializer): @@ -91,15 +88,10 @@ class ResetPasswordSerializer(serializers.Serializer): class Meta: fields = ("email", "url_format") - @property - def validated_data(self): - _validated_data = super().validated_data - if _validated_data.get('url_format') is None: - _validated_data[ - 'url_format' - ] = '/#/reset-password/{token}/{email}/' - - return _validated_data + def validate_url_format(self, value): + if value is None: + return '/#/reset-password/{token}/{email}/' + return value class UserSerializer(serializers.ModelSerializer):