@ -83,7 +83,7 @@ static const char *sql_trustword =
static const char * sql_get_identity =
" select fpr, username, comm_type, lang, "
" identity.flags | pgp_keypair.flags, "
" is_own "
" is_own , pEp_version_major, pEp_version_minor "
" from identity "
" join person on id = identity.user_id "
" join pgp_keypair on fpr = identity.main_key_id "
@ -101,7 +101,7 @@ static const char *sql_get_identity =
static const char * sql_get_identities_by_main_key_id =
" select address, identity.user_id, username, comm_type, lang, "
" identity.flags | pgp_keypair.flags, "
" is_own "
" is_own , pEp_version_major, pEp_version_minor "
" from identity "
" join person on id = identity.user_id "
" join pgp_keypair on fpr = identity.main_key_id "
@ -113,7 +113,7 @@ static const char *sql_get_identities_by_main_key_id =
static const char * sql_get_identity_without_trust_check =
" select identity.main_key_id, username, lang, "
" identity.flags, is_own "
" identity.flags, is_own , pEp_version_major, pEp_version_minor "
" from identity "
" join person on id = identity.user_id "
" where (case when (address = ?1) then (1) "
@ -127,7 +127,7 @@ static const char *sql_get_identity_without_trust_check =
static const char * sql_get_identities_by_address =
" select user_id, identity.main_key_id, username, lang, "
" identity.flags, is_own "
" identity.flags, is_own , pEp_version_major, pEp_version_minor "
" from identity "
" join person on id = identity.user_id "
" where (case when (address = ?1) then (1) "
@ -141,7 +141,7 @@ static const char *sql_get_identities_by_address =
static const char * sql_get_identities_by_userid =
" select address, fpr, username, comm_type, lang, "
" identity.flags | pgp_keypair.flags, "
" is_own "
" is_own , pEp_version_major, pEp_version_minor "
" from identity "
" join person on id = identity.user_id "
" join pgp_keypair on fpr = identity.main_key_id "
@ -239,20 +239,25 @@ static const char* sql_exists_identity_entry =
static const char * sql_set_identity_entry =
" insert into identity ( "
" address, main_key_id, "
" user_id, flags, is_own "
" user_id, flags, is_own, "
" pEp_version_major, pEp_version_minor "
" ) values ( "
" ?1, "
" upper(replace(?2,' ','')), "
" ?3, "
" ?4, "
" ?5 "
" ?5, "
" ?6, "
" ?7 "
" ); " ;
static const char * sql_update_identity_entry =
" update identity "
" set main_key_id = upper(replace(?2,' ','')), "
" flags = ?4, "
" is_own = ?5 "
" is_own = ?5, "
" pEp_version_major = ?6, "
" pEp_version_major = ?7 "
" where (case when (address = ?1) then (1) "
" when (lower(address) = lower(?1)) then (1) "
" when (replace(lower(address),'.','') = replace(lower(?1),'.','')) then (1) "
@ -303,13 +308,25 @@ static const char *sql_unset_identity_flags =
static const char * sql_set_pEp_version =
" update identity "
" set pEp_version = ?1 "
" where (case when (address = ?2) then (1) "
" when (lower(address) = lower(?2)) then (1) "
" when (replace(lower(address),'.','') = replace(lower(?2),'.','')) then (1) "
" set pEp_version_major = ?1, "
" pEp_version_minor = ?2 "
" where (case when (address = ?3) then (1) "
" when (lower(address) = lower(?3)) then (1) "
" when (replace(lower(address),'.','') = replace(lower(?3),'.','')) then (1) "
" else 0 "
" end) = 1 "
" and user_id = ?3 ; " ;
" and user_id = ?4 ; " ;
static const char * sql_upgrade_pEp_version_by_user_id =
" update identity "
" set pEp_version_major = ?1, "
" pEp_version_minor = ?2 "
" where user_id = ?3 "
" and (case when (pEp_version_major < ?1) then (1) "
" when (pEp_version_major > ?1) then (0) "
" when (pEp_version_minor < ?2) then (1) "
" else 0 "
" end) = 1 ; " ;
static const char * sql_set_trust =
" insert into trust (user_id, pgp_keypair_fpr, comm_type) "
@ -403,7 +420,7 @@ static const char *sql_is_own_address =
static const char * sql_own_identities_retrieve =
" select address, fpr, identity.user_id, username, "
" lang, identity.flags | pgp_keypair.flags "
" lang, identity.flags | pgp_keypair.flags , pEp_version_major, pEp_version_minor "
" from identity "
" join person on id = identity.user_id "
" join pgp_keypair on fpr = identity.main_key_id "
@ -975,7 +992,8 @@ DYNAMIC_API PEP_STATUS init(
" comment text, \n "
" flags integer default 0, \n "
" is_own integer default 0, \n "
" pEp_version real default 0, \n "
" pEp_version_major integer default 0, \n "
" pEp_version_minor integer default 0, \n "
" timestamp integer default (datetime('now')), \n "
" primary key (address, user_id) \n "
" ); \n "
@ -1081,7 +1099,7 @@ DYNAMIC_API PEP_STATUS init(
// Sometimes the user_version wasn't set correctly.
if ( version = = 1 ) {
bool version_changed = true ;
if ( table_contains_column ( _session , " identity " , " pEp_version " ) ) {
if ( table_contains_column ( _session , " identity " , " pEp_version _major " ) ) {
version = 12 ;
}
else if ( db_contains_table ( _session , " social_graph " ) > 0 ) {
@ -1441,13 +1459,66 @@ DYNAMIC_API PEP_STATUS init(
int_result = sqlite3_exec (
_session - > db ,
" alter table identity \n "
" add column pEp_version real default 0 \n " ,
" add column pEp_version_major integer default 0; \n "
" alter table identity \n "
" add column pEp_version_minor integer default 0; \n " ,
NULL ,
NULL ,
NULL
) ;
if ( status ! = PEP_STATUS_OK )
return status ;
int_result = sqlite3_exec (
_session - > db ,
" update identity \n "
" set pEp_version_major = 2 \n "
" where exists (select * from person \n "
" where identity.user_id = person.id \n "
" and identity.is_own = 0 \n "
" and person.is_pEp_user = 1); \n " ,
NULL ,
NULL ,
NULL
) ;
if ( status ! = PEP_STATUS_OK )
return status ;
return status ;
// N.B. WE DEFINE PEP_VERSION - IF WE'RE AT 9-DIGIT MAJOR OR MINOR VERSIONS, ER, BAD.
char major_buf [ 10 ] ;
char minor_buf [ 10 ] ;
if ( sscanf ( " %s.%s " , major_buf , minor_buf ) ! = 2 )
return PEP_UNKNOWN_ERROR ; // DO BETTER
size_t major_len = strlen ( major_buf ) ;
size_t minor_len = strlen ( minor_buf ) ;
const char * _ver_12_startstr =
" update identity \n "
" set pEp_version_major = " ;
const char * _ver_12_midstr = " , \n "
" pEp_version_minor = " ;
const char * _ver_12_endstr =
" \n "
" where identity.is_own = 1; \n " ;
size_t new_stringlen = strlen ( _ver_12_startstr ) + major_len +
strlen ( _ver_12_midstr ) + minor_len +
strlen ( _ver_12_endstr ) ;
char * _ver_12_stmt = calloc ( new_stringlen + 1 , 1 ) ;
snprintf ( _ver_12_stmt , new_stringlen + 1 , " %s%s%s%s%s " ,
_ver_12_startstr , major_buf , _ver_12_midstr , minor_buf , _ver_12_endstr ) ;
int_result = sqlite3_exec (
_session - > db ,
_ver_12_stmt ,
NULL ,
NULL ,
NULL
) ;
free ( _ver_12_stmt ) ;
if ( status ! = PEP_STATUS_OK )
return status ;
}
}
else {
@ -1651,6 +1722,11 @@ DYNAMIC_API PEP_STATUS init(
( int ) strlen ( sql_set_pEp_version ) , & _session - > set_pEp_version ,
NULL ) ;
assert ( int_result = = SQLITE_OK ) ;
int_result = sqlite3_prepare_v2 ( _session - > db , sql_upgrade_pEp_version_by_user_id ,
( int ) strlen ( sql_upgrade_pEp_version_by_user_id ) , & _session - > upgrade_pEp_version_by_user_id ,
NULL ) ;
assert ( int_result = = SQLITE_OK ) ;
int_result = sqlite3_prepare_v2 ( _session - > db , sql_set_trust ,
( int ) strlen ( sql_set_trust ) , & _session - > set_trust , NULL ) ;
@ -1892,6 +1968,8 @@ DYNAMIC_API void release(PEP_SESSION session)
sqlite3_finalize ( session - > delete_person ) ;
if ( session - > set_as_pEp_user )
sqlite3_finalize ( session - > set_as_pEp_user ) ;
if ( session - > upgrade_pEp_version_by_user_id )
sqlite3_finalize ( session - > upgrade_pEp_version_by_user_id ) ;
if ( session - > is_pEp_user )
sqlite3_finalize ( session - > is_pEp_user ) ;
if ( session - > exists_person )
@ -1920,6 +1998,8 @@ DYNAMIC_API void release(PEP_SESSION session)
sqlite3_finalize ( session - > set_identity_flags ) ;
if ( session - > unset_identity_flags )
sqlite3_finalize ( session - > unset_identity_flags ) ;
if ( session - > set_pEp_version )
sqlite3_finalize ( session - > set_pEp_version ) ;
if ( session - > exists_trust_entry )
sqlite3_finalize ( session - > exists_trust_entry ) ;
if ( session - > set_trust )
@ -2482,6 +2562,10 @@ DYNAMIC_API PEP_STATUS get_identity(
sqlite3_column_int ( session - > get_identity , 4 ) ;
_identity - > me = ( unsigned int )
sqlite3_column_int ( session - > get_identity , 5 ) ;
_identity - > major_ver =
sqlite3_column_int ( session - > get_identity , 6 ) ;
_identity - > minor_ver =
sqlite3_column_int ( session - > get_identity , 7 ) ;
* identity = _identity ;
break ;
@ -2556,6 +2640,10 @@ PEP_STATUS get_identities_by_userid(
sqlite3_column_int ( session - > get_identities_by_userid , 5 ) ;
ident - > me = ( unsigned int )
sqlite3_column_int ( session - > get_identities_by_userid , 6 ) ;
ident - > major_ver =
sqlite3_column_int ( session - > get_identities_by_userid , 6 ) ;
ident - > minor_ver =
sqlite3_column_int ( session - > get_identities_by_userid , 7 ) ;
identity_list_add ( * identities , ident ) ;
ident = NULL ;
@ -2622,6 +2710,10 @@ PEP_STATUS get_identities_by_main_key_id(
sqlite3_column_int ( session - > get_identities_by_main_key_id , 5 ) ;
ident - > me = ( unsigned int )
sqlite3_column_int ( session - > get_identities_by_main_key_id , 6 ) ;
ident - > major_ver =
sqlite3_column_int ( session - > get_identities_by_main_key_id , 7 ) ;
ident - > minor_ver =
sqlite3_column_int ( session - > get_identities_by_main_key_id , 8 ) ;
identity_list_add ( * identities , ident ) ;
ident = NULL ;
@ -2692,6 +2784,10 @@ PEP_STATUS get_identity_without_trust_check(
sqlite3_column_int ( session - > get_identity_without_trust_check , 3 ) ;
_identity - > me = ( unsigned int )
sqlite3_column_int ( session - > get_identity_without_trust_check , 4 ) ;
_identity - > major_ver =
sqlite3_column_int ( session - > get_identity_without_trust_check , 6 ) ;
_identity - > minor_ver =
sqlite3_column_int ( session - > get_identity_without_trust_check , 7 ) ;
* identity = _identity ;
break ;
@ -2757,6 +2853,10 @@ PEP_STATUS get_identities_by_address(
sqlite3_column_int ( session - > get_identities_by_address , 4 ) ;
ident - > me = ( unsigned int )
sqlite3_column_int ( session - > get_identities_by_address , 5 ) ;
ident - > major_ver =
sqlite3_column_int ( session - > get_identities_by_address , 6 ) ;
ident - > minor_ver =
sqlite3_column_int ( session - > get_identities_by_address , 7 ) ;
if ( ident_list )
identity_list_add ( ident_list , ident ) ;
@ -2913,6 +3013,9 @@ static PEP_STATUS _set_or_update_identity_entry(PEP_SESSION session,
SQLITE_STATIC ) ;
sqlite3_bind_int ( set_or_update , 4 , identity - > flags ) ;
sqlite3_bind_int ( set_or_update , 5 , identity - > me ) ;
sqlite3_bind_int ( set_or_update , 6 , identity - > major_ver ) ;
sqlite3_bind_int ( set_or_update , 7 , identity - > minor_ver ) ;
int result = sqlite3_step ( set_or_update ) ;
sqlite3_reset ( set_or_update ) ;
if ( result ! = SQLITE_DONE )
@ -3117,7 +3220,9 @@ PEP_STATUS update_pEp_user_trust_vals(PEP_SESSION session,
if ( result ! = SQLITE_DONE )
return PEP_CANNOT_SET_TRUST ;
return PEP_STATUS_OK ;
PEP_STATUS status = upgrade_pEp_version_by_user_id ( session , user , 2 , 0 ) ;
return status ;
}
@ -3159,16 +3264,17 @@ DYNAMIC_API PEP_STATUS set_as_pEp_user(PEP_SESSION session, pEp_identity* user)
}
// This ONLY sets the version flag. Must be called outside of a transaction.
PEP_STATUS set_pEp_version ( PEP_SESSION session , pEp_identity * ident , float new_pEp_version ) {
PEP_STATUS set_pEp_version ( PEP_SESSION session , pEp_identity * ident , unsigned int new_ver_major , unsigned int new_ver_minor ) {
assert ( session ) ;
assert ( ! EMPTYSTR ( ident - > user_id ) ) ;
assert ( ! EMPTYSTR ( ident - > address ) ) ;
sqlite3_reset ( session - > set_pEp_version ) ;
sqlite3_bind_double ( session - > set_pEp_version , 1 , new_pEp_version ) ;
sqlite3_bind_text ( session - > set_pEp_version , 2 , ident - > address , - 1 ,
sqlite3_bind_double ( session - > set_pEp_version , 1 , new_ver_major ) ;
sqlite3_bind_double ( session - > set_pEp_version , 2 , new_ver_minor ) ;
sqlite3_bind_text ( session - > set_pEp_version , 3 , ident - > address , - 1 ,
SQLITE_STATIC ) ;
sqlite3_bind_text ( session - > set_pEp_version , 3 , ident - > user_id , - 1 ,
sqlite3_bind_text ( session - > set_pEp_version , 4 , ident - > user_id , - 1 ,
SQLITE_STATIC ) ;
int result = sqlite3_step ( session - > set_pEp_version ) ;
@ -3180,6 +3286,30 @@ PEP_STATUS set_pEp_version(PEP_SESSION session, pEp_identity* ident, float new_p
return PEP_STATUS_OK ;
}
// Generally ONLY called by set_as_pEp_user, and ONLY from < 2.0 to 2.0.
PEP_STATUS upgrade_pEp_version_by_user_id ( PEP_SESSION session ,
pEp_identity * ident ,
unsigned int new_ver_major ,
unsigned int new_ver_minor
)
{
assert ( session ) ;
assert ( ! EMPTYSTR ( ident - > user_id ) ) ;
sqlite3_reset ( session - > upgrade_pEp_version_by_user_id ) ;
sqlite3_bind_int ( session - > upgrade_pEp_version_by_user_id , 1 , new_ver_major ) ;
sqlite3_bind_int ( session - > upgrade_pEp_version_by_user_id , 2 , new_ver_minor ) ;
sqlite3_bind_text ( session - > upgrade_pEp_version_by_user_id , 3 , ident - > user_id , - 1 ,
SQLITE_STATIC ) ;
int result = sqlite3_step ( session - > upgrade_pEp_version_by_user_id ) ;
sqlite3_reset ( session - > upgrade_pEp_version_by_user_id ) ;
if ( result ! = SQLITE_DONE )
return PEP_CANNOT_SET_PEP_VERSION ;
return PEP_STATUS_OK ;
}
PEP_STATUS exists_person ( PEP_SESSION session , pEp_identity * identity ,
bool * exists ) {