Skip to content

Commit d7ae790

Browse files
PLUGINS-232 Adding Xsync Administrator role.
1 parent b9294b0 commit d7ae790

23 files changed

Lines changed: 512 additions & 199 deletions

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ dependencies {
124124
implementation "org.apache.httpcomponents:httpclient"
125125
implementation 'org.apache.httpcomponents:httpmime'
126126

127+
implementation "org.aspectj:aspectjweaver"
127128

128129
implementation "org.hibernate:hibernate-core"
129130

src/main/java/org/nrg/xsync/components/elements/ProjectSyncStatus.java

Lines changed: 42 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -7,121 +7,68 @@
77
import java.util.List;
88
import java.util.Map;
99

10+
import lombok.Getter;
11+
import lombok.Setter;
1012
import org.nrg.xsync.components.SyncStatusHolder.SyncType;
1113

1214
public class ProjectSyncStatus {
1315

14-
private boolean isSyncing;
15-
private SyncType syncType;
16-
private Date syncStartTime;
17-
private Date syncEndTime;
18-
private String currentSubject;
19-
private String currentExperiment;
20-
private String currentExperimentType;
21-
private long historyId;
22-
private Boolean wasSyncSuccessful;
23-
private final List<String> initialSubjectList = new ArrayList<>();
24-
private final List<String> completedSubjects = new ArrayList<>();
25-
private final List<String> failedSubjects = new ArrayList<>();
26-
private final Map<String,String> completedExperiments = new HashMap<>();
27-
private final Map<String,String> failedExperiments = new HashMap<>();
16+
private boolean isSyncing;
17+
@Setter
18+
@Getter
19+
private SyncType syncType;
20+
@Setter
21+
private Date syncStartTime;
22+
@Setter
23+
private Date syncEndTime;
24+
@Setter
25+
@Getter
26+
private String currentSubject;
27+
@Setter
28+
@Getter
29+
private String currentExperiment;
30+
@Setter
31+
@Getter
32+
private String currentExperimentType;
33+
@Setter
34+
@Getter
35+
private long historyId;
36+
@Getter
37+
private Boolean wasSyncSuccessful;
38+
@Getter
39+
private final List<String> initialSubjectList = new ArrayList<>();
40+
@Getter
41+
private final List<String> completedSubjects = new ArrayList<>();
42+
@Getter
43+
private final List<String> failedSubjects = new ArrayList<>();
44+
@Getter
45+
private final Map<String,String> completedExperiments = new HashMap<>();
46+
@Getter
47+
private final Map<String,String> failedExperiments = new HashMap<>();
2848
private static final SimpleDateFormat datef = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
2949

3050
public ProjectSyncStatus() {
3151
isSyncing = false;
3252
syncType = SyncType.NONE_SINCE_STARTUP;
3353
}
3454

35-
public boolean isSyncing() {
55+
public boolean getIsSyncing() {
3656
return isSyncing;
3757
}
38-
39-
public void setSyncing(boolean isSyncing) {
58+
59+
public void setIsSyncing(boolean isSyncing) {
4060
this.isSyncing = isSyncing;
4161
}
42-
43-
public SyncType getSyncType() {
44-
return syncType;
45-
}
46-
47-
public void setSyncType(SyncType syncType) {
48-
this.syncType = syncType;
49-
}
50-
51-
public String getSyncStartTime() {
52-
return (syncStartTime!=null) ? datef.format(syncStartTime) : null;
53-
}
5462

55-
public void setSyncStartTime(Date syncStartTime) {
56-
this.syncStartTime = syncStartTime;
63+
public String getSyncStartTime() {
64+
return (syncStartTime!=null) ? datef.format(syncStartTime) : null;
5765
}
5866

59-
public String getSyncEndTime() {
67+
public String getSyncEndTime() {
6068
return (syncEndTime!=null) ? datef.format(syncEndTime) : null;
6169
}
6270

63-
public void setSyncEndTime(Date syncEndTime) {
64-
this.syncEndTime = syncEndTime;
65-
}
66-
67-
public String getCurrentSubject() {
68-
return currentSubject;
69-
}
70-
71-
public void setCurrentSubject(String currentSubject) {
72-
this.currentSubject = currentSubject;
73-
}
74-
75-
public String getCurrentExperiment() {
76-
return currentExperiment;
77-
}
78-
79-
public void setCurrentExperiment(String currentExperiment) {
80-
this.currentExperiment = currentExperiment;
81-
}
82-
83-
public String getCurrentExperimentType() {
84-
return currentExperimentType;
85-
}
86-
87-
public void setCurrentExperimentType(String currentExperimentType) {
88-
this.currentExperimentType = currentExperimentType;
89-
}
90-
91-
public List<String> getInitialSubjectList() {
92-
return initialSubjectList;
93-
}
94-
95-
public List<String> getCompletedSubjects() {
96-
return completedSubjects;
97-
}
98-
99-
public List<String> getFailedSubjects() {
100-
return failedSubjects;
101-
}
102-
103-
public Map<String,String> getCompletedExperiments() {
104-
return completedExperiments;
105-
}
106-
107-
public Map<String,String> getFailedExperiments() {
108-
return failedExperiments;
109-
}
110-
111-
public long getHistoryId() {
112-
return historyId;
113-
}
114-
115-
public void setHistoryId(long historyId) {
116-
this.historyId = historyId;
117-
}
118-
119-
public Boolean getWasSyncSuccessful() {
120-
return this.wasSyncSuccessful;
121-
}
122-
123-
public void setWasSyncSuccessful(boolean wasSyncSuccessful) {
71+
public void setWasSyncSuccessful(boolean wasSyncSuccessful) {
12472
this.wasSyncSuccessful=wasSyncSuccessful;
12573
}
126-
127-
}
74+
}

src/main/java/org/nrg/xsync/configuration/XsyncPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737
@ComponentScan({
3838
"org.nrg.xsync.aspera",
3939
"org.nrg.xsync.components",
40+
"org.nrg.xsync.initialization.tasks",
4041
"org.nrg.xsync.scheduler",
42+
"org.nrg.xsync.security",
4143
"org.nrg.xsync.services",
4244
"org.nrg.xsync.services.local",
4345
"org.nrg.xsync.tools",
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.nrg.xsync.initialization.tasks;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.nrg.xdat.entities.UserRole;
5+
import org.nrg.xdat.security.XDATUser;
6+
import org.nrg.xdat.security.helpers.Users;
7+
import org.nrg.xdat.security.services.RoleHolder;
8+
import org.nrg.xft.schema.XFTManager;
9+
import org.nrg.xft.security.UserI;
10+
import org.nrg.xnat.initialization.tasks.AbstractInitializingTask;
11+
import org.nrg.xnat.initialization.tasks.InitializingTaskException;
12+
import org.nrg.xnat.services.XnatAppInfo;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
import org.springframework.stereotype.Component;
15+
import org.springframework.util.CollectionUtils;
16+
17+
import java.util.Collection;
18+
import java.util.Map;
19+
20+
@Component
21+
@Slf4j
22+
public class AssignXsyncAdministratorRoleToSiteAdminOnUpgrade extends AbstractInitializingTask {
23+
24+
@Autowired
25+
public AssignXsyncAdministratorRoleToSiteAdminOnUpgrade(XnatAppInfo appInfo, RoleHolder roleHolder) {
26+
super();
27+
this.appInfo = appInfo;
28+
this.roleHolder = roleHolder;
29+
}
30+
31+
@Override
32+
public String getTaskName() {
33+
return "AssignXsyncAdministratorRoleToSiteAdminOnUpgrade";
34+
}
35+
36+
@Override
37+
protected void callImpl() throws InitializingTaskException {
38+
if (!appInfo.isInitialized() || !XFTManager.isComplete()) {
39+
throw new InitializingTaskException(InitializingTaskException.Level.RequiresInitialization);
40+
}
41+
final Map<String, Collection<String>> rolesAndUsers = roleHolder.getRolesAndUsers();
42+
final Collection<String> allSiteAdmins = rolesAndUsers.get(UserRole.ROLE_ADMINISTRATOR);
43+
if (noUserIsAssignedXsyncAdministratorRole(rolesAndUsers)) {
44+
UserI adminUser = Users.getAdminUser();
45+
try {
46+
grantXsyncAdministratorRole(adminUser, allSiteAdmins);
47+
} catch (Exception e) {
48+
throw new InitializingTaskException(InitializingTaskException.Level.Error);
49+
}
50+
}
51+
}
52+
53+
private void grantXsyncAdministratorRole(final UserI adminUser, final Collection<String> allSiteAdmins) throws Exception {
54+
for (String userName : allSiteAdmins) {
55+
UserI user = Users.getUser(userName);
56+
if (user instanceof XDATUser) {
57+
if (user.isEnabled()) {
58+
if (!((XDATUser) user).checkRole(XSYNC_ADMINISTRATOR_ROLE)) {
59+
if (!roleHolder.addRole(adminUser, user, XSYNC_ADMINISTRATOR_ROLE)) {
60+
log.error("Could not assign user {} the " + XSYNC_ADMINISTRATOR_ROLE + " role.", userName);
61+
}
62+
}
63+
} else {
64+
log.error("User {} is not enabled. Could not assign the " + XSYNC_ADMINISTRATOR_ROLE + " role.", userName);
65+
}
66+
}
67+
}
68+
}
69+
70+
private boolean noUserIsAssignedXsyncAdministratorRole(final Map<String, Collection<String>> rolesAndUsers) {
71+
if (rolesAndUsers.containsKey(XSYNC_ADMINISTRATOR_ROLE)) {
72+
Collection<String> usersWithXsyncAdministrator = rolesAndUsers.get(XSYNC_ADMINISTRATOR_ROLE);
73+
return CollectionUtils.isEmpty(usersWithXsyncAdministrator);
74+
}
75+
return true;
76+
}
77+
78+
private final String XSYNC_ADMINISTRATOR_ROLE = "XsyncAdministrator";
79+
private final XnatAppInfo appInfo;
80+
private final RoleHolder roleHolder;
81+
}

src/main/java/org/nrg/xsync/remote/alias/services/SyncStatusService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public SyncStatusService(SyncStatusHolder statusHolder, SyncManifestService mani
2626

2727
public void registerSyncStart(String projectId, SyncType syncType, SyncManifest syncManifest) {
2828
final ProjectSyncStatus projectSyncStatus = _statusHolder.getProjectSyncStatus(projectId);
29-
projectSyncStatus.setSyncing(true);
29+
projectSyncStatus.setIsSyncing(true);
3030
if (syncManifest!=null) {
3131
projectSyncStatus.setSyncStartTime(syncManifest.getSync_start_time());
3232
} else {
@@ -46,7 +46,7 @@ public void registerSyncStart(String projectId, SyncType syncType, SyncManifest
4646

4747
public void registerSyncEnd(String projectId, SyncManifest syncManifest) {
4848
final ProjectSyncStatus projectSyncStatus = _statusHolder.getProjectSyncStatus(projectId);
49-
projectSyncStatus.setSyncing(false);
49+
projectSyncStatus.setIsSyncing(false);
5050
if (syncManifest!=null) {
5151
projectSyncStatus.setWasSyncSuccessful(syncManifest.wasSyncSuccessful());
5252
projectSyncStatus.setSyncEndTime(syncManifest.getSync_end_time());
@@ -98,7 +98,7 @@ public void registerFailedExperiment(String projectId, String expId, String expT
9898
}
9999

100100
public boolean isCurrentlySyncing(String projectId) {
101-
return _statusHolder.getProjectSyncStatus(projectId).isSyncing();
101+
return _statusHolder.getProjectSyncStatus(projectId).getIsSyncing();
102102
}
103103

104104
public ProjectSyncStatus getProjectSyncStatus(String projectId) {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.nrg.xsync.security;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.nrg.xapi.authorization.AbstractXapiAuthorization;
5+
import org.aspectj.lang.JoinPoint;
6+
import org.nrg.xdat.security.helpers.AccessLevel;
7+
import org.nrg.xdat.security.helpers.Roles;
8+
import org.nrg.xft.security.UserI;
9+
import org.nrg.xsync.utils.XsyncUtils;
10+
import org.springframework.stereotype.Component;
11+
12+
import javax.servlet.http.HttpServletRequest;
13+
14+
@Slf4j
15+
@Component
16+
public class XsyncAdministratorUserAuthorization extends AbstractXapiAuthorization {
17+
@Override
18+
protected boolean checkImpl(AccessLevel accessLevel, JoinPoint joinPoint, UserI user, HttpServletRequest request) {
19+
return Roles.checkRole(user, XsyncUtils.XSYNC_ADMINISTRATOR_ROLE);
20+
}
21+
22+
@Override
23+
protected boolean considerGuests() {
24+
return false;
25+
}
26+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.nrg.xsync.security;
2+
3+
import org.aspectj.lang.JoinPoint;
4+
import org.nrg.xapi.authorization.AbstractXapiAuthorization;
5+
import org.nrg.xdat.base.BaseElement;
6+
import org.nrg.xdat.om.XnatExperimentdata;
7+
import org.nrg.xdat.security.helpers.AccessLevel;
8+
import org.nrg.xdat.security.helpers.Permissions;
9+
import org.nrg.xdat.security.helpers.Roles;
10+
import org.nrg.xft.search.ItemSearch;
11+
import org.nrg.xft.security.UserI;
12+
import org.nrg.xsync.utils.XsyncUtils;
13+
14+
import javax.servlet.http.HttpServletRequest;
15+
16+
public class XsyncDeleteExperimentUserAuthorizer extends AbstractXapiAuthorization {
17+
//Experiment ID must be the first argument within the method signature for this to work correctly
18+
@Override
19+
protected boolean checkImpl(AccessLevel accessLevel, JoinPoint joinPoint, UserI user, HttpServletRequest request) {
20+
try {
21+
String experimentId = (String) joinPoint.getArgs()[0];
22+
XnatExperimentdata expData = XnatExperimentdata.getXnatExperimentdatasById(experimentId, user, false);
23+
return (Permissions.canDelete(user, expData) || Roles.checkRole(user, XsyncUtils.XSYNC_ADMINISTRATOR_ROLE));
24+
} catch (Exception e) {
25+
throw new RuntimeException(e);
26+
}
27+
}
28+
29+
@Override
30+
protected boolean considerGuests() {
31+
return false;
32+
}
33+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.nrg.xsync.security;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.aspectj.lang.JoinPoint;
5+
import org.nrg.xapi.authorization.AbstractXapiAuthorization;
6+
import org.nrg.xdat.om.XnatProjectdata;
7+
import org.nrg.xdat.security.helpers.AccessLevel;
8+
import org.nrg.xdat.security.helpers.Permissions;
9+
import org.nrg.xdat.security.helpers.Roles;
10+
import org.nrg.xft.security.UserI;
11+
import org.nrg.xsync.utils.XsyncUtils;
12+
import org.springframework.stereotype.Component;
13+
14+
import javax.servlet.http.HttpServletRequest;
15+
16+
@Slf4j
17+
@Component
18+
public class XsyncDeleteProjectUserAuthority extends AbstractXapiAuthorization {
19+
//Project ID must be the first argument within the method signature for this to work correctly
20+
@Override
21+
protected boolean checkImpl(AccessLevel accessLevel, JoinPoint joinPoint, UserI user, HttpServletRequest request) {
22+
try {
23+
String projectId = (String) joinPoint.getArgs()[0];
24+
return (Permissions.canDeleteProject(user, projectId) || Roles.checkRole(user, XsyncUtils.XSYNC_ADMINISTRATOR_ROLE));
25+
} catch (Exception e) {
26+
throw new RuntimeException(e);
27+
}
28+
}
29+
30+
@Override
31+
protected boolean considerGuests() {
32+
return false;
33+
}
34+
}

0 commit comments

Comments
 (0)