From 199d58157769fe3bdb113054ed37289b068bb97a Mon Sep 17 00:00:00 2001 From: Pelayo Torres Date: Thu, 30 May 2024 17:40:44 +0200 Subject: [PATCH 1/3] Changes in Register --- services/register/config.yaml | 4 +- .../register/register_service/__main__.py | 8 ++-- .../controllers/register_controller.py | 43 ++++++++++++++++--- .../core/register_operations.py | 9 ++-- services/register/register_service/db/db.py | 1 + 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/services/register/config.yaml b/services/register/config.yaml index bc1370f..dd33a97 100644 --- a/services/register/config.yaml +++ b/services/register/config.yaml @@ -3,6 +3,7 @@ mongo: { 'password': 'example', 'db': 'capif_users', 'col': 'user', + 'admins': 'admins', 'host': 'mongo_register', 'port': '27017' } @@ -15,6 +16,5 @@ ca_factory: { register: { register_uuid: '6ba7b810-9dad-11d1-80b4-00c04fd430c8', refresh_expiration: 30, #days - token_expiration: 10, #mins - admin_users: {admin: "password123"} + token_expiration: 10 #mins } \ No newline at end of file diff --git a/services/register/register_service/__main__.py b/services/register/register_service/__main__.py index 12f6ffd..563ab71 100644 --- a/services/register/register_service/__main__.py +++ b/services/register/register_service/__main__.py @@ -1,13 +1,11 @@ - -import os from flask import Flask from .controllers.register_controller import register_routes from flask_jwt_extended import JWTManager from OpenSSL.crypto import PKey, TYPE_RSA, X509Req, dump_certificate_request, FILETYPE_PEM, dump_privatekey import requests import json -import jwt from .config import Config +from .db.db import MongoDatabse app = Flask(__name__) @@ -73,6 +71,10 @@ response = requests.request("GET", url, headers=headers, verify = False) key_data = json.loads(response.text)["data"]["data"]["key"] +# Create an Admin in the Admin Collection +client = MongoDatabse() +client.get_col_by_name(client.capif_admins).insert_one({"admin_name": config["mongo"]["user"], "admin_pass": config["mongo"]["password"]}) + app.config['JWT_ALGORITHM'] = 'RS256' app.config['JWT_PRIVATE_KEY'] = key_data diff --git a/services/register/register_service/controllers/register_controller.py b/services/register/register_service/controllers/register_controller.py index 14877f8..ded8e8b 100644 --- a/services/register/register_service/controllers/register_controller.py +++ b/services/register/register_service/controllers/register_controller.py @@ -5,6 +5,7 @@ from ..core.register_operations import RegisterOperations from ..config import Config from functools import wraps from datetime import datetime, timedelta +from ..db.db import MongoDatabse from flask_httpauth import HTTPBasicAuth import jwt @@ -34,7 +35,9 @@ def generate_tokens(username): @auth.verify_password def verify_password(username, password): users = register_operation.get_users()[0].json["users"] - if username in config["register"]["admin_users"] and password == config["register"]["admin_users"][username]: + client = MongoDatabse() + admin = client.get_col_by_name(client.capif_admins).find_one({"admin_name": username, "admin_pass": password}) + if admin: return username, "admin" for user in users: if user["username"] == username and user["password"]==password: @@ -84,12 +87,40 @@ def refresh_token(username): @register_routes.route("/createUser", methods=["POST"]) @admin_required() def register(username): - username = request.json["username"] - password = request.json["password"] - description = request.json["description"] - email = request.json["email"] + required_fields = { + "username": str, + "password": str, + "enterprise": str, + "country": str, + "email": str, + "purpose": str + } + + optional_fields = { + "phone_number": str, + "company_web": str, + "description": str + } + + user_info = request.get_json() + + missing_fields = [] + for field, field_type in required_fields.items(): + if field not in user_info: + missing_fields.append(field) + elif not isinstance(user_info[field], field_type): + return jsonify({"error": f"Field '{field}' must be of type {field_type.__name__}"}), 400 + + for field, field_type in optional_fields.items(): + if field in user_info and not isinstance(user_info[field], field_type): + return jsonify({"error": f"Optional field '{field}' must be of type {field_type.__name__}"}), 400 + if field not in user_info: + user_info[field] = None + + if missing_fields: + return jsonify({"error": "Missing required fields", "fields": missing_fields}), 400 - return register_operation.register_user(username, password, description, email) + return register_operation.register_user(user_info) @register_routes.route("/getauth", methods=["GET"]) @auth.login_required diff --git a/services/register/register_service/core/register_operations.py b/services/register/register_service/core/register_operations.py index 1eb6b07..e897074 100644 --- a/services/register/register_service/core/register_operations.py +++ b/services/register/register_service/core/register_operations.py @@ -13,17 +13,18 @@ class RegisterOperations: self.mimetype = 'application/json' self.config = Config().get_config() - def register_user(self, username, password, description, email): + def register_user(self, user_info): mycol = self.db.get_col_by_name(self.db.capif_users) - exist_user = mycol.find_one({"username": username}) + exist_user = mycol.find_one({"username": user_info["username"]}) if exist_user: return jsonify("user already exists"), 409 name_space = uuid.UUID(self.config["register"]["register_uuid"]) - user_uuid = str(uuid.uuid5(name_space, username)) + user_uuid = str(uuid.uuid5(name_space,user_info["username"])) - user_info = dict(uuid=user_uuid, username=username, password=password, description=description, email=email, onboarding_date=datetime.now()) + user_info["user_uuid"] = user_uuid + user_info["onboarding_date"]=datetime.now() obj = mycol.insert_one(user_info) return jsonify(message="User registered successfully", uuid=user_uuid), 201 diff --git a/services/register/register_service/db/db.py b/services/register/register_service/db/db.py index 0b08933..65a8a83 100644 --- a/services/register/register_service/db/db.py +++ b/services/register/register_service/db/db.py @@ -12,6 +12,7 @@ class MongoDatabse(): self.config = Config().get_config() self.db = self.__connect() self.capif_users = self.config['mongo']['col'] + self.capif_admins = self.config['mongo']['admins'] def get_col_by_name(self, name): -- GitLab From 62da2036a79ba67a05eae3fe08f5f903fed76d2a Mon Sep 17 00:00:00 2001 From: Pelayo Torres Date: Tue, 4 Jun 2024 12:07:18 +0200 Subject: [PATCH 2/3] admin collection --- services/register/config.yaml | 4 +++- services/register/register_service/__main__.py | 3 ++- .../register/register_service/core/register_operations.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/services/register/config.yaml b/services/register/config.yaml index dd33a97..f63df9f 100644 --- a/services/register/config.yaml +++ b/services/register/config.yaml @@ -16,5 +16,7 @@ ca_factory: { register: { register_uuid: '6ba7b810-9dad-11d1-80b4-00c04fd430c8', refresh_expiration: 30, #days - token_expiration: 10 #mins + token_expiration: 10, #mins + admin_users: {admin_user: "admin", + admin_pass: "password123"} } \ No newline at end of file diff --git a/services/register/register_service/__main__.py b/services/register/register_service/__main__.py index 563ab71..7554fa2 100644 --- a/services/register/register_service/__main__.py +++ b/services/register/register_service/__main__.py @@ -73,7 +73,8 @@ key_data = json.loads(response.text)["data"]["data"]["key"] # Create an Admin in the Admin Collection client = MongoDatabse() -client.get_col_by_name(client.capif_admins).insert_one({"admin_name": config["mongo"]["user"], "admin_pass": config["mongo"]["password"]}) +if not client.get_col_by_name(client.capif_admins).find_one({"admin_name": config["register"]["admin_users"]["admin_user"], "admin_pass": config["register"]["admin_users"]["admin_pass"]}): + client.get_col_by_name(client.capif_admins).insert_one({"admin_name": config["register"]["admin_users"]["admin_user"], "admin_pass": config["register"]["admin_users"]["admin_pass"]}) app.config['JWT_ALGORITHM'] = 'RS256' diff --git a/services/register/register_service/core/register_operations.py b/services/register/register_service/core/register_operations.py index e897074..16f3132 100644 --- a/services/register/register_service/core/register_operations.py +++ b/services/register/register_service/core/register_operations.py @@ -40,7 +40,7 @@ class RegisterOperations: if exist_user is None: return jsonify("Not exister user with this credentials"), 400 - access_token = create_access_token(identity=(username + " " + exist_user["uuid"])) + access_token = create_access_token(identity=(username + " " + exist_user["user_uuid"])) cert_file = open("register_service/certs/ca_root.crt", 'rb') ca_root = cert_file.read() -- GitLab From 61677dbb1193ffacf767c216373e1d004bd6b23a Mon Sep 17 00:00:00 2001 From: Pelayo Torres Date: Wed, 5 Jun 2024 10:20:53 +0200 Subject: [PATCH 3/3] fix uuid --- .../register/register_service/core/register_operations.py | 4 ++-- tests/resources/common/basicRequests.robot | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/services/register/register_service/core/register_operations.py b/services/register/register_service/core/register_operations.py index 16f3132..b76d092 100644 --- a/services/register/register_service/core/register_operations.py +++ b/services/register/register_service/core/register_operations.py @@ -23,7 +23,7 @@ class RegisterOperations: name_space = uuid.UUID(self.config["register"]["register_uuid"]) user_uuid = str(uuid.uuid5(name_space,user_info["username"])) - user_info["user_uuid"] = user_uuid + user_info["uuid"] = user_uuid user_info["onboarding_date"]=datetime.now() obj = mycol.insert_one(user_info) @@ -40,7 +40,7 @@ class RegisterOperations: if exist_user is None: return jsonify("Not exister user with this credentials"), 400 - access_token = create_access_token(identity=(username + " " + exist_user["user_uuid"])) + access_token = create_access_token(identity=(username + " " + exist_user["uuid"])) cert_file = open("register_service/certs/ca_root.crt", 'rb') ca_root = cert_file.read() diff --git a/tests/resources/common/basicRequests.robot b/tests/resources/common/basicRequests.robot index ea3a96f..5c5f650 100644 --- a/tests/resources/common/basicRequests.robot +++ b/tests/resources/common/basicRequests.robot @@ -416,6 +416,11 @@ Create User At Register ... password=${password} ... description=${description} ... email=${email} + ... enterprise=enterprise + ... country=Spain + ... purpose=testing + ... phone_number=123456789 + ... company_web=www.enterprise.com ${resp}= Post On Session register_session /createUser headers=${headers} json=${body} Should Be Equal As Strings ${resp.status_code} 201 -- GitLab