1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-07-03 16:37:45 +02:00

add option to encrypt an existing unencrypted data file

This commit is contained in:
Jfreegman 2014-09-15 16:17:58 -04:00
parent a2a23b3932
commit 388d78d11e
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
5 changed files with 55 additions and 23 deletions

View File

@ -55,11 +55,16 @@ instead of
\fI~/\&.config/tox/toxic\&.conf\fR \fI~/\&.config/tox/toxic\&.conf\fR
.RE .RE
.PP .PP
\-d, \-\-default_locale \-d, \-\-default\-locale
.RS 4 .RS 4
Use default locale Use default locale
.RE .RE
.PP .PP
\-e, \-\-encrypt\-data
.RS 4
Encrypt an existing unencrypted data file\&. An error will occur if this option is used with a non\-existent or encrypted data file\&.
.RE
.PP
\-f, \-\-file data\-file \-f, \-\-file data\-file
.RS 4 .RS 4
Use specified Use specified

View File

@ -27,11 +27,15 @@ OPTIONS
-c, --config config-file:: -c, --config config-file::
Use specified 'config-file' instead of '~/.config/tox/toxic.conf' Use specified 'config-file' instead of '~/.config/tox/toxic.conf'
-d, --default_locale:: -d, --default-locale::
Use default locale Use default locale
-e, --encrypt-data::
Encrypt an existing unencrypted data file. An error will occur
if this option is used with a non-existent or encrypted data file.
-f, --file data-file:: -f, --file data-file::
Use specified 'data-file' instead of '~/.config/tox/data' Use specified 'data-file' instead of '~/.config/tox/data'
-h, --help:: -h, --help::
Show help message Show help message

View File

