diff options
author | Joursoir <chat@joursoir.net> | 2020-10-21 19:26:03 +0000 |
---|---|---|
committer | Joursoir <chat@joursoir.net> | 2020-10-21 19:26:03 +0000 |
commit | 5a8218b13fbe21e4c85a484933ca201b666323ee (patch) | |
tree | 2f834cd5eefe529c9e569c0cbafa2c0c653386ed /main.c | |
parent | 8af0737920cceb1d29bbd4ac6cf7b692c1ad1416 (diff) | |
download | lock-password-5a8218b13fbe21e4c85a484933ca201b666323ee.tar.gz lock-password-5a8218b13fbe21e4c85a484933ca201b666323ee.tar.bz2 lock-password-5a8218b13fbe21e4c85a484933ca201b666323ee.zip |
fix bug: work outside working dir; refactor
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 275 |
1 files changed, 120 insertions, 155 deletions
@@ -1,3 +1,10 @@ +/* +** Code written by Joursoir +** +** This is free and unencumbered software released into the public domain. +** (C) The Unlicense +*/ + #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -5,35 +12,58 @@ #include <sys/wait.h> #include <getopt.h> #include <dirent.h> -#include <errno.h> +#include <libgen.h> #include "easydir.h" #include "handerror.h" #include "implementation.h" +#define VERSION "1.0" +#define DATE_RELEASE "21 October, 2020" //#define DEBUG #define MINLEN_PASSWORD 1 #define MAXLEN_PASSWORD 128 #define STANDARD_AMOUNT_GENERATE_SYMBOLS 10 #define LOCKPASS_DIR "/.lock-password/" -#define STORAGEPASS_DIR "Password-Storage/" #define GPGKEY_FILE "/.gpg-key" +#define TREE_OUTPUT_FILE ".tree" + #define HASH_INIT 6385337657 #define HASH_HELP 6385292014 #define HASH_VERSION 229486327000139 #define HASH_COPY 6385123360 #define HASH_EDIT 6385183019 +#define HASH_MV 5863624 #define HASH_MOVE 249844339311324255 #define HASH_GENERATE 7572409341523952 #define HASH_INSERT 6953633055386 +#define HASH_RM 5863780 #define HASH_REMOVE 6953974396019 #define HASH_DELETE 6953426453624 #define WITHOUT_ARGUMENTS 1 // == global var == -char *gPath_rootdir; -char *gSecret_gpgkey; +char *gPath_rootdir; // /home/[username]/.lockpassword/ +char *gPath_subdir; // example: programming/github.com +char *gPath_pass; // example: programming/github.com/joursoir.gpg + +static void globalSplitPath(char *source) +{ + int len_path = strlen(source) + strlen(".gpg") + 1; + + gPath_pass = malloc(sizeof(char) * len_path); // path without working dir + strcpy(gPath_pass, source); + strcat(gPath_pass, ".gpg"); + + gPath_subdir = malloc(sizeof(char) * len_path); // path without working dir and pass file + strcpy(gPath_subdir, source); + gPath_subdir = dirname(gPath_subdir); + + #if defined(DEBUG) + printf("dir: %s\n", gPath_subdir); + #endif +} static void cmd_init(int argc, char *argv[]) { @@ -45,17 +75,10 @@ static void cmd_init(int argc, char *argv[]) // create main directory: int len_init_storage = strlen(gPath_rootdir) + strlen(GPGKEY_FILE) + 1; // +1 for '\0' char *path_init_storage = (char *) malloc(sizeof(char) * len_init_storage); - strcpy(path_init_storage, gPath_rootdir); - int pid = fork(); - if(pid == -1) callError(100); - if(pid == 0) { /* new process */ - execlp("mkdir", "mkdir", "-vp", path_init_storage, NULL); - perror("mkdir"); - exit(4); - } - wait(&pid); + char *arguments[] = {"mkdir", "-vp", path_init_storage, NULL}; + easyFork("mkdir", arguments); strcat(path_init_storage, GPGKEY_FILE); @@ -83,13 +106,15 @@ static void cmd_edit(int argc, char *argv[]) if(path_to_password == NULL) printError("Use: lpass edit [path to password]\n"); + checkForbiddenPaths(path_to_password); - if(checkFileExist(path_to_password) == 0) { + globalSplitPath(path_to_password); + + if(checkFileExist(gPath_pass) == 0) printError("lpass: No such file exists\n"); - } /* ask user about change pass */ - int buffSize = (strlen("Do you want edit password in '' (Y/N)?") + strlen(path_to_password)) * sizeof(char) + sizeof(char); + int buffSize = (strlen("Do you want edit password in '' (Y/N)?") + strlen(path_to_password) + 1) * sizeof(char); char *str = malloc(buffSize); snprintf(str, buffSize, "Do you want edit password in '%s' (Y/N)?", path_to_password); @@ -105,14 +130,32 @@ static void cmd_edit(int argc, char *argv[]) printf("Passwords do not match\n"); } +static void cmd_move(int argc, char *argv[]) +{ + char *old_path = argv[2]; + char *new_path = argv[argc-1]; + + if(old_path == new_path) + printError("Use: lpass move/mv [old path] [new path]"); + + // soon ... +} + static void cmd_generate(int argc, char *argv[]) { char *len_pass = argv[2]; char *path_to_password = argv[argc-1]; - if(checkFileExist(path_to_password) == 1) { + if(path_to_password == NULL) + printError("Use: lpass generate [len pass] [path to password]\n"); + checkForbiddenPaths(path_to_password); + + globalSplitPath(path_to_password); + + if(checkFileExist(gPath_pass) == 1) { // ask user about change pass - int buffSize = (strlen("Do you want generate new password and paste it in '' (Y/N)?") + strlen(path_to_password)) * sizeof(char) + sizeof(char); + int buffSize = (strlen("Do you want generate new password and paste it in '' (Y/N)?") + \ + strlen(path_to_password) - 4 + 1) * sizeof(char); char *str = malloc(buffSize); snprintf(str, buffSize, "Do you want generate new password and paste it in '%s' (Y/N)?", path_to_password); @@ -120,8 +163,7 @@ static void cmd_generate(int argc, char *argv[]) int answer = getAnswer(str); free(str); - if(answer != 1) - exit(EXIT_FAILURE); + if(answer != 1) exit(EXIT_SUCCESS); } int n_symbols = 0; @@ -129,7 +171,6 @@ static void cmd_generate(int argc, char *argv[]) n_symbols = STANDARD_AMOUNT_GENERATE_SYMBOLS; else n_symbols = atoi(len_pass); - if(n_symbols < MINLEN_PASSWORD || n_symbols > MAXLEN_PASSWORD) { printError("lpass: you typed an incorrect number"); } @@ -148,8 +189,11 @@ static void cmd_insert(int argc, char *argv[]) char *path_to_password = argv[2]; if(path_to_password == NULL) printError("Use: lpass insert [path to password]\n"); + checkForbiddenPaths(path_to_password); + + globalSplitPath(path_to_password); - if(checkFileExist(path_to_password) == 1) + if(checkFileExist(gPath_pass) == 1) printError("To change pass use: lpass change [path to password]\n"); if(userEnterPassword(MINLEN_PASSWORD, MAXLEN_PASSWORD, path_to_password) == 1) @@ -161,77 +205,54 @@ static void cmd_insert(int argc, char *argv[]) static void cmd_remove(int argc, char *argv[]) { char *path_to_password = argv[2]; + if(path_to_password == NULL) + printError("Use: lpass remove/rm/delete [path to password]\n"); + checkForbiddenPaths(path_to_password); - 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"); + globalSplitPath(path_to_password); - if(checkFileExist(path_with_gpg) == 0) { + if(checkFileExist(gPath_pass) == 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); + if(deleteFile(gPath_pass)) { + deleteEmptyDir(gPath_subdir); } - - free(path_with_gpg); - free(main_path); - free(file_path); } static void cmd_showtree(char *path) { - if(opendir(path) != NULL) { // if it's directory - int pid; - pid = fork(); - if(pid == -1) callError(101); - if(pid == 0) { /* new process */ - 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); + if(opendir(path) != NULL ) // if it's directory + { + char *arg1[] = {"tree", "-C", "--noreport", path, "-o", TREE_OUTPUT_FILE, NULL}; + easyFork("tree", arg1); - 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 *arg2[] = {"sed", "-i", "-E", "s/\\.gpg(\\x1B\\[[0-9]+m)?( ->|$)/\\1\\2/g", TREE_OUTPUT_FILE, NULL}; + easyFork("sed", arg2); // remove .gpg at the pass name - char password[MAXLEN_PASSWORD]; - getPassword(path_with_gpg, password, MAXLEN_PASSWORD); + if(strcmp(path, ".") == 0) printf("Password Storage\n"); + else printf("Password Storage/%s\n", path); - free(path_with_gpg); + char *arg3[] = {"tail", "-n", "+2", TREE_OUTPUT_FILE, NULL}; + easyFork("tail", arg3); // remove working directory - printf("%s\n", password); + remove(TREE_OUTPUT_FILE); } -} - -static void cmd_help() -{ + else + { + globalSplitPath(path); + if(checkFileExist(gPath_pass) == 1) // exist + { + char password[MAXLEN_PASSWORD]; + getPassword(path, password, sizeof(char)*MAXLEN_PASSWORD); + printf("%s\n", password); + } + else printf("Error: %s is not in the password storage\n", path); + } } -static void cmd_version() +static void cmd_help() { } @@ -243,110 +264,54 @@ int main(int argc, char *argv[]) } /* init global path to root directory */ - int len_rootdir = strlen(getenv("HOME")) + strlen(LOCKPASS_DIR) + strlen(STORAGEPASS_DIR) + 1; // +1 for '\0' + int len_rootdir = strlen(getenv("HOME")) + strlen(LOCKPASS_DIR) + 1; // +1 for '\0' gPath_rootdir = (char *) malloc(sizeof(char) * len_rootdir); strcpy(gPath_rootdir, getenv("HOME")); strcat(gPath_rootdir, LOCKPASS_DIR); - strcat(gPath_rootdir, STORAGEPASS_DIR); /* end init */ unsigned long ihash = WITHOUT_ARGUMENTS; 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) ) { + if(chdir(gPath_rootdir) != 0 && ihash != HASH_INIT) printError("Before starting work, you must initialize LockPassword\nUse: lpass init [gpg key]\n"); - } switch(ihash) { - case HASH_INIT: { - cmd_init(argc, argv); - break; - } - case HASH_COPY: { - cmd_copy(argc, argv); - break; - } - case HASH_EDIT: { - cmd_edit(argc, argv); - break; - } - case HASH_MOVE: - break; - case HASH_GENERATE: { - cmd_generate(argc, argv); - break; - } - case HASH_INSERT: { - cmd_insert(argc, argv); - break; - } + case HASH_INIT: { cmd_init(argc, argv); break; } + case HASH_COPY: { cmd_copy(argc, argv); break; } + case HASH_EDIT: { cmd_edit(argc, argv); break; } + case HASH_MV: + case HASH_MOVE: { cmd_move(argc, argv); break; } + case HASH_GENERATE: { cmd_generate(argc, argv); break; } + case HASH_INSERT: { cmd_insert(argc, argv); break; } + case HASH_RM: case HASH_REMOVE: - case HASH_DELETE: { - cmd_remove(argc, argv); - break; - } - case HASH_HELP: { - cmd_help(); - break; - } + case HASH_DELETE: { cmd_remove(argc, argv); break; } + case HASH_HELP: { cmd_help(); break; } case HASH_VERSION: { - cmd_version(); + printf("LockPassword v%s\n", VERSION); + printf("Release date: %s\n\n", DATE_RELEASE); + printf("Code written by Joursoir\n"); + printf("This is free and unencumbered software released into the public domain.\n\n"); break; } default: { - // fix [./lpass ..] - int newlen_rootdir = len_rootdir - strlen(STORAGEPASS_DIR) - 1; - gPath_rootdir[newlen_rootdir-1] = '\0'; - - if(chdir(gPath_rootdir) != 0) - callError(123); - - char *ptr; - if(ihash == WITHOUT_ARGUMENTS) { - ptr = malloc(sizeof(char) * (strlen(STORAGEPASS_DIR)+1) ); - strcpy(ptr, STORAGEPASS_DIR); - } - else { - int buff_tree = strlen(STORAGEPASS_DIR) + strlen(argv[argc-1]) + 1; - ptr = malloc(sizeof(char) * buff_tree); - strcpy(ptr, STORAGEPASS_DIR); - strcat(ptr, argv[argc-1]); - } - cmd_showtree(ptr); - - free(ptr); + if(ihash == WITHOUT_ARGUMENTS) strcpy(argv[argc-1], "."); + else checkForbiddenPaths(argv[argc-1]); + + cmd_showtree(argv[argc-1]); break; } } + if(gPath_subdir != NULL) { + free(gPath_subdir); + free(gPath_pass); + } free(gPath_rootdir); return EXIT_SUCCESS; }
\ No newline at end of file |