diff options
-rw-r--r-- | src/exec-cmd.h | 14 | ||||
-rw-r--r-- | src/handerror.c | 2 | ||||
-rw-r--r-- | src/handerror.h | 2 | ||||
-rw-r--r-- | src/implementation.c | 11 | ||||
-rw-r--r-- | src/implementation.h | 1 | ||||
-rw-r--r-- | src/main.c | 193 |
6 files changed, 112 insertions, 111 deletions
diff --git a/src/exec-cmd.h b/src/exec-cmd.h new file mode 100644 index 0000000..2bd8000 --- /dev/null +++ b/src/exec-cmd.h @@ -0,0 +1,14 @@ +#ifndef LPASS_EXECCMD_H +#define LPASS_EXECCMD_H + +void cmd_showtree(int argc, char *argv[]); +void cmd_init(int argc, char *argv[]); +void cmd_insert(int argc, char *argv[]); +void cmd_edit(int argc, char *argv[]); +void cmd_generate(int argc, char *argv[]); +void cmd_remove(int argc, char *argv[]); +void cmd_move(int argc, char *argv[]); +void cmd_help(int argc, char *argv[]); +void cmd_version(int argc, char *argv[]); + +#endif /* LPASS_EXECCMD_H */ diff --git a/src/handerror.c b/src/handerror.c index 35e8f28..218619d 100644 --- a/src/handerror.c +++ b/src/handerror.c @@ -9,7 +9,7 @@ void callError(int num) exit(3); } -void printError(char *text) +void printError(const char *text) { fprintf(stderr, "%s", text); exit(4); diff --git a/src/handerror.h b/src/handerror.h index 6f75c7b..09c5106 100644 --- a/src/handerror.h +++ b/src/handerror.h @@ -3,6 +3,6 @@ void easyFork(char *name, char *arguments[]); void callError(int num); -void printError(char *text); +void printError(const char *text); #endif
\ No newline at end of file diff --git a/src/implementation.c b/src/implementation.c index 863b755..9b93704 100644 --- a/src/implementation.c +++ b/src/implementation.c @@ -216,17 +216,6 @@ char *generatePassword(char *dest, int amount) return dest; } -unsigned long hash(char *str) -{ - unsigned long hash = 5381; - char c; - - while( (c = *str++) ) - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ - - return hash; -} - static void clearStdinBuff() { char garbage; diff --git a/src/implementation.h b/src/implementation.h index ba436a7..52f4dc7 100644 --- a/src/implementation.h +++ b/src/implementation.h @@ -11,7 +11,6 @@ void insertPass(char *add_path, char *password, int flag_copy); char *typePass(char *text, char *dest, int minlen, int maxlen); int userEnterPassword(int minlen, int maxlen, char *path_insert, int flag_echo, int flag_copy); char *generatePassword(char *dest, int amount); -unsigned long hash(char *str); int getOverwriteAnswer(char *path); #endif
\ No newline at end of file @@ -16,6 +16,7 @@ #include "easydir.h" #include "handerror.h" #include "implementation.h" +#include "exec-cmd.h" #define VERSION "1.0c" #define DATE_RELEASE "14 January, 2021" @@ -30,26 +31,22 @@ #define TREE_OUTPUT_FILE ".tree" #define TEXTEDITOR_FILE ".text-editor" -#define HASH_INIT 6385337657 -#define HASH_HELP 6385292014 -#define HASH_VERSION 229486327000139 -#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 - -#define STR_SHOWTREEUSE "Use: lpass [-c] [passname]\n" -#define STR_INITUSE "Use: lpass init gpg-key\n" -#define STR_INSERTUSE "Use: lpass insert [-ecf] passname\n" -#define STR_EDITUSE "Use: lpass edit [-t=text-editor] passname\n" -#define STR_GENERATEUSE "Use: lpass generate [-l=pass-length] [-f] passname\n" -#define STR_REMOVEUSE "Use: lpass remove/rm/delete passname\n" -#define STR_MOVEUSE "Use: lpass move/mv [-f] old-path new-path\n" +struct cmd_struct { + const char *cmd; + void (*func)(int, char **); +}; + +static struct cmd_struct commands[] = { + { "init", cmd_init }, + { "insert", cmd_insert }, + { "edit", cmd_edit }, + { "generate", cmd_generate }, + { "rm", cmd_remove }, + { "mv", cmd_move }, + { "help", cmd_help }, + { "version", cmd_version }, + { NULL, NULL } +}; // == global var == char *gPath_rootdir = NULL; // /home/[username]/.lockpassword/ @@ -74,10 +71,11 @@ static void globalSplitPath(char *source) #endif } -static void cmd_init(int argc, char *argv[]) +void cmd_init(int argc, char *argv[]) { + const char description[] = "Use: lpass init gpg-key\n"; char *gpg_key = argv[2]; - if(gpg_key == NULL) printError(STR_INITUSE); + if(gpg_key == NULL) printError(description); // create main directory: int len_init_storage = strlen(gPath_rootdir) + strlen(GPGKEY_FILE) + 1; // +1 for '\0' @@ -102,8 +100,9 @@ static void cmd_init(int argc, char *argv[]) printf("LockPassword initialized for %s\n", gpg_key); } -static void cmd_edit(int argc, char *argv[]) +void cmd_edit(int argc, char *argv[]) { + const char description[] = "Use: lpass edit [-t=text-editor] passname\n"; const struct option long_options[] = { {"text-editor", required_argument, NULL, 't'}, {NULL, 0, NULL, 0} @@ -122,7 +121,7 @@ static void cmd_edit(int argc, char *argv[]) printf("You changed text editor to %s\n", optarg); break; } - default: printError(STR_EDITUSE); + default: printError(description); } } @@ -133,7 +132,7 @@ static void cmd_edit(int argc, char *argv[]) #endif char *path_to_password; - if(argv[optind] == NULL) printError(STR_EDITUSE); + if(argv[optind] == NULL) printError(description); else path_to_password = argv[optind]; checkForbiddenPaths(path_to_password); @@ -191,12 +190,13 @@ static void cmd_edit(int argc, char *argv[]) free(public_gpgkey); } -static void cmd_move(int argc, char *argv[]) +void cmd_move(int argc, char *argv[]) { /* we have a two situation: 1) mv file file 2) mv file directory */ + const char description[] = "Use: lpass mv [-f] old-path new-path\n"; const struct option long_options[] = { {"force", no_argument, NULL, 'f'}, {NULL, 0, NULL, 0} @@ -206,7 +206,7 @@ static void cmd_move(int argc, char *argv[]) while((result = getopt_long(argc, argv, "f", long_options, NULL)) != -1) { switch(result) { case 'f': { flag_force = 1; break; } - default: printError(STR_MOVEUSE); + default: printError(description); } } @@ -217,8 +217,8 @@ static void cmd_move(int argc, char *argv[]) if(argv[optind] != NULL) printf("new-path: %s\n", argv[optind+1]); #endif - if(argv[optind] == NULL) printError(STR_MOVEUSE); - if(argv[optind+1] == NULL) printError(STR_MOVEUSE); + if(argv[optind] == NULL) printError(description); + if(argv[optind+1] == NULL) printError(description); char *old_path = argv[optind]; checkForbiddenPaths(old_path); globalSplitPath(old_path); @@ -248,9 +248,11 @@ static void cmd_move(int argc, char *argv[]) free(old_path_subdir); free(old_path_gpg); } -static void cmd_generate(int argc, char *argv[]) +void cmd_generate(int argc, char *argv[]) { - int pass_length = STANDARD_AMOUNT_GENERATE_SYMBOLS, flag_force = 0, flag_copy = 0, result; + const char description[] = "Use: lpass generate [-l=pass-length] [-f] passname\n"; + int pass_length = STANDARD_AMOUNT_GENERATE_SYMBOLS; + int flag_force = 0, flag_copy = 0, result; const struct option long_options[] = { {"length", required_argument, NULL, 'l'}, {"force", no_argument, NULL, 'f'}, @@ -264,7 +266,7 @@ static void cmd_generate(int argc, char *argv[]) case 'l': { pass_length = atoi(optarg); break; } case 'f': { flag_force = 1; break; } case 'c': { flag_copy = 1; break; } - default: printError(STR_GENERATEUSE); + default: printError(description); } } @@ -275,7 +277,7 @@ static void cmd_generate(int argc, char *argv[]) #endif char *path_to_password; - if(argv[optind] == NULL) printError(STR_GENERATEUSE); + if(argv[optind] == NULL) printError(description); else path_to_password = argv[optind]; if(pass_length < MINLEN_PASSWORD || pass_length > MAXLEN_PASSWORD) @@ -300,8 +302,9 @@ static void cmd_generate(int argc, char *argv[]) printf("Password added successfully for %s\n", path_to_password); } -static void cmd_insert(int argc, char *argv[]) +void cmd_insert(int argc, char *argv[]) { + const char description[] = "Use: lpass insert [-ecf] passname\n"; int flag_echo = 0, flag_force = 0, flag_copy = 0, result; const struct option long_options[] = { {"echo", no_argument, NULL, 'e'}, @@ -315,7 +318,7 @@ static void cmd_insert(int argc, char *argv[]) case 'e': { flag_echo = 1; break; } case 'f': { flag_force = 1; break; } case 'c': { flag_copy = 1; break; } - default: printError(STR_INSERTUSE); + default: printError(description); } } @@ -326,7 +329,7 @@ static void cmd_insert(int argc, char *argv[]) #endif char *path_to_password; - if(argv[optind] == NULL) printError(STR_INSERTUSE); + if(argv[optind] == NULL) printError(description); else path_to_password = argv[optind]; checkForbiddenPaths(path_to_password); @@ -346,11 +349,12 @@ static void cmd_insert(int argc, char *argv[]) printf("Passwords do not match\n"); } -static void cmd_remove(int argc, char *argv[]) +void cmd_remove(int argc, char *argv[]) { + const char description[] = "Use: lpass rm passname\n"; char *path_to_password = argv[2]; if(path_to_password == NULL) - printError(STR_REMOVEUSE); + printError(description); checkForbiddenPaths(path_to_password); globalSplitPath(path_to_password); @@ -362,8 +366,9 @@ static void cmd_remove(int argc, char *argv[]) deleteEmptyDir(gPath_subdir); } -static void cmd_showtree(int argc, char *argv[]) +void cmd_showtree(int argc, char *argv[]) { + const char description[] = "Use: lpass [-c] [passname]\n"; int flag_copy = 0, result; char *path; const struct option long_options[] = { @@ -374,7 +379,7 @@ static void cmd_showtree(int argc, char *argv[]) while((result = getopt_long(argc, argv, "c", long_options, NULL)) != -1) { switch(result) { case 'c': { flag_copy = 1; break; } - default: printError(STR_SHOWTREEUSE); + default: printError(description); } } @@ -384,7 +389,7 @@ static void cmd_showtree(int argc, char *argv[]) #endif if(argv[optind] == NULL) { - if(flag_copy) printError(STR_SHOWTREEUSE); + if(flag_copy) printError(description); else { path = (char *) malloc(sizeof(char) * 2); strcpy(path, "."); @@ -427,50 +432,55 @@ static void cmd_showtree(int argc, char *argv[]) if(argv[1] == NULL) free(path); } -static void cmd_help() +void cmd_help(int argc, char *argv[]) { - printf("Synopsis:\n\tlpass [command] [arguments] ...\n"); - - printf("Commands:\n\tinit gpg-key\n"); - printf("\t\tInitialize the password manager using the passed gpg-key.\n"); - - printf("\tinsert [-e, --echo] [-c, --copy] [-f, --force] passname\n"); - printf("\t\tAdd the specified passname to the password manager.\n"); - - printf("\tedit [-t, --text-editor=text-editor] passname\n"); - printf("\t\tOpen the specified passname in a text editor, waiting for changes.\n"); - - printf("\tgenerate [-l, --length=pass-length] [-c, --copy] [-f, --force] passname\n"); - printf("\t\tGenerate a random password and write it in passname.\n"); - - printf("\tmv/move [-f, --force] old-path new-path\n"); - printf("\t\tMove/rename old-path to new-path.\n"); - - printf("\trm/remove/delete passname\n"); - printf("\t\tRemove the passname you specified from the password manager.\n"); - - printf("\thelp\n"); - printf("\t\tPrint help information about commands and the application itself.\n"); - - printf("\tversion\n"); - printf("\t\tPrint version information.\n"); + printf("Synopsis:\n" + "\tlpass [command] [arguments] ...\n" + + "Commands:\n" + "\tinit gpg-key\n" + "\t\tInitialize the password manager using the passed gpg-key.\n" + "\tinsert [-e, --echo] [-c, --copy] [-f, --force] passname\n" + "\t\tAdd the specified passname to the password manager.\n" + "\tedit [-t, --text-editor=text-editor] passname\n" + "\t\tOpen the specified passname in a text editor, waiting for changes.\n" + "\tgenerate [-l, --length=pass-length] [-c, --copy] [-f, --force] passname\n" + "\t\tGenerate a random password and write it in passname.\n" + "\tmv [-f, --force] old-path new-path\n" + "\t\tMove/rename old-path to new-path.\n" + "\trm passname\n" + "\t\tRemove the passname you specified from the password manager.\n" + "\thelp\n" + "\t\tPrint help information about commands and the application itself.\n" + "\tversion\n" + "\t\tPrint version information.\n" + + "\nMore information may be found in the lpass(1) man page.\n"); +} - printf("\nMore information may be found in the lpass(1) man page.\n"); +void cmd_version(int argc, char *argv[]) +{ + printf("LockPassword v%s\n" + "Release date: %s\n\n" + "Code was written by Joursoir\n" + "This is free and unencumbered software released into the public domain.\n\n", + VERSION, DATE_RELEASE); } -static void cmd_version() +struct cmd_struct *get_cmd(const char *name) { - printf("LockPassword v%s\n", VERSION); - printf("Release date: %s\n\n", DATE_RELEASE); - printf("Code was written by Joursoir\n"); - printf("This is free and unencumbered software released into the public domain.\n\n"); + struct cmd_struct *ptr; + for(ptr = commands; ptr->cmd; ptr++) { + if(strcmp(name, ptr->cmd) == 0) + return ptr; + } + return NULL; } int main(int argc, char *argv[]) { - if(!isatty(0)) { // stdin + if(!isatty(STDIN_FILENO)) printError("lpass: Please, use a terminal to run this application\n"); - } /* init global path to root directory */ int len_rootdir = strlen(getenv("HOME")) + strlen(LOCKPASS_DIR) + 1; // +1 for '\0' @@ -480,30 +490,19 @@ int main(int argc, char *argv[]) strcat(gPath_rootdir, LOCKPASS_DIR); /* end init */ - unsigned long ihash = WITHOUT_ARGUMENTS; - if(argv[1] != NULL) { - ihash = hash(argv[1]); - } + char *cmd = (argv[1] != NULL) ? argv[1] : ""; + struct cmd_struct *ptr; - if(chdir(gPath_rootdir) != 0 && ihash != HASH_INIT) { - printf("Before starting work, you must initialize LockPassword\n"); - printError(STR_INITUSE); - } + int dir = chdir(gPath_rootdir); - switch(ihash) - { - case HASH_INIT: { cmd_init(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_VERSION: { cmd_version(); break; } - default: { cmd_showtree(argc, argv); break; } + if((ptr = get_cmd(cmd))) + ptr->func(argc, argv); + else { + if(dir != 0) { + printf("Before starting work, you must initialize LockPassword\n"); + return 1; + } + cmd_showtree(argc, argv); } if(gPath_subdir != NULL) { |