@ -503,7 +503,6 @@ static int password_prompt(char *buf, int size)
int ch; int ch;
while ((ch = getchar()) != '\n' && ch > 0) while ((ch = getchar()) != '\n' && ch > 0)
; ;
return 0; return 0;
} }
@ -512,13 +511,13 @@ static int password_prompt(char *buf, int size)
} }
/* Ask user if they would like to encrypt the data file on first usage */ /* Ask user if they would like to encrypt the data file on first usage */
static void first_time_running(void) static void first_time_encrypt(const char *msg)
{ {
char ch[5] = {0}; char ch[5] = {0};
do { do {
system("clear"); system("clear");
printf("Creating new data file. Would you like to encrypt it? Y/n (q to quit)\n"); printf("%s\n", msg);
if (!strcasecmp(ch, "y\n") || !strcasecmp(ch, "n\n") if (!strcasecmp(ch, "y\n") || !strcasecmp(ch, "n\n")
|| !strcasecmp(ch, "yes\n") || !strcasecmp(ch, "no\n") || !strcasecmp(ch, "yes\n") || !strcasecmp(ch, "no\n")
@ -574,8 +573,7 @@ int store_data(Tox *m, const char *path)
return -2; return -2;
if (user_password.data_is_encrypted) if (user_password.data_is_encrypted)
tox_encrypted_save(m, (uint8_t *) buf, (uint8_t *) user_password.pass, tox_encrypted_save(m, (uint8_t *) buf, (uint8_t *) user_password.pass, user_password.len);
user_password.len);
else else
tox_save(m, (uint8_t *) buf); tox_save(m, (uint8_t *) buf);
@ -622,10 +620,15 @@ static void load_data(Tox *m, char *path)
exit_toxic_err("failed in load_data", FATALERR_FREAD); exit_toxic_err("failed in load_data", FATALERR_FREAD);
} }
user_password.data_is_encrypted = tox_is_data_encrypted((uint8_t *) buf); bool is_encrypted = tox_is_data_encrypted((uint8_t *) buf);
int pwlen = 0;
if (user_password.data_is_encrypted) { /* attempt to encrypt an already encrypted data file */
if (arg_opts.encrypt_data && is_encrypted)
exit_toxic_err("failed in load_data", FATALERR_ENCRYPT);
if (is_encrypted) {
user_password.data_is_encrypted = true;
int pwlen = 0;
system("clear"); system("clear");
printf("Enter password (q to quit) "); printf("Enter password (q to quit) ");
@ -636,6 +639,9 @@ static void load_data(Tox *m, char *path)
if (strcasecmp(user_password.pass, "q") == 0) if (strcasecmp(user_password.pass, "q") == 0)
exit(0); exit(0);
if (pwlen < MIN_PASSWORD_LEN)
continue;
if (tox_encrypted_load(m, (uint8_t *) buf, len, (uint8_t *) user_password.pass, pwlen) == 0) { if (tox_encrypted_load(m, (uint8_t *) buf, len, (uint8_t *) user_password.pass, pwlen) == 0) {
break; break;
} else { } else {
@ -724,6 +730,7 @@ static void print_usage(void)
fprintf(stderr, " -b --debug Enable stderr for debugging\n"); fprintf(stderr, " -b --debug Enable stderr for debugging\n");
fprintf(stderr, " -c, --config Use specified config file\n"); fprintf(stderr, " -c, --config Use specified config file\n");
fprintf(stderr, " -d, --default-locale Use default POSIX locale\n"); fprintf(stderr, " -d, --default-locale Use default POSIX locale\n");
fprintf(stderr, " -e, --encrypt-data Encrypt an existing unencrypted data file\n");
fprintf(stderr, " -f, --file Use specified data file\n"); fprintf(stderr, " -f, --file Use specified data file\n");
fprintf(stderr, " -h, --help Show this message and exit\n"); fprintf(stderr, " -h, --help Show this message and exit\n");
fprintf(stderr, " -n, --nodes Use specified DHTnodes file\n"); fprintf(stderr, " -n, --nodes Use specified DHTnodes file\n");
@ -744,6 +751,7 @@ static void set_default_opts(void)
arg_opts.no_connect = 0; arg_opts.no_connect = 0;
arg_opts.force_tcp = 0; arg_opts.force_tcp = 0;
arg_opts.use_proxy = 0; arg_opts.use_proxy = 0;
arg_opts.encrypt_data = 0;
} }
static void parse_args(int argc, char *argv[]) static void parse_args(int argc, char *argv[])
@ -757,6 +765,7 @@ static void parse_args(int argc, char *argv[])
{"debug", no_argument, 0, 'b'}, {"debug", no_argument, 0, 'b'},
{"default-locale", no_argument, 0, 'd'}, {"default-locale", no_argument, 0, 'd'},
{"config", required_argument, 0, 'c'}, {"config", required_argument, 0, 'c'},
{"encrypt-data", no_argument, 0, 'e'},
{"nodes", required_argument, 0, 'n'}, {"nodes", required_argument, 0, 'n'},
{"help", no_argument, 0, 'h'}, {"help", no_argument, 0, 'h'},
{"noconnect", no_argument, 0, 'o'}, {"noconnect", no_argument, 0, 'o'},
@ -766,7 +775,7 @@ static void parse_args(int argc, char *argv[])
{NULL, no_argument, NULL, 0}, {NULL, no_argument, NULL, 0},
}; };
const char *opts_str = "4bdhotxc:f:n:r:p:"; const char *opts_str = "4bdehotxc:f:n:r:p:";
int opt, indexptr; int opt, indexptr;
while ((opt = getopt_long(argc, argv, opts_str, long_opts, &indexptr)) != -1) { while ((opt = getopt_long(argc, argv, opts_str, long_opts, &indexptr)) != -1) {
@ -793,6 +802,10 @@ static void parse_args(int argc, char *argv[])
queue_init_message("Using default POSIX locale"); queue_init_message("Using default POSIX locale");
break; break;
case 'e':
arg_opts.encrypt_data = 1;
break;
case 'f': case 'f':
arg_opts.use_custom_data = 1; arg_opts.use_custom_data = 1;
DATA_FILE = strdup(optarg); DATA_FILE = strdup(optarg);
@ -917,13 +930,22 @@ int main(int argc, char *argv[])
init_signal_catchers(); init_signal_catchers();
parse_args(argc, argv); parse_args(argc, argv);
/* Use the -b flag to enable stderr */
if (!arg_opts.debug)
freopen("/dev/null", "w", stderr);
/* Make sure all written files are read/writeable only by the current user. */ /* Make sure all written files are read/writeable only by the current user. */
umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
int config_err = init_default_data_files();
/* if first time using given data file prompt for data encryption */ int config_err = init_default_data_files();
if (!file_exists(DATA_FILE)) bool datafile_exists = file_exists(DATA_FILE);
first_time_running();
if (!arg_opts.ignore_data_file) {
if (!datafile_exists)
first_time_encrypt("Creating new data file. Would you like to encrypt it? Y/n (q to quit)");
else if (arg_opts.encrypt_data)
first_time_encrypt("Encrypt existing data file? Y/n (q to quit)");
}
/* init user_settings struct and load settings from conf file */ /* init user_settings struct and load settings from conf file */
user_settings_ = calloc(1, sizeof(struct user_settings)); user_settings_ = calloc(1, sizeof(struct user_settings));
@ -936,15 +958,15 @@ int main(int argc, char *argv[])
Tox *m = init_tox(); Tox *m = init_tox();
/* enable stderr for debugging */
if (!arg_opts.debug)
freopen("/dev/null", "w", stderr);
if (m == NULL) if (m == NULL)
exit_toxic_err("failed in main", FATALERR_NETWORKINIT); exit_toxic_err("failed in main", FATALERR_NETWORKINIT);
if (!arg_opts.ignore_data_file) if (!arg_opts.ignore_data_file) {
load_data(m, DATA_FILE); if (!arg_opts.encrypt_data || (arg_opts.encrypt_data && datafile_exists))
load_data(m, DATA_FILE);
else
exit_toxic_err("failed in main", FATALERR_ENCRYPT);
}
init_term(); init_term();
prompt = init_windows(m); prompt = init_windows(m);

View File

@ -79,6 +79,7 @@ typedef enum _FATAL_ERRS {
FATALERR_INFLOOP = -9, /* infinite loop detected */ FATALERR_INFLOOP = -9, /* infinite loop detected */
FATALERR_WININIT = -10, /* window init failed */ FATALERR_WININIT = -10, /* window init failed */
FATALERR_PROXY = -11, /* Tox network failed to init using a proxy */ FATALERR_PROXY = -11, /* Tox network failed to init using a proxy */
FATALERR_ENCRYPT = -12, /* Data file encryption failure */
} FATAL_ERRS; } FATAL_ERRS;
/* Fixes text color problem on some terminals. /* Fixes text color problem on some terminals.

View File

@ -83,7 +83,7 @@ struct arg_opts {
int default_locale; int default_locale;
int use_custom_data; int use_custom_data;
int no_connect; int no_connect;
int encrypt_data;
char dns_path[MAX_STR_SIZE]; char dns_path[MAX_STR_SIZE];
char config_path[MAX_STR_SIZE]; char config_path[MAX_STR_SIZE];
char nodes_path[MAX_STR_SIZE]; char nodes_path[MAX_STR_SIZE];