Skip to content

Commit 55faa3d

Browse files
committed
Merge branch 'main' into docs/user-guide
2 parents 0e3a7ce + 58b93fe commit 55faa3d

24 files changed

+306
-128
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@ db.sqlite3
1212
# Coverage files from pytest-cov plugin for pytest
1313
.coverage
1414

15+
# Logger files
16+
enigma.log
17+
1518
# Dependency directories
1619
node_modules/
1720

21+
#Access Modules
22+
Access/access_modules
23+
1824
# Folders created by Docker Compose
1925
mounts/
2026
public/

Access/accessrequest_helper.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -405,15 +405,17 @@ def create_request(auth_user, access_request_form):
405405
}
406406

407407
access_module = helper.get_available_access_modules()[access_tag]
408+
module_access_labels = access_module.validate_request(
409+
access_labels, auth_user, is_group=False
410+
)
411+
408412
extra_field_labels = get_extra_field_labels(access_module)
413+
409414
if extra_fields and extra_field_labels:
410415
for field in extra_field_labels:
411-
access_labels[0][field] = extra_fields[0]
416+
module_access_labels[0][field] = extra_fields[0]
412417
extra_fields = extra_fields[1:]
413418

414-
module_access_labels = access_module.validate_request(
415-
access_labels, auth_user, is_group=False
416-
)
417419

418420
for index2, access_label in enumerate(module_access_labels):
419421
request_id = request_id + "_" + str(index2)
@@ -516,10 +518,7 @@ def get_extra_field_labels(access_module):
516518
def get_extra_fields(access_request):
517519
if "extraFields" in access_request:
518520
return access_request["extraFields"]
519-
elif "extraFields[]" in access_request:
520-
return [access_request["extraFields[]"]]
521-
else:
522-
return []
521+
return []
523522

524523

525524
def _validate_access_request(access_request_form, user):

Access/admin.py

+52-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
'''
2+
Models to configure diplay, search and filtering for models on admin panel
3+
'''
4+
15
from django.contrib import admin
26

