password view feature only enabled if password is not already hashed
This commit is contained in:
parent
7c092d6e12
commit
0411a016d2
4 changed files with 46 additions and 34 deletions
|
@ -125,6 +125,8 @@ public final class Constants {
|
|||
public static final RGB WHITE_RGB = new RGB(255, 255, 255);
|
||||
public static final RGB BLACK_RGB = new RGB(0, 0, 0);
|
||||
|
||||
public static final String IMPORTED_PASSWORD_MARKER = "_IMPORTED_PASSWORD";
|
||||
|
||||
public static final TypeReference<Collection<APIMessage>> TYPE_REFERENCE_API_MESSAGE =
|
||||
new TypeReferenceAPIMessage();
|
||||
public static final ParameterizedTypeReference<Collection<Privilege>> TYPE_REFERENCE_PRIVILEGES =
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
package ch.ethz.seb.sebserver.gui.widget;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
@ -16,6 +17,7 @@ import org.eclipse.swt.SWT;
|
|||
import org.eclipse.swt.layout.GridData;
|
||||
import org.eclipse.swt.layout.GridLayout;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.swt.widgets.Event;
|
||||
import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Text;
|
||||
|
||||
|
@ -25,7 +27,6 @@ public class PasswordInput extends Composite {
|
|||
new LocTextKey("sebserver.overall.action.showPassword.tooltip");
|
||||
|
||||
|
||||
private final WidgetFactory widgetFactory;
|
||||
private final Composite inputAnchor;
|
||||
private final Label visibilityButton;
|
||||
|
||||
|
@ -35,7 +36,6 @@ public class PasswordInput extends Composite {
|
|||
|
||||
public PasswordInput(final Composite parent, final WidgetFactory widgetFactory) {
|
||||
super(parent, SWT.NONE);
|
||||
this.widgetFactory = widgetFactory;
|
||||
|
||||
GridLayout gridLayout = new GridLayout(2, false);
|
||||
gridLayout.horizontalSpacing = 0;
|
||||
|
@ -54,8 +54,6 @@ public class PasswordInput extends Composite {
|
|||
inputAnchor.setLayout(gridLayout);
|
||||
inputAnchor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
|
||||
|
||||
|
||||
|
||||
visibilityButton = widgetFactory.imageButton(
|
||||
WidgetFactory.ImageIcon.VISIBILITY,
|
||||
this,
|
||||
|
@ -95,8 +93,8 @@ public class PasswordInput extends Composite {
|
|||
}
|
||||
|
||||
if (buildPassword) {
|
||||
passwordInput.addListener(SWT.FocusOut, event -> super.notifyListeners(SWT.FocusOut, event));
|
||||
passwordInput.addListener(SWT.Traverse, event -> super.notifyListeners(SWT.Traverse, event));
|
||||
passwordInput.addListener(SWT.FocusOut, event -> changeEvent(SWT.FocusOut, event));
|
||||
passwordInput.addListener(SWT.Traverse, event -> changeEvent(SWT.Traverse, event));
|
||||
this.visibilityButton.setImage(WidgetFactory.ImageIcon.VISIBILITY.getImage(getDisplay()));
|
||||
} else {
|
||||
passwordInput.setData(RWT.CUSTOM_VARIANT, WidgetFactory.CustomVariant.PLAIN_PWD.key);
|
||||
|
@ -109,9 +107,22 @@ public class PasswordInput extends Composite {
|
|||
super.layout(true, true);
|
||||
}
|
||||
|
||||
private void changeEvent(int eventType, Event event) {
|
||||
if (!this.visibilityButton.isEnabled() && !StringUtils.endsWith(
|
||||
this.passwordInput.getText(),
|
||||
Constants.IMPORTED_PASSWORD_MARKER)) {
|
||||
|
||||
visibilityButton.setEnabled(true);
|
||||
}
|
||||
super.notifyListeners(eventType, event);
|
||||
}
|
||||
|
||||
public void setValue(CharSequence value) {
|
||||
if (passwordInput != null) {
|
||||
passwordInput.setText(value != null ? value.toString() : StringUtils.EMPTY);
|
||||
if (StringUtils.endsWith(value, Constants.IMPORTED_PASSWORD_MARKER)) {
|
||||
this.visibilityButton.setEnabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,20 @@
|
|||
|
||||
package ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.AttributeType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationValue;
|
||||
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.ExamConfigXMLParser.PListNode.Type;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.converter.KioskModeConverter;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.helpers.DefaultHandler;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
@ -15,22 +29,6 @@ import java.util.Stack;
|
|||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.util.Cryptor;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.helpers.DefaultHandler;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.AttributeType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationValue;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.ExamConfigXMLParser.PListNode.Type;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.converter.KioskModeConverter;
|
||||
|
||||
public class ExamConfigXMLParser extends DefaultHandler {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(ExamConfigXMLParser.class);
|
||||
|
@ -91,8 +89,6 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
"hashedAdminPassword"
|
||||
));
|
||||
|
||||
public static final String IMPORTED_PASSWORD_MARKER = "_IMPORTED_PASSWORD";
|
||||
|
||||
private final Cryptor cryptor;
|
||||
private final Consumer<ConfigurationValue> valueConsumer;
|
||||
private final Function<String, ConfigurationAttribute> attributeResolver;
|
||||
|
@ -120,14 +116,14 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void startDocument() throws SAXException {
|
||||
public void startDocument() {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Start parsing document");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endDocument() throws SAXException {
|
||||
public void endDocument() {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("End parsing document");
|
||||
}
|
||||
|
@ -138,7 +134,7 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
final String uri,
|
||||
final String localName,
|
||||
final String qName,
|
||||
final Attributes attributes) throws SAXException {
|
||||
final Attributes attributes) {
|
||||
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("start element: {}", qName);
|
||||
|
@ -274,7 +270,7 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
public void endElement(
|
||||
final String uri,
|
||||
final String localName,
|
||||
final String qName) throws SAXException {
|
||||
final String qName) {
|
||||
|
||||
final PListNode top = this.stack.peek();
|
||||
if (VALUE_ELEMENTS.contains(qName)) {
|
||||
|
@ -386,7 +382,7 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
public void characters(
|
||||
final char[] ch,
|
||||
final int start,
|
||||
final int length) throws SAXException {
|
||||
final int length) {
|
||||
|
||||
final char[] valueChar = new char[length];
|
||||
System.arraycopy(ch, start, valueChar, 0, length);
|
||||
|
@ -453,7 +449,9 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
this.configId,
|
||||
attribute.id,
|
||||
listIndex,
|
||||
StringUtils.isNotBlank(value) ? cryptor.encrypt(value + IMPORTED_PASSWORD_MARKER).toString() : value);
|
||||
StringUtils.isNotBlank(value)
|
||||
? cryptor.encrypt(value + Constants.IMPORTED_PASSWORD_MARKER).toString()
|
||||
: value);
|
||||
}
|
||||
|
||||
return new ConfigurationValue(
|
||||
|
@ -510,7 +508,7 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
private final boolean isValueType;
|
||||
private final String typeName;
|
||||
|
||||
private Type(final boolean isValueType, final String typeName) {
|
||||
Type(final boolean isValueType, final String typeName) {
|
||||
this.isValueType = isValueType;
|
||||
this.typeName = typeName;
|
||||
}
|
||||
|
@ -520,7 +518,7 @@ public class ExamConfigXMLParser extends DefaultHandler {
|
|||
}
|
||||
|
||||
public static Type getType(final String qName) {
|
||||
return Arrays.asList(Type.values()).stream()
|
||||
return Arrays.stream(Type.values())
|
||||
.filter(type -> type.typeName.equals(qName))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
|
|
@ -16,6 +16,7 @@ import java.util.HashSet;
|
|||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.Constants;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.client.ClientCredentialService;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.ExamConfigXMLParser;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
@ -123,8 +124,8 @@ public class StringConverter implements AttributeValueConverter {
|
|||
// decrypt internally encrypted password and hash it for export
|
||||
// NOTE: see special case description in ExamConfigXMLParser.createConfigurationValue
|
||||
String plainText = this.clientCredentialService.decrypt(value).toString();
|
||||
if (plainText.endsWith(ExamConfigXMLParser.IMPORTED_PASSWORD_MARKER)) {
|
||||
return plainText.replace(ExamConfigXMLParser.IMPORTED_PASSWORD_MARKER, StringUtils.EMPTY);
|
||||
if (plainText.endsWith(Constants.IMPORTED_PASSWORD_MARKER)) {
|
||||
return plainText.replace(Constants.IMPORTED_PASSWORD_MARKER, StringUtils.EMPTY);
|
||||
} else {
|
||||
return Utils.hash_SHA_256_Base_16(plainText);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue