Adding and deleting users and sites.
This commit is contained in:
@@ -94,9 +94,9 @@ public interface MPSite<Q extends MPQuestion> extends Comparable<MPSite<?>> {
|
||||
@Nonnull
|
||||
MPUser<?> getUser();
|
||||
|
||||
void addQuestion(Q question);
|
||||
boolean addQuestion(Q question);
|
||||
|
||||
void deleteQuestion(Q question);
|
||||
boolean deleteQuestion(Q question);
|
||||
|
||||
@Nonnull
|
||||
Collection<Q> getQuestions();
|
||||
|
@@ -77,6 +77,8 @@ public interface MPUser<S extends MPSite<?>> extends Comparable<MPUser<?>> {
|
||||
void authenticate(MPMasterKey masterKey)
|
||||
throws MPIncorrectMasterPasswordException, MPKeyUnavailableException, MPAlgorithmException;
|
||||
|
||||
void invalidate();
|
||||
|
||||
boolean isMasterKeyAvailable();
|
||||
|
||||
@Nonnull
|
||||
@@ -90,7 +92,7 @@ public interface MPUser<S extends MPSite<?>> extends Comparable<MPUser<?>> {
|
||||
@Nonnull
|
||||
S addSite(S site);
|
||||
|
||||
void deleteSite(S site);
|
||||
boolean deleteSite(MPSite<?> site);
|
||||
|
||||
@Nonnull
|
||||
Collection<S> getSites();
|
||||
@@ -107,5 +109,7 @@ public interface MPUser<S extends MPSite<?>> extends Comparable<MPUser<?>> {
|
||||
void onUserUpdated(MPUser<?> user);
|
||||
|
||||
void onUserAuthenticated(MPUser<?> user);
|
||||
|
||||
void onUserInvalidated(MPUser<?> user);
|
||||
}
|
||||
}
|
||||
|
@@ -55,8 +55,10 @@ public abstract class MPBasicQuestion extends Changeable implements MPQuestion {
|
||||
|
||||
@Override
|
||||
public void setType(final MPResultType type) {
|
||||
this.type = type;
|
||||
if (Objects.equals(this.type, type))
|
||||
return;
|
||||
|
||||
this.type = type;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
|
@@ -73,8 +73,10 @@ public abstract class MPBasicSite<U extends MPUser<?>, Q extends MPQuestion> ext
|
||||
|
||||
@Override
|
||||
public void setAlgorithm(final MPAlgorithm algorithm) {
|
||||
this.algorithm = algorithm;
|
||||
if (Objects.equals(this.algorithm, algorithm))
|
||||
return;
|
||||
|
||||
this.algorithm = algorithm;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -86,8 +88,10 @@ public abstract class MPBasicSite<U extends MPUser<?>, Q extends MPQuestion> ext
|
||||
|
||||
@Override
|
||||
public void setCounter(final UnsignedInteger counter) {
|
||||
this.counter = counter;
|
||||
if (Objects.equals(this.counter, counter))
|
||||
return;
|
||||
|
||||
this.counter = counter;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -99,8 +103,10 @@ public abstract class MPBasicSite<U extends MPUser<?>, Q extends MPQuestion> ext
|
||||
|
||||
@Override
|
||||
public void setResultType(final MPResultType resultType) {
|
||||
this.resultType = resultType;
|
||||
if (Objects.equals(this.resultType, resultType))
|
||||
return;
|
||||
|
||||
this.resultType = resultType;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -112,8 +118,10 @@ public abstract class MPBasicSite<U extends MPUser<?>, Q extends MPQuestion> ext
|
||||
|
||||
@Override
|
||||
public void setLoginType(@Nullable final MPResultType loginType) {
|
||||
this.loginType = ifNotNullElse( loginType, getAlgorithm().mpw_default_login_type() );
|
||||
if (Objects.equals(this.loginType, loginType))
|
||||
return;
|
||||
|
||||
this.loginType = ifNotNullElse( loginType, getAlgorithm().mpw_default_login_type() );
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -152,17 +160,21 @@ public abstract class MPBasicSite<U extends MPUser<?>, Q extends MPQuestion> ext
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addQuestion(final Q question) {
|
||||
questions.add( question );
|
||||
public boolean addQuestion(final Q question) {
|
||||
if (!questions.add( question ))
|
||||
return false;
|
||||
|
||||
setChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteQuestion(final Q question) {
|
||||
questions.remove( question );
|
||||
public boolean deleteQuestion(final Q question) {
|
||||
if (!questions.remove( question ))
|
||||
return false;
|
||||
|
||||
setChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@@ -25,8 +25,7 @@ import com.google.common.collect.ImmutableSortedSet;
|
||||
import com.lyndir.lhunath.opal.system.CodeUtils;
|
||||
import com.lyndir.lhunath.opal.system.logging.Logger;
|
||||
import com.lyndir.masterpassword.*;
|
||||
import com.lyndir.masterpassword.model.MPIncorrectMasterPasswordException;
|
||||
import com.lyndir.masterpassword.model.MPUser;
|
||||
import com.lyndir.masterpassword.model.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
import javax.annotation.Nonnull;
|
||||
@@ -66,8 +65,10 @@ public abstract class MPBasicUser<S extends MPBasicSite<?, ?>> extends Changeabl
|
||||
|
||||
@Override
|
||||
public void setAvatar(final int avatar) {
|
||||
this.avatar = avatar;
|
||||
if (Objects.equals(this.avatar, avatar))
|
||||
return;
|
||||
|
||||
this.avatar = avatar;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -85,8 +86,10 @@ public abstract class MPBasicUser<S extends MPBasicSite<?, ?>> extends Changeabl
|
||||
|
||||
@Override
|
||||
public void setAlgorithm(final MPAlgorithm algorithm) {
|
||||
this.algorithm = algorithm;
|
||||
if (Objects.equals(this.algorithm, algorithm))
|
||||
return;
|
||||
|
||||
this.algorithm = algorithm;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -136,6 +139,17 @@ public abstract class MPBasicUser<S extends MPBasicSite<?, ?>> extends Changeabl
|
||||
listener.onUserAuthenticated( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invalidate() {
|
||||
if (masterKey == null)
|
||||
return;
|
||||
|
||||
this.masterKey = null;
|
||||
|
||||
for (final Listener listener : listeners)
|
||||
listener.onUserInvalidated( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMasterKeyAvailable() {
|
||||
return masterKey != null;
|
||||
@@ -151,6 +165,7 @@ public abstract class MPBasicUser<S extends MPBasicSite<?, ?>> extends Changeabl
|
||||
return masterKey;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public S addSite(final S site) {
|
||||
sites.put( site.getSiteName(), site );
|
||||
@@ -160,10 +175,12 @@ public abstract class MPBasicUser<S extends MPBasicSite<?, ?>> extends Changeabl
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteSite(final S site) {
|
||||
sites.values().remove( site );
|
||||
public boolean deleteSite(final MPSite<?> site) {
|
||||
if (!sites.values().remove( site ))
|
||||
return false;
|
||||
|
||||
setChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@@ -21,6 +21,7 @@ package com.lyndir.masterpassword.model.impl;
|
||||
import com.google.common.primitives.UnsignedInteger;
|
||||
import com.lyndir.masterpassword.*;
|
||||
import com.lyndir.masterpassword.model.MPSite;
|
||||
import java.util.Objects;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import org.joda.time.Instant;
|
||||
@@ -75,8 +76,10 @@ public class MPFileSite extends MPBasicSite<MPFileUser, MPFileQuestion> {
|
||||
}
|
||||
|
||||
public void setUrl(@Nullable final String url) {
|
||||
this.url = url;
|
||||
if (Objects.equals( this.url, url))
|
||||
return;
|
||||
|
||||
this.url = url;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -92,7 +95,6 @@ public class MPFileSite extends MPBasicSite<MPFileUser, MPFileQuestion> {
|
||||
uses++;
|
||||
lastUsed = new Instant();
|
||||
getUser().use();
|
||||
|
||||
setChanged();
|
||||
}
|
||||
|
||||
|
@@ -23,6 +23,7 @@ import com.lyndir.masterpassword.model.MPIncorrectMasterPasswordException;
|
||||
import com.lyndir.masterpassword.model.MPUser;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import org.joda.time.Instant;
|
||||
@@ -98,8 +99,10 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
|
||||
}
|
||||
|
||||
public void setFormat(final MPMarshalFormat format) {
|
||||
this.format = format;
|
||||
if (Objects.equals(this.format, format))
|
||||
return;
|
||||
|
||||
this.format = format;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -108,8 +111,10 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
|
||||
}
|
||||
|
||||
public void setContentMode(final MPMarshaller.ContentMode contentMode) {
|
||||
this.contentMode = contentMode;
|
||||
if (Objects.equals(this.contentMode, contentMode))
|
||||
return;
|
||||
|
||||
this.contentMode = contentMode;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -118,8 +123,10 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
|
||||
}
|
||||
|
||||
public void setDefaultType(final MPResultType defaultType) {
|
||||
this.defaultType = defaultType;
|
||||
if (Objects.equals(this.defaultType, defaultType))
|
||||
return;
|
||||
|
||||
this.defaultType = defaultType;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -129,7 +136,6 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
|
||||
|
||||
public void use() {
|
||||
lastUsed = new Instant();
|
||||
|
||||
setChanged();
|
||||
}
|
||||
|
||||
@@ -159,7 +165,6 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
|
||||
|
||||
if (keyID == null) {
|
||||
keyID = masterKey.getKeyID( getAlgorithm() );
|
||||
|
||||
setChanged();
|
||||
}
|
||||
}
|
||||
|
@@ -25,8 +25,8 @@ import com.lyndir.lhunath.opal.system.logging.Logger;
|
||||
import com.lyndir.masterpassword.model.MPConstants;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
|
||||
|
||||
/**
|
||||
@@ -52,6 +52,7 @@ public class MPFileUserManager {
|
||||
}
|
||||
}
|
||||
|
||||
private final Collection<Listener> listeners = new CopyOnWriteArraySet<>();
|
||||
private final Map<String, MPFileUser> userByName = new HashMap<>();
|
||||
private final File path;
|
||||
|
||||
@@ -67,13 +68,13 @@ public class MPFileUserManager {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public ImmutableSortedSet<MPFileUser> reload() {
|
||||
public void reload() {
|
||||
userByName.clear();
|
||||
|
||||
File[] pathFiles;
|
||||
if ((!path.exists() && !path.mkdirs()) || ((pathFiles = path.listFiles()) == null)) {
|
||||
logger.err( "Couldn't create directory for user files: %s", path );
|
||||
return getFiles();
|
||||
return;
|
||||
}
|
||||
|
||||
for (final File file : pathFiles)
|
||||
@@ -90,12 +91,14 @@ public class MPFileUserManager {
|
||||
logger.err( e, "Couldn't read user from: %s", file );
|
||||
}
|
||||
|
||||
return getFiles();
|
||||
fireUpdated();
|
||||
}
|
||||
|
||||
public MPFileUser add(final String fullName) {
|
||||
MPFileUser user = new MPFileUser( fullName );
|
||||
userByName.put( user.getFullName(), user );
|
||||
fireUpdated();
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
@@ -104,8 +107,8 @@ public class MPFileUserManager {
|
||||
File userFile = user.getFile();
|
||||
if (userFile.exists() && !userFile.delete())
|
||||
logger.err( "Couldn't delete file: %s", userFile );
|
||||
else
|
||||
userByName.values().remove( user );
|
||||
else if (userByName.values().remove( user ))
|
||||
fireUpdated();
|
||||
}
|
||||
|
||||
public File getPath() {
|
||||
@@ -115,4 +118,27 @@ public class MPFileUserManager {
|
||||
public ImmutableSortedSet<MPFileUser> getFiles() {
|
||||
return ImmutableSortedSet.copyOf( userByName.values() );
|
||||
}
|
||||
|
||||
public boolean addListener(final Listener listener) {
|
||||
return listeners.add( listener );
|
||||
}
|
||||
|
||||
public boolean removeListener(final Listener listener) {
|
||||
return listeners.remove( listener );
|
||||
}
|
||||
|
||||
private void fireUpdated() {
|
||||
if (listeners.isEmpty())
|
||||
return;
|
||||
|
||||
ImmutableSortedSet<MPFileUser> files = getFiles();
|
||||
|
||||
for (final Listener listener : listeners)
|
||||
listener.onFilesUpdated( files );
|
||||
}
|
||||
|
||||
public interface Listener {
|
||||
|
||||
void onFilesUpdated(ImmutableSortedSet<MPFileUser> files);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user