Skip to content
136 changes: 136 additions & 0 deletions src/prerna/auth/utils/AbstractSecurityUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
import prerna.engine.api.IHeadersDataRow;
import prerna.engine.api.IRDBMSEngine;
import prerna.engine.api.IRawSelectWrapper;
import prerna.project.api.IProject;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.filters.SimpleQueryFilter;
import prerna.query.querystruct.selectors.QueryColumnSelector;
Expand Down Expand Up @@ -100,6 +101,16 @@ public abstract class AbstractSecurityUtils {
static boolean adminOnlyProjectAddAccess = false;
static boolean adminOnlyProjectSetPublic = false;
static boolean adminOnlyProjectSetDiscoverable = false;
static boolean adminOnlyWorkspaceAdd = false;
static boolean adminOnlyWorkspaceDelete = false;
static boolean adminOnlyWorkspaceAddAccess = false;
static boolean adminOnlyWorkspaceSetPublic = false;
static boolean adminOnlyWorkspaceSetDiscoverable = false;
static boolean adminOnlySkillAdd = false;
static boolean adminOnlySkillDelete = false;
static boolean adminOnlySkillAddAccess = false;
static boolean adminOnlySkillSetPublic = false;
static boolean adminOnlySkillSetDiscoverable = false;

static boolean adminOnlyDatabaseAdd = false;
static boolean adminOnlyDatabaseDelete = false;
Expand Down Expand Up @@ -211,6 +222,16 @@ public static void loadSecurityDatabase() throws Exception {
adminOnlyProjectAddAccess = Utility.getApplicationAdminOnlyProjectAddAccess();
adminOnlyProjectSetPublic = Utility.getApplicationAdminOnlyProjectSetPublic();
adminOnlyProjectSetDiscoverable = Utility.getApplicationAdminOnlyProjectSetDiscoverable();
adminOnlyWorkspaceAdd = Utility.getApplicationAdminOnlyWorkspaceAdd();
adminOnlyWorkspaceDelete = Utility.getApplicationAdminOnlyWorkspaceDelete();
adminOnlyWorkspaceAddAccess = Utility.getApplicationAdminOnlyWorkspaceAddAccess();
adminOnlyWorkspaceSetPublic = Utility.getApplicationAdminOnlyWorkspaceSetPublic();
adminOnlyWorkspaceSetDiscoverable = Utility.getApplicationAdminOnlyWorkspaceSetDiscoverable();
adminOnlySkillAdd = Utility.getApplicationAdminOnlySkillAdd();
adminOnlySkillDelete = Utility.getApplicationAdminOnlySkillDelete();
adminOnlySkillAddAccess = Utility.getApplicationAdminOnlySkillAddAccess();
adminOnlySkillSetPublic = Utility.getApplicationAdminOnlySkillSetPublic();
adminOnlySkillSetDiscoverable = Utility.getApplicationAdminOnlySkillSetDiscoverable();

adminOnlyDatabaseAdd = Utility.getApplicationAdminOnlyDbAdd();
adminOnlyDatabaseDelete = Utility.getApplicationAdminOnlyDbDelete();
Expand Down Expand Up @@ -275,22 +296,137 @@ public static boolean adminOnlyProjectAdd() {
return adminOnlyProjectAdd;
}

public static boolean adminOnlyProjectAdd(IProject.PROJECT_TYPE type) {
if (IProject.PROJECT_TYPE.WORKSPACE == type) {
return adminOnlyWorkspaceAdd;
} else if (IProject.PROJECT_TYPE.SKILL == type) {
return adminOnlySkillAdd;
}
return adminOnlyProjectAdd;
}

public static boolean adminOnlyProjectDelete() {
return adminOnlyProjectDelete;
}

public static boolean adminOnlyProjectDelete(String projectId) {
return adminOnlyProjectDelete(getProjectTypeForAdminOnly(projectId));
}

public static boolean adminOnlyProjectDelete(IProject.PROJECT_TYPE type) {
if (IProject.PROJECT_TYPE.WORKSPACE == type) {
return adminOnlyWorkspaceDelete;
} else if (IProject.PROJECT_TYPE.SKILL == type) {
return adminOnlySkillDelete;
}
return adminOnlyProjectDelete;
}

public static boolean adminOnlyProjectAddAccess() {
return adminOnlyProjectAddAccess;
}

public static boolean adminOnlyProjectAddAccess(String projectId) {
return adminOnlyProjectAddAccess(getProjectTypeForAdminOnly(projectId));
}

public static boolean adminOnlyProjectAddAccess(IProject.PROJECT_TYPE type) {
if (IProject.PROJECT_TYPE.WORKSPACE == type) {
return adminOnlyWorkspaceAddAccess;
} else if (IProject.PROJECT_TYPE.SKILL == type) {
return adminOnlySkillAddAccess;
}
return adminOnlyProjectAddAccess;
}

public static boolean adminOnlyProjectSetPublic() {
return adminOnlyProjectSetPublic;
}

public static boolean adminOnlyProjectSetPublic(String projectId) {
return adminOnlyProjectSetPublic(getProjectTypeForAdminOnly(projectId));
}

public static boolean adminOnlyProjectSetPublic(IProject.PROJECT_TYPE type) {
if (IProject.PROJECT_TYPE.WORKSPACE == type) {
return adminOnlyWorkspaceSetPublic;
} else if (IProject.PROJECT_TYPE.SKILL == type) {
return adminOnlySkillSetPublic;
}
return adminOnlyProjectSetPublic;
}

public static boolean adminOnlyProjectSetDiscoverable() {
return adminOnlyProjectSetDiscoverable;
}

public static boolean adminOnlyProjectSetDiscoverable(String projectId) {
return adminOnlyProjectSetDiscoverable(getProjectTypeForAdminOnly(projectId));
}

public static boolean adminOnlyProjectSetDiscoverable(IProject.PROJECT_TYPE type) {
if (IProject.PROJECT_TYPE.WORKSPACE == type) {
return adminOnlyWorkspaceSetDiscoverable;
} else if (IProject.PROJECT_TYPE.SKILL == type) {
return adminOnlySkillSetDiscoverable;
}
return adminOnlyProjectSetDiscoverable;
}

public static boolean adminOnlyWorkspaceAdd() {
return adminOnlyWorkspaceAdd;
}

public static boolean adminOnlyWorkspaceDelete() {
return adminOnlyWorkspaceDelete;
}

public static boolean adminOnlyWorkspaceAddAccess() {
return adminOnlyWorkspaceAddAccess;
}

public static boolean adminOnlyWorkspaceSetPublic() {
return adminOnlyWorkspaceSetPublic;
}

public static boolean adminOnlyWorkspaceSetDiscoverable() {
return adminOnlyWorkspaceSetDiscoverable;
}

public static boolean adminOnlySkillAdd() {
return adminOnlySkillAdd;
}

public static boolean adminOnlySkillDelete() {
return adminOnlySkillDelete;
}

public static boolean adminOnlySkillAddAccess() {
return adminOnlySkillAddAccess;
}

public static boolean adminOnlySkillSetPublic() {
return adminOnlySkillSetPublic;
}

public static boolean adminOnlySkillSetDiscoverable() {
return adminOnlySkillSetDiscoverable;
}

private static IProject.PROJECT_TYPE getProjectTypeForAdminOnly(String projectId) {
String projectType = SecurityProjectUtils.getProjectTypeForId(projectId);
if (projectType == null || projectType.trim().isEmpty()) {
return IProject.PROJECT_TYPE.INSIGHTS;
}
try {
return IProject.PROJECT_TYPE.valueOf(projectType.trim());
} catch (IllegalArgumentException e) {
classLogger.warn("Unknown project type '{}' for project {}; applying project admin limits", projectType,
projectId);
return IProject.PROJECT_TYPE.INSIGHTS;
}
}

public static boolean adminOnlyDatabaseAdd() {
return adminOnlyDatabaseAdd;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public NounMetadata execute() {
"Workspace " + workspaceId + " is a built-in system agent and cannot be deleted");
}

if (AbstractSecurityUtils.adminOnlyProjectDelete()) {
if (AbstractSecurityUtils.adminOnlyWorkspaceDelete()) {
throwFunctionalityOnlyExposedForAdminsError();
}

Expand Down
2 changes: 1 addition & 1 deletion src/prerna/project/impl/ProjectHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public static IProject generateNewProject(String projectId, String projectName,
AbstractReactor.throwUserNotPublisherError();
}

if (AbstractSecurityUtils.adminOnlyProjectAdd() && !SecurityAdminUtils.userIsAdmin(user)) {
if (AbstractSecurityUtils.adminOnlyProjectAdd(projectType) && !SecurityAdminUtils.userIsAdmin(user)) {
AbstractReactor.throwFunctionalityOnlyExposedForAdminsError();
}

Expand Down
2 changes: 1 addition & 1 deletion src/prerna/reactor/agent/skill/DeleteSkillReactor.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public NounMetadata execute() {
throw new IllegalArgumentException("skillId is required");
}

if (AbstractSecurityUtils.adminOnlyProjectDelete()) {
if (AbstractSecurityUtils.adminOnlySkillDelete()) {
throwFunctionalityOnlyExposedForAdminsError();
}

Expand Down
33 changes: 19 additions & 14 deletions src/prerna/reactor/project/UploadProjectAppReactor.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,17 +123,6 @@ public NounMetadata execute() {
throwUserNotPublisherError();
}

if (AbstractSecurityUtils.adminOnlyProjectAdd() && !SecurityAdminUtils.userIsAdmin(user)) {
AbstractReactor.throwFunctionalityOnlyExposedForAdminsError();
}

if (global && (AbstractSecurityUtils.adminOnlyProjectSetPublic() && !SecurityAdminUtils.userIsAdmin(user))) {
SemossPixelException exception = new SemossPixelException(
NounMetadata.getErrorNounMessage("User can upload an app but cannot make the app public"));
exception.setContinueThreadOfExecution(false);
throw exception;
}

// creating a temp folder to unzip project folder and smss
String randomIdAsDir = UUID.randomUUID().toString();
String randomTempUnzipFolderPath = this.insight.getInsightFolder() + DIR_SEPARATOR + randomIdAsDir;
Expand All @@ -144,6 +133,7 @@ public NounMetadata execute() {
List<String> fileList = new ArrayList<>();
String smssFileLoc = null;
File smssFile = null;
Properties projectProperties = null;
// unzip files to temp project folder
boolean error = false;
try {
Expand Down Expand Up @@ -174,6 +164,21 @@ public NounMetadata execute() {
if (smssFileLoc == null) {
throw new SemossPixelException("Unable to find " + Constants.SEMOSS_EXTENSION + " file", false);
}

projectProperties = Utility.loadProperties(smssFileLoc);
String projectTypeString = projectProperties.getProperty(Constants.PROJECT_ENUM_TYPE);
IProject.PROJECT_TYPE projectType = projectTypeString == null ? IProject.PROJECT_TYPE.INSIGHTS
: IProject.PROJECT_TYPE.valueOf(projectTypeString.trim());
if (AbstractSecurityUtils.adminOnlyProjectAdd(projectType) && !SecurityAdminUtils.userIsAdmin(user)) {
AbstractReactor.throwFunctionalityOnlyExposedForAdminsError();
}
if (global && AbstractSecurityUtils.adminOnlyProjectSetPublic(projectType)
&& !SecurityAdminUtils.userIsAdmin(user)) {
SemossPixelException exception = new SemossPixelException(
NounMetadata.getErrorNounMessage("User can upload an app but cannot make the app public"));
exception.setContinueThreadOfExecution(false);
throw exception;
}
} catch (SemossPixelException e) {
error = true;
throw e;
Expand All @@ -200,7 +205,7 @@ public NounMetadata execute() {
boolean projectAddedToDIHelper = false;
try {
logger.info(step + ") Reading smss");
Properties prop = Utility.loadProperties(smssFileLoc);
Properties prop = projectProperties;
projectId = prop.getProperty(Constants.PROJECT);
projectName = Utility.normalizePath(prop.getProperty(Constants.PROJECT_ALIAS));

Expand Down Expand Up @@ -406,7 +411,7 @@ protected boolean deleteIfExisting() {
}

/**
*
*
* @param fileToDelete
*/
private void cleanUpFolders(File... fileToDelete) {
Expand Down Expand Up @@ -445,4 +450,4 @@ protected String getDescriptionForKey(String key) {
return super.getDescriptionForKey(key);
}

}
}
29 changes: 17 additions & 12 deletions src/prerna/reactor/project/UploadProjectReactor.java
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,6 @@ public NounMetadata execute() {
throwUserNotPublisherError();
}

if (AbstractSecurityUtils.adminOnlyProjectAdd() && !SecurityAdminUtils.userIsAdmin(user)) {
AbstractReactor.throwFunctionalityOnlyExposedForAdminsError();
}

if (global && (AbstractSecurityUtils.adminOnlyProjectSetPublic() && !SecurityAdminUtils.userIsAdmin(user))) {
SemossPixelException exception = new SemossPixelException(
NounMetadata.getErrorNounMessage("User can upload a project but cannot make the project public"));
exception.setContinueThreadOfExecution(false);
throw exception;
}

// creating a temp folder to unzip project folder and smss
String randomIdAsDir = UUID.randomUUID().toString();
String projectFolderPath = DIHelper.getInstance().getProperty(Constants.BASE_FOLDER) + DIR_SEPARATOR
Expand All @@ -131,6 +120,7 @@ public NounMetadata execute() {
List<String> fileList = new ArrayList<>();
String smssFileLoc = null;
File smssFile = null;
Properties projectProperties = null;
// unzip files to temp project folder
boolean error = false;
try {
Expand Down Expand Up @@ -161,6 +151,21 @@ public NounMetadata execute() {
if (smssFileLoc == null) {
throw new SemossPixelException("Unable to find " + Constants.SEMOSS_EXTENSION + " file", false);
}

projectProperties = Utility.loadProperties(smssFileLoc);
String projectTypeString = projectProperties.getProperty(Constants.PROJECT_ENUM_TYPE);
IProject.PROJECT_TYPE projectType = projectTypeString == null ? IProject.PROJECT_TYPE.INSIGHTS
: IProject.PROJECT_TYPE.valueOf(projectTypeString.trim());
if (AbstractSecurityUtils.adminOnlyProjectAdd(projectType) && !SecurityAdminUtils.userIsAdmin(user)) {
AbstractReactor.throwFunctionalityOnlyExposedForAdminsError();
}
if (global && AbstractSecurityUtils.adminOnlyProjectSetPublic(projectType)
&& !SecurityAdminUtils.userIsAdmin(user)) {
SemossPixelException exception = new SemossPixelException(NounMetadata
.getErrorNounMessage("User can upload a project but cannot make the project public"));
exception.setContinueThreadOfExecution(false);
throw exception;
}
} catch (SemossPixelException e) {
error = true;
throw e;
Expand All @@ -183,7 +188,7 @@ public NounMetadata execute() {
boolean projectAddedToDIHelper = false;
try {
logger.info("{}) Reading smss", step);
Properties prop = Utility.loadProperties(smssFileLoc);
Properties prop = projectProperties;
projectId = prop.getProperty(Constants.PROJECT);
projectName = prop.getProperty(Constants.PROJECT_ALIAS);

Expand Down
2 changes: 1 addition & 1 deletion src/prerna/reactor/utils/DeleteProjectReactor.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public NounMetadata execute() {
projectId = SecurityProjectUtils.testUserProjectIdForAlias(this.insight.getUser(), projectId);
boolean isAdmin = SecurityAdminUtils.userIsAdmin(user);
if (!isAdmin) {
if (AbstractSecurityUtils.adminOnlyProjectDelete()) {
if (AbstractSecurityUtils.adminOnlyProjectDelete(projectId)) {
throwFunctionalityOnlyExposedForAdminsError();
}

Expand Down
10 changes: 10 additions & 0 deletions src/prerna/util/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,16 @@ public class Constants {
public static final String ADMIN_ONLY_PROJECT_ADD_ACCESS = "ADMIN_ONLY_PROJECT_ADD_ACCESS";
public static final String ADMIN_ONLY_PROJECT_SET_PUBLIC = "ADMIN_ONLY_PROJECT_SET_PUBLIC";
public static final String ADMIN_ONLY_PROJECT_SET_DISCOVERABLE = "ADMIN_ONLY_PROJECT_SET_DISCOVERABLE";
public static final String ADMIN_ONLY_WORKSPACE_ADD = "ADMIN_ONLY_WORKSPACE_ADD";
public static final String ADMIN_ONLY_WORKSPACE_DELETE = "ADMIN_ONLY_WORKSPACE_DELETE";
public static final String ADMIN_ONLY_WORKSPACE_ADD_ACCESS = "ADMIN_ONLY_WORKSPACE_ADD_ACCESS";
public static final String ADMIN_ONLY_WORKSPACE_SET_PUBLIC = "ADMIN_ONLY_WORKSPACE_SET_PUBLIC";
public static final String ADMIN_ONLY_WORKSPACE_SET_DISCOVERABLE = "ADMIN_ONLY_WORKSPACE_SET_DISCOVERABLE";
public static final String ADMIN_ONLY_SKILL_ADD = "ADMIN_ONLY_SKILL_ADD";
public static final String ADMIN_ONLY_SKILL_DELETE = "ADMIN_ONLY_SKILL_DELETE";
public static final String ADMIN_ONLY_SKILL_ADD_ACCESS = "ADMIN_ONLY_SKILL_ADD_ACCESS";
public static final String ADMIN_ONLY_SKILL_SET_PUBLIC = "ADMIN_ONLY_SKILL_SET_PUBLIC";
public static final String ADMIN_ONLY_SKILL_SET_DISCOVERABLE = "ADMIN_ONLY_SKILL_SET_DISCOVERABLE";

public static final String ADMIN_ONLY_DB_ADD = "ADMIN_ONLY_DB_ADD";
public static final String ADMIN_ONLY_DB_DELETE = "ADMIN_ONLY_DB_DELETE";
Expand Down
Loading
Loading