37
from Access.models import (
@@ -14,17 +18,61 @@
1418

1519

1620
class UserAdmin(admin.ModelAdmin):
21+
'''Class to describe how to display User model on admin panel'''
1722
ordering = ("name", "email")
1823
search_fields = ("name", "email")
1924
list_display = ("name", "email")
2025

2126

27+
class MembershipV2AdminPanel(admin.ModelAdmin):
28+
'''Class to describe how to display MembershipV2 on admin panel'''
29+
ordering = ("membership_id", "user__name", "group__name")
30+
search_fields = ("membership_id", "user__name", "group__name")
31+
list_display = ("membership_id", "user", "group")
32+
33+
34+
class AccessV2AdminPanel(admin.ModelAdmin):
35+
'''Class to describe how to display AccessV2 model on admin panel'''
36+
search_fields = ("access_tag", "access_label")
37+
list_display = ("access_tag", "access_label")
38+
sortable_by = ("access_tag",)
39+
40+
41+
class UserIdentityAdminPanel(admin.ModelAdmin):
42+
'''Class to describe how to display User Identity on admin panel'''
43+
search_fields = ("access_tag", "user__name", "status")
44+
list_display = ("access_tag", "user", "identity", "status")
45+
46+
47+
class UserAccessMappingAdminPanel(admin.ModelAdmin):
48+
'''Class to describe how to display UserAccessMapping on admin panel'''
49+
search_fields = (
50+
"request_id",
51+
"user_identity__user__name",
52+
"access__access_tag",
53+
"access__access_label",
54+
"status"
55+
)
56+
list_display = (
57+
"request_id",
58+
"get_user_name",
59+
"access",
60+
"status",
61+
)
62+
ordering = (
63+
"request_id",
64+
"user_identity__user__name",
65+
"access",
66+
"status"
67+
)
68+
69+
2270
admin.site.register(User, UserAdmin)
2371
admin.site.register(Permission)
24-
admin.site.register(UserAccessMapping)
72+
admin.site.register(UserAccessMapping, UserAccessMappingAdminPanel)
2573
admin.site.register(Role)
26-
admin.site.register(AccessV2)
74+
admin.site.register(AccessV2, AccessV2AdminPanel)
2775
admin.site.register(GroupV2)
28-
admin.site.register(MembershipV2)
76+
admin.site.register(MembershipV2, MembershipV2AdminPanel)
2977
admin.site.register(GroupAccessMapping)
30-
admin.site.register(UserIdentity)
78+
admin.site.register(UserIdentity, UserIdentityAdminPanel)

Access/background_task_manager.py

+54-50
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
from celery.signals import task_success, task_failure
88

99
from Access import helpers
10-
from bootprocess import general
11-
from EnigmaAutomation.settings import AUTOMATED_EXEC_IDENTIFIER
12-
from Access.models import UserAccessMapping, ApprovalType
10+
from Access.models import UserAccessMapping
1311
from Access import notifications
1412

1513
logger = logging.getLogger(__name__)
@@ -166,70 +164,76 @@ def run_access_grant(request_id):
166164
def run_access_revoke(request_id):
167165
access_mapping = UserAccessMapping.get_access_request(request_id=request_id)
168166
if not access_mapping:
169-
# TODO: Have to add the email targets for failure
170-
targets = []
171-
message = "Request not found"
172-
notifications.send_revoke_failure_mail(
173-
targets, request_id, access_mapping.revoker.email, 0, message
174-
)
167+
logger.debug(f"Cannot find access mapping with id: {request_id}")
175168
return False
176169
elif access_mapping.status == "Revoked":
170+
logger.debug(f"The request with id {request_id} is already revoked.")
177171
return True
178172
access = access_mapping.access
179173
user_identity = access_mapping.user_identity
180174

181175
revoker = access_mapping.revoker
182-
if not revoker:
183-
# TODO: Have to add the email targets for failure
184-
targets = []
185-
message = "Revoker not found"
186-
notifications.send_revoke_failure_mail(
187-
targets,
188-
request_id,
189-
access_mapping.revoker.email,
190-
0,
191-
message,
192-
access.access_tag,
193-
)
194-
user_identity.mark_revoke_failed_for_approved_access_mapping(access)
195-
return False
196-
197176
access_modules = helpers.get_available_access_modules()
198-
199177
access_module = access_modules[access.access_tag]
178+
if not revoker:
179+
logger.debug(f"The revoker is not set for the request with id {request_id}")
180+
access_mapping.revoke_failed("Revoker was not set.")
181+
return False
200182

201-
response = access_module.revoke(
202-
user_identity.user, user_identity, access.access_label, access_mapping
203-
)
204-
logger.debug("Response from the revoke function: " + str(response))
205-
if type(response) is bool:
206-
revoke_success = response
207-
message = None
208-
else:
209-
revoke_success = response[0]
210-
message = str(response[1])
183+
try:
184+
response = access_module.revoke(
185+
user_identity.user, user_identity, access.access_label, access_mapping
186+
)
187+
if type(response) is bool:
188+
revoke_success = response
189+
message = None
190+
else:
191+
revoke_success = response[0]
192+
message = str(response[1])
193+
except Exception as e:
194+
logger.exception(
195+
"Error while running revoke function: " + str(traceback.format_exc())
196+
)
197+
revoke_success = False
198+
message = str(traceback.format_exc())
199+
211200

212201
if revoke_success:
213-
if AUTOMATED_EXEC_IDENTIFIER in access_module.revoke_owner():
214-
user_identity.revoke_approved_access_mapping(access)
202+
access_mapping.revoke()
203+
logger.debug(
204+
{
205+
"requestId": request_id,
206+
"status": "revoked",
207+
"by": revoker,
208+
"response": message,
209+
}
210+
)
215211
else:
212+
access_mapping.revoke_failed(
213+
fail_reason="Error while running revoke in module"
214+
)
216215
logger.debug(
217-
"Failed to revoke the request: {} due to exception: {}".format(
218-
access_mapping.request_id, message
219-
)
216+
{
217+
"requestId": request_id,
218+
"status": "RevokeFailed",
219+
"by": revoker,
220+
"response": message,
221+
"retry_count": run_access_revoke.request.retries
222+
}
220223
)
221-
logger.debug("Retry count: {}".format(run_access_revoke.request.retries))
222224
if run_access_revoke.request.retries == 3:
223225
logger.info("Sending the notification for failure")
224-
notifications.send_revoke_failure_mail(
225-
access_module.access_mark_revoke_permission(access_mapping.access_type),
226-
access_mapping.request_id,
227-
revoker.email,
228-
run_access_revoke.request.retries,
229-
message,
230-
access.access_tag,
231-
)
232-
user_identity.mark_revoke_failed_for_approved_access_mapping(access)
226+
try:
227+
notifications.send_revoke_failure_mail(
228+
access_module.access_mark_revoke_permission(access_mapping.access_type),
229+
access_mapping.request_id,
230+
revoker.email,
231+
run_access_revoke.request.retries,
232+
message,
233+
access.access_tag,
234+
)
235+
except Exception as e:
236+
logger.debug(f"Failed to send Revoke failed mail due to exception: {str(e)}")
233237
raise Exception("Failed to revoke the access due to: " + str(message))
234238

235239
return True

Access/group_helper.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -664,17 +664,19 @@ def save_group_access_request(form_data, auth_user):
664664
access_labels_json=access_request["accessLabel"][accessIndex],
665665
access_tag=access_tag,
666666
)
667+
668+
module_access_labels = access_module.validate_request(
669+
access_labels, auth_user, is_group=False
670+
)
671+
667672
extra_fields = accessrequest_helper.get_extra_fields(access_request)
668673
extra_field_labels = accessrequest_helper.get_extra_field_labels(access_module)
669674

