diff --git a/Workbench/comanage_midpoint_data/container_files/seed-data/createDBforMP.sql b/Workbench/comanage_midpoint_data/container_files/seed-data/createDBforMP.sql
new file mode 100644
index 0000000..b5c6541
--- /dev/null
+++ b/Workbench/comanage_midpoint_data/container_files/seed-data/createDBforMP.sql
@@ -0,0 +1,99 @@
+CREATE DATABASE grouper_to_midpoint WITH ENCODING=utf8;
+CREATE USER grouper WITH PASSWORD 'password';
+GRANT ALL PRIVILEGES ON DATABASE grouper_to_midpoint TO grouper;
+
+\connect grouper_to_midpoint;
+set role grouper;
+
+CREATE TABLE gr_mp_groups (
+ group_name varchar(1024) NULL, -- Name of group mapped in some way
+ id_index int8 NOT NULL, -- This is the integer identifier for a group and foreign key to group attributes and memberships
+ display_name varchar(1024) NULL, -- Display name of group mapped in some way
+ description varchar(1024) NULL, -- Description of group mapped in some way
+ last_modified int8 NOT NULL, -- Millis since 1970, will be sequential and unique
+ deleted varchar(1) NOT NULL, -- T or F. Deleted rows will be removed after they have had time to be processed
+ CONSTRAINT gr_mp_groups_pkey PRIMARY KEY (id_index)
+);
+CREATE INDEX gr_mp_groups_ddx ON gr_mp_groups(display_name);
+CREATE INDEX gr_mp_groups_gdx ON gr_mp_groups(group_name);
+CREATE UNIQUE INDEX gr_mp_groups_idx ON gr_mp_groups(id_index);
+CREATE UNIQUE INDEX gr_mp_groups_ldx ON gr_mp_groups(last_modified);
+COMMENT ON TABLE gr_mp_groups IS 'This table holds groups';
+
+COMMENT ON COLUMN gr_mp_groups.group_name IS 'Name of group mapped in some way';
+COMMENT ON COLUMN gr_mp_groups.id_index IS 'This is the integer identifier for a group and foreign key to group attributes and memberships';
+COMMENT ON COLUMN gr_mp_groups.display_name IS 'Display name of group mapped in some way';
+COMMENT ON COLUMN gr_mp_groups.description IS 'Description of group mapped in some way';
+COMMENT ON COLUMN gr_mp_groups.last_modified IS 'Millis since 1970, will be sequential and unique';
+COMMENT ON COLUMN gr_mp_groups.deleted IS 'T or F. Deleted rows will be removed after they have had time to be processed';
+
+CREATE TABLE gr_mp_subjects (
+ subject_id_index int8 NOT NULL, -- This is the integer identifier for a subject and foreign key to subject attributes and memberships
+ subject_id varchar(1024) NULL, -- Subject ID mapped in some way
+ last_modified int8 NOT NULL, -- Millis since 1970, will be sequential and unique
+ deleted varchar(1) NOT NULL, -- T or F. Deleted rows will be removed after they have had time to be processed
+ CONSTRAINT gr_mp_subjects_pkey PRIMARY KEY (subject_id_index)
+);
+CREATE UNIQUE INDEX gr_mp_subjects_idx ON gr_mp_subjects(subject_id_index);
+CREATE UNIQUE INDEX gr_mp_subjects_ldx ON gr_mp_subjects(last_modified);
+CREATE INDEX gr_mp_subjects_sdx ON gr_mp_subjects(subject_id);
+COMMENT ON TABLE gr_mp_subjects IS 'This table holds subjects';
+
+COMMENT ON COLUMN gr_mp_subjects.subject_id_index IS 'This is the integer identifier for a subject and foreign key to subject attributes and memberships';
+COMMENT ON COLUMN gr_mp_subjects.subject_id IS 'Subject ID mapped in some way';
+COMMENT ON COLUMN gr_mp_subjects.last_modified IS 'Millis since 1970, will be sequential and unique';
+COMMENT ON COLUMN gr_mp_subjects.deleted IS 'T or F. Deleted rows will be removed after they have had time to be processed';
+
+CREATE TABLE gr_mp_group_attributes (
+ group_id_index int8 NOT NULL, -- This is the integer identifier for a group and foreign key to groups and memberships
+ attribute_name varchar(1000) NOT NULL, -- Attribute name for attributes not in the main group table
+ attribute_value varchar(4000) NULL, -- Attribute value could be null
+ last_modified int8 NOT NULL, -- Millis since 1970, will be sequential and unique
+ deleted varchar(1) NOT NULL, -- T or F. Deleted rows will be removed after they have had time to be processed
+ CONSTRAINT gr_mp_group_attributes_fk FOREIGN KEY (group_id_index) REFERENCES gr_mp_groups(id_index)
+);
+CREATE UNIQUE INDEX gr_mp_group_attributes_idx ON gr_mp_group_attributes(group_id_index, attribute_name, attribute_value);
+CREATE UNIQUE INDEX gr_mp_group_attributes_ldx ON gr_mp_group_attributes(last_modified);
+COMMENT ON TABLE gr_mp_group_attributes IS 'This table holds group attributes which are one to one or one to many to the groups table';
+
+COMMENT ON COLUMN gr_mp_group_attributes.group_id_index IS 'This is the integer identifier for a group and foreign key to groups and memberships';
+COMMENT ON COLUMN gr_mp_group_attributes.attribute_name IS 'Attribute name for attributes not in the main group table';
+COMMENT ON COLUMN gr_mp_group_attributes.attribute_value IS 'Attribute value could be null';
+COMMENT ON COLUMN gr_mp_group_attributes.last_modified IS 'Millis since 1970, will be sequential and unique';
+COMMENT ON COLUMN gr_mp_group_attributes.deleted IS 'T or F. Deleted rows will be removed after they have had time to be processed';
+
+CREATE TABLE gr_mp_memberships (
+ group_id_index int8 NOT NULL, -- This is the foreign key to groups
+ subject_id_index int8 NOT NULL, -- This is the foreign key to subjects
+ last_modified int8 NOT NULL, -- Millis since 1970, will be sequential and unique
+ deleted varchar(1) NOT NULL, -- T or F. Deleted rows will be removed after they have had time to be processed
+ CONSTRAINT gr_mp_memberships_gfk FOREIGN KEY (group_id_index) REFERENCES gr_mp_groups(id_index),
+ CONSTRAINT gr_mp_memberships_sfk FOREIGN KEY (subject_id_index) REFERENCES gr_mp_subjects(subject_id_index)
+);
+CREATE UNIQUE INDEX gr_mp_memberships_idx ON gr_mp_memberships(group_id_index, subject_id_index);
+CREATE UNIQUE INDEX gr_mp_memberships_ldx ON gr_mp_memberships(last_modified);
+COMMENT ON TABLE gr_mp_memberships IS 'This table holds memberships. The primary key is group_id_index and subject_id_index';
+
+COMMENT ON COLUMN gr_mp_memberships.group_id_index IS 'This is the foreign key to groups';
+COMMENT ON COLUMN gr_mp_memberships.subject_id_index IS 'This is the foreign key to subjects';
+COMMENT ON COLUMN gr_mp_memberships.last_modified IS 'Millis since 1970, will be sequential and unique';
+COMMENT ON COLUMN gr_mp_memberships.deleted IS 'T or F. Deleted rows will be removed after they have had time to be processed';
+
+CREATE TABLE gr_mp_subject_attributes (
+ subject_id_index int8 NOT NULL, -- This is the integer identifier and foreign key to subjects
+ attribute_name varchar(1000) NOT NULL, -- Attribute name for attributes not in the main subject table
+ attribute_value varchar(4000) NULL, -- Attribute value could be null
+ last_modified int8 NOT NULL, -- Millis since 1970, will be sequential and unique
+ deleted varchar(1) NOT NULL, -- T or F. Deleted rows will be removed after they have had time to be processed
+ CONSTRAINT gr_mp_subject_attributes_fk FOREIGN KEY (subject_id_index) REFERENCES gr_mp_subjects(subject_id_index)
+);
+CREATE UNIQUE INDEX gr_mp_subject_attributes_idx ON gr_mp_subject_attributes(subject_id_index, attribute_name, attribute_value);
+CREATE UNIQUE INDEX gr_mp_subject_attributes_ldx ON gr_mp_subject_attributes(last_modified);
+COMMENT ON TABLE gr_mp_subject_attributes IS 'This table holds subject attributes which are one to one or one to many to the subjects table';
+
+COMMENT ON COLUMN gr_mp_subject_attributes.subject_id_index IS 'This is the integer identifier and foreign key to subjects';
+COMMENT ON COLUMN gr_mp_subject_attributes.attribute_name IS 'Attribute name for attributes not in the main subject table';
+COMMENT ON COLUMN gr_mp_subject_attributes.attribute_value IS 'Attribute value could be null';
+COMMENT ON COLUMN gr_mp_subject_attributes.last_modified IS 'Millis since 1970, will be sequential and unique';
+COMMENT ON COLUMN gr_mp_subject_attributes.deleted IS 'T or F. Deleted rows will be removed after they have had time to be processed';
+
diff --git a/Workbench/configs-and-secrets/grouper/application/grouper-loader.properties b/Workbench/configs-and-secrets/grouper/application/grouper-loader.properties
index a3d5c61..7d66bbd 100755
--- a/Workbench/configs-and-secrets/grouper/application/grouper-loader.properties
+++ b/Workbench/configs-and-secrets/grouper/application/grouper-loader.properties
@@ -51,13 +51,11 @@ db.sis.pass = 49321420423
db.sis.url = jdbc:mysql://sources:3306/sis
db.sis.driver = com.mysql.jdbc.Driver
-
# midpoint External System
-#db.midPoint.driver = com.mysql.jdbc.Driver
-db.midPoint.driver = com.mysql.cj.jdbc.Driver
+db.midPoint.driver = org.postgresql.Driver
#db.midPoint.pass = ${java.lang.System.getenv().get('GROUPER_DATABASE_PASSWORD_FILE') != null ? org.apache.commons.io.FileUtils.readFileToString(java.lang.System.getenv().get('GROUPER_DATABASE_PASSWORD_FILE'), "utf-8") : java.lang.System.getenv().get('GROUPER_DATABASE_PASSWORD') }
db.midPoint.pass = password
-db.midPoint.url = jdbc:mysql://grouper_data:3306/grouper_to_midpoint?CharSet=utf8&useUnicode=true&characterEncoding=utf8
+db.midPoint.url = jdbc:postgresql://comanage_midpoint_data:5432/grouper_to_midpoint?CharSet=utf8
db.midPoint.user = grouper
# provisioner midpoint
@@ -66,9 +64,14 @@ provisioner.midPoint.customizeEntityCrud = true
provisioner.midPoint.customizeGroupCrud = true
provisioner.midPoint.customizeMembershipCrud = true
provisioner.midPoint.dbExternalSystemConfigId = midPoint
-provisioner.midPoint.deleteEntities = false
-provisioner.midPoint.deleteGroups = false
-provisioner.midPoint.deleteMemberships = false
+provisioner.midPoint.deleteEntities = true
+provisioner.midPoint.deleteEntitiesIfNotExistInGrouper = false
+provisioner.midPoint.deleteEntitiesIfGrouperDeleted = true
+provisioner.midPoint.deleteGroups = true
+provisioner.midPoint.deleteGroupsIfNotExistInGrouper = true
+provisioner.midPoint.deleteMemberships = true
+provisioner.midPoint.deleteMembershipsIfNotExistInGrouper = false
+provisioner.midPoint.deleteMembershipsIfGrouperDeleted = true
provisioner.midPoint.makeChangesToEntities = true
provisioner.midPoint.midPointDeletedColumnName = deleted
provisioner.midPoint.midPointLastModifiedColumnName = last_modified
diff --git a/Workbench/grouper_data/Dockerfile b/Workbench/grouper_data/Dockerfile
index 07cc0bd..56990ae 100644
--- a/Workbench/grouper_data/Dockerfile
+++ b/Workbench/grouper_data/Dockerfile
@@ -10,8 +10,7 @@ RUN yum install -y epel-release \
COPY container_files/conf/ /opt/grouper/grouperWebapp/WEB-INF/classes/
COPY container_files/bootstrap/ /tmp/
-COPY container_files/mysql/createDBforMP.sql /
-COPY container_files/mysql/setupDBforMP.sql /
+COPY container_files/mysql/createSQLuser.sql /
RUN ln -s /usr/bin/resolveip /usr/libexec/resolveip
@@ -27,15 +26,15 @@ RUN mysql_install_db \
&& echo "mysqladmin --silent --wait=30 ping || exit 1" >> /tmp/config \
&& echo "mysql -e 'GRANT ALL PRIVILEGES ON *.* TO \"root\"@\"%\" WITH GRANT OPTION;'" >> /tmp/config \
&& echo "mysql -e 'CREATE DATABASE grouper CHARACTER SET utf8 COLLATE utf8_bin;'" >> /tmp/config \
- && echo "mysql < /createDBforMP.sql" >> /tmp/config \
- && echo "mysql -u grouper -p'password' grouper_to_midpoint < /setupDBforMP.sql" >> /tmp/config \
+ && echo "mysql < /createSQLuser.sql" >> /tmp/config \
&& bash /tmp/config \
&& rm -f /tmp/config
RUN (mysqld_safe & ) \
&& while ! curl -s localhost:3306 > /dev/null; do echo waiting for mysqld to start; sleep 1; done; \
/opt/grouper/grouperWebapp/WEB-INF/bin/gsh.sh -registry -check -runscript -noprompt && \
- /opt/grouper/grouperWebapp/WEB-INF/bin/gsh.sh /tmp/initialize.gsh
+ /opt/grouper/grouperWebapp/WEB-INF/bin/gsh.sh /tmp/initialize.gsh && \
+ /opt/grouper/grouperWebapp/WEB-INF/bin/gsh.sh /tmp/set-prov.gsh
EXPOSE 3306
diff --git a/Workbench/grouper_data/container_files/bootstrap/initialize.gsh b/Workbench/grouper_data/container_files/bootstrap/initialize.gsh
index 2ea77f7..2412b28 100644
--- a/Workbench/grouper_data/container_files/bootstrap/initialize.gsh
+++ b/Workbench/grouper_data/container_files/bootstrap/initialize.gsh
@@ -9,8 +9,16 @@ addStem("", "org", "org")
addStem("", "test", "test")
addRootStem("ref", "ref")
-addStem("ref", "course", "course")
-addStem("ref", "affiliation", "affiliation")
+addStem("ref", "course", "Course")
+addStem("ref", "dept", "Department")
+addStem("ref", "affiliation", "Affiliation")
+
+new GroupSave().assignName("ref:affiliation:alum").assignDisplayName("Alumni").assignCreateParentStemsIfNotExist(true).save();
+new GroupSave().assignName("ref:affiliation:community").assignDisplayName("Community").assignCreateParentStemsIfNotExist(true).save();
+new GroupSave().assignName("ref:affiliation:faculty").assignDisplayName("Faculty").assignCreateParentStemsIfNotExist(true).save();
+new GroupSave().assignName("ref:affiliation:member").assignDisplayName("Member").assignCreateParentStemsIfNotExist(true).save();
+new GroupSave().assignName("ref:affiliation:staff").assignDisplayName("Staff").assignCreateParentStemsIfNotExist(true).save();
+new GroupSave().assignName("ref:affiliation:student").assignDisplayName("Student").assignCreateParentStemsIfNotExist(true).save();
group = GroupFinder.findByName(gs, "etc:sysadmingroup", true)
group.getAttributeDelegate().assignAttribute(LoaderLdapUtils.grouperLoaderLdapAttributeDefName()).getAttributeAssign()
diff --git a/Workbench/grouper_data/container_files/bootstrap/set-prov.gsh b/Workbench/grouper_data/container_files/bootstrap/set-prov.gsh
new file mode 100644
index 0000000..2cc4bbc
--- /dev/null
+++ b/Workbench/grouper_data/container_files/bootstrap/set-prov.gsh
@@ -0,0 +1,37 @@
+
+provisioner_name="midPoint";
+GrouperSession grouperSession = GrouperSession.startRootSession();
+
+def setProvOnStem(grouperSession,provisioner_name,folder_name) {
+ AttributeAssign attributeAssignMarker = null;
+ attributeAssignMarker = new AttributeAssignSave(grouperSession).assignOwnerStemName(folder_name).assignNameOfAttributeDefName("etc:provisioning:provisioningMarker").save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningDirectAssign").addValue("true").save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningDoProvision").addValue(provisioner_name).save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningStemScope").addValue("sub").save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningTarget").addValue(provisioner_name).save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningMetadataJson").addValue("{\"destination\":\"midpoint\",\"actor\":\"initial load\"}").save();
+
+}
+
+def setProvOnGroup(grouperSession,provisioner_name,group_name) {
+ AttributeAssign attributeAssignMarker = null;
+ attributeAssignMarker = new AttributeAssignSave(grouperSession).assignOwnerGroupName(group_name).assignNameOfAttributeDefName("etc:provisioning:provisioningMarker").save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningDirectAssign").addValue("true").save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningDoProvision").addValue(provisioner_name).save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningStemScope").addValue("sub").save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningTarget").addValue(provisioner_name).save();
+ new AttributeAssignSave(grouperSession).assignOwnerAttributeAssign(attributeAssignMarker).assignNameOfAttributeDefName("etc:provisioning:provisioningMetadataJson").addValue("{\"destination\":\"midpoint\",\"actor\":\"initial load\"}").save();
+
+}
+
+setProvOnStem(grouperSession,provisioner_name,"app")
+setProvOnStem(grouperSession,provisioner_name,"test")
+setProvOnStem(grouperSession,provisioner_name,"ref:dept")
+setProvOnStem(grouperSession,provisioner_name,"ref:course")
+setProvOnGroup(grouperSession,provisioner_name,"ref:affiliation:alum")
+setProvOnGroup(grouperSession,provisioner_name,"ref:affiliation:community")
+setProvOnGroup(grouperSession,provisioner_name,"ref:affiliation:faculty")
+setProvOnGroup(grouperSession,provisioner_name,"ref:affiliation:member")
+setProvOnGroup(grouperSession,provisioner_name,"ref:affiliation:staff")
+setProvOnGroup(grouperSession,provisioner_name,"ref:affiliation:student")
+
diff --git a/Workbench/grouper_data/container_files/mysql/createDBforMP.sql b/Workbench/grouper_data/container_files/mysql/createSQLuser.sql
similarity index 75%
rename from Workbench/grouper_data/container_files/mysql/createDBforMP.sql
rename to Workbench/grouper_data/container_files/mysql/createSQLuser.sql
index 8cf329f..f89839f 100644
--- a/Workbench/grouper_data/container_files/mysql/createDBforMP.sql
+++ b/Workbench/grouper_data/container_files/mysql/createSQLuser.sql
@@ -1,7 +1,5 @@
-CREATE DATABASE grouper_to_midpoint CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'grouper'@'%' IDENTIFIED BY 'password';
CREATE USER 'grouper'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'grouper'@'%';
GRANT ALL PRIVILEGES ON * . * TO 'grouper'@'localhost';
FLUSH PRIVILEGES;
-
diff --git a/Workbench/grouper_data/container_files/mysql/setupDBforMP.sql b/Workbench/grouper_data/container_files/mysql/setupDBforMP.sql
deleted file mode 100644
index be1e73e..0000000
--- a/Workbench/grouper_data/container_files/mysql/setupDBforMP.sql
+++ /dev/null
@@ -1,60 +0,0 @@
-USE grouper_to_midpoint;
-CREATE TABLE gr_mp_groups (
- group_name varchar(1024) DEFAULT NULL,
- id_index bigint NOT NULL,
- display_name varchar(1024) DEFAULT NULL,
- description varchar(1024) DEFAULT NULL,
- last_modified bigint NOT NULL,
- deleted varchar(1) NOT NULL,
- PRIMARY KEY (id_index),
- UNIQUE KEY gr_mp_groups_ldx (last_modified),
- UNIQUE KEY gr_mp_groups_idx (id_index),
- KEY gr_mp_groups_ddx (display_name(255)),
- KEY gr_mp_groups_gdx (group_name(255))
-);
-
-CREATE TABLE gr_mp_group_attributes (
- group_id_index bigint NOT NULL,
- attribute_name varchar(1000) NOT NULL,
- attribute_value varchar(4000) DEFAULT NULL,
- last_modified bigint NOT NULL,
- deleted varchar(1) NOT NULL,
- UNIQUE KEY gr_mp_group_attributes_ldx (last_modified),
- UNIQUE KEY gr_mp_group_attributes_idx (group_id_index,attribute_name(100),attribute_value(155)),
- CONSTRAINT gr_mp_group_attributes_fk FOREIGN KEY (group_id_index) REFERENCES gr_mp_groups (id_index)
-);
-
-CREATE TABLE gr_mp_subjects (
- subject_id_index bigint NOT NULL,
- subject_id varchar(1024) DEFAULT NULL,
- last_modified bigint NOT NULL,
- deleted varchar(1) NOT NULL,
- PRIMARY KEY (subject_id_index),
- UNIQUE KEY gr_mp_subjects_ldx (last_modified),
- UNIQUE KEY gr_mp_subjects_idx (subject_id_index),
- KEY gr_mp_subjects_sdx (subject_id(255))
-);
-
-CREATE TABLE gr_mp_subject_attributes (
- subject_id_index bigint NOT NULL,
- attribute_name varchar(1000) NOT NULL,
- attribute_value varchar(4000) DEFAULT NULL,
- last_modified bigint NOT NULL,
- deleted varchar(1) NOT NULL,
- UNIQUE KEY gr_mp_subject_attributes_ldx (last_modified),
- UNIQUE KEY gr_mp_subject_attributes_idx (subject_id_index,attribute_name(100),attribute_value(155)),
- CONSTRAINT gr_mp_subject_attributes_fk FOREIGN KEY (subject_id_index) REFERENCES gr_mp_subjects (subject_id_index)
-);
-
-CREATE TABLE gr_mp_memberships (
- group_id_index bigint NOT NULL,
- subject_id_index bigint NOT NULL,
- last_modified bigint NOT NULL,
- deleted varchar(1) NOT NULL,
- UNIQUE KEY gr_mp_memberships_ldx (last_modified),
- UNIQUE KEY gr_mp_memberships_idx (group_id_index,subject_id_index),
- KEY gr_mp_memberships_sfk (subject_id_index),
- CONSTRAINT gr_mp_memberships_gfk FOREIGN KEY (group_id_index) REFERENCES gr_mp_groups (id_index),
- CONSTRAINT gr_mp_memberships_sfk FOREIGN KEY (subject_id_index) REFERENCES gr_mp_subjects (subject_id_index)
-);
-
diff --git a/Workbench/idp_ui/Dockerfile b/Workbench/idp_ui/Dockerfile
index 2fef2b7..5cf77c6 100644
--- a/Workbench/idp_ui/Dockerfile
+++ b/Workbench/idp_ui/Dockerfile
@@ -1,4 +1,4 @@
-FROM i2incommon/shib-idp-ui:1.17.4
+FROM i2incommon/shib-idp-ui:1.18.0
ARG CSPHOSTNAME=localhost
ENV CSPHOSTNAME=$CSPHOSTNAME
diff --git a/Workbench/idp_ui_api/Dockerfile b/Workbench/idp_ui_api/Dockerfile
index fefbdec..2aaa200 100644
--- a/Workbench/idp_ui_api/Dockerfile
+++ b/Workbench/idp_ui_api/Dockerfile
@@ -1,4 +1,4 @@
-FROM i2incommon/shib-idp-ui:1.17.4
+FROM i2incommon/shib-idp-ui:1.18.0
ARG CSPHOSTNAME=localhost
ENV CSPHOSTNAME=$CSPHOSTNAME
diff --git a/Workbench/midpoint_server/container_files/mp-home/icf-connectors/connector-grouper-1.0-SNAPSHOT.jar b/Workbench/midpoint_server/container_files/mp-home/icf-connectors/connector-grouper-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..74e744b
Binary files /dev/null and b/Workbench/midpoint_server/container_files/mp-home/icf-connectors/connector-grouper-1.0-SNAPSHOT.jar differ
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/objectTemplates/100-template-user.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/objectTemplates/100-template-user.xml
index b81206b..fb5239a 100644
--- a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/objectTemplates/100-template-user.xml
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/objectTemplates/100-template-user.xml
@@ -126,86 +126,4 @@
-
-
- strong
-
- employeeNumber
-
-
-
-
-
- assignment
-
-
-
-
-
-
-
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/resources/100-grouper-new.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/resources/100-grouper-new.xml
new file mode 100644
index 0000000..12ff683
--- /dev/null
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/resources/100-grouper-new.xml
@@ -0,0 +1,339 @@
+
+
+
+
+ Source: Groups
+
+
+
+
+
+
+
+ c:connectorType
+ com.evolveum.polygon.connector.grouper.GrouperConnector
+
+
+ connectorVersion
+ 1.0-SNAPSHOT
+
+
+
+
+
+
+ comanage_midpoint_data
+ 5432
+ grouper
+ password
+ grouper_to_midpoint
+
+
+ false
+ false
+ false
+
+ true
+
+
+
+
+ account
+ default
+ Default Account
+ true
+ ri:CustomSubjectObjectClass
+
+
+ c:UserType
+
+
+
+ [ri:subject_id]
+
+
+ $user/name
+
+
+
+
+
+
+
+ [ri:member_of]
+ explicit
+
+
+ [ri:group]
+
+
+
+ c:OrgType
+
+
+ name
+
+
+
+
+
+
+
+
+ assignment
+
+
+ entitlement
+ group
+ objectToSubject
+ ri:members
+ icfs:uid
+ ri:member_of
+ icfs:uid
+ false
+
+
+
+
+
+ unique_index
+ -
+
[name]
+
+
+
+
+
+
+
+ unmatched
+
+
+ true
+
+
+
+
+ unlinked
+
+
+ true
+
+
+
+
+ linked
+
+
+
+
+
+
+
+
+
+ entitlement
+ group
+ Group
+ true
+ ri:GroupObjectClass
+
+
+ c:OrgType
+
+
+
+ [icfs:uid]
+
+
+ $focus/name
+
+
+
+
+
+ [ri:group_name]
+
+ strong
+
+ extension/grouperName
+
+
+
+ strong
+
+
+
+
+ assignment
+
+ all
+
+
+
+
+
+ [ri:display_name]
+
+
+ extension/grouperDisplayName
+
+
+
+
+ $focus/displayName
+
+
+
+
+ [ri:description]
+
+
+ $focus/description
+
+
+
+
+
+ [ri:members]
+ explicit
+
+
+
+
+
+ unique_index
+ -
+
[name]
+
+
+
+
+
+
+
+ unmatched
+
+
+
+ true
+
+
+
+
+ unlinked
+
+
+ true
+
+
+
+
+ linked
+
+
+
+
+
+ deleted
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ 2023-05-24T13:23:53.145+02:00
+ d991389de17be20e-55b20a5934dbcc31
+
+
+
+
+ false
+
+
+
+
+ connector
+
+
+
+
+
+
+
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/resources/100-grouper.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/resources/100-grouper.xml
deleted file mode 100644
index d57f3c0..0000000
--- a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/resources/100-grouper.xml
+++ /dev/null
@@ -1,246 +0,0 @@
-
-
-
-
-
- Source: Groups
- Groups from Grouper
-
-
-
- connectorType
- com.evolveum.polygon.connector.grouper.rest.GrouperConnector
-
-
-
-
-
- https://grouper-ws:443
- banderson
- password1
- :
-
- :
- app:.*
- test:.*
- ref:.*
- .*_(includes|excludes|systemOfRecord|systemOfRecordAndIncludes)
- ldap
- true
-
-
- false
- true
- false
-
-
-
- AMQP async update connector
-
-
-
- connectorType
- AsyncUpdateConnector
-
-
-
-
-
-
- amqp://mq:5672
- guest
- password
- sampleQueue
-
-
-
-
-
-
-
-
-
- entitlement
- group
- ri:Group
- true
-
- [ri:name]
-
- strong
-
- extension/grouperName
-
-
-
- strong
-
-
-
-
- assignment
-
- all
-
-
-
-
- strong
-
-
- RoleType
- 30082d24-0bea-4f22-b558-d0ee2a399c38
-
-
-
- assignment
-
- all
-
-
-
-
-
-
-
- strong
-
-
- RoleType
- 9e5a82fc-7969-4fd8-9f74-e0857969cdbb
-
-
-
- assignment
-
- all
-
-
-
-
-
-
-
-
- [ri:member]
- explicit
- indexOnly
-
-
-
-
-
- true
- entitlement
- group
- ri:Group
- OrgType
-
-
- extension/grouperName
-
- $projection/attributes/name
-
-
-
-
- linked
- http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#asyncUpdate
-
-
-
- false
-
-
- linked
- true
-
-
- deleted
-
-
- true
-
-
- unlinked
-
- http://midpoint.evolveum.com/xml/ns/public/model/action-3#link
-
-
-
- unmatched
-
- http://midpoint.evolveum.com/xml/ns/public/model/action-3#addFocus
-
-
-
-
-
- passive
-
-
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/roles/200-metarole-grouper-provided-group.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/roles/200-metarole-grouper-provided-group.xml
index 03e0b57..a9351a4 100644
--- a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/roles/200-metarole-grouper-provided-group.xml
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/roles/200-metarole-grouper-provided-group.xml
@@ -90,97 +90,6 @@
-
- name
- This mapping fills-in org name (e.g. 'affiliation_member') from identifier (e.g. 'member').
- It uses extension/midPointNamePrefix information from the archetype (e.g. 'affiliation_' defined in affiliation archetype)
- strong
-
- identifier
-
-
-
-
-
- name
-
-
-
-
- displayName
- This mapping fills-in org displayName (e.g. 'Affiliation: member') from identifier (e.g. 'member').
- It uses extension/midPointDisplayNamePrefix information from the archetype (e.g. 'Affiliation: ' defined in affiliation archetype)
- strong
-
- identifier
-
-
-
-
-
- displayName
-
-
-
- lifecycle state
- This mapping sets org lifecycle state to be either "active" or "retired", depending on
- whether Grouper group for this org still exists. Orgs in the latter state are on the way to deletion:
- their members are unassigned and after no members are there, the org is automatically deleted.
- strong
-
-
-
-
- lifecycleState
-
-
+
+
+
+
+
+
+ targetRef
+
+
+
+
+
+
+
+
+
+
P3M
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/550-task-grouper-groups-livesync.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/550-task-grouper-groups-livesync.xml
new file mode 100644
index 0000000..c916cf4
--- /dev/null
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/550-task-grouper-groups-livesync.xml
@@ -0,0 +1,31 @@
+
+ Groups: Group Livesync
+ Grouper live synchronization task for groups. It will poll changelog and pull in changes
+ 1494860533840-0-1
+
+ 1494860534232132-0-1
+ running
+ Recomputation
+ true
+
+ tight
+
+ recurring
+ 5
+
+
+
+
+
+
+ GroupObjectClass
+
+
+
+
+
+
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/550-task-grouper-users-livesync.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/550-task-grouper-users-livesync.xml
new file mode 100644
index 0000000..007f6f1
--- /dev/null
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/550-task-grouper-users-livesync.xml
@@ -0,0 +1,31 @@
+
+ Groups: User Livesync
+ Grouper live synchronization task for users. It will poll changelog and pull in changes
+ 1494860534232132-0-1
+
+ waiting
+ otherTasks
+ Recomputation
+ true
+
+ tight
+
+ recurring
+ 5
+
+
+
+
+
+
+ CustomSubjectObjectClass
+
+
+
+
+
+
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/610-task-reconcile-grouper-groups.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/610-task-reconcile-grouper-groups.xml
new file mode 100644
index 0000000..e0d378e
--- /dev/null
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/610-task-reconcile-grouper-groups.xml
@@ -0,0 +1,51 @@
+
+ Groups: Reconcile groups/entitlements
+
+
+
+
+
+
+ enabled
+
+
+ 0
+
+
+
+
+
+
+
+ 1689973935302-20962-1
+
+
+
+ runnable
+ ready
+ Reconciliation
+ success
+
+
+
+
+ loose
+
+ 900
+
+
+
+
+
+
+
+
+ entitlement
+ group
+ ri:GroupObjectClass
+
+
+
+
+
+
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/630-task-reconcile-grouper-users.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/630-task-reconcile-grouper-users.xml
new file mode 100644
index 0000000..9c0e32b
--- /dev/null
+++ b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/630-task-reconcile-grouper-users.xml
@@ -0,0 +1,64 @@
+
+ Groups: Reconcile Users/accounts
+
+
+ 2023-07-21T21:12:58.938Z
+
+
+
+ 2023-07-21T21:12:58.953Z
+
+
+
+ http://midpoint.evolveum.com/xml/ns/public/common/channels-3#user
+
+
+
+
+
+ enabled
+
+
+ 0
+
+
+
+
+
+
+
+ 1689973978954-20962-1
+
+
+
+ runnable
+ ready
+ Reconciliation
+ success
+
+
+
+ 2023-07-21T22:20:16.993Z
+ 2023-07-21T22:20:33.812Z
+ 2023-07-21T21:15:14.922Z
+
+ loose
+
+ 900
+
+
+
+
+
+
+
+
+ account
+ default
+ ri:CustomSubjectObjectClass
+
+
+
+
+
+
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/995-task-group-scavenger.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/995-task-group-scavenger.xml
deleted file mode 100644
index a4213aa..0000000
--- a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/995-task-group-scavenger.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
-
-
-
- Groups: Group Scavenger
-
-
-
- execute-script
-
- script
-
- import com.evolveum.midpoint.xml.ns._public.common.common_3.*
-
- result = midpoint.currentResult
- log.info('Processing dead group: {}', input)
- query = prismContext.queryFor(UserType.class)
- .item(UserType.F_ROLE_MEMBERSHIP_REF).ref(input.oid)
- .build()
- members = midpoint.repositoryService.searchObjects(UserType.class, query, null, result)
- log.info('Found {} members: {}', members.size(), members)
-
- for (member in members) {
- log.info('Going to recompute {}', member)
- try {
- midpoint.recompute(UserType.class, member.oid)
- } catch (Throwable t) {
- log.error('Couldn\'t recompute {}: {}', member, t.message, t)
- }
- }
- log.info('Members recomputed; checking if the org is still in "retired" state')
- orgAfter = midpoint.repositoryService.getObject(OrgType.class, input.oid, null, result)
- currentState = orgAfter.asObjectable().lifecycleState
- log.info('Current state = {}', currentState)
- if (currentState == 'retired') {
- log.info('Deleting the org: {}', orgAfter)
- midpoint.deleteObject(OrgType.class, orgAfter.oid, null)
- } else {
- log.info('State has changed, not deleting the org: {}', orgAfter)
- }
- log.info('Dead group processing done: {}', input)
-
-
-
-
-
- OrgType
-
-
-
- lifecycleState
- retired
-
-
-
-
-
-
-
-
- runnable
- BulkActions
- recurring
-
- 60
-
-
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/997-task-async-update-grouper.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/997-task-async-update-grouper.xml
deleted file mode 100644
index fbd150f..0000000
--- a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/997-task-async-update-grouper.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
- Groups: Live updates
-
- 1
-
-
-
-
- 1552664339630-0-2
-
-
-
- runnable
- AsynchronousUpdate
-
-
-
- single
- loose
- restart
-
diff --git a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/998-task-reconciliation-grouper-groups.xml b/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/998-task-reconciliation-grouper-groups.xml
deleted file mode 100644
index 5180680..0000000
--- a/Workbench/midpoint_server/container_files/mp-home/post-initial-objects/tasks/998-task-reconciliation-grouper-groups.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
- Groups: Full Reconciliation
-
- ri:Group
-
-
-
-
-
-
-
- 1494860531232132-0-2
- 1494860531232132-0-1
- waiting
- otherTasks
- Reconciliation
-
-
-
- single
- loose
- restart
-
diff --git a/Workbench/midpoint_server/container_files/mp-home/schema/internet2.xsd b/Workbench/midpoint_server/container_files/mp-home/schema/internet2.xsd
index e09d7ae..9dac09f 100644
--- a/Workbench/midpoint_server/container_files/mp-home/schema/internet2.xsd
+++ b/Workbench/midpoint_server/container_files/mp-home/schema/internet2.xsd
@@ -65,6 +65,7 @@
+
diff --git a/Workbench/webproxy/container_files/httpd/index.html b/Workbench/webproxy/container_files/httpd/index.html
index 06ea312..1d8da5e 100644
--- a/Workbench/webproxy/container_files/httpd/index.html
+++ b/Workbench/webproxy/container_files/httpd/index.html
@@ -13,7 +13,7 @@ Welcome to the InCommon TAP Workbench!
midPoint (4.6)
COmanage Registry (4.1.0)
-Shibboleth IdP UI (1.17.4)
+Shibboleth IdP UI (1.18.0)