diff options
Diffstat (limited to 'src/routines.c')
-rw-r--r-- | src/routines.c | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/src/routines.c b/src/routines.c new file mode 100644 index 0000000..f6b6bcc --- /dev/null +++ b/src/routines.c @@ -0,0 +1,211 @@ +/*** + This file is part of LockPassword + Copyright (C) 2020-2021 Aleksandr D. Goncharov (Joursoir) <chat@joursoir.net> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. +***/ + +#include <stdio.h> +#include <stdlib.h> +#include <libgen.h> +#include <unistd.h> +#include <termios.h> +#include <string.h> +#include <time.h> +#include <errno.h> +#include <sys/stat.h> + +#include "routines.h" +#include "constants.h" +#include "easydir.h" +#include "r-gpgme.h" +#if defined(DISPLAY) + #include "r-x11.h" +#endif + +int copy_outside(char *password) +{ + #if defined(DISPLAY) + int pid; + pid = fork(); + if(pid == -1) + errprint_r(1, "X11 fork() failed\n"); + if(pid == 0) /* new process */ + exit(run_clipboard(password)); + return 0; + #endif + + if(getenv("WAYLAND_DISPLAY") != NULL) { + char * const wl_copy[] = {"wl-copy", password, NULL}; + int pid; + pid = fork(); + if(pid == -1) + errprint_r(1, "Wayland fork() failed\n"); + if(pid == 0) { /* new process */ + execvp("wl-copy", wl_copy); + perror("wl-copy"); + exit(1); + } + + return 0; + } + + errprint_r(1, "You didn't have x11 or wayland when app builded\n"); +} + +/* check two dot in path */ +int check_sneaky_paths(const char *path) +{ + int length = strlen(path), i; + for(i = 1; i < length; i++) + { + if(path[i-1] == '.' && path[i] == '.') + return 1; + } + return 0; +} + +char *get_pubkey() +{ + char *pubkey; + + FILE *fileGPG = fopen(".gpg-key", "r"); + if(fileGPG == NULL) { + if(errno == ENOENT) + errprint_r(NULL, "No GPG key exists. Use \"lpass init\"\n"); + errprint_r(NULL, "%s\n", strerror(errno)); + } + + pubkey = malloc(sizeof(char) * (maxlen_fingerprint + 1)); + if(fgets(pubkey, maxlen_fingerprint + 1, fileGPG) == NULL) { + free(pubkey); + errprint_ptr(&pubkey, NULL, "%s\n", strerror(errno)); + } + + fclose(fileGPG); + return pubkey; +} + +char *get_password(const char *path) +{ + return decrypt_data(path); +} + +void visible_enter(int status) +{ + struct termios term_settings; + tcgetattr(0, &term_settings); // get current settings + if(status == 1) + term_settings.c_lflag |= ECHO; + else + term_settings.c_lflag &= ~ECHO; + tcsetattr(0, TCSANOW, &term_settings); +} + +static void mkdir_recursive(const char *path) +{ + char *subpath, *fullpath; + + fullpath = strdup(path); + subpath = dirname(fullpath); + if(subpath[0] != '.') + mkdir_recursive(subpath); + + mkdir(path, S_IRWXU); + free(fullpath); +} + +int insert_pass(const char *path, const char *password) +{ + char *public_gpgkey = get_pubkey(); + if(public_gpgkey == NULL) + return 1; + + // create directories + char *tmp, *dirs_path; + tmp = strdup(path); + dirs_path = dirname(tmp); + if(dirs_path[0] != '.') + mkdir_recursive(dirs_path); + free(tmp); + + int ret = ecnrypt_data(path, password, public_gpgkey); + free(public_gpgkey); + return ret; +} + +char *get_input(int minlen, int maxlen) +{ + char *pass = malloc(sizeof(char) * (maxlen + 1)); + int len; + + if(fgets(pass, maxlen + 1, stdin) == NULL) { + free(pass); + errprint_ptr(&pass, NULL, "%s\n", strerror(errno)); + } + + len = strlen(pass); + if(len < minlen) { + free(pass); + return NULL; + } + + if(pass[len-1] == '\n') + pass[len-1] = '\0'; + + return pass; +} + +char *gen_password(int length) +{ + int i, min = 33, max = 126; + char *password = malloc(sizeof(char) * (length + 1)); + + srand(time(NULL)); + for(i = 0; i < length; i++) + password[i] = min + rand() % (max-min); + + return password; +} + +static void clear_stdin() +{ + int garbage; + while( (garbage = fgetc(stdin)) != '\n' && garbage != EOF ) + ; +} + +int overwrite_answer(const char *path) +{ + int answer; + printf("Password for \"%s\" exists. Overwrite? (Y/N)\n", path); + while((answer = fgetc(stdin))) + { + clear_stdin(); + switch(answer) + { + case 'Y': + case 'y': return 'y'; + case 'N': + case 'n': + case EOF: return 'n'; + default: { + printf("Overwrite? (Y/N) "); + break; + } + } + } + + return 'n'; +} |