Read in site questions from json & don't serialize incomplete MPFileUser
This commit is contained in:
		@@ -42,6 +42,7 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
 | 
			
		||||
 | 
			
		||||
    private MPResultType    defaultType;
 | 
			
		||||
    private ReadableInstant lastUsed;
 | 
			
		||||
    private boolean         complete;
 | 
			
		||||
 | 
			
		||||
    public MPFileUser(final String fullName) {
 | 
			
		||||
        this( fullName, null, MPAlgorithm.Version.CURRENT.getAlgorithm() );
 | 
			
		||||
@@ -131,6 +132,14 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
 | 
			
		||||
        setChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected boolean isComplete() {
 | 
			
		||||
        return complete;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void setComplete() {
 | 
			
		||||
        complete = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public File getFile() {
 | 
			
		||||
        return new File( path, getFullName() + getFormat().fileSuffix() );
 | 
			
		||||
    }
 | 
			
		||||
@@ -157,7 +166,8 @@ public class MPFileUser extends MPBasicUser<MPFileSite> {
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onChanged() {
 | 
			
		||||
        try {
 | 
			
		||||
            getFormat().marshaller().marshall( this );
 | 
			
		||||
            if (isComplete())
 | 
			
		||||
                getFormat().marshaller().marshall( this );
 | 
			
		||||
        }
 | 
			
		||||
        catch (final MPKeyUnavailableException e) {
 | 
			
		||||
            logger.wrn( e, "Cannot write out changes for unauthenticated user: %s.", this );
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,9 @@ public class MPFlatMarshaller implements MPMarshaller {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void marshall(final MPFileUser user)
 | 
			
		||||
            throws IOException, MPKeyUnavailableException, MPMarshalException, MPAlgorithmException {
 | 
			
		||||
        if (!user.isComplete())
 | 
			
		||||
            throw new IllegalStateException( "Cannot marshall an incomplete user: " + user );
 | 
			
		||||
 | 
			
		||||
        StringBuilder content = new StringBuilder();
 | 
			
		||||
        content.append( "# Master Password site export\n" );
 | 
			
		||||
        content.append( "#     " ).append( user.getContentMode().description() ).append( '\n' );
 | 
			
		||||
 
 | 
			
		||||
@@ -188,6 +188,7 @@ public class MPFlatUnmarshaller implements MPUnmarshaller {
 | 
			
		||||
                throw new MPMarshalException( "No full header found in import file." );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        user.setComplete();
 | 
			
		||||
        user.endChanges();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -155,8 +155,8 @@ public class MPJSONFile extends MPJSONAnyObject {
 | 
			
		||||
            String siteName = siteEntry.getKey();
 | 
			
		||||
            Site   fileSite = siteEntry.getValue();
 | 
			
		||||
            MPFileSite site = new MPFileSite(
 | 
			
		||||
                    user, siteName, fileSite.algorithm.getAlgorithm(), UnsignedInteger.valueOf( fileSite.counter ), fileSite.type,
 | 
			
		||||
                    export.redacted? fileSite.password: null,
 | 
			
		||||
                    user, siteName, fileSite.algorithm.getAlgorithm(), UnsignedInteger.valueOf( fileSite.counter ),
 | 
			
		||||
                    fileSite.type, export.redacted? fileSite.password: null,
 | 
			
		||||
                    fileSite.login_type, export.redacted? fileSite.login_name: null,
 | 
			
		||||
                    (fileSite._ext_mpw != null)? fileSite._ext_mpw.url: null, fileSite.uses,
 | 
			
		||||
                    (fileSite.last_used != null)? MPConstants.dateTimeFormatter.parseDateTime( fileSite.last_used ): new Instant() );
 | 
			
		||||
@@ -169,9 +169,23 @@ public class MPJSONFile extends MPJSONAnyObject {
 | 
			
		||||
                                       fileSite.login_name );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (fileSite.questions != null)
 | 
			
		||||
                for (final Map.Entry<String, Site.Question> questionEntry : fileSite.questions.entrySet()) {
 | 
			
		||||
                    Site.Question fileQuestion = questionEntry.getValue();
 | 
			
		||||
                    MPFileQuestion question = new MPFileQuestion( site, questionEntry.getKey(),
 | 
			
		||||
                                                                  fileQuestion.type, export.redacted? fileQuestion.answer: null );
 | 
			
		||||
 | 
			
		||||
                    if (!export.redacted && (fileQuestion.answer != null))
 | 
			
		||||
                        question.setAnswer( (fileQuestion.type != null)? fileQuestion.type: MPResultType.StoredPersonal,
 | 
			
		||||
                                            fileQuestion.answer );
 | 
			
		||||
 | 
			
		||||
                    site.addQuestion( question );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            user.addSite( site );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        user.setComplete();
 | 
			
		||||
        user.endChanges();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,9 @@ public class MPJSONMarshaller implements MPMarshaller {
 | 
			
		||||
    public void marshall(final MPFileUser user)
 | 
			
		||||
            throws IOException, MPKeyUnavailableException, MPMarshalException, MPAlgorithmException {
 | 
			
		||||
 | 
			
		||||
        if (!user.isComplete())
 | 
			
		||||
            throw new IllegalStateException( "Cannot marshall an incomplete user: " + user );
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            objectMapper.writerWithDefaultPrettyPrinter().writeValue( user.getFile(), new MPJSONFile( user ) );
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user