diff --git a/platform-independent/c/core/src/mpw-algorithm.c b/platform-independent/c/core/src/mpw-algorithm.c index a9b2d79f..daf3bb1f 100644 --- a/platform-independent/c/core/src/mpw-algorithm.c +++ b/platform-independent/c/core/src/mpw-algorithm.c @@ -122,7 +122,10 @@ const char *mpw_site_result( return NULL; } - if (resultType & MPResultTypeClassTemplate) { + if (resultType == MPResultTypeNone) { + return NULL; + } + else if (resultType & MPResultTypeClassTemplate) { switch (algorithmVersion) { case MPAlgorithmVersionV0: return mpw_site_template_password_v0( masterKey, siteKey, resultType, resultParam ); @@ -203,6 +206,10 @@ const char *mpw_site_state( return NULL; } + if (resultType == MPResultTypeNone) { + return NULL; + } + switch (algorithmVersion) { case MPAlgorithmVersionV0: return mpw_site_state_v0( masterKey, siteKey, resultType, resultParam ); diff --git a/platform-independent/c/core/src/mpw-marshal.c b/platform-independent/c/core/src/mpw-marshal.c index c2a9315f..85e9afe4 100644 --- a/platform-independent/c/core/src/mpw-marshal.c +++ b/platform-independent/c/core/src/mpw-marshal.c @@ -93,7 +93,7 @@ MPMarshalledUser *mpw_marshal_user( .fullName = mpw_strdup( fullName ), .identicon = MPIdenticonUnset, .keyID = NULL, - .defaultType = MPResultTypeDefault, + .defaultType = MPResultTypeDefaultResult, .lastUsed = 0, .sites_count = 0, @@ -122,7 +122,7 @@ MPMarshalledSite *mpw_marshal_site( .resultType = resultType, .resultState = NULL, - .loginType = MPResultTypeTemplateName, + .loginType = MPResultTypeDefaultLogin, .loginState = NULL, .url = NULL, @@ -864,7 +864,7 @@ static void mpw_marshal_read_flat( char *fullName = NULL, *keyID = NULL; MPAlgorithmVersion algorithm = MPAlgorithmVersionCurrent; MPIdenticon identicon = MPIdenticonUnset; - MPResultType defaultType = MPResultTypeDefault; + MPResultType defaultType = MPResultTypeDefaultResult; time_t exportDate = 0; bool headerStarted = false, headerEnded = false, importRedacted = false; for (const char *endOfLine, *positionInLine = in; (endOfLine = strstr( positionInLine, "\n" )); positionInLine = endOfLine + 1) { @@ -1014,13 +1014,14 @@ static void mpw_marshal_read_flat( mpw_marshal_error( file, MPMarshalErrorIllegal, "Invalid site last used: %s: %s", siteName, str_lastUsed ); continue; } + MPResultType siteLoginType = siteLoginState && strlen( siteLoginState )? MPResultTypeStatefulPersonal: MPResultTypeNone; char dateString[21]; mpw_marshal_data_set_num( siteCounter, file->data, "sites", siteName, "counter", NULL ); mpw_marshal_data_set_num( siteAlgorithm, file->data, "sites", siteName, "algorithm", NULL ); mpw_marshal_data_set_num( siteType, file->data, "sites", siteName, "type", NULL ); mpw_marshal_data_set_str( siteResultState, file->data, "sites", siteName, "password", NULL ); - mpw_marshal_data_set_num( MPResultTypeDefault, file->data, "sites", siteName, "login_type", NULL ); + mpw_marshal_data_set_num( siteLoginType, file->data, "sites", siteName, "login_type", NULL ); mpw_marshal_data_set_str( siteLoginState, file->data, "sites", siteName, "login_name", NULL ); mpw_marshal_data_set_num( strtol( str_uses, NULL, 10 ), file->data, "sites", siteName, "uses", NULL ); if (strftime( dateString, sizeof( dateString ), "%FT%TZ", gmtime( &siteLastUsed ) )) @@ -1150,7 +1151,7 @@ MPMarshalledUser *mpw_marshal_auth( } MPIdenticon identicon = mpw_identicon_encoded( mpw_marshal_data_get_str( file->data, "user", "identicon", NULL ) ); const char *keyID = mpw_marshal_data_get_str( file->data, "user", "key_id", NULL ); - MPResultType defaultType = mpw_default_n( MPResultTypeDefault, mpw_marshal_data_get_num( file->data, "user", "default_type", NULL ) ); + MPResultType defaultType = mpw_default_n( MPResultTypeDefaultResult, mpw_marshal_data_get_num( file->data, "user", "default_type", NULL ) ); if (!mpw_type_short_name( defaultType )) { mpw_marshal_error( file, MPMarshalErrorIllegal, "Invalid user default type: %u", defaultType ); return NULL; @@ -1216,7 +1217,7 @@ MPMarshalledUser *mpw_marshal_auth( return NULL; } const char *siteResultState = mpw_marshal_data_get_str( siteData, "password", NULL ); - MPResultType siteLoginType = mpw_default_n( MPResultTypeTemplateName, mpw_marshal_data_get_num( siteData, "login_type", NULL ) ); + MPResultType siteLoginType = mpw_default_n( MPResultTypeDefaultLogin, mpw_marshal_data_get_num( siteData, "login_type", NULL ) ); if (!mpw_type_short_name( siteLoginType )) { mpw_marshal_error( file, MPMarshalErrorIllegal, "Invalid site login type: %s: %u", siteName, siteLoginType ); mpw_free( &masterKey, MPMasterKeySize ); @@ -1258,10 +1259,10 @@ MPMarshalledUser *mpw_marshal_auth( return NULL; } - if (siteResultState && strlen( siteResultState )) + if (siteResultState && strlen( siteResultState ) && masterKey) site->resultState = mpw_site_state( masterKey, site->siteName, site->counter, MPKeyPurposeAuthentication, NULL, site->resultType, siteResultState, site->algorithm ); - if (siteLoginState && strlen( siteLoginState )) + if (siteLoginState && strlen( siteLoginState ) && masterKey) site->loginState = mpw_site_state( masterKey, site->siteName, MPCounterValueInitial, MPKeyPurposeIdentification, NULL, site->loginType, siteLoginState, site->algorithm ); } @@ -1282,7 +1283,7 @@ MPMarshalledUser *mpw_marshal_auth( if (!user->redacted) { // Clear Text - if (answerState && strlen( answerState )) + if (answerState && strlen( answerState ) && masterKey) question->state = mpw_site_state( masterKey, site->siteName, MPCounterValueInitial, MPKeyPurposeRecovery, question->keyword, question->type, answerState, site->algorithm ); } diff --git a/platform-independent/c/core/src/mpw-types.c b/platform-independent/c/core/src/mpw-types.c index 3eaf4341..17af8335 100644 --- a/platform-independent/c/core/src/mpw-types.c +++ b/platform-independent/c/core/src/mpw-types.c @@ -38,6 +38,8 @@ const MPResultType mpw_type_named(const char *typeName) { // Find what password type is represented by the type letter. if (strlen( typeName ) == 1) { + if ('0' == typeName[0]) + return MPResultTypeNone; if ('x' == typeName[0]) return MPResultTypeTemplateMaximum; if ('l' == typeName[0]) @@ -63,6 +65,8 @@ const MPResultType mpw_type_named(const char *typeName) { } // Find what password type is represented by the type name. + if (mpw_strncasecmp( mpw_type_short_name( MPResultTypeNone ), typeName, strlen( typeName ) ) == OK) + return MPResultTypeNone; if (mpw_strncasecmp( mpw_type_short_name( MPResultTypeTemplateMaximum ), typeName, strlen( typeName ) ) == OK) return MPResultTypeTemplateMaximum; if (mpw_strncasecmp( mpw_type_short_name( MPResultTypeTemplateLong ), typeName, strlen( typeName ) ) == OK) @@ -93,6 +97,8 @@ const MPResultType mpw_type_named(const char *typeName) { const char *mpw_type_abbreviation(const MPResultType resultType) { switch (resultType) { + case MPResultTypeNone: + return "no"; case MPResultTypeTemplateMaximum: return "max"; case MPResultTypeTemplateLong: @@ -125,6 +131,8 @@ const char *mpw_type_abbreviation(const MPResultType resultType) { const char *mpw_type_short_name(const MPResultType resultType) { switch (resultType) { + case MPResultTypeNone: + return "none"; case MPResultTypeTemplateMaximum: return "maximum"; case MPResultTypeTemplateLong: @@ -157,6 +165,8 @@ const char *mpw_type_short_name(const MPResultType resultType) { const char *mpw_type_long_name(const MPResultType resultType) { switch (resultType) { + case MPResultTypeNone: + return "None"; case MPResultTypeTemplateMaximum: return "Maximum Security Password"; case MPResultTypeTemplateLong: diff --git a/platform-independent/c/core/src/mpw-types.h b/platform-independent/c/core/src/mpw-types.h index 24a1dab5..06a1d79e 100644 --- a/platform-independent/c/core/src/mpw-types.h +++ b/platform-independent/c/core/src/mpw-types.h @@ -80,6 +80,9 @@ typedef mpw_opts( uint16_t, MPSiteFeature ) { // bit 0-3 | MPResultTypeClass | MPSiteFeature typedef mpw_enum( uint32_t, MPResultType ) { + /** 0: Don't produce a result */ + MPResultTypeNone = 0, + /** 16: pg^VMAUBk5x3p%HP%i4= */ MPResultTypeTemplateMaximum = 0x0 | MPResultTypeClassTemplate | 0x0, /** 17: BiroYena8:Kixa */ @@ -105,7 +108,8 @@ typedef mpw_enum( uint32_t, MPResultType ) { /** 4160: Derive a unique binary key. */ MPResultTypeDeriveKey = 0x0 | MPResultTypeClassDerive | MPSiteFeatureAlternative, - MPResultTypeDefault = MPResultTypeTemplateLong, + MPResultTypeDefaultResult = MPResultTypeTemplateLong, + MPResultTypeDefaultLogin = MPResultTypeTemplateName, }; typedef mpw_enum ( uint32_t, MPCounterValue ) {