1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.security.app.tools.group;
35
36 import info.magnolia.cms.security.AccessDeniedException;
37 import info.magnolia.cms.security.Group;
38 import info.magnolia.cms.security.SecuritySupport;
39 import info.magnolia.i18nsystem.SimpleTranslator;
40 import info.magnolia.security.app.tools.AbstractSecurityToolPresenter;
41 import info.magnolia.security.app.tools.SecurityToolView;
42 import info.magnolia.ui.api.context.UiContext;
43 import info.magnolia.ui.dialog.formdialog.FormBuilder;
44 import info.magnolia.ui.framework.tools.FormToolActionExecutor;
45
46 import java.util.Collection;
47
48 import javax.inject.Inject;
49
50 import org.apache.commons.collections4.CollectionUtils;
51 import org.apache.commons.lang3.StringEscapeUtils;
52
53 import com.vaadin.v7.data.Container;
54 import com.vaadin.v7.data.Item;
55 import com.vaadin.v7.data.util.BeanItem;
56 import com.vaadin.v7.data.util.HierarchicalContainer;
57
58
59
60
61 public class GroupMemberPresenter extends AbstractSecurityToolPresenter {
62
63 private final SecuritySupport securitySupport;
64 private final SimpleTranslator i18n;
65 private GroupMemberViewOption viewOption;
66
67 @Inject
68 public GroupMemberPresenter(SecurityToolView view, FormBuilder formBuilder, FormToolActionExecutor actionExecutor,
69 UiContext uiContext, SimpleTranslator i18n, SecuritySupport securitySupport) {
70 super(view, formBuilder, actionExecutor, uiContext);
71 this.securitySupport = securitySupport;
72 this.i18n = i18n;
73 }
74
75 @Override
76 protected Item getItem() {
77 viewOption = new GroupMemberViewOption();
78 return new BeanItem<>(viewOption);
79 }
80
81 @Override
82 protected Container.Hierarchical buildContainer() throws AccessDeniedException {
83 container = new HierarchicalContainer();
84 container.addContainerProperty(VALUE_ID, String.class, "");
85 container.addContainerProperty(TRANSITIVE_ID, String.class, "");
86
87 Group existedGroup = securitySupport.getGroupManager().getGroup(viewOption.getName());
88 if (existedGroup == null) {
89 return null;
90 }
91
92 Collection<String> directUsers, indirectUsers = null;
93 Collection<String> directGroups, indirectGroups = null;
94
95 directGroups = securitySupport.getGroupManager().getDirectSubGroups(existedGroup.getName());
96 directUsers = securitySupport.getUserManager().getUsersWithGroup(existedGroup.getName());
97
98 if (DumpMode.INCLUDE_TRANSITIVE.equals(viewOption.getDumpMode())) {
99 Collection<String> allUsers = securitySupport.getUserManager().getUsersWithGroup(existedGroup.getName(), true);
100 indirectUsers = CollectionUtils.isEmpty(directUsers) ? allUsers : CollectionUtils.disjunction(allUsers, directUsers);
101 indirectGroups = securitySupport.getGroupManager().getAllSuperGroups(existedGroup.getName());
102 }
103
104 int numberOfGroups = (CollectionUtils.isEmpty(directGroups) ? 0 : directGroups.size()) + (CollectionUtils.isEmpty(indirectGroups) ? 0 : indirectGroups.size());
105 int numberOfUsers = (CollectionUtils.isEmpty(directUsers) ? 0 : directUsers.size()) + (CollectionUtils.isEmpty(indirectUsers) ? 0 : indirectUsers.size());
106
107 addSection(i18n.translate("security.tools.results.userSection.title", numberOfUsers), directUsers, indirectUsers);
108 addSection(i18n.translate("security.tools.results.groupSection.title", numberOfGroups), directGroups, indirectGroups);
109
110 return container;
111 }
112
113 @Override
114 protected String getErrorMessage() {
115 return i18n.translate(i18n.translate("security.groupMembersTab.error"), StringEscapeUtils.escapeHtml4(viewOption.getName()));
116 }
117
118 private Object addSection(String title, Collection<String> directItems, Collection<String> indirectItems) {
119 if (CollectionUtils.isEmpty(directItems) && CollectionUtils.isEmpty(indirectItems)) {
120 return null;
121 }
122 Object sectionItemId = addContainerItem(VALUE_ID, title, null);
123 container.setChildrenAllowed(sectionItemId, true);
124 if (CollectionUtils.isNotEmpty(directItems)) {
125 for (String item : directItems) {
126 addSectionItem(item, i18n.translate("security.groupMembersTab.status.direct"), sectionItemId);
127 }
128 }
129 if (CollectionUtils.isNotEmpty(indirectItems)) {
130 for (String item : indirectItems) {
131 addSectionItem(item, i18n.translate("security.groupMembersTab.status.indirect"), sectionItemId);
132 }
133 }
134 return sectionItemId;
135 }
136
137 private Object addSectionItem(String value, String transitive, Object parentId) {
138 Object itemId = addContainerItem(VALUE_ID, value, parentId);
139 container.getItem(itemId).getItemProperty(TRANSITIVE_ID).setValue(transitive);
140 container.setChildrenAllowed(itemId, false);
141 return itemId;
142 }
143
144
145
146
147 public static class GroupMemberViewOption extends AbstractSecurityToolPresenter.ViewOption {
148 private DumpMode dumpMode;
149
150 public DumpMode getDumpMode() {
151 return dumpMode;
152 }
153
154 public void setDumpMode(DumpMode dumpMode) {
155 this.dumpMode = dumpMode;
156 }
157 }
158
159
160
161
162 public enum DumpMode {
163 INCLUDE_TRANSITIVE, OMIT_TRANSITIVE
164 }
165 }