View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }