Skip to content

Commit dcf7552

Browse files
committed
fix: conflicts
2 parents 888a338 + 7d2b336 commit dcf7552

File tree

5 files changed

+99
-27
lines changed

5 files changed

+99
-27
lines changed

Access/group_helper.py

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from Access.models import User, GroupV2, MembershipV2, AccessV2
1+
from Access.models import GroupAccessMapping, User, GroupV2, MembershipV2, AccessV2
22
from Access import helpers, views_helper, notifications, accessrequest_helper
33
from django.db import transaction
44
import datetime
@@ -24,6 +24,9 @@
2424
"msg": "Error Occured while loading the page. Please contact admin",
2525
}
2626

27+
USER_UNAUTHORIZED_MESSAGE = "User unauthorised to perform the action."
28+
GROUP_ACCESS_MAPPING_NOT_FOUND = "Group Access Mapping not found in the database."
29+
2730
NEW_GROUP_CREATE_ERROR_GROUP_EXISTS = {
2831
"error_msg": "Invalid Group Name",
2932
"msg": "A group with name {group_name} already exists. Please choose a new name.",
@@ -745,6 +748,14 @@ def validate_group_access_create_request(group, auth_user):
745748
return None
746749

747750

751+
def revoke_user_access(user, access, revoker, decline_message):
752+
user_identity = user.get_active_identity(access.access_tag)
753+
user_identity.decline_non_approved_access_mapping(access, decline_message)
754+
access_mapping = user_identity.get_granted_access_mapping(access).first()
755+
if not access_mapping:
756+
return False
757+
revoke_request(access_mapping, revoker)
758+
748759
def remove_member(request):
749760
try:
750761
membership_id = request.POST.get("membershipId")
@@ -763,7 +774,7 @@ def remove_member(request):
763774
]
764775

765776
other_memberships_groups = (
766-
user.get_all_memberships()
777+
user.get_all_approved_memberships()
767778
.exclude(group=membership.group)
768779
.values_list("group", flat=True)
769780
)
@@ -775,16 +786,59 @@ def remove_member(request):
775786

776787
accesses = list(set(group_accesses) - set(other_group_accesses))
777788

778-
for access in accesses:
779-
user_identity = user.get_active_identity(access.access_tag)
780-
user_identity.decline_non_approved_access_mapping(access)
781-
user_identity.offboarding_approved_access_mapping(access)
782-
revoke_request(user_access_mapping=access, revoker=request.user.user)
789+
with transaction.atomic():
790+
for access in accesses:
791+
revoke_user_access(user, access, request.user.user, "User removed from the group")
783792

784793
membership.revoke_membership()
785794

786795
return {"message": "Successfully removed user from group"}
787796

797+
def access_exist_in_other_groups_of_user(membership, group, access):
798+
other_memberships = (
799+
membership.user.get_all_approved_memberships()
800+
.exclude(group=membership.group)
801+
)
802+
for membership in other_memberships:
803+
if membership.group.check_access_exist(access):
804+
return True
805+
806+
return False
807+
808+
809+
def revoke_access_from_group(request):
810+
try:
811+
request_id = request.POST.get("request_id")
812+
if not request_id:
813+
logger.debug("Cannot find request_id in the http request.")
814+
return {"error": ERROR_MESSAGE}
815+
816+
mapping = GroupAccessMapping.get_by_id(request_id)
817+
if not mapping:
818+
logger.debug("Group Access Mapping not found in the database")
819+
return {"error": GROUP_ACCESS_MAPPING_NOT_FOUND}
820+
except Exception as e:
821+
logger.exception(str(e))
822+
return {"error": ERROR_MESSAGE}
823+
824+
group = mapping.group
825+
auth_user = request.user
826+
if not (auth_user.user.has_permission("ALLOW_USER_OFFBOARD") or group.member_is_owner(auth_user.user)):
827+
return {"error": USER_UNAUTHORIZED_MESSAGE}
828+
829+
revoke_access_memberships = []
830+
for membership in group.get_all_approved_members():
831+
if access_exist_in_other_groups_of_user(membership, group, mapping.access):
832+
continue
833+
revoke_access_memberships.append(membership)
834+
835+
with transaction.atomic():
836+
for membership in revoke_access_memberships:
837+
revoke_user_access(membership.user, mapping.access, auth_user.user, "Access revoked for the group")
838+
839+
mapping.mark_revoked(auth_user.user)
840+
841+
return {"message": "Successfully initiated the revoke"}
788842

789843
def get_selected_users_by_email(user_emails):
790844
selected_users = User.get_users_by_emails(emails=user_emails)

Access/models.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ def getOwnedGroups(self):
191191
def isAdminOrOps(self):
192192
return self.is_ops or self.user.is_superuser
193193

