Skip to content

Commit

Permalink
MID-8348 password panel "remove password" fix (backport to some extent)
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Nov 24, 2022
1 parent ee4c3f5 commit fb62aa2
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 95 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,43 +24,45 @@
</script>
</wicket:head>
<wicket:panel>
<span wicket:id="linkContainer" class="col-xs-10 col-lg-11 col-md-10">
<span wicket:id="passwordSet"/>
<span wicket:id="passwordRemove"/>
<span class="btn-group" style="float:right">
<a href="#" wicket:id="changePasswordLink" class="btn btn-primary btn-xs"></a>
<div style="display: flex; justify-content: space-between;">
<span wicket:id="linkContainer" style="flex-grow: 1 !important;">
<span wicket:id="passwordSet"/>
<span wicket:id="passwordRemove"/>
</span>
</span>
<div wicket:id="inputContainer">
<div class="password-parent" style="height:30px; position: relative;">
<div class="col-md-12" style="padding: 0px !important;">
<input id="password-input" class="form-control input-sm" wicket:id="password1" wicket:message="placeholder:PasswordPanel.passwordPlaceholder"
type="password" autocomplete="new-password" about="password1" style="padding-right: 26px;"/>
<div class="password-validator-popover" wicket:id="validationPanel"/>
</div>
<div style="position: absolute; right: 8px; top: 8px; z-index: 5;">
<i class="fa fa-eye" style="float:right;cursor: pointer; color: #555555;" onclick="showPassword(this)"></i>
<div wicket:id="inputContainer" style="flex-grow: 1 !important;">
<div class="password-parent" style="height:30px; position: relative;">
<div class="col-md-12" style="padding: 0px !important;">
<input id="password-input" class="form-control input-sm" wicket:id="password1" wicket:message="placeholder:PasswordPanel.passwordPlaceholder"
type="password" autocomplete="new-password" about="password1" style="padding-right: 26px;"/>
<div class="password-validator-popover" wicket:id="validationPanel"/>
</div>
<div style="position: absolute; right: 8px; top: 8px; z-index: 5;">
<i class="fa fa-eye" style="float:right;cursor: pointer; color: #555555;" onclick="showPassword(this)"></i>
</div>
</div>
</div>
<div class="password-progress-bar">
<div class="progress">
<div id="progress-bar-container" class="progress-bar"/>
<div class="password-progress-bar">
<div class="progress">
<div id="progress-bar-container" class="progress-bar"/>
</div>
</div>
</div>
<div class="password-parent" style="height:30px; position: relative;">
<div class="col-md-12" style="padding: 0px !important;">
<input class="form-control input-sm" wicket:id="password2" wicket:message="placeholder:PasswordPanel.repeatPasswordPlaceholder" type="password" autocomplete="new-password" style="padding-right: 26px; padding-bottom: 5px;" about="password2"/>
<div class="password-parent" style="height:30px; position: relative;">
<div class="col-md-12" style="padding: 0px !important;">
<input class="form-control input-sm" wicket:id="password2" wicket:message="placeholder:PasswordPanel.repeatPasswordPlaceholder" type="password" autocomplete="new-password" style="padding-right: 26px; padding-bottom: 5px;" about="password2"/>
</div>
<div style="position: absolute; right: 8px; top: 8px; z-index: 5;">
<i class="fa fa-eye" style="float:right;cursor: pointer; color: #555555;" onclick="showPassword(this)"></i>
</div>
</div>
<div style="position: absolute; right: 8px; top: 8px; z-index: 5;">
<i class="fa fa-eye" style="float:right;cursor: pointer; color: #555555;" onclick="showPassword(this)"></i>
<div class="password-progress-bar">
<div class="progress">
<div class="text-danger" style="float: left; line-height: 15px; font-size: 12px;" wicket:id="password2ValidationMessage"/>
</div>
</div>
</div>
<div class="password-progress-bar">
<div class="progress">
<div class="text-danger" style="float: left; line-height: 15px; font-size: 12px;" wicket:id="password2ValidationMessage"/>
</div>
<div class="btn-group" style="margin-left: 0.5rem;" wicket:id="buttonBar">
<a href="#" wicket:id="changePasswordLink" class="btn btn-primary btn-xs"></a>
<a href="#" wicket:id="removePasswordLink" class="btn btn-danger btn-xs"></a>
</div>
</div>
<div wicket:id="removeButtonContainer" class="col-lg-1 col-md-2 col-xs-2" style="float:right; padding-right:0px;"><span class="btn-group" style="float:right;"><a href="#" wicket:id="removePasswordLink" class="btn btn-primary btn-xs"></a></span></div>
</wicket:panel>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import java.util.List;
import java.util.Objects;

