import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.HexFormat;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import edu.internet2.middleware.grouper.Group;
import edu.internet2.middleware.grouper.GroupFinder;
import edu.internet2.middleware.grouper.GroupSave;
import edu.internet2.middleware.grouper.GrouperSession;
import edu.internet2.middleware.grouper.SubjectFinder;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateConfig;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateDecorateForUiInput;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateInputConfigAndValue;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateOutput;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateRuntime;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2input;
import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2output;
import edu.internet2.middleware.grouper.exception.GrouperSessionException;
import edu.internet2.middleware.grouper.ldap.LdapAttribute;
import edu.internet2.middleware.grouper.ldap.LdapEntry;
import edu.internet2.middleware.grouper.ldap.LdapModificationItem;
import edu.internet2.middleware.grouper.ldap.LdapModificationType;
import edu.internet2.middleware.grouper.ldap.LdapSessionUtils;
import edu.internet2.middleware.grouper.misc.GrouperSessionHandler;
import edu.internet2.middleware.grouper.privs.AccessPrivilege;
import edu.internet2.middleware.grouper.util.GrouperUtil;
import edu.internet2.middleware.grouperClient.collections.MultiKey;
import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess;
import edu.internet2.middleware.subject.Subject;
public class Test76ssoCoarseGrainedConfig extends GshTemplateV2 {
@Override
public void decorateTemplateForUiDisplay(
GshTemplateDecorateForUiInput gshTemplateDecorateForUiInput) {
String stemName = gshTemplateDecorateForUiInput.getOwnerStemName();
boolean prod = StringUtils.equals(stemName, "penn:isc:ts:iam:weblogin:service:templates:idpRegistrationProd");
if (!stemName.equals("penn:isc:ts:iam:weblogin:service:templates:idpRegistrationStage")
&& !stemName.equals("penn:isc:ts:iam:weblogin:service:templates:idpRegistrationProd")) {
throw new RuntimeException("Invalid owner folder, should start with: 'penn:isc:ts:iam:weblogin:service:templates:' and be prod or stage");
}
String adminGroupName = "penn:isc:ts:iam:weblogin:service:policy:idpFrontDoorStaging:security:idpFrontDoorStagingUpdaters";
// ssoFrontDoor_shibdev2_access_admins
String managerFolderPrefix = "penn:isc:ts:iam:weblogin:service:policy:idpFrontDoorStaging:service:policy:managers:";
String tableName = "sso_stage_entity_front_door";
if (prod) {
tableName = "sso_prod_entity_front_door";
adminGroupName = "penn:isc:ts:iam:weblogin:service:policy:idpFrontDoorProd:security:idpFrontDoorProdUpdaters";
managerFolderPrefix = "penn:isc:ts:iam:weblogin:service:policy:idpFrontDoorProd:service:policy:managers:";
}
Group adminGroup = GroupFinder.findByName(adminGroupName, true);
boolean isAdmin = adminGroup.hasMember(gshTemplateDecorateForUiInput.getCurrentSubject());
Map<String, GshTemplateInputConfigAndValue> gshTemplateInputConfigAndValues = gshTemplateDecorateForUiInput.getGshTemplateInputConfigAndValues();
GshTemplateInputConfigAndValue action = gshTemplateInputConfigAndValues.get("gsh_input_action");
GshTemplateInputConfigAndValue entityIdInput = gshTemplateInputConfigAndValues.get("gsh_input_entityId");
GshTemplateInputConfigAndValue nameInput = gshTemplateInputConfigAndValues.get("gsh_input_name");
GshTemplateInputConfigAndValue descriptionInput = gshTemplateInputConfigAndValues.get("gsh_input_description");
GshTemplateInputConfigAndValue adminsInput = gshTemplateInputConfigAndValues.get("gsh_input_admins");
GshTemplateInputConfigAndValue ownersInput = gshTemplateInputConfigAndValues.get("gsh_input_owners");
GshTemplateInputConfigAndValue frontDoorPolicyInput = gshTemplateInputConfigAndValues.get("gsh_input_frontDoorPolicy");
GshTemplateInputConfigAndValue urlInput = gshTemplateInputConfigAndValues.get("gsh_input_url");
GshTemplateInputConfigAndValue urlInstructionsInput = gshTemplateInputConfigAndValues.get("gsh_input_urlInstructions");
GshTemplateInputConfigAndValue requiresTwoStepInput = gshTemplateInputConfigAndValues.get("gsh_input_requiresTwostep");
GshTemplateInputConfigAndValue errorPageTypeInput = gshTemplateInputConfigAndValues.get("gsh_input_errorPageType");
GshTemplateInputConfigAndValue errorPageUrlInput = gshTemplateInputConfigAndValues.get("gsh_input_errorPageUrl");
GshTemplateInputConfigAndValue errorPageTextInput = gshTemplateInputConfigAndValues.get("gsh_input_errorPageText");
GshTemplateInputConfigAndValue policyGroupNameInput = gshTemplateInputConfigAndValues.get("gsh_input_policyGroupName");
if (StringUtils.equals(action.getValue(), "add")) {
List<String> entityIds = new GcDbAccess().sql("select entity_id from sso_prod_entity_id spei where not exists (select 1 from " + tableName + " sefd where sefd.entity_id = spei.entity_id) order by 1").selectList(String.class);
List<MultiKey> keysAndValues = new ArrayList<MultiKey>();
keysAndValues.add(new MultiKey("", ""));
for (String entityId : entityIds) {
keysAndValues.add(new MultiKey(entityId, entityId));
}
entityIdInput.getGshTemplateInputConfig().setDropdownKeysAndLabels(keysAndValues);
} else if (StringUtils.equals(action.getValue(), "delete") || StringUtils.equals(action.getValue(), "edit")) {
List<String> entityIds = null;
if (isAdmin) {
entityIds = new GcDbAccess().sql("select entity_id from " + tableName + " order by 1").selectList(String.class);
} else {
entityIds = new GcDbAccess().sql(String.format("""
select entity_id from %s stefd
WHERE EXISTS (SELECT 1 FROM GROUPER_MEMBERSHIPS_LW_V gmlv
WHERE gmlv.SUBJECT_ID = ?
AND gmlv.SUBJECT_SOURCE = 'pennperson'
AND gmlv.LIST_NAME = 'members'
AND gmlv.GROUP_NAME = '%sssoFrontDoor_'
|| stefd.name_without_special_characters || '_admins') order by 1
""", tableName, managerFolderPrefix)).addBindVar(gshTemplateDecorateForUiInput.getCurrentSubject().getId()).selectList(String.class);
}
List<MultiKey> keysAndValues = new ArrayList<MultiKey>();
keysAndValues.add(new MultiKey("", ""));
for (String entityId : entityIds) {
keysAndValues.add(new MultiKey(entityId, entityId));
}
entityIdInput.getGshTemplateInputConfig().setDropdownKeysAndLabels(keysAndValues);
}
// gsh_input_action
// gsh_input_entityId
// gsh_input_name
// gsh_input_description
// gsh_input_admins
// gsh_input_owners
// gsh_input_frontDoorPolicy
// gsh_input_url
// gsh_input_urlInstructions
// gsh_input_requiresTwostep
if (StringUtils.equals(gshTemplateDecorateForUiInput.getEventConfigId(), "gsh_input_action")) {
if (entityIdInput != null) {
entityIdInput.setValue(null);
}
}
if (StringUtils.equals(gshTemplateDecorateForUiInput.getEventConfigId(), "gsh_input_action")
|| (entityIdInput != null && StringUtils.isBlank(entityIdInput.getValue()))
|| (StringUtils.equals(gshTemplateDecorateForUiInput.getEventConfigId(), "gsh_input_entityId")
&& StringUtils.equals(action.getValue(), "add"))) {
if (nameInput != null) {
nameInput.setValue(null);
}
if (descriptionInput != null) {
descriptionInput.setValue(null);
}
if (adminsInput != null) {
adminsInput.setValue(null);
}
if (ownersInput != null) {
ownersInput.setValue(null);
}
if (frontDoorPolicyInput != null) {
frontDoorPolicyInput.setValue(null);
}
if (urlInput != null) {
urlInput.setValue(null);
}
if (urlInstructionsInput != null) {
urlInstructionsInput.setValue(null);
}
if (requiresTwoStepInput != null) {
requiresTwoStepInput.setValue(null);
}
if (errorPageTypeInput != null) {
errorPageTypeInput.setValue(null);
}
if (errorPageUrlInput != null) {
errorPageUrlInput.setValue(null);
}
if (errorPageTextInput != null) {
errorPageTextInput.setValue(null);
}
if (policyGroupNameInput != null) {
policyGroupNameInput.setValue(null);
}
}
if (StringUtils.equals(gshTemplateDecorateForUiInput.getEventConfigId(), "gsh_input_entityId")
&& StringUtils.equals(action.getValue(), "edit") && entityIdInput != null && !StringUtils.isBlank(entityIdInput.getValue())) {
String entityId = entityIdInput.getValue();
Object[] dataRow = new GcDbAccess().sql("select name_without_special_characters, name, description, url, url_instructions, "
+ "coarse_grained_policy, requires_twostep, error_page_type, error_page_url, error_page_text, front_door_policy_group from " + tableName + " where entity_id = ?").addBindVar(entityId).
select(Object[].class);
String nameWithoutSpecialCharacters = (String)dataRow[0];
String name = (String)dataRow[1];
String description = (String)dataRow[2];
String url = (String)dataRow[3];
String urlInstructions = (String)dataRow[4];
String coarseGrainedPolicy = (String)dataRow[5];
String requiresTwostep = (String)dataRow[6];
String errorPageType = (String)dataRow[7];
String errorPageUrl = (String)dataRow[8];
String errorPageText = (String)dataRow[9];
String policyFrontDoorGroup = (String)dataRow[10];
nameInput.setValue(name);
descriptionInput.setValue(description);
urlInput.setValue(url);
urlInstructionsInput.setValue(urlInstructions);
frontDoorPolicyInput.setValue(coarseGrainedPolicy);
requiresTwoStepInput.setValue(GrouperUtil.booleanValue(requiresTwostep, false) ? "true" : "false");
errorPageTypeInput.setValue(errorPageType);
errorPageUrlInput.setValue(errorPageUrl);
errorPageTextInput.setValue(errorPageText);
policyGroupNameInput.setValue(policyFrontDoorGroup);
}
}
Map<String, String> bucketLabelToGroupName = GrouperUtil.toMap(
"workforceInTwoStep", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:employeesInTwoStep",
"workforce", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpWorkforce",
"memberInTwoStep", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:memberInTwoStep",
"member", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:member",
"affiliateInTwoStep", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpAffiliateInTwoStep",
"affiliate", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpAffiliate",
"affiliateOrAlumInTwoStep", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpAffiliateOrAlumInTwoStep",
"affiliateOrAlum", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpAffiliateOrAlum",
"inTwoStep", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:enrolledInTwoStep",
"recentAffiliateInTwoStep", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpRecentAffiliateInTwoStep",
"recentAffiliate", "penn:isc:ts:iam:weblogin:service:policy:idpCoarseGrained:idpRecentAffiliate",
"none", "none");
public void convertListOfSubjectStringsToSubjects(String inputName, String subjectsString, Set<Subject> subjects, GshTemplateOutput gsh_builtin_gshTemplateOutput) {
Set<String> subjectStringSet = GrouperUtil.splitTrimToSet(subjectsString, ",");
for (String subjectString : subjectStringSet) {
if (subjectString.contains(":")) {
Group group = GroupFinder.findByName(subjectString, false);
if (group == null) {
gsh_builtin_gshTemplateOutput.addValidationLine(inputName, "Cannot find group: '" + subjectString + "'");
} else {
subjects.add(group.toSubject());
}
} else {
Subject subject = SubjectFinder.findByIdOrIdentifierAndSource(subjectString, "pennperson", false);
if (subject == null) {
gsh_builtin_gshTemplateOutput.addValidationLine(inputName, "Cannot find person: '" + subjectString + "'");
} else {
subjects.add(subject);
}
}
}
}
/**
* TODO remove after upgrade
* encrypt a message to SHA
* @param plaintext
* @return the hash
*/
public synchronized String encryptShaHex(String plaintext) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA"); //step 2
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
try {
md.update(plaintext.getBytes("UTF-8")); //step 3
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
byte[] raw = md.digest(); //step 4
String hex = HexFormat.of().formatHex(raw);
return hex; //step 6
}
public void createLdapModificationItem(List<LdapModificationItem> ldapModificationItems, String attributeName, String oldValue, String newValue) {
if (StringUtils.isBlank(oldValue)) {
ldapModificationItems.add(new LdapModificationItem(LdapModificationType.ADD_ATTRIBUTE, new LdapAttribute(attributeName, newValue)));
} else if (StringUtils.isBlank(newValue)) {
ldapModificationItems.add(new LdapModificationItem(LdapModificationType.REMOVE_ATTRIBUTE, new LdapAttribute(attributeName)));
} else {
ldapModificationItems.add(new LdapModificationItem(LdapModificationType.REPLACE_ATTRIBUTE, new LdapAttribute(attributeName, newValue)));
}
}
@Override
public void gshRunLogic(GshTemplateV2input gshTemplateV2input, GshTemplateV2output gshTemplateV2output) {
Subject subjectLoggedIn = gshTemplateV2input.getGsh_builtin_gshTemplateRuntime().getCurrentSubject();
// Analyze user access, Analyze user history, Analyze application
String gsh_input_action = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_action");
String gsh_input_entityId = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_entityId");
String gsh_input_name = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_name");
String gsh_input_description = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_description");
String gsh_input_admins = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_admins");
String gsh_input_owners = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_owners");
String gsh_input_frontDoorPolicy = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_frontDoorPolicy");
String gsh_input_url = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_url");
String gsh_input_urlInstructions = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_urlInstructions");
boolean gsh_input_requiresTwostep = gshTemplateV2input.getGsh_builtin_inputBoolean("gsh_input_requiresTwostep");
String gsh_input_errorPageType = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_errorPageType");
String gsh_input_errorPageText = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_errorPageText");
String gsh_input_errorPageUrl = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_errorPageUrl");
String gsh_input_policyGroupName = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_policyGroupName");
String stemName = gshTemplateV2input.getGsh_builtin_ownerStemName();
boolean prod = StringUtils.equals(stemName, "penn:isc:ts:iam:weblogin:service:templates:idpRegistrationProd");
if (!stemName.startsWith("penn:isc:ts:iam:weblogin:service:templates:")) {
throw new RuntimeException("Invalid owner folder, should start with: 'penn:isc:ts:iam:weblogin:service:templates:'");
}
String adminGroupName = "penn:isc:ts:iam:weblogin:service:policy:idpFrontDoorStaging:security:idpFrontDoorStagingUpdaters";
String tableName = "sso_stage_entity_front_door";
String ldapConnection = "iamLdapStagingApplications";
String pennGroupsFolderExtension = "idpFrontDoorStaging";
String canRunTemplateGroupName = "penn:isc:ts:iam:weblogin:service:security:canRunIdpTemplateStage";
if (prod) {
tableName = "sso_prod_entity_front_door";
ldapConnection = "iamLdapProdApplications";
pennGroupsFolderExtension = "idpFrontDoorProd";
canRunTemplateGroupName = "penn:isc:ts:iam:weblogin:service:security:canRunIdpTemplate";
adminGroupName = "penn:isc:ts:iam:weblogin:service:policy:idpFrontDoorProd:security:idpFrontDoorProdUpdaters";
}
GshTemplateOutput gsh_builtin_gshTemplateOutput = gshTemplateV2output.getGsh_builtin_gshTemplateOutput();
gsh_builtin_gshTemplateOutput.assignRedirectToGrouperOperation("NONE");
Group adminGroup = GroupFinder.findByName(adminGroupName, true);
boolean isAdmin = adminGroup.hasMember(subjectLoggedIn);
String inputPolicyGroupEntitlement = null;
if (!StringUtils.isBlank(gsh_input_policyGroupName)) {
Group policyGroup = GroupFinder.findByName(gsh_input_policyGroupName, false);
if (policyGroup == null) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_policyGroupName", "Policy group '" + gsh_input_policyGroupName + "' not found, make sure to copy/paste the ID path");
return;
}
inputPolicyGroupEntitlement = "urn:mace:upenn.edu:" + gsh_input_policyGroupName;
}
boolean actionAdd = StringUtils.equals("add", gsh_input_action);
if (actionAdd && !isAdmin) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_action", "You are not allowed to add front door configurations, please use the remedy tile to request a configuration");
return;
}
boolean actionEdit = StringUtils.equals("edit", gsh_input_action);
boolean actionDelete = StringUtils.equals("delete", gsh_input_action);
if (!actionAdd && !actionDelete && !actionEdit) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_action", "Action not implemented yet, just add for now");
return;
}
if (StringUtils.equals(gsh_input_errorPageType, "customized") && StringUtils.isBlank(gsh_input_errorPageText)) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_errorPageText", "Error page text is required");
return;
}
if (StringUtils.equals(gsh_input_errorPageType, "other_url") && StringUtils.isBlank(gsh_input_errorPageUrl)) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_errorPageUrl", "Error page URL is required");
return;
}
if (!StringUtils.equals(gsh_input_errorPageType, "other_url") && !StringUtils.isBlank(gsh_input_errorPageUrl)) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_errorPageUrl", "Error page URL must be blank if the error page type is not 'other_url'");
return;
}
if (!StringUtils.equals(gsh_input_errorPageType, "customized") && !StringUtils.isBlank(gsh_input_errorPageText)) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_errorPageText", "Error page text must be blank if the error page type is not 'custommized'");
return;
}
String entityIdShaHex = encryptShaHex(gsh_input_entityId);
String nameWithoutSpecialCharacters = gsh_input_name == null ? null : gsh_input_name.replaceAll("[^A-Za-z0-9_-]", "_");
if (actionEdit || actionDelete) {
nameWithoutSpecialCharacters = new GcDbAccess().sql("select name_without_special_characters from " + tableName + " where entity_id = ?").
addBindVar(gsh_input_entityId).select(String.class);
}
// entity_id
// entity_id_sha_hex
// name_without_special_characters
// name
// description
// url
// url_instructions
int rowsForNameWithoutSpecialChars = new GcDbAccess().sql("select count(1) from " + tableName + " where name_without_special_characters = ?").
addBindVar(nameWithoutSpecialCharacters).select(int.class);
if (actionAdd && rowsForNameWithoutSpecialChars > 0) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_name", "Name conflicts with existing SP registration! '" + gsh_input_name + "'");
}
if ((actionDelete || actionEdit) && rowsForNameWithoutSpecialChars != 1) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_name", "Name not found with existing SP registration! '" + gsh_input_name + "'");
}
int rowsForEntityId = new GcDbAccess().sql("select count(1) from " + tableName + " where entity_id = ?").
addBindVar(gsh_input_entityId).select(int.class);
if (actionAdd && rowsForEntityId > 0) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_entityId", "Entity ID conflicts with existing SP registration! '" + gsh_input_entityId + "'");
}
if (actionEdit && rowsForEntityId != 1) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_entityId", "Cannot find entity ID! '" + gsh_input_entityId + "'");
}
String groupExtensionAdmins = "ssoFrontDoor_" + nameWithoutSpecialCharacters + "_admins";
String groupExtensionOwners = "ssoFrontDoor_" + nameWithoutSpecialCharacters + "_owners";
String adminsGroupName = "penn:isc:ts:iam:weblogin:service:policy:" + pennGroupsFolderExtension + ":service:policy:managers:" + groupExtensionAdmins;
Group adminsGroup = GroupFinder.findByName(adminsGroupName, false);
if (!isAdmin) {
if (adminsGroup == null) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_entityId", "Cannot find admins group! '" + groupExtensionAdmins + "'");
} else {
if (!adminsGroup.hasMember(subjectLoggedIn)) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_entityId", "You are not allowed to make changes to this entity! '" + gsh_input_entityId + "'");
}
}
}
Set<Subject> admins = new HashSet<>();
if (!StringUtils.isBlank(gsh_input_admins) && actionAdd) {
convertListOfSubjectStringsToSubjects("gsh_input_admins", gsh_input_admins, admins, gsh_builtin_gshTemplateOutput);
}
Set<Subject> owners = new HashSet<>();
if (!StringUtils.isBlank(gsh_input_owners) && actionAdd) {
convertListOfSubjectStringsToSubjects("gsh_input_owners", gsh_input_owners, owners, gsh_builtin_gshTemplateOutput);
}
if (StringUtils.isBlank(gsh_input_frontDoorPolicy)) {
gsh_input_frontDoorPolicy = "none";
}
if (GrouperUtil.length(gsh_builtin_gshTemplateOutput.getValidationLines()) > 0) {
gsh_builtin_gshTemplateOutput.assignIsError(true);
return;
}
if (actionAdd) {
new GcDbAccess().sql("insert into " + tableName + " (entity_id, entity_id_sha_hex, "
+ "name_without_special_characters, name, description, url, url_instructions, coarse_grained_policy, front_door_policy_group, "
+ "requires_twostep, error_page_type, error_page_url, error_page_text) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ").
addBindVar(gsh_input_entityId).addBindVar(entityIdShaHex).addBindVar(nameWithoutSpecialCharacters).
addBindVar(gsh_input_name).addBindVar(gsh_input_description).addBindVar(gsh_input_url).
addBindVar(gsh_input_urlInstructions).addBindVar(gsh_input_frontDoorPolicy).addBindVar(gsh_input_policyGroupName).
addBindVar(gsh_input_requiresTwostep ? "T" : "F").addBindVar(gsh_input_errorPageType).
addBindVar(gsh_input_errorPageUrl).addBindVar(gsh_input_errorPageText).executeSql();
if (adminsGroup == null) {
adminsGroup = new GroupSave().assignName(adminsGroupName).assignDescription("Admins for " + gsh_input_name + ". " + gsh_input_description).save();
}
for (Subject subject : admins) {
adminsGroup.addMember(subject, false);
}
String ownersGroupName = "penn:isc:ts:iam:weblogin:service:policy:" + pennGroupsFolderExtension + ":service:policy:managers:" + groupExtensionOwners;
Group ownersGroup = new GroupSave().assignName(ownersGroupName).assignDescription("Owners for " + gsh_input_name + ". " + gsh_input_description).save();
for (Subject subject : owners) {
ownersGroup.addMember(subject, false);
}
adminsGroup.addMember(ownersGroup.toSubject());
adminsGroup.grantPriv(ownersGroup.toSubject(), AccessPrivilege.UPDATE, false);
adminsGroup.grantPriv(ownersGroup.toSubject(), AccessPrivilege.READ, false);
ownersGroup.grantPriv(ownersGroup.toSubject(), AccessPrivilege.UPDATE, false);
ownersGroup.grantPriv(ownersGroup.toSubject(), AccessPrivilege.READ, false);
Group canRunTemplateGroup = GroupFinder.findByName(canRunTemplateGroupName, true);
canRunTemplateGroup.addMember(adminsGroup.toSubject(), false);
// cn=c77a2c1fd25902a3e09e313af5cd4d0da29b7405,ou=applications,dc=penncommunity,dc=upenn,dc=edu
String dn = "cn=" + entityIdShaHex + ",ou=applications,dc=authz,dc=upenn,dc=edu";
LdapEntry ldapEntry = new LdapEntry(dn);
ldapEntry.addAttribute(new LdapAttribute("cn", entityIdShaHex));
ldapEntry.addAttribute(new LdapAttribute("objectClass", "sAMLApp"));
ldapEntry.addAttribute(new LdapAttribute("appEntityId", gsh_input_entityId));
ldapEntry.addAttribute(new LdapAttribute("appAdminEntitlement", "urn:mace:upenn.edu:" + adminsGroupName));
ldapEntry.addAttribute(new LdapAttribute("appOwnerEntitlement", "urn:mace:upenn.edu:" + ownersGroupName));
ldapEntry.addAttribute(new LdapAttribute("appDescription", gsh_input_description));
if (!StringUtils.equals("none", gsh_input_frontDoorPolicy) && !StringUtils.isBlank(gsh_input_frontDoorPolicy)) {
ldapEntry.addAttribute(new LdapAttribute("appMACPolicy", gsh_input_frontDoorPolicy));
}
ldapEntry.addAttribute(new LdapAttribute("appModifiedBy", subjectLoggedIn.getId()));
ldapEntry.addAttribute(new LdapAttribute("appName", gsh_input_name));
if (!StringUtils.isBlank(inputPolicyGroupEntitlement)) {
ldapEntry.addAttribute(new LdapAttribute("appPolicyGroup", inputPolicyGroupEntitlement));
}
if (!StringUtils.isBlank(gsh_input_urlInstructions)) {
ldapEntry.addAttribute(new LdapAttribute("appTestNote", gsh_input_urlInstructions));
}
if (!StringUtils.isBlank(gsh_input_url)) {
ldapEntry.addAttribute(new LdapAttribute("appTestURL", gsh_input_url));
}
LdapSessionUtils.ldapSession().create(ldapConnection, ldapEntry);
gsh_builtin_gshTemplateOutput.addOutputLine("Success: added a new service provider");
} else if (actionEdit) {
Object[] dataRow = new GcDbAccess().sql("select name, description, url, url_instructions, "
+ "coarse_grained_policy, requires_twostep, error_page_type, error_page_url, error_page_text, front_door_policy_group from " + tableName + " where entity_id = ?").addBindVar(gsh_input_entityId).
select(Object[].class);
String name = (String)dataRow[0];
String description = (String)dataRow[1];
String url = (String)dataRow[2];
String urlInstructions = (String)dataRow[3];
String coarseGrainedPolicy = (String)dataRow[4];
String requiresTwoStep = (String)dataRow[5];
String errorPageType = (String)dataRow[6];
String errorPageUrl = (String)dataRow[7];
String errorPageText = (String)dataRow[8];
String frontDoorPolicyGroup = (String)dataRow[9];
String frontDoorPolicyGroupEntitlement = frontDoorPolicyGroup;
if (!StringUtils.isBlank(frontDoorPolicyGroup)) {
frontDoorPolicyGroupEntitlement = "urn:mace:upenn.edu:" + frontDoorPolicyGroup;
}
if (StringUtils.isBlank(coarseGrainedPolicy)) {
coarseGrainedPolicy = "none";
}
if (!isAdmin && !StringUtils.equals(frontDoorPolicyGroup, gsh_input_policyGroupName)) {
gsh_builtin_gshTemplateOutput.addValidationLine("gsh_input_policyGroupName", "Non admins cannot change the policy group, contact ISC to change this");
return;
}
boolean hasChange = false;
List<LdapModificationItem> ldapModificationItems = new ArrayList<LdapModificationItem>();
if (!StringUtils.equals(StringUtils.trimToNull(name), StringUtils.trimToNull(gsh_input_name))) {
hasChange = true;
createLdapModificationItem(ldapModificationItems, "appName", name, gsh_input_name);
}
if (!StringUtils.equals(StringUtils.trimToNull(description), StringUtils.trimToNull(gsh_input_description))) {
hasChange = true;
createLdapModificationItem(ldapModificationItems, "appDescription", description, gsh_input_description);
}
if (!StringUtils.equals(StringUtils.trimToNull(url), StringUtils.trimToNull(gsh_input_url))) {
hasChange = true;
createLdapModificationItem(ldapModificationItems, "appTestURL", url, gsh_input_url);
}
if (!StringUtils.equals(StringUtils.trimToNull(urlInstructions), StringUtils.trimToNull(gsh_input_urlInstructions))) {
hasChange = true;
createLdapModificationItem(ldapModificationItems, "appTestNote", urlInstructions, gsh_input_urlInstructions);
}
if (!StringUtils.equals(StringUtils.trimToNull(coarseGrainedPolicy), StringUtils.trimToNull(gsh_input_frontDoorPolicy))) {
hasChange = true;
createLdapModificationItem(ldapModificationItems, "appMACPolicy", StringUtils.equals(coarseGrainedPolicy, "none") ? null : coarseGrainedPolicy,
StringUtils.equals(gsh_input_frontDoorPolicy, "none") ? null : gsh_input_frontDoorPolicy);
}
if (!StringUtils.equals(StringUtils.trimToNull(frontDoorPolicyGroupEntitlement), StringUtils.trimToNull(inputPolicyGroupEntitlement))) {
hasChange = true;
createLdapModificationItem(ldapModificationItems, "appPolicyGroup", frontDoorPolicyGroupEntitlement, inputPolicyGroupEntitlement);
}
String inputRequiresTwoStep = gsh_input_requiresTwostep ? "T" : "F";
if (!StringUtils.equals(StringUtils.trimToNull(requiresTwoStep), StringUtils.trimToNull(inputRequiresTwoStep))) {
hasChange = true;
}
if (!StringUtils.equals(StringUtils.trimToNull(errorPageType), StringUtils.trimToNull(gsh_input_errorPageType))) {
hasChange = true;
}
if (!StringUtils.equals(StringUtils.trimToNull(errorPageUrl), StringUtils.trimToNull(gsh_input_errorPageUrl))) {
hasChange = true;
}
if (!StringUtils.equals(StringUtils.trimToNull(errorPageText), StringUtils.trimToNull(gsh_input_errorPageText))) {
hasChange = true;
}
if (!hasChange) {
gsh_builtin_gshTemplateOutput.addOutputLine("Note: no changes made");
return;
}
new GcDbAccess().sql("update " + tableName + " set name=?, description=?, url=?, url_instructions=?, coarse_grained_policy=?, "
+ "front_door_policy_group=?, requires_twostep=?, error_page_type=?, error_page_url=?, error_page_text=? where entity_id = ?").
addBindVar(gsh_input_name).addBindVar(gsh_input_description).addBindVar(gsh_input_url).
addBindVar(gsh_input_urlInstructions).addBindVar(gsh_input_frontDoorPolicy).addBindVar(gsh_input_policyGroupName).
addBindVar(inputRequiresTwoStep).addBindVar(gsh_input_errorPageType).addBindVar(gsh_input_errorPageUrl).
addBindVar(gsh_input_errorPageText).addBindVar(gsh_input_entityId).executeSql();
if (ldapModificationItems.size() > 0) {
createLdapModificationItem(ldapModificationItems, "appModifiedBy", "whatever123", subjectLoggedIn.getId());
// cn=c77a2c1fd25902a3e09e313af5cd4d0da29b7405,ou=applications,dc=penncommunity,dc=upenn,dc=edu
String dn = "cn=" + entityIdShaHex + ",ou=applications,dc=authz,dc=upenn,dc=edu";
LdapSessionUtils.ldapSession().internal_modifyHelper(ldapConnection, dn, ldapModificationItems);
}
gsh_builtin_gshTemplateOutput.addOutputLine("Success: edited new service provider");
} else if (actionDelete) {
if (adminsGroup != null) {
adminsGroup.delete();
gsh_builtin_gshTemplateOutput.addOutputLine("Success: group deleted: " + adminsGroupName);
}
String ownersGroupName = "penn:isc:ts:iam:weblogin:service:policy:" + pennGroupsFolderExtension + ":service:policy:managers:" + groupExtensionOwners;
Group ownersGroup = GroupFinder.findByName(ownersGroupName, false);
if (ownersGroup != null) {
ownersGroup.delete();
gsh_builtin_gshTemplateOutput.addOutputLine("Success: group deleted: " + ownersGroupName);
}
new GcDbAccess().sql("delete from " + tableName + " where entity_id = ?").addBindVar(gsh_input_entityId).executeSql();
gsh_builtin_gshTemplateOutput.addOutputLine("Success: delete registration in database for entity id: " + gsh_input_entityId);
String dn = "cn=" + entityIdShaHex + ",ou=applications,dc=authz,dc=upenn,dc=edu";
LdapSessionUtils.ldapSession().delete(ldapConnection, dn);
gsh_builtin_gshTemplateOutput.addOutputLine("Success: delete LDAP entry: " + dn);
gsh_builtin_gshTemplateOutput.addOutputLine("Success: deleted the service provider");
}
// if (StringUtils.equals("add", gsh_input_action)) {
//
// } else {
// throw new RuntimeException("Invalid action: '" + gsh_input_action + "'");
// }
}
public static void main(String[] args) {
GshTemplateV2input gshTemplateV2input = new GshTemplateV2input();
GshTemplateV2output gshTemplateV2output = new GshTemplateV2output();
GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() {
@Override
public Object callback(GrouperSession grouperSession) throws GrouperSessionException {
// user for chris hyzer
//Subject subject = SubjectFinder.findByIdAndSource("10021368", "pennperson", true);
// user for sam jenkins: 55308115
Subject subject = SubjectFinder.findByIdAndSource("55308115", "pennperson", true);
gshTemplateV2input.setGsh_builtin_gshTemplateRuntime(new GshTemplateRuntime());
// gshTemplateV2input.getGsh_builtin_gshTemplateRuntime().setAuthenticatedSubject(subject);
gshTemplateV2input.setGsh_builtin_subject(subject);
gshTemplateV2input.getGsh_builtin_gshTemplateRuntime().setCurrentSubject(subject);
GshTemplateRuntime gshTemplateRuntime = new GshTemplateRuntime();
gshTemplateRuntime.setTemplateConfigId("ssoCoarseGrainedAuthzConfig");
Test76ssoCoarseGrainedConfig myGshTemplate = new Test76ssoCoarseGrainedConfig();
gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_action", "add");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_action", "edit");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_entityId", "https://fides.isc-seo.upenn.edu/shibboleth");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_name", "sdfsdf");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_description", "sdfasdf");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_admins", "");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_owners", "");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_frontDoorPolicy", "workforceInTwoStep");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_url", "");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_urlInstructions", "");
//gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_requiresTwostep", true);
//myGshTemplate.gshRunLogic(gshTemplateV2input, gshTemplateV2output);
//
GshTemplateConfig templateConfig = new GshTemplateConfig("ssoCoarseGrainedAuthzConfig");
templateConfig.populateConfiguration();
GshTemplateDecorateForUiInput gshTemplateDecorateForUiInput = new GshTemplateDecorateForUiInput();
gshTemplateDecorateForUiInput.setOwnerStemName("penn:isc:ts:iam:weblogin:service:templates:idpRegistrationProd");
gshTemplateDecorateForUiInput.setCurrentSubject(subject);
gshTemplateDecorateForUiInput.setEventConfigId("gsh_input_action");
Map<String, GshTemplateInputConfigAndValue> gshTemplateInputConfigAndValues = new HashMap<String, GshTemplateInputConfigAndValue>();
GshTemplateInputConfigAndValue gshTemplateConfigAndValue = gshTemplateConfigAndValue();
gshTemplateConfigAndValue.setGshTemplateInputConfig(templateConfig.getGshTemplateInputConfigs().get(0));
gshTemplateConfigAndValue.setValueObject("edit");
gshTemplateInputConfigAndValues.put("gsh_input_action", gshTemplateConfigAndValue);
gshTemplateDecorateForUiInput.setGshTemplateInputConfigAndValues(gshTemplateInputConfigAndValues);
myGshTemplate.decorateTemplateForUiDisplay(gshTemplateDecorateForUiInput);
return null;
}
public GshTemplateInputConfigAndValue gshTemplateConfigAndValue() {
return new GshTemplateInputConfigAndValue();
}
});
System.out.println(GrouperUtil.toStringForLog(gshTemplateV2output.getGsh_builtin_gshTemplateOutput().getValidationLines()));
System.out.println(GrouperUtil.toStringForLog(gshTemplateV2output.getGsh_builtin_gshTemplateOutput().getOutputLines()));
System.exit(0);
}
}