1 // This file is under GNU General Public License 3.0
4 #include "pEp_internal.h"
5 #include "dynamic_api.h"
6 #include "cryptotech.h"
13 #define _PEP_SQLITE_DEBUG 0
18 static volatile int init_count = -1;
20 // sql overloaded functions - modified from sqlite3.c
21 static void _sql_lower(sqlite3_context* ctx, int argc, sqlite3_value** argv) {
25 z2 = (char*)sqlite3_value_text(argv[0]);
26 n = sqlite3_value_bytes(argv[0]);
27 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
28 assert( z2==(char*)sqlite3_value_text(argv[0]) );
30 z1 = (char*)sqlite3_malloc(n+1);
34 char c_mod = c | 0x20;
35 if (c_mod < 0x61 || c_mod > 0x7a)
40 sqlite3_result_text(ctx, z1, n, sqlite3_free);
46 int sql_trace_callback (unsigned trace_constant,
50 switch (trace_constant) {
51 case SQLITE_TRACE_STMT:
52 fprintf(stderr, "SQL_DEBUG: STMT - ");
53 const char* X_str = (const char*) X;
54 if (!EMPTYSTR(X_str) && X_str[0] == '-' && X_str[1] == '-')
55 fprintf(stderr, "%s\n", X_str);
57 fprintf(stderr, "%s\n", sqlite3_expanded_sql((sqlite3_stmt*)P));
59 case SQLITE_TRACE_ROW:
60 fprintf(stderr, "SQL_DEBUG: ROW - ");
61 fprintf(stderr, "%s\n", sqlite3_expanded_sql((sqlite3_stmt*)P));
63 case SQLITE_TRACE_CLOSE:
64 fprintf(stderr, "SQL_DEBUG: CLOSE - ");
73 // sql manipulation statements
74 static const char *sql_log =
75 "insert into log (title, entity, description, comment)"
76 "values (?1, ?2, ?3, ?4);";
78 static const char *sql_trustword =
79 "select id, word from wordlist where lang = lower(?1) "
82 static const char *sql_get_identity =
83 "select fpr, username, comm_type, lang,"
84 " identity.flags | pgp_keypair.flags,"
87 " join person on id = identity.user_id"
88 " join pgp_keypair on fpr = identity.main_key_id"
89 " join trust on id = trust.user_id"
90 " and pgp_keypair_fpr = identity.main_key_id"
91 " where (case when (address = ?1) then (1)"
92 " when (lower(address) = lower(?1)) then (1)"
93 " when (replace(lower(address),'.','') = replace(lower(?1),'.','')) then (1)"
96 " and identity.user_id = ?2"
97 " order by is_own desc, "
100 static const char *sql_get_identity_without_trust_check =
101 "select identity.main_key_id, username, lang,"
102 " identity.flags, is_own"
104 " join person on id = identity.user_id"
105 " where (case when (address = ?1) then (1)"
106 " when (lower(address) = lower(?1)) then (1)"
107 " when (replace(lower(address),'.','') = replace(lower(?1),'.','')) then (1)"
110 " and identity.user_id = ?2 "
111 " order by is_own desc, "
114 static const char *sql_get_identities_by_address =
115 "select user_id, identity.main_key_id, username, lang,"
116 " identity.flags, is_own"
118 " join person on id = identity.user_id"
119 " where (case when (address = ?1) then (1)"
120 " when (lower(address) = lower(?1)) then (1)"
121 " when (replace(lower(address),'.','') = replace(lower(?1),'.','')) then (1)"
124 " order by is_own desc, "
127 static const char *sql_replace_identities_fpr =
129 " set main_key_id = ?1 "
130 " where main_key_id = ?2 ;";
132 static const char *sql_remove_fpr_as_default =
133 "update person set main_key_id = NULL where main_key_id = ?1 ;"
134 "update identity set main_key_id = NULL where main_key_id = ?1 ;";
136 // Set person, but if already exist, only update.
137 // if main_key_id already set, don't touch.
138 static const char *sql_set_person =
139 "insert into person (id, username, lang, main_key_id, device_group)"
140 " values (?1, ?2, ?3, ?4, "
141 " (select device_group from person where id = ?1)) ;";
143 static const char *sql_update_person =
145 " set username = ?2, "
148 " (select coalesce( "
149 " (select main_key_id from person where id = ?1), "
150 " upper(replace(?4,' ','')))),"
152 " (select device_group from person where id = ?1)"
155 static const char *sql_set_as_pep_user =
156 "update person set is_pep_user = 1 "
159 static const char *sql_is_pep_user =
160 "select is_pep_user from person "
163 static const char* sql_exists_person =
164 "select count(*) from person "
167 static const char *sql_set_device_group =
168 "update person set device_group = ?1 "
171 // This will cascade to identity and trust
172 static const char* sql_replace_userid =
173 "update person set id = ?1 "
176 static const char *sql_replace_main_user_fpr =
178 " set main_key_id = ?1 "
181 static const char *sql_get_main_user_fpr =
182 "select main_key_id from person"
185 static const char *sql_refresh_userid_default_key =
187 " set main_key_id = "
188 " (select identity.main_key_id from identity "
189 " join trust on trust.user_id = identity.user_id "
190 " and trust.pgp_keypair_fpr = identity.main_key_id "
191 " join person on identity.user_id = identity.user_id "
192 " where identity.user_id = ?1 "
193 " order by trust.comm_type desc "
197 static const char *sql_get_device_group =
198 "select device_group from person "
201 static const char *sql_set_pgp_keypair =
202 "insert or ignore into pgp_keypair (fpr) "
203 "values (upper(replace(?1,' ',''))) ;";
205 static const char* sql_exists_identity_entry =
206 "select count(*) from identity "
207 " where (case when (address = ?1) then (1)"
208 " when (lower(address) = lower(?1)) then (1)"
209 " when (replace(lower(address),'.','') = replace(lower(?1),'.','')) then (1)"
212 " and user_id = ?2;";
214 static const char *sql_set_identity_entry =
215 "insert into identity ("
216 " address, main_key_id, "
217 " user_id, flags, is_own"
220 " upper(replace(?2,' ','')),"
226 static const char* sql_update_identity_entry =
228 " set main_key_id = upper(replace(?2,' ','')), "
231 " where (case when (address = ?1) then (1)"
232 " when (lower(address) = lower(?1)) then (1)"
233 " when (replace(lower(address),'.','') = replace(lower(?1),'.','')) then (1) "
236 " and user_id = ?3 ;";
240 // " (select flags from identity"
241 // " where address = ?1 and"
245 /* set_identity ignores previous flags, and doesn't filter machine flags */
247 static const char *sql_set_identity_flags =
248 "update identity set flags = "
249 " ((?1 & 255) | (select flags from identity"
250 " where (case when (address = ?2) then (1)"
251 " when (lower(address) = lower(?2)) then (1)"
252 " when (replace(lower(address),'.','') = replace(lower(?2),'.','')) then (1)"
255 " and user_id = ?3)) "
256 " where (case when (address = ?2) then (1)"
257 " when (lower(address) = lower(?2)) then (1)"
258 " when (replace(lower(address),'.','') = replace(lower(?2),'.','')) then (1)"
261 " and user_id = ?3 ;";
263 static const char *sql_unset_identity_flags =
264 "update identity set flags = "
265 " ( ~(?1 & 255) & (select flags from identity"
266 " where (case when (address = ?2) then (1)"
267 " when (lower(address) = lower(?2)) then (1)"
268 " when (replace(lower(address),'.','') = replace(lower(?2),'.','')) then (1)"
271 " and user_id = ?3)) "
272 " where (case when (address = ?2) then (1)"
273 " when (lower(address) = lower(?2)) then (1)"
274 " when (replace(lower(address),'.','') = replace(lower(?2),'.','')) then (1)"
277 " and user_id = ?3 ;";
279 static const char *sql_set_trust =
280 "insert into trust (user_id, pgp_keypair_fpr, comm_type) "
281 "values (?1, upper(replace(?2,' ','')), ?3) ;";
283 static const char *sql_update_trust =
284 "update trust set comm_type = ?3 "
285 " where user_id = ?1 and pgp_keypair_fpr = upper(replace(?2,' ',''));";
287 static const char *sql_update_trust_to_pep =
288 "update trust set comm_type = comm_type + 71 "
289 " where (user_id = ?1 "
290 " and (case when (comm_type = 56) then (1) "
291 " when (comm_type = 184) then (1) "
295 static const char* sql_exists_trust_entry =
296 "select count(*) from trust "
297 " where user_id = ?1 and pgp_keypair_fpr = upper(replace(?2,' ',''));";
299 static const char *sql_update_trust_for_fpr =
301 "set comm_type = ?1 "
302 "where pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
304 static const char *sql_get_trust =
305 "select comm_type from trust where user_id = ?1 "
306 "and pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
308 static const char *sql_least_trust =
309 "select min(comm_type) from trust where"
310 " pgp_keypair_fpr = upper(replace(?1,' ',''))"
311 " and comm_type != 0;"; // ignores PEP_ct_unknown
312 // returns PEP_ct_unknown only when no known trust is recorded
314 static const char *sql_mark_as_compromised =
315 "update trust not indexed set comm_type = 15"
316 " where pgp_keypair_fpr = upper(replace(?1,' ','')) ;";
318 static const char *sql_crashdump =
319 "select timestamp, title, entity, description, comment"
320 " from log order by timestamp desc limit ?1 ;";
322 static const char *sql_languagelist =
323 "select i18n_language.lang, name, phrase"
324 " from i18n_language join i18n_token using (lang) where i18n_token.id = 1000;" ;
326 static const char *sql_i18n_token =
327 "select phrase from i18n_token where lang = lower(?1) and id = ?2 ;";
330 static const char *sql_blacklist_add =
331 "insert or ignore into blacklist_keys (fpr) values (upper(replace(?1,' ',''))) ;"
332 "delete from identity where main_key_id = upper(replace(?1,' ','')) ;"
333 "delete from pgp_keypair where fpr = upper(replace(?1,' ','')) ;";
335 static const char *sql_blacklist_delete =
336 "delete from blacklist_keys where fpr = upper(replace(?1,' ','')) ;";
338 static const char *sql_blacklist_is_listed =
339 "select count(*) from blacklist_keys where fpr = upper(replace(?1,' ','')) ;";
341 static const char *sql_blacklist_retrieve =
342 "select * from blacklist_keys ;";
346 // We only care if it's 0 or non-zero
347 static const char *sql_own_key_is_listed =
348 "select count(*) from ("
349 " select pgp_keypair_fpr from trust"
350 " join identity on trust.user_id = identity.user_id"
351 " where pgp_keypair_fpr = upper(replace(?1,' ',''))"
352 " and identity.is_own = 1"
355 static const char *sql_own_identities_retrieve =
356 "select address, fpr, username, identity.user_id, "
357 " lang, identity.flags | pgp_keypair.flags"
359 " join person on id = identity.user_id"
360 " join pgp_keypair on fpr = identity.main_key_id"
361 " join trust on id = trust.user_id"
362 " and pgp_keypair_fpr = identity.main_key_id"
363 " where identity.is_own = 1"
364 " and (identity.flags & ?1) = 0;";
366 static const char *sql_own_keys_retrieve =
367 "select pgp_keypair_fpr from trust"
368 " join identity on trust.user_id = identity.user_id"
369 " where identity.is_own = 1";
371 static const char* sql_get_user_default_key =
372 "select main_key_id from person"
375 static const char* sql_get_default_own_userid =
376 "select id from person"
377 " join identity on id = identity.user_id"
378 " where identity.is_own = 1";
381 static const char *sql_sequence_value1 =
382 "insert or replace into sequences (name, value, own) "
384 " (select coalesce((select value + 1 from sequences "
385 " where name = ?1), 1 )), "
386 " (select coalesce((select own or ?2 from sequences "
387 " where name = ?1), ?2))) ; ";
389 static const char *sql_sequence_value2 =
390 "select value, own from sequences where name = ?1 ;";
392 static const char *sql_sequence_value3 =
393 "insert or replace into sequences (name, value, own) "
396 " (select coalesce((select own or ?3 from sequences "
397 " where name = ?1), ?3))) ; ";
399 // Revocation tracking
400 static const char *sql_set_revoked =
401 "insert or replace into revoked_keys ("
402 " revoked_fpr, replacement_fpr, revocation_date) "
403 "values (upper(replace(?1,' ','')),"
404 " upper(replace(?2,' ','')),"
407 static const char *sql_get_revoked =
408 "select revoked_fpr, revocation_date from revoked_keys"
409 " where replacement_fpr = upper(replace(?1,' ','')) ;";
411 static const char *sql_get_userid_alias_default =
412 "select default_id from alternate_user_id "
413 " where alternate_id = ?1 ; ";
415 // Revocation tracking
416 static const char *sql_add_mistrusted_key =
417 "insert or replace into mistrusted_keys (fpr) "
418 " values (upper(replace(?1,' ',''))) ;";
420 static const char *sql_delete_mistrusted_key =
421 "delete from mistrusted_keys where fpr = upper(replace(?1,' ','')) ;";
423 static const char *sql_is_mistrusted_key =
424 "select count(*) from mistrusted_keys where fpr = upper(replace(?1,' ','')) ;";
426 static const char *sql_add_userid_alias =
427 "insert or replace into alternate_user_id (alternate_id, default_id) "
430 static int user_version(void *_version, int count, char **text, char **name)
434 assert(text && text[0]);
435 if (!(_version && count == 1 && text && text[0]))
438 int *version = (int *) _version;
439 *version = atoi(text[0]);
443 static int table_contains_column(PEP_SESSION session, const char* table_name,
444 const char* col_name) {
447 if (!session || !table_name || !col_name)
450 // Table names can't be SQL parameters, so we do it this way.
452 // these two must be the same number.
454 const size_t max_q_len = 500;
456 size_t t_size, c_size, q_size;
458 const char* q1 = "SELECT "; // 7
459 const char* q2 = " from "; // 6
460 const char* q3 = ";"; // 1
463 t_size = strlen(table_name);
464 c_size = strlen(col_name);
466 size_t query_len = q_size + c_size + t_size + 1;
468 if (query_len > max_q_len)
471 strlcpy(sql_buf, q1, max_q_len);
472 strlcat(sql_buf, col_name, max_q_len);
473 strlcat(sql_buf, q2, max_q_len);
474 strlcat(sql_buf, table_name, max_q_len);
475 strlcat(sql_buf, q3, max_q_len);
479 sqlite3_prepare_v2(session->db, sql_buf, -1, &stmt, NULL);
483 int rc = sqlite3_step(stmt);
484 if (rc == SQLITE_DONE || rc == SQLITE_OK || rc == SQLITE_ROW) {
488 sqlite3_finalize(stmt);
493 void errorLogCallback(void *pArg, int iErrCode, const char *zMsg){
494 fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
498 PEP_STATUS pgp_import_ultimately_trusted_keypairs(PEP_SESSION session);
501 DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
503 PEP_STATUS status = PEP_STATUS_OK;
506 bool in_first = false;
507 bool very_first = false;
509 assert(sqlite3_threadsafe());
510 if (!sqlite3_threadsafe())
511 return PEP_INIT_SQLITE3_WITHOUT_MUTEX;
513 // a little race condition - but still a race condition
514 // mitigated by calling caveat (see documentation)
516 // this increment is made atomic IN THE ADAPTERS by
517 // guarding the call to init with the appropriate mutex.
518 int _count = ++init_count;
522 // Race condition mitigated by calling caveat starts here :
523 // If another call to init() preempts right now, then preemptive call
524 // will have in_first false, will not create SQL tables, and following
525 // calls relying on those tables will fail.
527 // Therefore, as above, adapters MUST guard init() with a mutex.
529 // Therefore, first session
530 // is to be created and last session to be deleted alone, and not
531 // concurently to other sessions creation or deletion.
532 // We expect adapters to enforce this either by implicitely creating a
533 // client session, or by using synchronization primitive to protect
534 // creation/deletion of first/last session from the app.
538 return PEP_ILLEGAL_VALUE;
542 pEpSession *_session = calloc(1, sizeof(pEpSession));
544 if (_session == NULL)
547 _session->version = PEP_ENGINE_VERSION;
549 #ifdef DEBUG_ERRORSTACK
550 _session->errorstack = new_stringlist("init()");
554 if (LOCAL_DB == NULL) {
555 status = PEP_INIT_CANNOT_OPEN_DB;
559 #if _PEP_SQLITE_DEBUG
560 sqlite3_config(SQLITE_CONFIG_LOG, errorLogCallback, NULL);
563 int_result = sqlite3_open_v2(
566 SQLITE_OPEN_READWRITE
568 | SQLITE_OPEN_FULLMUTEX
569 | SQLITE_OPEN_PRIVATECACHE,
573 if (int_result != SQLITE_OK) {
574 status = PEP_INIT_CANNOT_OPEN_DB;
578 int_result = sqlite3_exec(
580 "PRAGMA locking_mode=NORMAL;\n"
581 "PRAGMA journal_mode=WAL;\n",
588 sqlite3_busy_timeout(_session->db, BUSY_WAIT_TIME);
590 #if _PEP_SQLITE_DEBUG
591 sqlite3_trace_v2(_session->db,
592 SQLITE_TRACE_STMT | SQLITE_TRACE_ROW | SQLITE_TRACE_CLOSE,
598 if (SYSTEM_DB == NULL) {
599 status = PEP_INIT_CANNOT_OPEN_SYSTEM_DB;
603 int_result = sqlite3_open_v2(
604 SYSTEM_DB, &_session->system_db,
606 | SQLITE_OPEN_FULLMUTEX
607 | SQLITE_OPEN_SHAREDCACHE,
611 if (int_result != SQLITE_OK) {
612 status = PEP_INIT_CANNOT_OPEN_SYSTEM_DB;
616 sqlite3_busy_timeout(_session->system_db, 1000);
618 // increment this when patching DDL
619 #define _DDL_USER_VERSION "8"
623 int_result = sqlite3_exec(
625 "create table if not exists version_info (\n"
626 " id integer primary key,\n"
627 " timestamp integer default (datetime('now')),\n"
635 int_result = sqlite3_exec(
637 "PRAGMA application_id = 0x23423423;\n"
638 "create table if not exists log (\n"
639 " timestamp integer default (datetime('now')),\n"
640 " title text not null,\n"
641 " description text,\n"
642 " entity text not null,\n"
645 "create index if not exists log_timestamp on log (\n"
648 "create table if not exists pgp_keypair (\n"
649 " fpr text primary key,\n"
650 " created integer,\n"
651 " expires integer,\n"
653 " flags integer default 0\n"
655 "create index if not exists pgp_keypair_expires on pgp_keypair (\n"
658 "create table if not exists person (\n"
659 " id text primary key,\n"
660 " username text not null,\n"
661 " main_key_id text\n"
662 " references pgp_keypair (fpr)\n"
663 " on delete set null,\n"
666 " device_group text,\n"
667 " is_pep_user integer default 0\n"
669 "create table if not exists identity (\n"
672 " references person (id)\n"
673 " on delete cascade on update cascade,\n"
674 " main_key_id text\n"
675 " references pgp_keypair (fpr)\n"
676 " on delete set null,\n"
678 " flags integer default 0,\n"
679 " is_own integer default 0,\n"
680 " timestamp integer default (datetime('now')),\n"
681 " primary key (address, user_id)\n"
683 "create table if not exists trust (\n"
684 " user_id text not null\n"
685 " references person (id)\n"
686 " on delete cascade on update cascade,\n"
687 " pgp_keypair_fpr text not null\n"
688 " references pgp_keypair (fpr)\n"
689 " on delete cascade,\n"
690 " comm_type integer not null,\n"
692 " primary key (user_id, pgp_keypair_fpr)\n"
695 "create table if not exists blacklist_keys (\n"
696 " fpr text primary key\n"
699 "create table if not exists sequences(\n"
700 " name text primary key,\n"
701 " value integer default 0,\n"
702 " own integer default 0\n"
704 "create table if not exists revoked_keys (\n"
705 " revoked_fpr text primary key,\n"
706 " replacement_fpr text not null\n"
707 " references pgp_keypair (fpr)\n"
708 " on delete cascade,\n"
709 " revocation_date integer\n"
712 "create table if not exists alternate_user_id (\n"
713 " default_id text references person (id)\n"
714 " on delete cascade on update cascade,\n"
715 " alternate_id text primary key\n"
718 "create table if not exists mistrusted_keys (\n"
719 " fpr text primary key\n"
726 assert(int_result == SQLITE_OK);
729 int_result = sqlite3_exec(
731 "pragma user_version;",
737 assert(int_result == SQLITE_OK);
739 void (*xFunc_lower)(sqlite3_context*,int,sqlite3_value**) = &_sql_lower;
741 int_result = sqlite3_create_function_v2(
745 SQLITE_UTF8 | SQLITE_DETERMINISTIC,
751 assert(int_result == SQLITE_OK);
753 int_result = sqlite3_exec(
755 "pragma foreign_keys=ON;\n",
761 assert(int_result == SQLITE_OK);
764 // Sometimes the user_version wasn't set correctly. Check to see if this
765 // is really necessary...
767 bool version_changed = true;
768 if (table_contains_column(_session, "identity", "timestamp") > 0) {
771 if (table_contains_column(_session, "person", "is_pep_user") > 0) {
774 else if (table_contains_column(_session, "identity", "is_own") > 0) {
777 else if (table_contains_column(_session, "sequences", "own") > 0) {
780 else if (table_contains_column(_session, "pgp_keypair", "flags") > 0) {
784 version_changed = false;
787 if (version_changed) {
788 // set it in the DB, finally. Yeesh.
789 char verbuf[21]; // enough digits for a max-sized 64 bit int, cmon.
790 sprintf(verbuf,"%d",version);
792 size_t query_size = strlen(verbuf) + 25;
793 char* query = calloc(query_size, 1);
795 strlcpy(query, "pragma user_version = ", query_size);
796 strlcat(query, verbuf, query_size);
797 strlcat(query, ";", query_size);
799 int_result = sqlite3_exec(
812 // Version has been already set
814 // Early mistake : version 0 shouldn't have existed.
815 // Numbering should have started at 1 to detect newly created DB.
816 // Version 0 DBs are not anymore compatible.
818 // // Was version 0 compat code.
819 // if (version < 1) {
820 // int_result = sqlite3_exec(
822 // "alter table identity\n"
823 // " add column flags integer default 0;\n",
828 // assert(int_result == SQLITE_OK);
832 int_result = sqlite3_exec(
834 "alter table pgp_keypair\n"
835 " add column flags integer default 0;\n"
836 "alter table person\n"
837 " add column device_group text;\n",
842 assert(int_result == SQLITE_OK);
846 int_result = sqlite3_exec(
848 "alter table sequences\n"
849 " add column own integer default 0;\n",
854 assert(int_result == SQLITE_OK);
858 int_result = sqlite3_exec(
860 "delete from pgp_keypair where fpr = '';",
865 assert(int_result == SQLITE_OK);
866 int_result = sqlite3_exec(
868 "delete from trust where pgp_keypair_fpr = '';",
873 assert(int_result == SQLITE_OK);
877 int_result = sqlite3_exec(
879 "alter table identity\n"
880 " add column is_own integer default 0;\n",
885 assert(int_result == SQLITE_OK);
886 int_result = sqlite3_exec(
890 " where (user_id = '" PEP_OWN_USERID "');\n",
895 assert(int_result == SQLITE_OK);
897 // Turns out that just adding "on update cascade" in
898 // sqlite is a PITA. We need to be able to cascade
899 // person->id replacements (for temp ids like "TOFU_")
901 int_result = sqlite3_exec(
903 "PRAGMA foreign_keys=off;\n"
904 "BEGIN TRANSACTION;\n"
905 "ALTER TABLE identity RENAME TO _identity_old;\n"
906 "create table identity (\n"
909 " references person (id)\n"
910 " on delete cascade on update cascade,\n"
911 " main_key_id text\n"
912 " references pgp_keypair (fpr)\n"
913 " on delete set null,\n"
915 " flags integer default 0,\n"
916 " is_own integer default 0,\n"
917 " primary key (address, user_id)\n"
919 "INSERT INTO identity SELECT * FROM _identity_old;\n"
920 "DROP TABLE _identity_old;\n"
921 "ALTER TABLE trust RENAME TO _trust_old;\n"
922 "create table trust (\n"
923 " user_id text not null\n"
924 " references person (id)\n"
925 " on delete cascade on update cascade,\n"
926 " pgp_keypair_fpr text not null\n"
927 " references pgp_keypair (fpr)\n"
928 " on delete cascade,\n"
929 " comm_type integer not null,\n"
931 " primary key (user_id, pgp_keypair_fpr)\n"
933 "INSERT INTO trust SELECT * FROM _trust_old;\n"
934 "DROP TABLE _trust_old;\n"
937 "PRAGMA foreign_keys=on;\n"
938 "create table if not exists alternate_user_id (\n"
939 " default_id text references person (id)\n"
940 " on delete cascade on update cascade,\n"
941 " alternate_id text primary key\n"
948 assert(int_result == SQLITE_OK);
951 int_result = sqlite3_exec(
953 "alter table person\n"
954 " add column is_pep_user integer default 0;\n",
959 assert(int_result == SQLITE_OK);
960 int_result = sqlite3_exec(
963 " set is_pep_user = 1\n"
965 " (select distinct id from person "
966 " join trust on id = user_id "
967 " where (case when (comm_type = 127) then (id) "
968 " when (comm_type = 255) then (id) "
975 assert(int_result == SQLITE_OK);
977 int_result = sqlite3_exec(
979 "create table if not exists mistrusted_keys (\n"
980 " fpr text primary key\n"
986 assert(int_result == SQLITE_OK);
989 int_result = sqlite3_exec(
991 "PRAGMA foreign_keys=off;\n"
992 "BEGIN TRANSACTION;\n"
993 "ALTER TABLE identity RENAME TO _identity_old;\n"
994 "create table identity (\n"
997 " references person (id)\n"
998 " on delete cascade on update cascade,\n"
999 " main_key_id text\n"
1000 " references pgp_keypair (fpr)\n"
1001 " on delete set null,\n"
1003 " flags integer default 0,\n"
1004 " is_own integer default 0,\n"
1005 " timestamp integer default (datetime('now')),\n"
1006 " primary key (address, user_id)\n"
1008 "INSERT INTO identity (address, user_id, main_key_id, "
1009 " comment, flags, is_own) "
1010 " SELECT _identity_old.address, _identity_old.user_id, "
1011 " _identity_old.main_key_id, _identity_old.comment, "
1012 " _identity_old.flags, _identity_old.is_own "
1013 " FROM _identity_old "
1015 "DROP TABLE _identity_old;\n"
1018 "PRAGMA foreign_keys=on;\n"
1024 assert(int_result == SQLITE_OK);
1028 // Version from DB was 0, it means this is initial setup.
1029 // DB has just been created, and all tables are empty.
1033 if (version < atoi(_DDL_USER_VERSION)) {
1034 int_result = sqlite3_exec(
1036 "pragma user_version = "_DDL_USER_VERSION";\n"
1037 "insert or replace into version_info (id, version)"
1038 "values (1, '" PEP_ENGINE_VERSION "');",
1043 assert(int_result == SQLITE_OK);
1046 // We need to init a few globals for message id that we'd rather not
1047 // calculate more than once.
1051 int_result = sqlite3_prepare_v2(_session->db, sql_log,
1052 (int)strlen(sql_log), &_session->log, NULL);
1053 assert(int_result == SQLITE_OK);
1055 int_result = sqlite3_prepare_v2(_session->system_db, sql_trustword,
1056 (int)strlen(sql_trustword), &_session->trustword, NULL);
1057 assert(int_result == SQLITE_OK);
1059 int_result = sqlite3_prepare_v2(_session->db, sql_get_identity,
1060 (int)strlen(sql_get_identity), &_session->get_identity, NULL);
1061 assert(int_result == SQLITE_OK);
1063 int_result = sqlite3_prepare_v2(_session->db, sql_get_identity_without_trust_check,
1064 (int)strlen(sql_get_identity_without_trust_check),
1065 &_session->get_identity_without_trust_check, NULL);
1066 assert(int_result == SQLITE_OK);
1068 int_result = sqlite3_prepare_v2(_session->db, sql_get_identities_by_address,
1069 (int)strlen(sql_get_identities_by_address),
1070 &_session->get_identities_by_address, NULL);
1071 assert(int_result == SQLITE_OK);
1073 int_result = sqlite3_prepare_v2(_session->db, sql_get_user_default_key,
1074 (int)strlen(sql_get_user_default_key), &_session->get_user_default_key, NULL);
1075 assert(int_result == SQLITE_OK);
1077 int_result = sqlite3_prepare_v2(_session->db, sql_get_default_own_userid,
1078 (int)strlen(sql_get_default_own_userid), &_session->get_default_own_userid, NULL);
1079 assert(int_result == SQLITE_OK);
1081 int_result = sqlite3_prepare_v2(_session->db, sql_get_userid_alias_default,
1082 (int)strlen(sql_get_userid_alias_default), &_session->get_userid_alias_default, NULL);
1083 assert(int_result == SQLITE_OK);
1085 int_result = sqlite3_prepare_v2(_session->db, sql_add_userid_alias,
1086 (int)strlen(sql_add_userid_alias), &_session->add_userid_alias, NULL);
1087 assert(int_result == SQLITE_OK);
1089 int_result = sqlite3_prepare_v2(_session->db, sql_replace_userid,
1090 (int)strlen(sql_replace_userid), &_session->replace_userid, NULL);
1091 assert(int_result == SQLITE_OK);
1093 int_result = sqlite3_prepare_v2(_session->db, sql_replace_main_user_fpr,
1094 (int)strlen(sql_replace_main_user_fpr), &_session->replace_main_user_fpr, NULL);
1095 assert(int_result == SQLITE_OK);
1097 int_result = sqlite3_prepare_v2(_session->db, sql_get_main_user_fpr,
1098 (int)strlen(sql_get_main_user_fpr), &_session->get_main_user_fpr, NULL);
1099 assert(int_result == SQLITE_OK);
1101 int_result = sqlite3_prepare_v2(_session->db, sql_refresh_userid_default_key,
1102 (int)strlen(sql_refresh_userid_default_key), &_session->refresh_userid_default_key, NULL);
1103 assert(int_result == SQLITE_OK);
1105 int_result = sqlite3_prepare_v2(_session->db, sql_replace_identities_fpr,
1106 (int)strlen(sql_replace_identities_fpr),
1107 &_session->replace_identities_fpr, NULL);
1108 assert(int_result == SQLITE_OK);
1110 int_result = sqlite3_prepare_v2(_session->db, sql_remove_fpr_as_default,
1111 (int)strlen(sql_remove_fpr_as_default),
1112 &_session->remove_fpr_as_default, NULL);
1113 assert(int_result == SQLITE_OK);
1115 int_result = sqlite3_prepare_v2(_session->db, sql_set_person,
1116 (int)strlen(sql_set_person), &_session->set_person, NULL);
1117 assert(int_result == SQLITE_OK);
1119 int_result = sqlite3_prepare_v2(_session->db, sql_update_person,
1120 (int)strlen(sql_update_person), &_session->update_person, NULL);
1121 assert(int_result == SQLITE_OK);
1123 int_result = sqlite3_prepare_v2(_session->db, sql_exists_person,
1124 (int)strlen(sql_exists_person), &_session->exists_person, NULL);
1125 assert(int_result == SQLITE_OK);
1127 int_result = sqlite3_prepare_v2(_session->db, sql_set_as_pep_user,
1128 (int)strlen(sql_set_as_pep_user), &_session->set_as_pep_user, NULL);
1129 assert(int_result == SQLITE_OK);
1131 int_result = sqlite3_prepare_v2(_session->db, sql_is_pep_user,
1132 (int)strlen(sql_is_pep_user), &_session->is_pep_user, NULL);
1133 assert(int_result == SQLITE_OK);
1135 int_result = sqlite3_prepare_v2(_session->db, sql_set_device_group,
1136 (int)strlen(sql_set_device_group), &_session->set_device_group, NULL);
1137 assert(int_result == SQLITE_OK);
1139 int_result = sqlite3_prepare_v2(_session->db, sql_get_device_group,
1140 (int)strlen(sql_get_device_group), &_session->get_device_group, NULL);
1141 assert(int_result == SQLITE_OK);
1143 int_result = sqlite3_prepare_v2(_session->db, sql_set_pgp_keypair,
1144 (int)strlen(sql_set_pgp_keypair), &_session->set_pgp_keypair,
1146 assert(int_result == SQLITE_OK);
1148 int_result = sqlite3_prepare_v2(_session->db, sql_set_identity_entry,
1149 (int)strlen(sql_set_identity_entry), &_session->set_identity_entry, NULL);
1150 assert(int_result == SQLITE_OK);
1152 int_result = sqlite3_prepare_v2(_session->db, sql_update_identity_entry,
1153 (int)strlen(sql_update_identity_entry), &_session->update_identity_entry, NULL);
1154 assert(int_result == SQLITE_OK);
1156 int_result = sqlite3_prepare_v2(_session->db, sql_exists_identity_entry,
1157 (int)strlen(sql_exists_identity_entry), &_session->exists_identity_entry, NULL);
1158 assert(int_result == SQLITE_OK);
1160 int_result = sqlite3_prepare_v2(_session->db, sql_set_identity_flags,
1161 (int)strlen(sql_set_identity_flags), &_session->set_identity_flags,
1163 assert(int_result == SQLITE_OK);
1165 int_result = sqlite3_prepare_v2(_session->db, sql_unset_identity_flags,
1166 (int)strlen(sql_unset_identity_flags), &_session->unset_identity_flags,
1168 assert(int_result == SQLITE_OK);
1170 int_result = sqlite3_prepare_v2(_session->db, sql_set_trust,
1171 (int)strlen(sql_set_trust), &_session->set_trust, NULL);
1172 assert(int_result == SQLITE_OK);
1174 int_result = sqlite3_prepare_v2(_session->db, sql_update_trust,
1175 (int)strlen(sql_update_trust), &_session->update_trust, NULL);
1176 assert(int_result == SQLITE_OK);
1178 int_result = sqlite3_prepare_v2(_session->db, sql_update_trust_to_pep,
1179 (int)strlen(sql_update_trust_to_pep), &_session->update_trust_to_pep, NULL);
1180 assert(int_result == SQLITE_OK);
1182 int_result = sqlite3_prepare_v2(_session->db, sql_exists_trust_entry,
1183 (int)strlen(sql_exists_trust_entry), &_session->exists_trust_entry, NULL);
1184 assert(int_result == SQLITE_OK);
1186 int_result = sqlite3_prepare_v2(_session->db, sql_update_trust_for_fpr,
1187 (int)strlen(sql_update_trust_for_fpr), &_session->update_trust_for_fpr, NULL);
1188 assert(int_result == SQLITE_OK);
1190 int_result = sqlite3_prepare_v2(_session->db, sql_get_trust,
1191 (int)strlen(sql_get_trust), &_session->get_trust, NULL);
1192 assert(int_result == SQLITE_OK);
1194 int_result = sqlite3_prepare_v2(_session->db, sql_least_trust,
1195 (int)strlen(sql_least_trust), &_session->least_trust, NULL);
1196 assert(int_result == SQLITE_OK);
1198 int_result = sqlite3_prepare_v2(_session->db, sql_mark_as_compromised,
1199 (int)strlen(sql_mark_as_compromised), &_session->mark_compromised,
1201 assert(int_result == SQLITE_OK);
1203 int_result = sqlite3_prepare_v2(_session->db, sql_crashdump,
1204 (int)strlen(sql_crashdump), &_session->crashdump, NULL);
1205 assert(int_result == SQLITE_OK);
1207 int_result = sqlite3_prepare_v2(_session->system_db, sql_languagelist,
1208 (int)strlen(sql_languagelist), &_session->languagelist, NULL);
1209 assert(int_result == SQLITE_OK);
1211 int_result = sqlite3_prepare_v2(_session->system_db, sql_i18n_token,
1212 (int)strlen(sql_i18n_token), &_session->i18n_token, NULL);
1213 assert(int_result == SQLITE_OK);
1217 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_add,
1218 (int)strlen(sql_blacklist_add), &_session->blacklist_add, NULL);
1219 assert(int_result == SQLITE_OK);
1221 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_delete,
1222 (int)strlen(sql_blacklist_delete), &_session->blacklist_delete,
1224 assert(int_result == SQLITE_OK);
1226 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_is_listed,
1227 (int)strlen(sql_blacklist_is_listed),
1228 &_session->blacklist_is_listed, NULL);
1229 assert(int_result == SQLITE_OK);
1231 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_retrieve,
1232 (int)strlen(sql_blacklist_retrieve), &_session->blacklist_retrieve,
1234 assert(int_result == SQLITE_OK);
1238 int_result = sqlite3_prepare_v2(_session->db, sql_own_key_is_listed,
1239 (int)strlen(sql_own_key_is_listed), &_session->own_key_is_listed,
1241 assert(int_result == SQLITE_OK);
1243 int_result = sqlite3_prepare_v2(_session->db, sql_own_identities_retrieve,
1244 (int)strlen(sql_own_identities_retrieve),
1245 &_session->own_identities_retrieve, NULL);
1246 assert(int_result == SQLITE_OK);
1248 int_result = sqlite3_prepare_v2(_session->db, sql_own_keys_retrieve,
1249 (int)strlen(sql_own_keys_retrieve),
1250 &_session->own_keys_retrieve, NULL);
1251 assert(int_result == SQLITE_OK);
1253 // int_result = sqlite3_prepare_v2(_session->db, sql_set_own_key,
1254 // (int)strlen(sql_set_own_key),
1255 // &_session->set_own_key, NULL);
1256 // assert(int_result == SQLITE_OK);
1260 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value1,
1261 (int)strlen(sql_sequence_value1), &_session->sequence_value1,
1263 assert(int_result == SQLITE_OK);
1265 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value2,
1266 (int)strlen(sql_sequence_value2), &_session->sequence_value2,
1268 assert(int_result == SQLITE_OK);
1270 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value3,
1271 (int)strlen(sql_sequence_value3), &_session->sequence_value3,
1273 assert(int_result == SQLITE_OK);
1275 // Revocation tracking
1277 int_result = sqlite3_prepare_v2(_session->db, sql_set_revoked,
1278 (int)strlen(sql_set_revoked), &_session->set_revoked, NULL);
1279 assert(int_result == SQLITE_OK);
1281 int_result = sqlite3_prepare_v2(_session->db, sql_get_revoked,
1282 (int)strlen(sql_get_revoked), &_session->get_revoked, NULL);
1283 assert(int_result == SQLITE_OK);
1285 int_result = sqlite3_prepare_v2(_session->db, sql_add_mistrusted_key,
1286 (int)strlen(sql_add_mistrusted_key), &_session->add_mistrusted_key, NULL);
1287 assert(int_result == SQLITE_OK);
1289 int_result = sqlite3_prepare_v2(_session->db, sql_delete_mistrusted_key,
1290 (int)strlen(sql_delete_mistrusted_key), &_session->delete_mistrusted_key, NULL);
1291 assert(int_result == SQLITE_OK);
1293 int_result = sqlite3_prepare_v2(_session->db, sql_is_mistrusted_key,
1294 (int)strlen(sql_is_mistrusted_key), &_session->is_mistrusted_key, NULL);
1295 assert(int_result == SQLITE_OK);
1297 status = init_cryptotech(_session, in_first);
1298 if (status != PEP_STATUS_OK)
1301 status = init_transport_system(_session, in_first);
1302 if (status != PEP_STATUS_OK)
1305 status = log_event(_session, "init", "pEp " PEP_ENGINE_VERSION, NULL, NULL);
1306 if (status != PEP_STATUS_OK)
1314 // On first run, all private keys already present in PGP keyring
1315 // are taken as own in order to seamlessly integrate with
1316 // pre-existing GPG setup.
1318 // Note: earlier fears about danger because of DB reinitialisation should
1319 // be a non-issue here, as we ONLY take the ultimately trusted keys now.
1320 // Thus, unless the user has assigned ultimate trust through PGP, there is
1321 // no chance of automatically imported pEp keys from a previous run making
1322 // their way into PEP trusted status without explicit action (Bare imported
1323 // private keys have an 'unknown' trust designation in PGP).
1325 // We don't really worry about the status here.
1326 status = pgp_import_ultimately_trusted_keypairs(_session);
1330 // sync_session set to own session by default
1331 // sync_session is then never null on a valid session
1332 _session->sync_session = _session;
1334 *session = _session;
1336 // Note: Following statement is NOT for any cryptographic/secure functionality; it is
1337 // ONLY used for some randomness in generated outer message ID, which are
1338 // required by the RFC to be globally unique!
1339 srand((unsigned int) time(NULL));
1341 return PEP_STATUS_OK;
1344 status = PEP_OUT_OF_MEMORY;
1351 DYNAMIC_API void release(PEP_SESSION session)
1353 bool out_last = false;
1354 int _count = --init_count;
1356 assert(_count >= -1);
1359 if (!((_count >= -1) && session))
1362 // a small race condition but still a race condition
1363 // mitigated by calling caveat (see documentation)
1364 // (release() is to be guarded by a mutex by the caller)
1372 sqlite3_finalize(session->log);
1373 if (session->trustword)
1374 sqlite3_finalize(session->trustword);
1375 if (session->get_identity)
1376 sqlite3_finalize(session->get_identity);
1377 if (session->get_identity_without_trust_check)
1378 sqlite3_finalize(session->get_identity_without_trust_check);
1379 if (session->get_identities_by_address)
1380 sqlite3_finalize(session->get_identities_by_address);
1381 if (session->get_user_default_key)
1382 sqlite3_finalize(session->get_user_default_key);
1383 if (session->get_default_own_userid)
1384 sqlite3_finalize(session->get_default_own_userid);
1385 if (session->get_userid_alias_default)
1386 sqlite3_finalize(session->get_userid_alias_default);
1387 if (session->add_userid_alias)
1388 sqlite3_finalize(session->add_userid_alias);
1389 if (session->replace_identities_fpr)
1390 sqlite3_finalize(session->replace_identities_fpr);
1391 if (session->remove_fpr_as_default)
1392 sqlite3_finalize(session->remove_fpr_as_default);
1393 if (session->set_person)
1394 sqlite3_finalize(session->set_person);
1395 if (session->set_as_pep_user)
1396 sqlite3_finalize(session->set_as_pep_user);
1397 if (session->is_pep_user)
1398 sqlite3_finalize(session->is_pep_user);
1399 if (session->exists_person)
1400 sqlite3_finalize(session->exists_person);
1401 if (session->set_device_group)
1402 sqlite3_finalize(session->set_device_group);
1403 if (session->get_device_group)
1404 sqlite3_finalize(session->get_device_group);
1405 if (session->set_pgp_keypair)
1406 sqlite3_finalize(session->set_pgp_keypair);
1407 if (session->exists_identity_entry)
1408 sqlite3_finalize(session->exists_identity_entry);
1409 if (session->set_identity_entry)
1410 sqlite3_finalize(session->set_identity_entry);
1411 if (session->update_identity_entry)
1412 sqlite3_finalize(session->update_identity_entry);
1413 if (session->set_identity_flags)
1414 sqlite3_finalize(session->set_identity_flags);
1415 if (session->unset_identity_flags)
1416 sqlite3_finalize(session->unset_identity_flags);
1417 if (session->exists_trust_entry)
1418 sqlite3_finalize(session->exists_trust_entry);
1419 if (session->set_trust)
1420 sqlite3_finalize(session->set_trust);
1421 if (session->update_trust)
1422 sqlite3_finalize(session->update_trust);
1423 if (session->update_trust_to_pep)
1424 sqlite3_finalize(session->update_trust_to_pep);
1425 if (session->update_trust_for_fpr)
1426 sqlite3_finalize(session->update_trust_for_fpr);
1427 if (session->get_trust)
1428 sqlite3_finalize(session->get_trust);
1429 if (session->least_trust)
1430 sqlite3_finalize(session->least_trust);
1431 if (session->mark_compromised)
1432 sqlite3_finalize(session->mark_compromised);
1433 if (session->crashdump)
1434 sqlite3_finalize(session->crashdump);
1435 if (session->languagelist)
1436 sqlite3_finalize(session->languagelist);
1437 if (session->i18n_token)
1438 sqlite3_finalize(session->i18n_token);
1439 if (session->replace_userid)
1440 sqlite3_finalize(session->replace_userid);
1441 if (session->replace_main_user_fpr)
1442 sqlite3_finalize(session->replace_main_user_fpr);
1443 if (session->get_main_user_fpr)
1444 sqlite3_finalize(session->get_main_user_fpr);
1445 if (session->refresh_userid_default_key)
1446 sqlite3_finalize(session->refresh_userid_default_key);
1447 if (session->blacklist_add)
1448 sqlite3_finalize(session->blacklist_add);
1449 if (session->blacklist_delete)
1450 sqlite3_finalize(session->blacklist_delete);
1451 if (session->blacklist_is_listed)
1452 sqlite3_finalize(session->blacklist_is_listed);
1453 if (session->blacklist_retrieve)
1454 sqlite3_finalize(session->blacklist_retrieve);
1455 if (session->own_key_is_listed)
1456 sqlite3_finalize(session->own_key_is_listed);
1457 if (session->own_identities_retrieve)
1458 sqlite3_finalize(session->own_identities_retrieve);
1459 if (session->own_keys_retrieve)
1460 sqlite3_finalize(session->own_keys_retrieve);
1461 // if (session->set_own_key)
1462 // sqlite3_finalize(session->set_own_key);
1463 if (session->sequence_value1)
1464 sqlite3_finalize(session->sequence_value1);
1465 if (session->sequence_value2)
1466 sqlite3_finalize(session->sequence_value2);
1467 if (session->sequence_value3)
1468 sqlite3_finalize(session->sequence_value3);
1469 if (session->set_revoked)
1470 sqlite3_finalize(session->set_revoked);
1471 if (session->get_revoked)
1472 sqlite3_finalize(session->get_revoked);
1474 if (session->add_mistrusted_key)
1475 sqlite3_finalize(session->add_mistrusted_key);
1476 if (session->delete_mistrusted_key)
1477 sqlite3_finalize(session->delete_mistrusted_key);
1478 if (session->is_mistrusted_key)
1479 sqlite3_finalize(session->is_mistrusted_key);
1484 "PRAGMA optimize;\n",
1489 sqlite3_close_v2(session->db);
1491 if (session->system_db)
1492 sqlite3_close_v2(session->system_db);
1495 release_transport_system(session, out_last);
1496 release_cryptotech(session, out_last);
1498 #ifdef DEBUG_ERRORSTACK
1499 free_stringlist(session->errorstack);
1505 DYNAMIC_API void config_passive_mode(PEP_SESSION session, bool enable)
1508 session->passive_mode = enable;
1511 DYNAMIC_API void config_unencrypted_subject(PEP_SESSION session, bool enable)
1514 session->unencrypted_subject = enable;
1517 DYNAMIC_API void config_keep_sync_msg(PEP_SESSION session, bool enable)
1520 session->keep_sync_msg = enable;
1523 DYNAMIC_API void config_service_log(PEP_SESSION session, bool enable)
1526 session->service_log = enable;
1529 DYNAMIC_API PEP_STATUS log_event(
1530 PEP_SESSION session,
1533 const char *description,
1537 // PEP_STATUS status = PEP_STATUS_OK;
1544 // if (!(session && title && entity))
1545 // return PEP_ILLEGAL_VALUE;
1547 // sqlite3_reset(session->log);
1548 // sqlite3_bind_text(session->log, 1, title, -1, SQLITE_STATIC);
1549 // sqlite3_bind_text(session->log, 2, entity, -1, SQLITE_STATIC);
1551 // sqlite3_bind_text(session->log, 3, description, -1, SQLITE_STATIC);
1553 // sqlite3_bind_null(session->log, 3);
1555 // sqlite3_bind_text(session->log, 4, comment, -1, SQLITE_STATIC);
1557 // sqlite3_bind_null(session->log, 4);
1558 // result = sqlite3_step(session->log);
1559 // sqlite3_reset(session->log);
1561 return PEP_STATUS_OK; // We ignore errors for this function.
1564 DYNAMIC_API PEP_STATUS log_service(
1565 PEP_SESSION session,
1568 const char *description,
1574 return PEP_ILLEGAL_VALUE;
1576 if (session->service_log)
1577 return log_event(session, title, entity, description, comment);
1579 return PEP_STATUS_OK;
1582 DYNAMIC_API PEP_STATUS trustword(
1583 PEP_SESSION session, uint16_t value, const char *lang,
1584 char **word, size_t *wsize
1587 PEP_STATUS status = PEP_STATUS_OK;
1593 if (!(session && word && wsize))
1594 return PEP_ILLEGAL_VALUE;
1602 assert((lang[0] >= 'A' && lang[0] <= 'Z')
1603 || (lang[0] >= 'a' && lang[0] <= 'z'));
1604 assert((lang[1] >= 'A' && lang[1] <= 'Z')
1605 || (lang[1] >= 'a' && lang[1] <= 'z'));
1606 assert(lang[2] == 0);
1608 sqlite3_reset(session->trustword);
1609 sqlite3_bind_text(session->trustword, 1, lang, -1, SQLITE_STATIC);
1610 sqlite3_bind_int(session->trustword, 2, value);
1612 const int result = sqlite3_step(session->trustword);
1613 if (result == SQLITE_ROW) {
1614 *word = strdup((const char *) sqlite3_column_text(session->trustword,
1617 *wsize = sqlite3_column_bytes(session->trustword, 1);
1619 status = PEP_OUT_OF_MEMORY;
1621 status = PEP_TRUSTWORD_NOT_FOUND;
1623 sqlite3_reset(session->trustword);
1627 DYNAMIC_API PEP_STATUS trustwords(
1628 PEP_SESSION session, const char *fingerprint, const char *lang,
1629 char **words, size_t *wsize, int max_words
1632 const char *source = fingerprint;
1635 assert(fingerprint);
1638 assert(max_words >= 0);
1640 if (!(session && fingerprint && words && wsize && max_words >= 0))
1641 return PEP_ILLEGAL_VALUE;
1646 char *buffer = calloc(1, MAX_TRUSTWORDS_SPACE);
1649 return PEP_OUT_OF_MEMORY;
1650 char *dest = buffer;
1652 const size_t fsize = strlen(fingerprint);
1654 if (!lang || !lang[0])
1657 assert((lang[0] >= 'A' && lang[0] <= 'Z')
1658 || (lang[0] >= 'a' && lang[0] <= 'z'));
1659 assert((lang[1] >= 'A' && lang[1] <= 'Z')
1660 || (lang[1] >= 'a' && lang[1] <= 'z'));
1661 assert(lang[2] == 0);
1664 while (source < fingerprint + fsize) {
1671 for (value=0, j=0; j < 4 && source < fingerprint + fsize; ) {
1672 if (*source >= 'a' && *source <= 'f')
1673 value += (*source - 'a' + 10) << (3 - j++) * 4;
1674 else if (*source >= 'A' && *source <= 'F')
1675 value += (*source - 'A' + 10) << (3 - j++) * 4;
1676 else if (*source >= '0' && *source <= '9')
1677 value += (*source - '0') << (3 - j++) * 4;
1682 _status = trustword(session, value, lang, &word, &_wsize);
1683 if (_status == PEP_OUT_OF_MEMORY) {
1685 return PEP_OUT_OF_MEMORY;
1689 return PEP_TRUSTWORD_NOT_FOUND;
1692 if (dest + _wsize < buffer + MAX_TRUSTWORDS_SPACE - 1) {
1693 strncpy(dest, word, _wsize);
1699 break; // buffer full
1702 if (source < fingerprint + fsize
1703 && dest + _wsize < buffer + MAX_TRUSTWORDS_SPACE - 1)
1707 if (max_words && n_words >= max_words)
1712 *wsize = dest - buffer;
1713 return PEP_STATUS_OK;
1716 pEp_identity *new_identity(
1717 const char *address, const char *fpr, const char *user_id,
1718 const char *username
1721 pEp_identity *result = calloc(1, sizeof(pEp_identity));
1725 result->address = strdup(address);
1726 assert(result->address);
1727 if (result->address == NULL) {
1733 result->fpr = strdup(fpr);
1734 assert(result->fpr);
1735 if (result->fpr == NULL) {
1736 free_identity(result);
1741 result->user_id = strdup(user_id);
1742 assert(result->user_id);
1743 if (result->user_id == NULL) {
1744 free_identity(result);
1749 result->username = strdup(username);
1750 assert(result->username);
1751 if (result->username == NULL) {
1752 free_identity(result);
1760 pEp_identity *identity_dup(const pEp_identity *src)
1764 pEp_identity *dup = new_identity(src->address, src->fpr, src->user_id,
1770 dup->comm_type = src->comm_type;
1771 dup->lang[0] = src->lang[0];
1772 dup->lang[1] = src->lang[1];
1774 dup->flags = src->flags;
1780 void free_identity(pEp_identity *identity)
1783 free(identity->address);
1784 free(identity->fpr);
1785 free(identity->user_id);
1786 free(identity->username);
1791 DYNAMIC_API PEP_STATUS get_default_own_userid(
1792 PEP_SESSION session,
1799 if (!session || !userid)
1800 return PEP_ILLEGAL_VALUE;
1802 PEP_STATUS status = PEP_STATUS_OK;
1803 char* retval = NULL;
1805 sqlite3_reset(session->get_default_own_userid);
1807 const int result = sqlite3_step(session->get_default_own_userid);
1812 id = (const char *) sqlite3_column_text(session->get_default_own_userid, 0);
1814 // Shouldn't happen.
1815 status = PEP_UNKNOWN_ERROR;
1818 retval = strdup(id);
1820 status = PEP_OUT_OF_MEMORY;
1824 // Technically true, given how we find it, but FIXME we need a more descriptive error
1825 status = PEP_CANNOT_FIND_IDENTITY;
1831 sqlite3_reset(session->get_default_own_userid);
1836 DYNAMIC_API PEP_STATUS get_userid_alias_default(
1837 PEP_SESSION session,
1838 const char* alias_id,
1839 char** default_id) {
1843 assert(alias_id[0]);
1846 if (!(session && alias_id && alias_id[0] && default_id))
1847 return PEP_ILLEGAL_VALUE;
1849 PEP_STATUS status = PEP_STATUS_OK;
1850 char* retval = NULL;
1852 sqlite3_reset(session->get_userid_alias_default);
1853 sqlite3_bind_text(session->get_userid_alias_default, 1, alias_id, -1, SQLITE_STATIC);
1857 const int result = sqlite3_step(session->get_userid_alias_default);
1860 tempid = (const char *) sqlite3_column_text(session->get_userid_alias_default, 0);
1862 retval = strdup(tempid);
1865 return PEP_OUT_OF_MEMORY;
1868 *default_id = retval;
1871 status = PEP_CANNOT_FIND_ALIAS;
1875 sqlite3_reset(session->get_userid_alias_default);
1879 DYNAMIC_API PEP_STATUS set_userid_alias (
1880 PEP_SESSION session,
1881 const char* default_id,
1882 const char* alias_id) {
1890 if (!(session && default_id && alias_id &&
1891 default_id[0] != '\0' && alias_id[0] != '\0'))
1892 return PEP_ILLEGAL_VALUE;
1894 sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
1896 sqlite3_reset(session->add_userid_alias);
1897 sqlite3_bind_text(session->add_userid_alias, 1, default_id, -1,
1899 sqlite3_bind_text(session->add_userid_alias, 2, alias_id, -1,
1902 result = sqlite3_step(session->add_userid_alias);
1904 sqlite3_reset(session->add_userid_alias);
1905 if (result != SQLITE_DONE) {
1906 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1907 return PEP_CANNOT_SET_ALIAS;
1909 sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
1912 return PEP_STATUS_OK;
1915 DYNAMIC_API PEP_STATUS get_identity(
1916 PEP_SESSION session,
1917 const char *address,
1918 const char *user_id,
1919 pEp_identity **identity
1922 PEP_STATUS status = PEP_STATUS_OK;
1923 static pEp_identity *_identity;
1930 if (!(session && address && address[0] && identity))
1931 return PEP_ILLEGAL_VALUE;
1935 sqlite3_reset(session->get_identity);
1936 sqlite3_bind_text(session->get_identity, 1, address, -1, SQLITE_STATIC);
1937 sqlite3_bind_text(session->get_identity, 2, user_id, -1, SQLITE_STATIC);
1939 const int result = sqlite3_step(session->get_identity);
1942 _identity = new_identity(
1944 (const char *) sqlite3_column_text(session->get_identity, 0),
1946 (const char *) sqlite3_column_text(session->get_identity, 1)
1949 if (_identity == NULL) {
1950 sqlite3_reset(session->get_identity);
1951 return PEP_OUT_OF_MEMORY;
1954 _identity->comm_type = (PEP_comm_type)
1955 sqlite3_column_int(session->get_identity, 2);
1956 const char* const _lang = (const char *)
1957 sqlite3_column_text(session->get_identity, 3);
1958 if (_lang && _lang[0]) {
1959 assert(_lang[0] >= 'a' && _lang[0] <= 'z');
1960 assert(_lang[1] >= 'a' && _lang[1] <= 'z');
1961 assert(_lang[2] == 0);
1962 _identity->lang[0] = _lang[0];
1963 _identity->lang[1] = _lang[1];
1964 _identity->lang[2] = 0;
1966 _identity->flags = (unsigned int)
1967 sqlite3_column_int(session->get_identity, 4);
1968 _identity->me = (unsigned int)
1969 sqlite3_column_int(session->get_identity, 5);
1971 *identity = _identity;
1974 sqlite3_reset(session->get_identity);
1975 status = PEP_CANNOT_FIND_IDENTITY;
1979 sqlite3_reset(session->get_identity);
1983 PEP_STATUS get_identity_without_trust_check(
1984 PEP_SESSION session,
1985 const char *address,
1986 const char *user_id,
1987 pEp_identity **identity
1990 PEP_STATUS status = PEP_STATUS_OK;
1991 static pEp_identity *_identity;
1998 if (!(session && address && address[0] && identity))
1999 return PEP_ILLEGAL_VALUE;
2003 sqlite3_reset(session->get_identity_without_trust_check);
2004 sqlite3_bind_text(session->get_identity_without_trust_check, 1, address, -1, SQLITE_STATIC);
2005 sqlite3_bind_text(session->get_identity_without_trust_check, 2, user_id, -1, SQLITE_STATIC);
2007 const int result = sqlite3_step(session->get_identity_without_trust_check);
2010 _identity = new_identity(
2012 (const char *) sqlite3_column_text(session->get_identity_without_trust_check, 0),
2014 (const char *) sqlite3_column_text(session->get_identity_without_trust_check, 1)
2017 if (_identity == NULL) {
2018 sqlite3_reset(session->get_identity_without_trust_check);
2019 return PEP_OUT_OF_MEMORY;
2022 _identity->comm_type = PEP_ct_unknown;
2023 const char* const _lang = (const char *)
2024 sqlite3_column_text(session->get_identity_without_trust_check, 2);
2025 if (_lang && _lang[0]) {
2026 assert(_lang[0] >= 'a' && _lang[0] <= 'z');
2027 assert(_lang[1] >= 'a' && _lang[1] <= 'z');
2028 assert(_lang[2] == 0);
2029 _identity->lang[0] = _lang[0];
2030 _identity->lang[1] = _lang[1];
2031 _identity->lang[2] = 0;
2033 _identity->flags = (unsigned int)
2034 sqlite3_column_int(session->get_identity_without_trust_check, 3);
2035 _identity->me = (unsigned int)
2036 sqlite3_column_int(session->get_identity_without_trust_check, 4);
2038 *identity = _identity;
2041 status = PEP_CANNOT_FIND_IDENTITY;
2045 sqlite3_reset(session->get_identity_without_trust_check);
2049 PEP_STATUS get_identities_by_address(
2050 PEP_SESSION session,
2051 const char *address,
2052 identity_list** id_list
2055 pEp_identity* ident;
2062 if (!(session && address && address[0] && id_list))
2063 return PEP_ILLEGAL_VALUE;
2066 identity_list* ident_list = NULL;
2068 sqlite3_reset(session->get_identities_by_address);
2069 sqlite3_bind_text(session->get_identities_by_address, 1, address, -1, SQLITE_STATIC);
2072 while ((result = sqlite3_step(session->get_identities_by_address)) == SQLITE_ROW) {
2073 //"select user_id, main_key_id, username, comm_type, lang,"
2074 //" identity.flags, is_own"
2075 ident = new_identity(
2077 (const char *) sqlite3_column_text(session->get_identities_by_address, 1),
2078 (const char *) sqlite3_column_text(session->get_identities_by_address, 0),
2079 (const char *) sqlite3_column_text(session->get_identities_by_address, 2)
2082 if (ident == NULL) {
2083 sqlite3_reset(session->get_identities_by_address);
2084 return PEP_OUT_OF_MEMORY;
2087 ident->comm_type = PEP_ct_unknown;
2089 const char* const _lang = (const char *)
2090 sqlite3_column_text(session->get_identities_by_address, 3);
2091 if (_lang && _lang[0]) {
2092 assert(_lang[0] >= 'a' && _lang[0] <= 'z');
2093 assert(_lang[1] >= 'a' && _lang[1] <= 'z');
2094 assert(_lang[2] == 0);
2095 ident->lang[0] = _lang[0];
2096 ident->lang[1] = _lang[1];
2099 ident->flags = (unsigned int)
2100 sqlite3_column_int(session->get_identities_by_address, 4);
2101 ident->me = (unsigned int)
2102 sqlite3_column_int(session->get_identities_by_address, 5);
2105 identity_list_add(ident_list, ident);
2107 ident_list = new_identity_list(ident);
2110 sqlite3_reset(session->get_identities_by_address);
2112 *id_list = ident_list;
2115 return PEP_CANNOT_FIND_IDENTITY;
2117 return PEP_STATUS_OK;
2120 PEP_STATUS exists_identity_entry(PEP_SESSION session, pEp_identity* identity,
2124 assert(!EMPTYSTR(identity->user_id));
2125 assert(!EMPTYSTR(identity->address));
2126 if (!session || !exists || EMPTYSTR(identity->user_id) || EMPTYSTR(identity->address))
2127 return PEP_ILLEGAL_VALUE;
2131 PEP_STATUS status = PEP_STATUS_OK;
2133 sqlite3_reset(session->exists_identity_entry);
2134 sqlite3_bind_text(session->exists_identity_entry, 1, identity->address, -1,
2136 sqlite3_bind_text(session->exists_identity_entry, 2, identity->user_id, -1,
2139 int result = sqlite3_step(session->exists_identity_entry);
2142 // yeah yeah, I know, we could be lazy here, but it looks bad.
2143 *exists = (sqlite3_column_int(session->exists_identity_entry, 0) != 0);
2147 status = PEP_UNKNOWN_ERROR;
2150 sqlite3_reset(session->exists_identity_entry);
2154 PEP_STATUS exists_trust_entry(PEP_SESSION session, pEp_identity* identity,
2158 assert(!EMPTYSTR(identity->user_id));
2159 assert(!EMPTYSTR(identity->fpr));
2160 if (!session || !exists || EMPTYSTR(identity->user_id) || EMPTYSTR(identity->fpr))
2161 return PEP_ILLEGAL_VALUE;
2165 PEP_STATUS status = PEP_STATUS_OK;
2167 sqlite3_reset(session->exists_trust_entry);
2168 sqlite3_bind_text(session->exists_trust_entry, 1, identity->user_id, -1,
2170 sqlite3_bind_text(session->exists_trust_entry, 2, identity->fpr, -1,
2173 int result = sqlite3_step(session->exists_trust_entry);
2176 // yeah yeah, I know, we could be lazy here, but it looks bad.
2177 *exists = (sqlite3_column_int(session->exists_trust_entry, 0) != 0);
2181 status = PEP_UNKNOWN_ERROR;
2184 sqlite3_reset(session->exists_trust_entry);
2188 // FIXME: We can rollback in set_identity on the return status,
2189 // so we should probably do that.
2190 PEP_STATUS set_pgp_keypair(PEP_SESSION session, const char* fpr) {
2191 if (!session || EMPTYSTR(fpr))
2192 return PEP_ILLEGAL_VALUE;
2196 sqlite3_reset(session->set_pgp_keypair);
2197 sqlite3_bind_text(session->set_pgp_keypair, 1, fpr, -1,
2199 result = sqlite3_step(session->set_pgp_keypair);
2200 sqlite3_reset(session->set_pgp_keypair);
2201 if (result != SQLITE_DONE) {
2202 return PEP_CANNOT_SET_PGP_KEYPAIR;
2205 return PEP_STATUS_OK;
2208 static PEP_STATUS _set_or_update_trust(PEP_SESSION session,
2209 pEp_identity* identity,
2210 sqlite3_stmt* set_or_update) {
2214 assert(identity->user_id);
2215 assert(identity->fpr);
2217 if (!session || !identity || EMPTYSTR(identity->user_id) || EMPTYSTR(identity->fpr))
2218 return PEP_ILLEGAL_VALUE;
2222 sqlite3_reset(set_or_update);
2223 sqlite3_bind_text(set_or_update, 1, identity->user_id, -1,
2225 sqlite3_bind_text(set_or_update, 2, identity->fpr, -1,
2227 sqlite3_bind_int(set_or_update, 3, identity->comm_type);
2228 result = sqlite3_step(set_or_update);
2229 assert(result == SQLITE_DONE);
2230 sqlite3_reset(set_or_update);
2231 if (result != SQLITE_DONE)
2232 return PEP_CANNOT_SET_TRUST;
2234 return PEP_STATUS_OK;
2237 static PEP_STATUS _set_or_update_identity_entry(PEP_SESSION session,
2238 pEp_identity* identity,
2239 sqlite3_stmt* set_or_update) {
2242 assert(set_or_update);
2244 if (!session || !identity || !identity->user_id || !identity->address)
2245 return PEP_ILLEGAL_VALUE;
2247 sqlite3_reset(set_or_update);
2248 sqlite3_bind_text(set_or_update, 1, identity->address, -1,
2250 sqlite3_bind_text(set_or_update, 2, identity->fpr, -1,
2252 sqlite3_bind_text(set_or_update, 3, identity->user_id, -1,
2254 sqlite3_bind_int(set_or_update, 4, identity->flags);
2255 sqlite3_bind_int(set_or_update, 5, identity->me);
2256 int result = sqlite3_step(set_or_update);
2257 sqlite3_reset(set_or_update);
2258 if (result != SQLITE_DONE)
2259 return PEP_CANNOT_SET_IDENTITY;
2261 return PEP_STATUS_OK;
2264 static PEP_STATUS _set_or_update_person(PEP_SESSION session,
2265 pEp_identity* identity,
2266 sqlite3_stmt* set_or_update) {
2269 assert(set_or_update);
2271 if (!session || !identity || !identity->user_id || !identity->username)
2272 return PEP_ILLEGAL_VALUE;
2274 sqlite3_reset(set_or_update);
2275 sqlite3_bind_text(set_or_update, 1, identity->user_id, -1,
2277 sqlite3_bind_text(set_or_update, 2, identity->username, -1,
2279 if (identity->lang[0])
2280 sqlite3_bind_text(set_or_update, 3, identity->lang, 2,
2283 sqlite3_bind_null(set_or_update, 3);
2284 sqlite3_bind_text(set_or_update, 4, identity->fpr, -1,
2286 int result = sqlite3_step(set_or_update);
2287 sqlite3_reset(set_or_update);
2289 if (result != SQLITE_DONE)
2290 return PEP_CANNOT_SET_PERSON;
2292 return PEP_STATUS_OK;
2295 PEP_STATUS set_or_update_with_identity(PEP_SESSION session,
2296 pEp_identity* identity,
2297 PEP_STATUS (* set_function)(PEP_SESSION, pEp_identity*, sqlite3_stmt*),
2298 PEP_STATUS (* exists_function)(PEP_SESSION, pEp_identity*, bool*),
2299 sqlite3_stmt* update_query,
2300 sqlite3_stmt* set_query,
2301 bool guard_transaction) {
2303 if (guard_transaction) {
2304 sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
2306 bool exists = false;
2307 PEP_STATUS status = exists_function(session, identity, &exists);
2309 if (status == PEP_STATUS_OK) {
2311 status = set_function(session, identity, update_query);
2314 status = set_function(session, identity, set_query);
2317 if (guard_transaction) {
2318 if (status != PEP_STATUS_OK)
2319 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
2321 sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
2326 PEP_STATUS _set_trust_internal(PEP_SESSION session, pEp_identity* identity,
2327 bool guard_transaction) {
2328 return set_or_update_with_identity(session, identity,
2329 _set_or_update_trust,
2331 session->update_trust,
2336 // This is the TOP-LEVEL function. If you're calling from set_identity,
2337 // you can't use this one.
2338 PEP_STATUS set_trust(PEP_SESSION session, pEp_identity* identity) {
2339 PEP_STATUS status = PEP_STATUS_OK;
2341 status = _set_trust_internal(session, identity, true);
2342 if (status == PEP_STATUS_OK) {
2343 if ((identity->comm_type | PEP_ct_confirmed) == PEP_ct_pEp)
2344 status = set_as_pep_user(session, identity);
2349 PEP_STATUS set_person(PEP_SESSION session, pEp_identity* identity,
2350 bool guard_transaction) {
2351 return set_or_update_with_identity(session, identity,
2352 _set_or_update_person,
2354 session->update_person,
2355 session->set_person,
2359 PEP_STATUS set_identity_entry(PEP_SESSION session, pEp_identity* identity,
2360 bool guard_transaction) {
2361 return set_or_update_with_identity(session, identity,
2362 _set_or_update_identity_entry,
2363 exists_identity_entry,
2364 session->update_identity_entry,
2365 session->set_identity_entry,
2369 // This will NOT call set_as_pep_user; you have to do that separately.
2370 DYNAMIC_API PEP_STATUS set_identity(
2371 PEP_SESSION session, const pEp_identity *identity
2378 assert(identity->address);
2379 assert(identity->user_id);
2380 assert(identity->username);
2382 if (!(session && identity && identity->address &&
2383 identity->user_id && identity->username))
2384 return PEP_ILLEGAL_VALUE;
2386 PEP_STATUS status = PEP_STATUS_OK;
2388 bool has_fpr = (!EMPTYSTR(identity->fpr));
2390 sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
2392 if (identity->lang[0]) {
2393 assert(identity->lang[0] >= 'a' && identity->lang[0] <= 'z');
2394 assert(identity->lang[1] >= 'a' && identity->lang[1] <= 'z');
2395 assert(identity->lang[2] == 0);
2399 sqlite3_reset(session->set_pgp_keypair);
2400 sqlite3_bind_text(session->set_pgp_keypair, 1, identity->fpr, -1,
2402 result = sqlite3_step(session->set_pgp_keypair);
2403 sqlite3_reset(session->set_pgp_keypair);
2404 if (result != SQLITE_DONE) {
2405 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
2406 return PEP_CANNOT_SET_PGP_KEYPAIR;
2410 // We do this because there are checks in set_person for
2411 // aliases, which modify the identity object on return.
2412 pEp_identity* ident_copy = identity_dup(identity);
2414 return PEP_OUT_OF_MEMORY;
2416 status = set_person(session, ident_copy, false);
2417 if (status != PEP_STATUS_OK) {
2418 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
2422 status = set_identity_entry(session, ident_copy, false);
2423 if (status != PEP_STATUS_OK) {
2424 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
2429 status = _set_trust_internal(session, ident_copy, false);
2430 if (status != PEP_STATUS_OK) {
2431 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
2436 result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
2437 if (result == SQLITE_OK)
2438 status = PEP_STATUS_OK;
2440 status = PEP_COMMIT_FAILED;
2443 free_identity(ident_copy);
2447 PEP_STATUS update_pep_user_trust_vals(PEP_SESSION session,
2448 pEp_identity* user) {
2450 return PEP_ILLEGAL_VALUE;
2452 sqlite3_reset(session->update_trust_to_pep);
2453 sqlite3_bind_text(session->update_trust_to_pep, 1, user->user_id, -1,
2455 int result = sqlite3_step(session->update_trust_to_pep);
2456 sqlite3_reset(session->update_trust_to_pep);
2457 if (result != SQLITE_DONE)
2458 return PEP_CANNOT_SET_TRUST;
2460 return PEP_STATUS_OK;
2464 // This ONLY sets the user flag. Must be called outside of a transaction.
2465 PEP_STATUS set_as_pep_user(PEP_SESSION session, pEp_identity* user) {
2469 assert(!EMPTYSTR(user->user_id));
2471 if (!session || !user || EMPTYSTR(user->user_id))
2472 return PEP_ILLEGAL_VALUE;
2474 PEP_STATUS status = PEP_STATUS_OK;
2476 bool person_exists = false;
2478 status = exists_person(session, user, &person_exists);
2480 if (status != PEP_STATUS_OK)
2484 status = set_person(session, user, true);
2486 // Ok, let's set it.
2487 sqlite3_reset(session->set_as_pep_user);
2488 sqlite3_bind_text(session->set_as_pep_user, 1, user->user_id, -1,
2490 int result = sqlite3_step(session->set_as_pep_user);
2491 sqlite3_reset(session->set_as_pep_user);
2493 if (result != SQLITE_DONE)
2494 return PEP_CANNOT_SET_PERSON;
2496 status = update_pep_user_trust_vals(session, user);
2501 PEP_STATUS exists_person(PEP_SESSION session, pEp_identity* identity,
2504 // const char* user_id,
2505 // char** default_id, bool* exists) {
2509 assert(!EMPTYSTR(identity->user_id));
2511 if (!session || !exists || !identity || EMPTYSTR(identity->user_id))
2512 return PEP_ILLEGAL_VALUE;
2516 const char* user_id = identity->user_id;
2517 char* alias_default = NULL;
2519 PEP_STATUS status = get_userid_alias_default(session, user_id, &alias_default);
2521 if (status == PEP_CANNOT_FIND_ALIAS || EMPTYSTR(alias_default)) {
2522 sqlite3_reset(session->exists_person);
2523 sqlite3_bind_text(session->exists_person, 1, user_id, -1,
2525 int result = sqlite3_step(session->exists_person);
2528 // yeah yeah, I know, we could be lazy here, but it looks bad.
2529 *exists = (sqlite3_column_int(session->exists_person, 0) != 0);
2530 status = PEP_STATUS_OK;
2534 sqlite3_reset(session->exists_person);
2535 return PEP_UNKNOWN_ERROR;
2537 sqlite3_reset(session->exists_person);
2539 else if (status == PEP_STATUS_OK) {
2540 *exists = true; // thank you, delete on cascade!
2541 // FIXME: Should we correct the userid default here? I think we should.
2542 free(identity->user_id);
2543 identity->user_id = alias_default; // ownership transfer
2546 free(alias_default);
2551 DYNAMIC_API PEP_STATUS is_pep_user(PEP_SESSION session, pEp_identity *identity, bool* is_pep)
2556 assert(!EMPTYSTR(identity->user_id));
2558 if (!session || !is_pep || !identity || EMPTYSTR(identity->user_id))
2559 return PEP_ILLEGAL_VALUE;
2563 const char* user_id = identity->user_id;
2565 if (!session || EMPTYSTR(user_id))
2566 return PEP_ILLEGAL_VALUE;
2568 char* alias_default = NULL;
2570 PEP_STATUS status = get_userid_alias_default(session, user_id, &alias_default);
2572 if (status == PEP_CANNOT_FIND_ALIAS || EMPTYSTR(alias_default)) {
2573 free(alias_default);
2574 alias_default = strdup(user_id);
2577 sqlite3_reset(session->is_pep_user);
2578 sqlite3_bind_text(session->is_pep_user, 1, user_id, -1,
2580 int result = sqlite3_step(session->is_pep_user);
2583 // yeah yeah, I know, we could be lazy here, but it looks bad.
2584 *is_pep = (sqlite3_column_int(session->is_pep_user, 0) != 0);
2588 sqlite3_reset(session->is_pep_user);
2589 free(alias_default);
2590 return PEP_CANNOT_FIND_PERSON;
2593 sqlite3_reset(session->is_pep_user);
2594 return PEP_STATUS_OK;
2598 PEP_STATUS remove_fpr_as_default(PEP_SESSION session,
2603 if (!session || !fpr)
2604 return PEP_ILLEGAL_VALUE;
2606 sqlite3_reset(session->remove_fpr_as_default);
2607 sqlite3_bind_text(session->remove_fpr_as_default, 1, fpr, -1,
2610 int result = sqlite3_step(session->remove_fpr_as_default);
2611 sqlite3_reset(session->remove_fpr_as_default);
2613 if (result != SQLITE_DONE)
2614 return PEP_CANNOT_SET_IDENTITY; // misleading - could also be person
2616 return PEP_STATUS_OK;
2620 PEP_STATUS replace_identities_fpr(PEP_SESSION session,
2621 const char* old_fpr,
2622 const char* new_fpr)
2627 if (!old_fpr || !new_fpr)
2628 return PEP_ILLEGAL_VALUE;
2630 sqlite3_reset(session->replace_identities_fpr);
2631 sqlite3_bind_text(session->replace_identities_fpr, 1, new_fpr, -1,
2633 sqlite3_bind_text(session->replace_identities_fpr, 2, old_fpr, -1,
2636 int result = sqlite3_step(session->replace_identities_fpr);
2637 sqlite3_reset(session->replace_identities_fpr);
2639 if (result != SQLITE_DONE)
2640 return PEP_CANNOT_SET_IDENTITY;
2642 return PEP_STATUS_OK;
2645 PEP_STATUS update_trust_for_fpr(PEP_SESSION session,
2647 PEP_comm_type comm_type)
2650 return PEP_ILLEGAL_VALUE;
2652 sqlite3_reset(session->update_trust_for_fpr);
2653 sqlite3_bind_int(session->update_trust_for_fpr, 1, comm_type);
2654 sqlite3_bind_text(session->update_trust_for_fpr, 2, fpr, -1,
2656 int result = sqlite3_step(session->update_trust_for_fpr);
2657 sqlite3_reset(session->update_trust_for_fpr);
2658 if (result != SQLITE_DONE) {
2659 return PEP_CANNOT_SET_TRUST;
2662 return PEP_STATUS_OK;
2665 DYNAMIC_API PEP_STATUS set_device_group(
2666 PEP_SESSION session,
2667 const char *group_name
2674 if (!(session && group_name))
2675 return PEP_ILLEGAL_VALUE;
2677 // 1. Get own user_id
2678 char* user_id = NULL;
2679 PEP_STATUS status = get_default_own_userid(session, &user_id);
2681 // No user_id is returned in this case, no need to free;
2682 if (status != PEP_STATUS_OK)
2685 // 2. Set device group
2686 sqlite3_reset(session->set_device_group);
2688 sqlite3_bind_text(session->set_device_group, 1, group_name, -1,
2691 sqlite3_bind_null(session->set_device_group, 1);
2694 sqlite3_bind_text(session->set_device_group, 2, user_id, -1,
2697 result = sqlite3_step(session->set_device_group);
2698 sqlite3_reset(session->set_device_group);
2702 if (result != SQLITE_DONE)
2703 return PEP_CANNOT_SET_PERSON;
2705 return PEP_STATUS_OK;
2708 DYNAMIC_API PEP_STATUS get_device_group(PEP_SESSION session, char **group_name)
2710 PEP_STATUS status = PEP_STATUS_OK;
2716 if (!(session && group_name))
2717 return PEP_ILLEGAL_VALUE;
2719 // 1. Get own user_id
2720 char* user_id = NULL;
2721 status = get_default_own_userid(session, &user_id);
2723 // No user_id is returned in this case, no need to free;
2724 if (status != PEP_STATUS_OK)
2727 // 2. get device group
2728 sqlite3_reset(session->get_device_group);
2729 sqlite3_bind_text(session->get_device_group, 1, user_id, -1,
2732 result = sqlite3_step(session->get_device_group);
2735 const char *_group_name = (const char *)sqlite3_column_text(session->get_device_group, 0);
2737 *group_name = strdup(_group_name);
2738 if(*group_name == NULL)
2739 status = PEP_OUT_OF_MEMORY;
2745 status = PEP_RECORD_NOT_FOUND;
2749 sqlite3_reset(session->get_device_group);
2753 DYNAMIC_API PEP_STATUS set_identity_flags(
2754 PEP_SESSION session,
2755 pEp_identity *identity,
2763 assert(identity->address);
2764 assert(identity->user_id);
2766 if (!(session && identity && identity->address && identity->user_id))
2767 return PEP_ILLEGAL_VALUE;
2769 sqlite3_reset(session->set_identity_flags);
2770 sqlite3_bind_int(session->set_identity_flags, 1, flags);
2771 sqlite3_bind_text(session->set_identity_flags, 2, identity->address, -1,
2773 sqlite3_bind_text(session->set_identity_flags, 3, identity->user_id, -1,
2776 result = sqlite3_step(session->set_identity_flags);
2778 sqlite3_reset(session->set_identity_flags);
2779 if (result != SQLITE_DONE)
2780 return PEP_CANNOT_SET_IDENTITY;
2782 identity->flags |= flags;
2783 return PEP_STATUS_OK;
2786 DYNAMIC_API PEP_STATUS unset_identity_flags(
2787 PEP_SESSION session,
2788 pEp_identity *identity,
2796 assert(identity->address);
2797 assert(identity->user_id);
2799 if (!(session && identity && identity->address && identity->user_id))
2800 return PEP_ILLEGAL_VALUE;
2802 sqlite3_reset(session->unset_identity_flags);
2803 sqlite3_bind_int(session->unset_identity_flags, 1, flags);
2804 sqlite3_bind_text(session->unset_identity_flags, 2, identity->address, -1,
2806 sqlite3_bind_text(session->unset_identity_flags, 3, identity->user_id, -1,
2808 result = sqlite3_step(session->unset_identity_flags);
2809 sqlite3_reset(session->unset_identity_flags);
2810 if (result != SQLITE_DONE)
2811 return PEP_CANNOT_SET_IDENTITY;
2813 identity->flags &= ~flags;
2815 return PEP_STATUS_OK;
2819 PEP_STATUS replace_userid(PEP_SESSION session, const char* old_uid,
2820 const char* new_uid) {
2825 if (!session || !old_uid || !new_uid)
2826 return PEP_ILLEGAL_VALUE;
2831 sqlite3_reset(session->replace_userid);
2832 sqlite3_bind_text(session->replace_userid, 1, new_uid, -1,
2834 sqlite3_bind_text(session->replace_userid, 2, old_uid, -1,
2836 result = sqlite3_step(session->replace_userid);
2837 sqlite3_reset(session->replace_userid);
2838 if (result != SQLITE_DONE)
2839 return PEP_CANNOT_SET_PERSON; // May need clearer retval
2841 return PEP_STATUS_OK;
2844 PEP_STATUS refresh_userid_default_key(PEP_SESSION session, const char* user_id) {
2848 if (!session || !user_id)
2849 return PEP_ILLEGAL_VALUE;
2853 sqlite3_reset(session->refresh_userid_default_key);
2854 sqlite3_bind_text(session->refresh_userid_default_key, 1, user_id, -1,
2856 result = sqlite3_step(session->refresh_userid_default_key);
2857 sqlite3_reset(session->refresh_userid_default_key);
2858 if (result != SQLITE_DONE)
2859 return PEP_CANNOT_SET_PERSON;
2861 return PEP_STATUS_OK;
2864 PEP_STATUS replace_main_user_fpr(PEP_SESSION session, const char* user_id,
2865 const char* new_fpr) {
2870 if (!session || !user_id || !new_fpr)
2871 return PEP_ILLEGAL_VALUE;
2875 sqlite3_reset(session->replace_main_user_fpr);
2876 sqlite3_bind_text(session->replace_main_user_fpr, 1, new_fpr, -1,
2878 sqlite3_bind_text(session->replace_main_user_fpr, 2, user_id, -1,
2880 result = sqlite3_step(session->replace_main_user_fpr);
2881 sqlite3_reset(session->replace_main_user_fpr);
2882 if (result != SQLITE_DONE)
2883 return PEP_CANNOT_SET_PERSON;
2885 return PEP_STATUS_OK;
2888 PEP_STATUS get_main_user_fpr(PEP_SESSION session,
2889 const char* user_id,
2892 PEP_STATUS status = PEP_STATUS_OK;
2899 if (!(session && user_id && user_id[0] && main_fpr))
2900 return PEP_ILLEGAL_VALUE;
2904 sqlite3_reset(session->get_main_user_fpr);
2905 sqlite3_bind_text(session->get_main_user_fpr, 1, user_id, -1,
2907 result = sqlite3_step(session->get_main_user_fpr);
2911 (const char *) sqlite3_column_text(session->get_main_user_fpr, 0);
2913 *main_fpr = strdup(_fpr);
2915 status = PEP_OUT_OF_MEMORY;
2918 status = PEP_KEY_NOT_FOUND;
2923 status = PEP_CANNOT_FIND_PERSON;
2926 sqlite3_reset(session->get_main_user_fpr);
2931 DYNAMIC_API PEP_STATUS mark_as_compromized(
2932 PEP_SESSION session,
2936 return mark_as_compromised(session, fpr);
2939 DYNAMIC_API PEP_STATUS mark_as_compromised(
2940 PEP_SESSION session,
2947 assert(fpr && fpr[0]);
2949 if (!(session && fpr && fpr[0]))
2950 return PEP_ILLEGAL_VALUE;
2952 sqlite3_reset(session->mark_compromised);
2953 sqlite3_bind_text(session->mark_compromised, 1, fpr, -1,
2955 result = sqlite3_step(session->mark_compromised);
2956 sqlite3_reset(session->mark_compromised);
2958 if (result != SQLITE_DONE)
2959 return PEP_CANNOT_SET_TRUST;
2961 return PEP_STATUS_OK;
2964 void pEp_free(void *p)
2970 DYNAMIC_API PEP_STATUS get_trust(PEP_SESSION session, pEp_identity *identity)
2972 PEP_STATUS status = PEP_STATUS_OK;
2975 // We need to be able to test that we break correctly without shutting
2976 // asserts off everywhere.
2978 // assert(identity);
2979 // assert(identity->user_id);
2980 // assert(identity->user_id[0]);
2981 // assert(identity->fpr);
2982 // assert(identity->fpr[0]);
2984 if (!(session && identity && identity->user_id && identity->user_id[0] &&
2985 identity->fpr && identity->fpr[0]))
2986 return PEP_ILLEGAL_VALUE;
2988 identity->comm_type = PEP_ct_unknown;
2990 sqlite3_reset(session->get_trust);
2991 sqlite3_bind_text(session->get_trust, 1, identity->user_id, -1,
2993 sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
2995 result = sqlite3_step(session->get_trust);
2998 int comm_type = (PEP_comm_type) sqlite3_column_int(session->get_trust,
3000 identity->comm_type = comm_type;
3005 status = PEP_CANNOT_FIND_IDENTITY;
3008 sqlite3_reset(session->get_trust);
3012 DYNAMIC_API PEP_STATUS least_trust(
3013 PEP_SESSION session,
3015 PEP_comm_type *comm_type
3018 PEP_STATUS status = PEP_STATUS_OK;
3025 if (!(session && fpr && comm_type))
3026 return PEP_ILLEGAL_VALUE;
3028 *comm_type = PEP_ct_unknown;
3030 sqlite3_reset(session->least_trust);
3031 sqlite3_bind_text(session->least_trust, 1, fpr, -1, SQLITE_STATIC);
3033 result = sqlite3_step(session->least_trust);
3036 int _comm_type = sqlite3_column_int(session->least_trust, 0);
3037 *comm_type = (PEP_comm_type) _comm_type;
3041 // never reached because of sql min()
3042 status = PEP_CANNOT_FIND_IDENTITY;
3045 sqlite3_reset(session->least_trust);
3049 DYNAMIC_API PEP_STATUS decrypt_and_verify(
3050 PEP_SESSION session, const char *ctext, size_t csize,
3051 const char *dsigtext, size_t dsigsize,
3052 char **ptext, size_t *psize, stringlist_t **keylist
3062 if (!(session && ctext && csize && ptext && psize && keylist))
3063 return PEP_ILLEGAL_VALUE;
3065 return session->cryptotech[PEP_crypt_OpenPGP].decrypt_and_verify(
3066 session, ctext, csize, dsigtext, dsigsize, ptext, psize, keylist);
3069 DYNAMIC_API PEP_STATUS encrypt_and_sign(
3070 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
3071 size_t psize, char **ctext, size_t *csize
3081 if (!(session && keylist && ptext && psize && ctext && csize))
3082 return PEP_ILLEGAL_VALUE;
3084 return session->cryptotech[PEP_crypt_OpenPGP].encrypt_and_sign(session,
3085 keylist, ptext, psize, ctext, csize);
3088 PEP_STATUS encrypt_only(
3089 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
3090 size_t psize, char **ctext, size_t *csize
3100 if (!(session && keylist && ptext && psize && ctext && csize))
3101 return PEP_ILLEGAL_VALUE;
3103 return session->cryptotech[PEP_crypt_OpenPGP].encrypt_only(session,
3104 keylist, ptext, psize, ctext, csize);
3108 DYNAMIC_API PEP_STATUS verify_text(
3109 PEP_SESSION session, const char *text, size_t size,
3110 const char *signature, size_t sig_size, stringlist_t **keylist
3120 if (!(session && text && size && signature && sig_size && keylist))
3121 return PEP_ILLEGAL_VALUE;
3123 return session->cryptotech[PEP_crypt_OpenPGP].verify_text(session, text,
3124 size, signature, sig_size, keylist);
3127 DYNAMIC_API PEP_STATUS delete_keypair(PEP_SESSION session, const char *fpr)
3132 if (!(session && fpr))
3133 return PEP_ILLEGAL_VALUE;
3135 return session->cryptotech[PEP_crypt_OpenPGP].delete_keypair(session, fpr);
3138 DYNAMIC_API PEP_STATUS export_key(
3139 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
3147 if (!(session && fpr && key_data && size))
3148 return PEP_ILLEGAL_VALUE;
3150 return session->cryptotech[PEP_crypt_OpenPGP].export_key(session, fpr,
3151 key_data, size, false);
3154 DYNAMIC_API PEP_STATUS export_secret_key(
3155 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
3163 if (!(session && fpr && key_data && size))
3164 return PEP_ILLEGAL_VALUE;
3166 // don't accept key IDs but full fingerprints only
3167 if (strlen(fpr) < 16)
3168 return PEP_ILLEGAL_VALUE;
3170 return session->cryptotech[PEP_crypt_OpenPGP].export_key(session, fpr,
3171 key_data, size, true);
3175 DYNAMIC_API PEP_STATUS export_secrect_key(
3176 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
3179 return export_secret_key(session, fpr, key_data, size);
3182 DYNAMIC_API PEP_STATUS find_keys(
3183 PEP_SESSION session, const char *pattern, stringlist_t **keylist
3190 if (!(session && pattern && keylist))
3191 return PEP_ILLEGAL_VALUE;
3193 return session->cryptotech[PEP_crypt_OpenPGP].find_keys(session, pattern,
3198 DYNAMIC_API PEP_STATUS generate_keypair(
3199 PEP_SESSION session, pEp_identity *identity
3204 assert(identity->address);
3205 assert(identity->fpr == NULL || identity->fpr[0] == 0);
3206 assert(identity->username);
3208 if (!(session && identity && identity->address &&
3209 (identity->fpr == NULL || identity->fpr[0] == 0) &&
3210 identity->username))
3211 return PEP_ILLEGAL_VALUE;
3214 session->cryptotech[PEP_crypt_OpenPGP].generate_keypair(session,
3216 if (status != PEP_STATUS_OK)
3220 status = set_pgp_keypair(session, identity->fpr);
3222 // add to known keypair DB, as this might not end up being a default
3226 DYNAMIC_API PEP_STATUS get_key_rating(
3227 PEP_SESSION session,
3229 PEP_comm_type *comm_type
3236 if (!(session && fpr && comm_type))
3237 return PEP_ILLEGAL_VALUE;
3239 return session->cryptotech[PEP_crypt_OpenPGP].get_key_rating(session, fpr,
3243 DYNAMIC_API PEP_STATUS import_key(
3244 PEP_SESSION session,
3245 const char *key_data,
3247 identity_list **private_keys
3253 if (!(session && key_data))
3254 return PEP_ILLEGAL_VALUE;
3256 return session->cryptotech[PEP_crypt_OpenPGP].import_key(session, key_data,
3257 size, private_keys);
3260 DYNAMIC_API PEP_STATUS recv_key(PEP_SESSION session, const char *pattern)
3265 if (!(session && pattern))
3266 return PEP_ILLEGAL_VALUE;
3268 return session->cryptotech[PEP_crypt_OpenPGP].recv_key(session, pattern);
3271 DYNAMIC_API PEP_STATUS send_key(PEP_SESSION session, const char *pattern)
3276 if (!(session && pattern))
3277 return PEP_ILLEGAL_VALUE;
3279 return session->cryptotech[PEP_crypt_OpenPGP].send_key(session, pattern);
3282 DYNAMIC_API PEP_STATUS renew_key(
3283 PEP_SESSION session,
3291 if (!(session && fpr))
3292 return PEP_ILLEGAL_VALUE;
3294 return session->cryptotech[PEP_crypt_OpenPGP].renew_key(session, fpr, ts);
3297 DYNAMIC_API PEP_STATUS revoke_key(
3298 PEP_SESSION session,
3306 if (!(session && fpr))
3307 return PEP_ILLEGAL_VALUE;
3309 return session->cryptotech[PEP_crypt_OpenPGP].revoke_key(session, fpr,
3313 DYNAMIC_API PEP_STATUS key_expired(
3314 PEP_SESSION session,
3324 if (!(session && fpr && expired))
3325 return PEP_ILLEGAL_VALUE;
3327 return session->cryptotech[PEP_crypt_OpenPGP].key_expired(session, fpr,
3331 DYNAMIC_API PEP_STATUS key_revoked(
3332 PEP_SESSION session,
3341 if (!(session && fpr && revoked))
3342 return PEP_ILLEGAL_VALUE;
3344 return session->cryptotech[PEP_crypt_OpenPGP].key_revoked(session, fpr,
3348 static void _clean_log_value(char *text)
3351 for (char *c = text; *c; c++) {
3352 if (*c < 32 && *c != '\n')
3360 static char *_concat_string(char *str1, const char *str2, char delim)
3362 str2 = str2 ? str2 : "";
3363 size_t len1 = str1 ? strlen(str1) : 0;
3364 size_t len2 = strlen(str2);
3365 size_t len = len1 + len2 + 3;
3366 char * result = realloc(str1, len + 1);
3370 strcpy(result + len1 + 1, str2);
3371 result[len - 2] = '"';
3372 result[len - 1] = delim;
3382 DYNAMIC_API PEP_STATUS get_crashdump_log(
3383 PEP_SESSION session,
3388 PEP_STATUS status = PEP_STATUS_OK;
3389 char *_logdata= NULL;
3392 assert(maxlines >= 0 && maxlines <= CRASHDUMP_MAX_LINES);
3395 if (!(session && logdata && maxlines >= 0 && maxlines <=
3396 CRASHDUMP_MAX_LINES))
3397 return PEP_ILLEGAL_VALUE;
3401 int limit = maxlines ? maxlines : CRASHDUMP_DEFAULT_LINES;
3402 const char *timestamp = NULL;
3403 const char *title = NULL;
3404 const char *entity = NULL;
3405 const char *desc = NULL;
3406 const char *comment = NULL;
3408 sqlite3_reset(session->crashdump);
3409 sqlite3_bind_int(session->crashdump, 1, limit);
3414 result = sqlite3_step(session->crashdump);
3417 timestamp = (const char *) sqlite3_column_text(session->crashdump,
3419 title = (const char *) sqlite3_column_text(session->crashdump,
3421 entity = (const char *) sqlite3_column_text(session->crashdump,
3423 desc = (const char *) sqlite3_column_text(session->crashdump,
3425 comment = (const char *) sqlite3_column_text(session->crashdump,
3428 _logdata = _concat_string(_logdata, timestamp, ',');
3429 if (_logdata == NULL)
3432 _logdata = _concat_string(_logdata, title, ',');
3433 if (_logdata == NULL)
3436 _logdata = _concat_string(_logdata, entity, ',');
3437 if (_logdata == NULL)
3440 _logdata = _concat_string(_logdata, desc, ',');
3441 if (_logdata == NULL)
3444 _logdata = _concat_string(_logdata, comment, '\n');
3445 if (_logdata == NULL)
3448 _clean_log_value(_logdata);
3455 status = PEP_UNKNOWN_ERROR;
3456 result = SQLITE_DONE;
3458 } while (result != SQLITE_DONE);
3460 sqlite3_reset(session->crashdump);
3461 if (status == PEP_STATUS_OK) {
3463 *logdata = _logdata;
3466 *logdata = strdup("");
3475 status = PEP_OUT_OF_MEMORY;
3481 DYNAMIC_API PEP_STATUS get_languagelist(
3482 PEP_SESSION session,
3486 PEP_STATUS status = PEP_STATUS_OK;
3487 char *_languages= NULL;
3492 if (!(session && languages))
3493 return PEP_ILLEGAL_VALUE;
3497 const char *lang = NULL;
3498 const char *name = NULL;
3499 const char *phrase = NULL;
3501 sqlite3_reset(session->languagelist);
3506 result = sqlite3_step(session->languagelist);
3509 lang = (const char *) sqlite3_column_text(session->languagelist,
3511 name = (const char *) sqlite3_column_text(session->languagelist,
3513 phrase = (const char *) sqlite3_column_text(session->languagelist,
3516 _languages = _concat_string(_languages, lang, ',');
3517 if (_languages == NULL)
3520 _languages = _concat_string(_languages, name, ',');
3521 if (_languages == NULL)
3524 _languages = _concat_string(_languages, phrase, '\n');
3525 if (_languages == NULL)
3534 status = PEP_UNKNOWN_ERROR;
3535 result = SQLITE_DONE;
3537 } while (result != SQLITE_DONE);
3539 sqlite3_reset(session->languagelist);
3540 if (status == PEP_STATUS_OK)
3541 *languages = _languages;
3546 status = PEP_OUT_OF_MEMORY;
3552 DYNAMIC_API PEP_STATUS get_phrase(
3553 PEP_SESSION session,
3559 PEP_STATUS status = PEP_STATUS_OK;
3561 assert(session && lang && lang[0] && lang[1] && lang[2] == 0 && phrase);
3562 if (!(session && lang && lang[0] && lang[1] && lang[2] == 0 && phrase))
3563 return PEP_ILLEGAL_VALUE;
3567 sqlite3_reset(session->i18n_token);
3568 sqlite3_bind_text(session->i18n_token, 1, lang, -1, SQLITE_STATIC);
3569 sqlite3_bind_int(session->i18n_token, 2, phrase_id);
3571 const char *_phrase = NULL;
3574 result = sqlite3_step(session->i18n_token);
3577 _phrase = (const char *) sqlite3_column_text(session->i18n_token, 0);
3581 status = PEP_PHRASE_NOT_FOUND;
3585 status = PEP_UNKNOWN_ERROR;
3588 if (status == PEP_STATUS_OK) {
3589 *phrase = strdup(_phrase);
3590 if (*phrase == NULL)
3594 sqlite3_reset(session->i18n_token);
3598 status = PEP_OUT_OF_MEMORY;
3604 static PEP_STATUS _get_sequence_value(PEP_SESSION session, const char *name,
3607 assert(session && name && value);
3608 if (!(session && name && value))
3609 return PEP_ILLEGAL_VALUE;
3611 PEP_STATUS status = PEP_STATUS_OK;
3613 sqlite3_reset(session->sequence_value2);
3614 sqlite3_bind_text(session->sequence_value2, 1, name, -1,
3616 int result = sqlite3_step(session->sequence_value2);
3619 int32_t _value = (int32_t)
3620 sqlite3_column_int(session->sequence_value2, 0);
3622 sqlite3_column_int(session->sequence_value2, 1);
3625 status = PEP_OWN_SEQUENCE;
3629 status = PEP_RECORD_NOT_FOUND;
3632 status = PEP_UNKNOWN_ERROR;
3634 sqlite3_reset(session->sequence_value2);
3639 static PEP_STATUS _increment_sequence_value(PEP_SESSION session,
3640 const char *name, int own)
3642 assert(session && name);
3643 if (!(session && name))
3644 return PEP_ILLEGAL_VALUE;
3646 sqlite3_reset(session->sequence_value1);
3647 sqlite3_bind_text(session->sequence_value1, 1, name, -1, SQLITE_STATIC);
3648 sqlite3_bind_int(session->sequence_value1, 2, own);
3649 int result = sqlite3_step(session->sequence_value1);
3650 assert(result == SQLITE_DONE);
3651 sqlite3_reset(session->sequence_value1);
3652 if (result == SQLITE_DONE)
3653 return PEP_STATUS_OK;
3655 return PEP_CANNOT_INCREASE_SEQUENCE;
3658 static PEP_STATUS _set_sequence_value(PEP_SESSION session,
3659 const char *name, int32_t value, int own)
3661 assert(session && name && value > 0);
3662 if (!(session && name && value > 0))
3663 return PEP_ILLEGAL_VALUE;
3665 sqlite3_reset(session->sequence_value3);
3666 sqlite3_bind_text(session->sequence_value3, 1, name, -1, SQLITE_STATIC);
3667 sqlite3_bind_int(session->sequence_value3, 2, value);
3668 sqlite3_bind_int(session->sequence_value3, 3, own);
3669 int result = sqlite3_step(session->sequence_value3);
3670 assert(result == SQLITE_DONE);
3671 sqlite3_reset(session->sequence_value3);
3672 if (result == SQLITE_DONE)
3673 return PEP_STATUS_OK;
3675 return PEP_CANNOT_SET_SEQUENCE_VALUE;
3678 DYNAMIC_API PEP_STATUS sequence_value(
3679 PEP_SESSION session,
3684 PEP_STATUS status = PEP_STATUS_OK;
3688 assert(name && value && *value >= 0);
3690 if (!(session && name && value && *value >= 0))
3691 return PEP_ILLEGAL_VALUE;
3696 uuid_generate_random(uuid);
3697 uuid_unparse_upper(uuid, name);
3701 if (name == session->sync_session->sync_uuid ||
3702 strcmp(name, session->sync_session->sync_uuid) == 0)
3707 sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
3708 int32_t old_value = 0;
3709 status = _get_sequence_value(session, name, &old_value);
3710 if (status != PEP_STATUS_OK && status != PEP_RECORD_NOT_FOUND)
3712 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
3716 if (old_value >= *value) {
3717 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
3718 return PEP_SEQUENCE_VIOLATED;
3721 status = _set_sequence_value(session, name, *value, own);
3722 if (status == PEP_STATUS_OK) {
3723 result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
3724 if (result == SQLITE_OK)
3725 return PEP_STATUS_OK;
3727 return PEP_COMMIT_FAILED;
3729 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
3735 assert(*value == 0);
3736 sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
3737 status = _increment_sequence_value(session, name, own);
3738 if (status == PEP_STATUS_OK) {
3739 status = _get_sequence_value(session, name, value);
3741 if (status == PEP_STATUS_OK || status == PEP_OWN_SEQUENCE) {
3742 result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
3743 if (result == SQLITE_OK){
3744 assert(*value < INT32_MAX);
3745 if (*value == INT32_MAX){
3746 return PEP_CANNOT_INCREASE_SEQUENCE;
3750 return PEP_COMMIT_FAILED;
3753 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
3759 DYNAMIC_API PEP_STATUS set_revoked(
3760 PEP_SESSION session,
3761 const char *revoked_fpr,
3762 const char *replacement_fpr,
3763 const uint64_t revocation_date
3766 PEP_STATUS status = PEP_STATUS_OK;
3769 revoked_fpr && revoked_fpr[0] &&
3770 replacement_fpr && replacement_fpr[0]
3774 revoked_fpr && revoked_fpr[0] &&
3775 replacement_fpr && replacement_fpr[0]
3777 return PEP_ILLEGAL_VALUE;
3779 sqlite3_reset(session->set_revoked);
3780 sqlite3_bind_text(session->set_revoked, 1, revoked_fpr, -1, SQLITE_STATIC);
3781 sqlite3_bind_text(session->set_revoked, 2, replacement_fpr, -1,
3783 sqlite3_bind_int64(session->set_revoked, 3, revocation_date);
3787 result = sqlite3_step(session->set_revoked);
3790 status = PEP_STATUS_OK;
3794 status = PEP_UNKNOWN_ERROR;
3797 sqlite3_reset(session->set_revoked);
3801 DYNAMIC_API PEP_STATUS get_revoked(
3802 PEP_SESSION session,
3805 uint64_t *revocation_date
3808 PEP_STATUS status = PEP_STATUS_OK;
3819 return PEP_ILLEGAL_VALUE;
3821 *revoked_fpr = NULL;
3822 *revocation_date = 0;
3824 sqlite3_reset(session->get_revoked);
3825 sqlite3_bind_text(session->get_revoked, 1, fpr, -1, SQLITE_STATIC);
3829 result = sqlite3_step(session->get_revoked);
3832 *revoked_fpr = strdup((const char *)
3833 sqlite3_column_text(session->get_revoked, 0));
3835 *revocation_date = sqlite3_column_int64(session->get_revoked,
3838 status = PEP_OUT_OF_MEMORY;
3843 status = PEP_CANNOT_FIND_IDENTITY;
3846 sqlite3_reset(session->get_revoked);
3851 PEP_STATUS key_created(
3852 PEP_SESSION session,
3857 assert(session && fpr && created);
3858 if (!(session && fpr && created))
3859 return PEP_ILLEGAL_VALUE;
3861 return session->cryptotech[PEP_crypt_OpenPGP].key_created(session, fpr,
3865 PEP_STATUS find_private_keys(PEP_SESSION session, const char* pattern,
3866 stringlist_t **keylist) {
3867 assert(session && keylist);
3868 if (!(session && keylist))
3869 return PEP_ILLEGAL_VALUE;
3871 return session->cryptotech[PEP_crypt_OpenPGP].find_private_keys(session, pattern,
3875 DYNAMIC_API const char* get_engine_version() {
3876 return PEP_ENGINE_VERSION;
3880 DYNAMIC_API PEP_STATUS reset_peptest_hack(PEP_SESSION session)
3885 return PEP_ILLEGAL_VALUE;
3887 int int_result = sqlite3_exec(
3889 "delete from identity where address like '%@peptest.ch' ;",
3894 assert(int_result == SQLITE_OK);
3896 if (int_result != SQLITE_OK)
3897 return PEP_UNKNOWN_ERROR;
3899 return PEP_STATUS_OK;
3902 #ifdef DEBUG_ERRORSTACK
3903 PEP_STATUS session_add_error(PEP_SESSION session, const char* file, unsigned line, PEP_STATUS status)
3908 snprintf(logline,47, "%.24s:%u status=%u (0x%x)", file, line, status, status);
3910 snprintf(logline,47, "%.24s:%u status=%i.", file, line, status);
3912 stringlist_add(session->errorstack, logline); // logline is copied! :-)
3916 DYNAMIC_API const stringlist_t* get_errorstack(PEP_SESSION session)
3918 return session->errorstack;
3921 DYNAMIC_API void clear_errorstack(PEP_SESSION session)
3923 const int old_len = stringlist_length(session->errorstack);
3925 free_stringlist(session->errorstack);
3926 snprintf(buf, 47, "(%i elements cleared)", old_len);
3927 session->errorstack = new_stringlist(buf);
3932 static stringlist_t* dummy_errorstack = NULL;
3934 DYNAMIC_API const stringlist_t* get_errorstack(PEP_SESSION session)
3936 if(dummy_errorstack == NULL)
3938 dummy_errorstack = new_stringlist("( Please recompile pEpEngine with -DDEBUG_ERRORSTACK )");
3941 return dummy_errorstack;
3944 DYNAMIC_API void clear_errorstack(PEP_SESSION session)
3946 // nothing to do here