194-
def get_all_memberships(self):
195-
return self.membership_user.all()
194+
def get_all_approved_memberships(self):
195+
return self.membership_user.filter(status="Approved")
196196

197197
def is_allowed_admin_actions_on_group(self, group):
198198
return (
@@ -1027,6 +1027,19 @@ def getAccessRequestDetails(self, access_module):
10271027

10281028
return access_request_data
10291029

1030+
def get_by_id(request_id):
1031+
try:
1032+
return GroupAccessMapping.objects.get(request_id=request_id)
1033+
except GroupAccessMapping.DoesNotExist:
1034+
return None
1035+
1036+
def mark_revoked(self, revoker):
1037+
self.status = "Revoked"
1038+
self.revoker = revoker
1039+
self.save()
1040+
1041+
1042+
10301043
@staticmethod
10311044
def get_by_request_id(request_id):
10321045
try:

Access/views.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ def request_access(request):
208208
HTTPResponse: Access request form template or the status of access save request.
209209
"""
210210
if request.POST:
211+
print((request.POST))
211212
context = create_request(
212213
auth_user=request.user, access_request_form=request.POST
213214
)
@@ -639,3 +640,15 @@ def individual_resolve(request):
639640
logger.exception(str(e))
640641
json_response['error'] = {'error_msg': "Bad request", 'msg': "Error in request not found OR Invalid request type"}
641642
return render(request,'EnigmaOps/accessStatus.html',json_response)
643+
644+
def revoke_group_access(request):
645+
try:
646+
response = group_helper.revoke_access_from_group(request)
647+
if("error" in response):
648+
return JsonResponse(response, status=400)
649+
650+
return JsonResponse(response)
651+
except Exception as e:
652+
logger.exception(str(e))
653+
logger.debug("Something went wrong while revoking group access")
654+
return JsonResponse({"message": "Failed to revoke group Access"}, status=400)

EnigmaAutomation/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from django.contrib.auth import views as auth_views
1919
from django.urls import re_path, include
2020
from Access.views import (
21+
revoke_group_access,
2122
user_offboarding,
2223
show_access_history,
2324
pending_requests,
@@ -90,6 +91,7 @@
9091
re_path(
9192
r"^group/removeGroupMember$", remove_group_member, name="remove_group_member"
9293
),
94+
re_path(r"^group/revokeAccess", revoke_group_access, name="revoke_group_access"),
9395
re_path(r"^individual_resolve$", individual_resolve, name="individual_resolve")
9496
]
9597

templates/EnigmaOps/group_access_list_tabs/generic_accesses_tab.html

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,16 @@
2828

2929
$(document).on('click', '.group-revoke-button', function(){
3030
id = $(this).attr("id");
31-
urlBuilder = "/group/markGroupAccessRevoked?requestId="+id
32-
$.ajax({url: urlBuilder,
33-
success: function(result){
34-
document.getElementById("inactive-"+id+"-revoke-button").innerHTML = "Access Marked Revoked";
35-
},
36-
error: function(result){
37-
alert("Error occured while marking revoke! - "+result["responseJSON"]["error"])
38-
}});
39-
});
4031

41-
$(document).on('click', '.inactive-access-button', function(){
42-
id = $(this).attr("id");
43-
urlBuilder = "/group/markGroupAccessInactive?requestId="+id
32+
urlBuilder = "/group/revokeAccess"
4433
$.ajax({url: urlBuilder,
34+
method: "POST",
35+
data: {
36+
request_id: id,
37+
csrfmiddlewaretoken: '{{ csrf_token }}'
38+
},
4539
success: function(result){
46-
document.getElementById(id+"-revoke-button").innerHTML = "Access Marked Inactive";
40+
document.getElementById("inactive-"+id+"-revoke-button").innerHTML = "Access Marked Revoked";
4741
},
4842
error: function(result){
4943
alert("Error occured while marking revoke! - "+result["responseJSON"]["error"])
@@ -72,12 +66,8 @@
7266
<td>{{ eachAccess.status }}</td>
7367
<td>{{ eachAccess.accessMeta }}</td>
7468
<td id="inactive-{{ eachAccess.requestId }}-revoke-button">
75-
{% if user.is_owner %}
76-
<button class="btn btn-danger inactive-access-button" id="inactive-{{ eachAccess.requestId }}">Mark Inactive</button><br>(Existing accesses are not revoked)<br><br>
77-
{% endif %}
78-
7969
{% if allowRevoke and eachAccess.status == 'Approved' %}
80-
<button class="btn btn-danger group-revoke-button" id="{{ eachAccess.requestId }}">Mark Revoked</button><br>(Existing accesses are marked revoked)
70+
<button class="btn btn-danger group-revoke-button" id="{{ eachAccess.requestId }}">Mark Revoked</button><br>
8171
{% endif %}
8272
</td>
8373
</tr>

0 commit comments

Comments
 (0)