1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.client.console.wizards;
20
21 import java.io.Serializable;
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.stream.Collectors;
25 import org.apache.commons.lang3.StringUtils;
26 import org.apache.commons.lang3.time.DateFormatUtils;
27 import org.apache.syncope.client.console.SyncopeConsoleSession;
28 import org.apache.syncope.client.console.rest.DelegationRestClient;
29 import org.apache.syncope.client.console.rest.UserRestClient;
30 import org.apache.syncope.client.ui.commons.Constants;
31 import org.apache.syncope.client.ui.commons.DateOps;
32 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDateTimeFieldPanel;
33 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
34 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
35 import org.apache.syncope.common.lib.to.DelegationTO;
36 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
37 import org.apache.wicket.PageReference;
38 import org.apache.wicket.extensions.wizard.WizardModel;
39 import org.apache.wicket.extensions.wizard.WizardStep;
40 import org.apache.wicket.model.IModel;
41 import org.apache.wicket.model.Model;
42 import org.apache.wicket.model.PropertyModel;
43 import org.apache.wicket.model.ResourceModel;
44
45 public class DelegationWizardBuilder extends BaseAjaxWizardBuilder<DelegationTO> {
46
47 private static final long serialVersionUID = 16656970898539L;
48
49 protected final UserRestClient userRestClient;
50
51 protected final DelegationRestClient delegationRestClient;
52
53 public DelegationWizardBuilder(
54 final DelegationTO defaultItem,
55 final UserRestClient userRestClient,
56 final DelegationRestClient delegationRestClient,
57 final PageReference pageRef) {
58
59 super(defaultItem, pageRef);
60
61 this.userRestClient = userRestClient;
62 this.delegationRestClient = delegationRestClient;
63 }
64
65 @Override
66 protected Serializable onApplyInternal(final DelegationTO modelObject) {
67 if (getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey())) {
68 delegationRestClient.create(modelObject);
69 } else {
70 delegationRestClient.update(modelObject);
71 }
72 return null;
73 }
74
75 @Override
76 protected WizardModel buildModelSteps(final DelegationTO modelObject, final WizardModel wizardModel) {
77 if (getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey())
78 && SyncopeConsoleSession.get().owns(IdRepoEntitlement.USER_SEARCH)
79 && SyncopeConsoleSession.get().owns(IdRepoEntitlement.DELEGATION_CREATE)) {
80
81 wizardModel.add(new UserSelectionWizardStep(
82 new ResourceModel("delegating"), new PropertyModel<>(modelObject, "delegating"), pageRef));
83 wizardModel.add(new UserSelectionWizardStep(
84 new ResourceModel("delegated"), new PropertyModel<>(modelObject, "delegated"), pageRef));
85 } else {
86 wizardModel.add(new Users(modelObject));
87 }
88
89 wizardModel.add(new StartEnd(modelObject));
90 wizardModel.add(new Roles(modelObject));
91
92 return wizardModel;
93 }
94
95 private class Users extends WizardStep {
96
97 private static final long serialVersionUID = 33859341441696L;
98
99 Users(final DelegationTO modelObject) {
100 super();
101
102 setTitleModel(new ResourceModel("users"));
103
104 IModel<String> delegating = new PropertyModel<>(modelObject, "delegating");
105 IModel<String> delegated = new PropertyModel<>(modelObject, "delegated");
106
107 boolean isNew = getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey());
108 if (!isNew) {
109 if (SyncopeConsoleSession.get().owns(IdRepoEntitlement.USER_READ)) {
110 delegating = Model.of(userRestClient.read(delegating.getObject()).getUsername());
111 delegated = Model.of(userRestClient.read(delegated.getObject()).getUsername());
112 } else {
113 if (SyncopeConsoleSession.get().getSelfTO().getKey().equals(delegating.getObject())) {
114 delegating = Model.of(SyncopeConsoleSession.get().getSelfTO().getUsername());
115 }
116 if (SyncopeConsoleSession.get().getSelfTO().getKey().equals(delegated.getObject())) {
117 delegated = Model.of(SyncopeConsoleSession.get().getSelfTO().getUsername());
118 }
119 }
120 }
121
122 boolean isSelfOnly = !SyncopeConsoleSession.get().owns(IdRepoEntitlement.DELEGATION_CREATE);
123 if (isSelfOnly) {
124 modelObject.setDelegating(SyncopeConsoleSession.get().getSelfTO().getUsername());
125 }
126
127 add(new AjaxTextFieldPanel(
128 "delegating",
129 "delegating",
130 delegating,
131 false).addRequiredLabel().
132 setEnabled(isNew && !isSelfOnly));
133 add(new AjaxTextFieldPanel(
134 "delegated",
135 "delegated",
136 delegated,
137 false).addRequiredLabel().
138 setEnabled(isNew));
139 }
140 }
141
142 private static class StartEnd extends WizardStep {
143
144 private static final long serialVersionUID = 16957451737824L;
145
146 StartEnd(final DelegationTO modelObject) {
147 super();
148
149 setTitleModel(new ResourceModel("validity"));
150
151 add(new AjaxDateTimeFieldPanel(
152 "start",
153 "start",
154 DateOps.WrappedDateModel.ofOffset(new PropertyModel<>(modelObject, "start")),
155 DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT).
156 addRequiredLabel());
157
158 add(new AjaxDateTimeFieldPanel(
159 "end",
160 "end",
161 DateOps.WrappedDateModel.ofOffset(new PropertyModel<>(modelObject, "end")),
162 DateFormatUtils.ISO_8601_EXTENDED_DATETIME_TIME_ZONE_FORMAT));
163 }
164 }
165
166 private class Roles extends WizardStep implements WizardModel.ICondition {
167
168 private static final long serialVersionUID = 16957451737824L;
169
170 private final List<String> allRoles = new ArrayList<>();
171
172 private final DelegationTO modelObject;
173
174 Roles(final DelegationTO modelObject) {
175 super();
176 this.modelObject = modelObject;
177
178 setTitleModel(new ResourceModel("roles"));
179
180 add(new AjaxPalettePanel.Builder<String>().
181 withFilter().
182 setAllowOrder(true).
183 build("roles",
184 new PropertyModel<>(modelObject, "roles"),
185 new AjaxPalettePanel.Builder.Query<>() {
186
187 private static final long serialVersionUID = 3900199363626636719L;
188
189 @Override
190 public List<String> execute(final String filter) {
191 if (StringUtils.isEmpty(filter) || "*".equals(filter)) {
192 return allRoles.size() > Constants.MAX_ROLE_LIST_SIZE
193 ? allRoles.subList(0, Constants.MAX_ROLE_LIST_SIZE)
194 : allRoles;
195
196 }
197 return allRoles.stream().
198 filter(role -> StringUtils.containsIgnoreCase(role, filter)).
199 collect(Collectors.toList());
200 }
201 }).
202 hideLabel().
203 setOutputMarkupId(true));
204 }
205
206 @Override
207 public boolean evaluate() {
208 if (modelObject.getDelegating() != null) {
209 allRoles.clear();
210
211 if (SyncopeConsoleSession.get().owns(IdRepoEntitlement.USER_READ)) {
212 allRoles.addAll(userRestClient.read(modelObject.getDelegating()).getRoles());
213 } else if (SyncopeConsoleSession.get().getSelfTO().getKey().equals(modelObject.getDelegating())) {
214 allRoles.addAll(SyncopeConsoleSession.get().getSelfTO().getRoles());
215 }
216 }
217 return true;
218 }
219 }
220 }