670675
if extra_fields and extra_field_labels:
671676
for field in extra_field_labels:
672-
access_labels[0][field] = extra_fields[0]
677+
module_access_labels[0][field] = extra_fields[0]
673678
extra_fields = extra_fields[1:]
674679

675-
module_access_labels = access_module.validate_request(
676-
access_labels, auth_user, is_group=False
677-
)
678680

679681
request_id = (
680682
group.name

Access/models.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -827,18 +827,16 @@ def getAccessRequestDetails(self, access_module):
827827

828828
return access_request_data
829829

830-
def updateMetaData(self, key, data):
830+
def update_meta_data(self, key, data):
831831
with transaction.atomic():
832-
mapping = UserAccessMapping.objects.select_for_update().get(
833-
request_id=self.request_id
834-
)
835-
mapping.meta_data[key] = data
836-
mapping.save()
832+
self.meta_data[key] = data
833+
self.save()
837834
return True
838835

839-
def revoke(self, revoker):
836+
def revoke(self, revoker=None):
840837
self.status = "Revoked"
841-
self.revoker = revoker
838+
if revoker:
839+
self.revoker = revoker
842840
self.save()
843841

844842
@staticmethod
@@ -942,6 +940,9 @@ def create(
942940
mapping.save()
943941
return mapping
944942

943+
def get_user_name(self):
944+
return self.user_identity.user.name
945+
945946

946947
class GroupAccessMapping(models.Model):
947948
"""

Access/userlist_helper.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ def create_identity(user_identity_form, auth_user):
9797
new_module_identity_json = selected_access_module.verify_identity(
9898
user_identity_form, user.email
9999
)
100+
if not new_module_identity_json:
101+
raise Exception("Failed to verify identity")
102+
100103
existing_user_identity = user.get_active_identity(
101104
access_tag=selected_access_module.tag()
102105
)
@@ -152,7 +155,7 @@ def __change_identity_and_transfer_access_mapping(
152155
if existing_user_access_mapping:
153156
new_user_access_mapping = (
154157
new_user_identity.replicate_active_access_membership_for_module(
155-
existing_access=existing_user_access_mapping
158+
existing_user_access_mapping=existing_user_access_mapping
156159
)
157160
)
158161
system_user = User.get_system_user()

Access/views.py

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
INVALID_REQUEST_MESSAGE = "Error in request not found OR Invalid request type"
4444

4545
logger = logging.getLogger(__name__)
46+
logger.info("Server Started")
4647

4748

4849
@login_required

EnigmaAutomation/settings.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@
250250
'file': {
251251
'level': current_log_level,
252252
'class': 'logging.FileHandler',
253-
'filename': './enigma.log',
253+
'filename': 'enigma.log',
254254
'formatter': 'verbose',
255255
},
256256
"console": {
@@ -259,7 +259,7 @@
259259
"formatter": "verbose",
260260
},
261261
},
262-
"loggers": { },
262+
"loggers": {},
263263
}
264264
for each_app in logging_apps:
265265
LOGGING["loggers"][each_app] = {
@@ -268,3 +268,13 @@
268268
"propagate": True,
269269
"formatter": "verbose",
270270
}
271+
272+
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
273+
274+
EMAIL_HOST = data["emails"]["EMAIL_HOST"]
275+
EMAIL_PORT = data["emails"]["EMAIL_PORT"]
276+
EMAIL_HOST_USER = data["emails"]["EMAIL_HOST_USER"]
277+
EMAIL_HOST_PASSWORD = data["emails"]["EMAIL_HOST_PASSWORD"]
278+
EMAIL_USE_TLS = data["emails"]["EMAIL_USE_TLS"]
279+
EMAIL_USE_SSL = data["emails"]["EMAIL_USE_SSL"]
280+
DEFAULT_FROM_EMAIL = data["emails"]["DEFAULT_FROM_EMAIL"]

0 commit comments

Comments
 (0)