From 8af0737920cceb1d29bbd4ac6cf7b692c1ad1416 Mon Sep 17 00:00:00 2001 From: Joursoir Date: Mon, 19 Oct 2020 15:54:40 +0000 Subject: feature: gpg encryption, remove pass --- implementation.c | 32 +++++++++--- main.c | 147 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 103 insertions(+), 76 deletions(-) diff --git a/implementation.c b/implementation.c index 0ef17c1..f695b01 100644 --- a/implementation.c +++ b/implementation.c @@ -12,17 +12,22 @@ // == global var == extern char *gPath_rootdir; +extern char *gSecret_gpgkey; char* getPassword(char *path, char *password, int maxlen) { - FILE *filePass; - filePass = fopen(path, "r"); - if(filePass == NULL) { - if(errno == ENOENT) { // file doesn't exist - printError("lpass: No such file exists\n"); - } - callError(110); + // gpg + int pid = fork(); + if(pid == 1) callError(126); + if(pid == 0) { + execlp("gpg", "-d", "--quiet", "-r", gSecret_gpgkey, "-o", "gap", path, NULL); + perror("gpg"); + exit(4); } + wait(&pid); + + FILE *filePass = fopen("gap", "r"); + if(filePass == NULL) callError(127); char sign[maxlen]; if(!fgets(sign, sizeof(sign), filePass)) { @@ -31,6 +36,8 @@ char* getPassword(char *path, char *password, int maxlen) strcpy(password, sign); fclose(filePass); + + remove("gap"); return password; } @@ -91,6 +98,17 @@ void insertPass(char *add_path, char *password) fputs(password, filePass); fclose(filePass); + // gpg + int pid = fork(); + if(pid == 1) callError(225); + if(pid == 0) { + execlp("gpg", "-a", "-r", gSecret_gpgkey, "-e", file_path, NULL); + perror("gpg"); + exit(4); + } + wait(&pid); + remove(file_path); + free(main_path); free(file_path); } diff --git a/main.c b/main.c index cd368df..cace9d0 100644 --- a/main.c +++ b/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "easydir.h" #include "handerror.h" @@ -32,6 +33,7 @@ // == global var == char *gPath_rootdir; +char *gSecret_gpgkey; static void cmd_init(int argc, char *argv[]) { @@ -156,6 +158,36 @@ static void cmd_insert(int argc, char *argv[]) printf("Passwords do not match\n"); } +static void cmd_remove(int argc, char *argv[]) +{ + char *path_to_password = argv[2]; + + char *path_with_gpg = malloc( sizeof(char) * (strlen(path_to_password)+1+4) ); + strcpy(path_with_gpg, path_to_password); + strcat(path_with_gpg, ".gpg"); + + if(checkFileExist(path_with_gpg) == 0) { + printError("lpass: No such file exists\n"); + } + + // check working + char *main_path, *file_path; + main_path = (char *) malloc( sizeof(char) * (strlen(path_to_password)+1) ); + file_path = (char *) malloc( sizeof(char) * (strlen(path_to_password)+1) ); + + if(splitPath(path_to_password, main_path, file_path) == NULL) { // check correct input + printError("lpass: The path you specified is incorrect\n"); + } + + if(deleteFile(path_with_gpg)) { + deleteEmptyDir(main_path); + } + + free(path_with_gpg); + free(main_path); + free(file_path); +} + static void cmd_showtree(char *path) { if(opendir(path) != NULL) { // if it's directory @@ -163,15 +195,33 @@ static void cmd_showtree(char *path) pid = fork(); if(pid == -1) callError(101); if(pid == 0) { /* new process */ - execlp("tree", "tree", "-C", "--noreport", path, NULL); + execlp("tree", "tree", "-C", "--noreport", path, "-o", "tree", NULL); perror("tree"); exit(4); } wait(&pid); + + pid = fork(); + if(pid == -1) callError(130); + if(pid == 0) { + execlp("sed", "sed", "-E", "s/\\.gpg(\\x1B\\[[0-9]+m)?( ->|$)/\\1\\2/g", "tree", NULL); + perror("sed"); + exit(4); + } + wait(&pid); + + remove("tree"); } else { + char *path_with_gpg = (char *) malloc( sizeof(char) * (strlen(path)+1+4) ); // +4 for ".gpg" + strcpy(path_with_gpg, path); + strcat(path_with_gpg, ".gpg"); + char password[MAXLEN_PASSWORD]; - getPassword(path, password, MAXLEN_PASSWORD); + getPassword(path_with_gpg, password, MAXLEN_PASSWORD); + + free(path_with_gpg); + printf("%s\n", password); } } @@ -205,6 +255,30 @@ int main(int argc, char *argv[]) if(argv[1] != NULL) ihash = hash(argv[1]); + if(ihash != HASH_INIT) + { + if(chdir(gPath_rootdir) != 0) + printError("Before starting work, you must initialize LockPassword\nUse: lpass init [gpg key]\n"); + else { + /* init GPG key */ + FILE *fileGPG; + fileGPG = fopen(".gpg-key", "r"); + if(fileGPG == NULL) { + if(errno == ENOENT) printError("lpass: No GPG key exists\n"); + callError(121); + } + + gSecret_gpgkey = (char *) malloc( sizeof(char) * (MAXLEN_PASSWORD+1) ); + + char sign[MAXLEN_PASSWORD]; + if(!fgets(sign, sizeof(sign), fileGPG)) { + callError(122); + } + strcpy(gSecret_gpgkey, sign); + /* end init */ + } + } + if( (chdir(gPath_rootdir) != 0) && (ihash != HASH_INIT) ) { printError("Before starting work, you must initialize LockPassword\nUse: lpass init [gpg key]\n"); } @@ -235,7 +309,7 @@ int main(int argc, char *argv[]) } case HASH_REMOVE: case HASH_DELETE: { - printf("borrr\n"); + cmd_remove(argc, argv); break; } case HASH_HELP: { @@ -248,6 +322,7 @@ int main(int argc, char *argv[]) } default: { + // fix [./lpass ..] int newlen_rootdir = len_rootdir - strlen(STORAGEPASS_DIR) - 1; gPath_rootdir[newlen_rootdir-1] = '\0'; @@ -274,70 +349,4 @@ int main(int argc, char *argv[]) free(gPath_rootdir); return EXIT_SUCCESS; - - /*char rootPath = ""; - int result = 0; - if(result != -1) - { - switch(result) { - case 'g': { - char *passPath = argv[argc-1]; - char *lenPass = optarg; - - if(checkFileExist(passPath) == 1) { - // ask user about change pass - int buffSize = (strlen("Do you want generate new password and paste it in '' (Y/N)?") + strlen(passPath)) * sizeof(char) + sizeof(char); - char *str = malloc(buffSize); - - snprintf(str, buffSize, "Do you want generate new password and paste it in '%s' (Y/N)?", passPath); - if(getAnswer(str) != 1) { - // free(str); - return 0; - } - free(str); - } - - int n_symbols = 0; - if(strcmp(lenPass, passPath) == 0) - n_symbols = STANDARD_AMOUNT_GENERATE_SYMBOLS; - else n_symbols = atoi(lenPass); - - - if(n_symbols < 1 || n_symbols > 127) { - printError("lpass: you typed an incorrect number"); - } - - // generate password - char gpass[MAXLEN_PASSWORD]; - generatePassword(gpass, n_symbols, MAXLEN_PASSWORD); - - insertPass(rootPath, passPath, gpass); - printf("Generated password: %s\n", gpass); - printf("Password added successfully for %s\n", passPath); - - break; - } - case 'R': { - if(checkFileExist(optarg) == 0) { - printError("lpass: No such file exists\n"); - } - - // check working - char *main_path, *file_path; - main_path = (char *) malloc( sizeof(char) * (strlen(optarg)+1) ); - file_path = (char *) malloc( sizeof(char) * (strlen(optarg)+1) ); - - if(splitPath(optarg, main_path, file_path) == NULL) { // check correct input - printError("lpass: The path you specified is incorrect\n"); - } - - if(deleteFile(optarg)) { - deleteEmptyDir(main_path); - } - - free(main_path); - free(file_path); - break; - } - }*/ } \ No newline at end of file -- cgit v1.2.3-18-g5258