import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.Application;
import org.apache.wicket.ajax.AjaxChannel;
Expand Down Expand Up @@ -47,18 +49,9 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.self.PageOrgSelfProfile;
import com.evolveum.midpoint.web.page.self.PageRoleSelfProfile;
import com.evolveum.midpoint.web.page.self.PageServiceSelfProfile;
import com.evolveum.midpoint.web.page.self.PageUserSelfProfile;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.web.security.util.SecurityUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ValuePolicyType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;

/**
Expand All @@ -74,7 +67,8 @@ public class PasswordPanel extends InputPanel {
private static final String ID_PASSWORD_REMOVE = "passwordRemove";
private static final String ID_CHANGE_PASSWORD_LINK = "changePasswordLink";
private static final String ID_REMOVE_PASSWORD_LINK = "removePasswordLink";
private static final String ID_REMOVE_BUTTON_CONTAINER = "removeButtonContainer";

private static final String ID_BUTTON_BAR = "buttonBar";
private static final String ID_INPUT_CONTAINER = "inputContainer";
private static final String ID_PASSWORD_ONE = "password1";
private static final String ID_PASSWORD_TWO = "password2";
Expand All @@ -86,6 +80,8 @@ public class PasswordPanel extends InputPanel {
private static boolean setPasswordInput = false;
private final IModel<ProtectedStringType> model;

private boolean isReadOnly;

public PasswordPanel(String id, IModel<ProtectedStringType> model) {
this(id, model, false, model == null || model.getObject() == null);
}
Expand All @@ -103,31 +99,31 @@ public <F extends FocusType> PasswordPanel(String id, IModel<ProtectedStringType
super(id);
this.passwordInputVisible = isInputVisible;
this.model = model;
initLayout(isReadOnly, object);
this.isReadOnly = isReadOnly;
initLayout(object);
}

@Override
protected void onInitialize() {
super.onInitialize();
}

private <F extends FocusType> void initLayout(final boolean isReadOnly, PrismObject<F> object) {
private <F extends FocusType> void initLayout(PrismObject<F> object) {
setOutputMarkupId(true);
final WebMarkupContainer inputContainer = new WebMarkupContainer(ID_INPUT_CONTAINER) {
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
return passwordInputVisible;
}
};
final WebMarkupContainer inputContainer = new WebMarkupContainer(ID_INPUT_CONTAINER);
inputContainer.add(new VisibleBehaviour(() -> passwordInputVisible));
inputContainer.setOutputMarkupId(true);
add(inputContainer);

LoadableDetachableModel<List<StringLimitationResult>> limitationsModel = new LoadableDetachableModel<>() {
@Override
protected List<StringLimitationResult> load() {
ValuePolicyType valuePolicy = getValuePolicy(object);
ValuePolicyType valuePolicy = null;
if (object == null || !object.canRepresent(ResourceType.class)) {
//we skip getting value policy for ResourceType because it is some protected string from connector configuration
valuePolicy = getValuePolicy(object);
}
return getLimitationsForActualPassword(valuePolicy, object);
}
};
Expand Down Expand Up @@ -213,15 +209,8 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
}
});

final WebMarkupContainer linkContainer = new WebMarkupContainer(ID_LINK_CONTAINER) {
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
return !passwordInputVisible;
}
};
inputContainer.setOutputMarkupId(true);
final WebMarkupContainer linkContainer = new WebMarkupContainer(ID_LINK_CONTAINER);
linkContainer.add(new VisibleBehaviour(() -> !passwordInputVisible));
linkContainer.setOutputMarkupId(true);
add(linkContainer);

Expand All @@ -232,57 +221,54 @@ public boolean isVisible() {
passwordRemoveLabel.setVisible(false);
linkContainer.add(passwordRemoveLabel);

AjaxLink<Void> link = new AjaxLink<>(ID_CHANGE_PASSWORD_LINK) {
WebMarkupContainer buttonBar = new WebMarkupContainer(ID_BUTTON_BAR);
buttonBar.add(new VisibleBehaviour(() -> isChangePasswordVisible() || isRemovePasswordVisible()));
add(buttonBar);

AjaxLink<Void> changePassword = new AjaxLink<>(ID_CHANGE_PASSWORD_LINK) {

@Override
public void onClick(AjaxRequestTarget target) {
clearPasswordInput = true;
setPasswordInput = false;
onLinkClick(target);
}

@Override
public boolean isVisible() {
return !passwordInputVisible && model != null && model.getObject() != null;
}
};
link.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return !isReadOnly;

}
});
link.setBody(new ResourceModel("passwordPanel.passwordChange"));
link.setOutputMarkupId(true);
linkContainer.add(link);
changePassword.add(new VisibleBehaviour(() -> isChangePasswordVisible()));
changePassword.setBody(new ResourceModel("passwordPanel.passwordChange"));
changePassword.setOutputMarkupId(true);
buttonBar.add(changePassword);

final WebMarkupContainer removeButtonContainer = new WebMarkupContainer(ID_REMOVE_BUTTON_CONTAINER);
AjaxLink<Void> removePassword = new AjaxLink<>(ID_REMOVE_PASSWORD_LINK) {
@Override
public void onClick(AjaxRequestTarget target) {
onRemovePassword(model, target);
}

};
removePassword.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
PageBase pageBase = getPageBase();
if (pageBase == null) {
return false;
}
if (pageBase instanceof PageUserSelfProfile || pageBase instanceof PageOrgSelfProfile
|| pageBase instanceof PageRoleSelfProfile || pageBase instanceof PageServiceSelfProfile) {
return false;
}
return pageBase instanceof PageAdminFocus && !((PageAdminFocus) pageBase).isLoggedInFocusPage()
&& model.getObject() != null;
}
});
removePassword.add(new VisibleBehaviour(() -> isRemovePasswordVisible()));
removePassword.setBody(new ResourceModel("passwordPanel.passwordRemove"));
removePassword.setOutputMarkupId(true);
removeButtonContainer.add(removePassword);
add(removeButtonContainer);
buttonBar.add(removePassword);
}

private boolean isChangePasswordVisible() {
return !isReadOnly && !passwordInputVisible && model != null && model.getObject() != null;
}

protected boolean isRemovePasswordVisible() {
// todo wrong code, panel should be stupid, it must not know about different pages and subpages...
// PageBase pageBase = getPageBase();
// if (pageBase == null) {
// return false;
// }
// if (pageBase instanceof PageUserSelfProfile || pageBase instanceof PageOrgSelfProfile
// || pageBase instanceof PageRoleSelfProfile || pageBase instanceof PageServiceSelfProfile) {
// return false;
// }
// return pageBase instanceof PageAdminFocus && !((PageAdminFocus) pageBase).isLoggedInFocusPage()
// && model.getObject() != null;

return !isReadOnly && model.getObject() != null && SecurityUtils.getPrincipalUser() != null;
}

private String initPasswordValidation() {
Expand Down

0 comments on commit fb62aa2

Please sign in to comment.