diff options
author | Joursoir <chat@joursoir.net> | 2020-10-31 17:45:29 +0000 |
---|---|---|
committer | Joursoir <chat@joursoir.net> | 2020-10-31 17:45:29 +0000 |
commit | 64ef51a8ce6bc148ba493e350e2cac4cba470201 (patch) | |
tree | 4418c4133b16341975cfe4d29df8da6ce27abcff /main.c | |
parent | 38a3be4a3eeacec75a534fef6951b9484b4d7098 (diff) | |
download | lock-password-64ef51a8ce6bc148ba493e350e2cac4cba470201.tar.gz lock-password-64ef51a8ce6bc148ba493e350e2cac4cba470201.tar.bz2 lock-password-64ef51a8ce6bc148ba493e350e2cac4cba470201.zip |
some features:
remake README.md for new code architecture;
add help command;
add man page;
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 491 |
1 files changed, 0 insertions, 491 deletions
@@ -1,491 +0,0 @@ -/* -** 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> -#include <string.h> -#include <sys/wait.h> -#include <getopt.h> -#include <dirent.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 STANDARD_TEXTEDITOR "vim" -#define MAXLEN_TEXTEDITOR 16 -#define MINLEN_PASSWORD 1 -#define MAXLEN_PASSWORD 128 -#define STANDARD_AMOUNT_GENERATE_SYMBOLS 14 -#define LOCKPASS_DIR "/.lock-password/" -#define GPGKEY_FILE "/.gpg-key" - -#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] [passname]\n" -#define STR_INITUSE "Use: lpass init gpg-key\n" -#define STR_INSERTUSE "Use: lpass insert [-ef] 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" - -// == global var == -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); - printf("pass: %s\n", gPath_pass); - #endif -} - -static void cmd_init(int argc, char *argv[]) -{ - char *gpg_key = argv[2]; - if(gpg_key == NULL) printError(STR_INITUSE); - - // 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); - - char *arguments[] = {"mkdir", "-vp", path_init_storage, NULL}; - easyFork("mkdir", arguments); - - strcat(path_init_storage, GPGKEY_FILE); - - // create .gpg-key in storage - FILE *filekey; - filekey = fopen(path_init_storage, "w"); - if(filekey == NULL) { - callError(122); - } - fputs(gpg_key, filekey); - fclose(filekey); - - free(path_init_storage); - printf("LockPassword initialized for %s\n", gpg_key); -} - -static void cmd_edit(int argc, char *argv[]) -{ - const struct option long_options[] = { - {"text-editor", required_argument, NULL, 't'}, - {NULL, 0, NULL, 0} - }; - - int result; - while((result = getopt_long(argc, argv, "t:", long_options, NULL)) != -1) { - switch(result) { - case 't': - { - // create file, copy name text editor there - FILE *f_texteditor = fopen(TEXTEDITOR_FILE, "w"); - if(f_texteditor == NULL) callError(108); - fputs(optarg, f_texteditor); - fclose(f_texteditor); - printf("You changed text editor to %s\n", optarg); - break; - } - default: printError(STR_EDITUSE); - } - } - - if(optind < argc) optind++; // for skip "edit" - #if defined(DEBUG) - for(int i=0; i < argc; i++) printf("arg: %s\n", argv[i]); - printf("passname: %s\n", argv[optind]); - #endif - - char *path_to_password; - if(argv[optind] == NULL) printError(STR_EDITUSE); - else path_to_password = argv[optind]; - - checkForbiddenPaths(path_to_password); - globalSplitPath(path_to_password); - - if(checkFileExist(gPath_pass) != 1) - printError("Error: No such file exists\n"); - - // configure text editor file - char text_editor[MAXLEN_TEXTEDITOR]; - FILE *f_texteditor = fopen(TEXTEDITOR_FILE, "r"); - if(f_texteditor == NULL) { - f_texteditor = fopen(TEXTEDITOR_FILE, "w"); - if(f_texteditor == NULL) callError(108); - fputs(STANDARD_TEXTEDITOR, f_texteditor); // in file - strcpy(text_editor, STANDARD_TEXTEDITOR); // in variable - } - else { - if(!fgets(text_editor, sizeof(char)*MAXLEN_TEXTEDITOR, f_texteditor)) - callError(122); - } - fclose(f_texteditor); - - #if defined(DEBUG) - printf("using text editor: %s\n", text_editor); - #endif - // end configure - - // decryption - int size_gpgkey = sizeof(char) * GPG_PUBLICKEY_MAXLENGTH; - char *secret_gpgkey = (char *) malloc(size_gpgkey); - getGPGKey(secret_gpgkey, size_gpgkey); - - char *decryp_arg[] = {"gpg", "-d", "--quiet", "-r", secret_gpgkey, "-o", path_to_password, gPath_pass, NULL}; - easyFork("gpg", decryp_arg); - - // start vim/etc for edit passowrd - char *texte_arg[] = {text_editor, path_to_password, NULL}; - easyFork(text_editor, texte_arg); - - // delete '\n' and paste good pass - char password[MAXLEN_PASSWORD]; - fileCropLineFeed(path_to_password, password, MAXLEN_PASSWORD); - - FILE *file = fopen(path_to_password, "w"); - if(file == NULL) callError(108); - fputs(password, file); - fclose(file); - - // encryption - char *encryp_arg[] = {"gpg", "--quiet", "--yes", "-r", secret_gpgkey, "-e", path_to_password, NULL}; - easyFork("gpg", encryp_arg); - - remove(path_to_password); - free(secret_gpgkey); -} - -static void cmd_move(int argc, char *argv[]) -{ - /* we have a two situation: - 1) mv file file - 2) mv file directory */ - - const struct option long_options[] = { - {"force", no_argument, NULL, 'f'}, - {NULL, 0, NULL, 0} - }; - - int result, flag_force = 0; - while((result = getopt_long(argc, argv, "f", long_options, NULL)) != -1) { - switch(result) { - case 'f': { flag_force = 1; break; } - default: printError(STR_MOVEUSE); - } - } - - if(optind < argc) optind++; // for skip "move" - #if defined(DEBUG) - for(int i=0; i < argc; i++) printf("arg: %s\n", argv[i]); - printf("old-path: %s\n", argv[optind]); - 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); - - char *old_path = argv[optind]; - checkForbiddenPaths(old_path); globalSplitPath(old_path); - if(checkFileExist(gPath_pass) != 1) printError("Error: No such old-path exists\n"); - - char *old_path_gpg = gPath_pass; - char *old_path_subdir = gPath_subdir; - - char *new_path = argv[optind+1]; - checkForbiddenPaths(new_path); globalSplitPath(new_path); - - if(checkFileExist(new_path) == 2) // if new-path = dir - ; - else if(checkFileExist(gPath_pass) == 1) { // if new-path = file - if(!flag_force) { - if(getOverwriteAnswer(new_path) != 1) - return; - } - new_path = gPath_pass; - } - else printError("Error: No such new-path exists\n"); - - char *arguments[] = {"mv", "-f", old_path_gpg, new_path, NULL}; - easyFork("mv", arguments); - - deleteEmptyDir(old_path_subdir); - free(old_path_subdir); free(old_path_gpg); -} - -static void cmd_generate(int argc, char *argv[]) -{ - int pass_length = STANDARD_AMOUNT_GENERATE_SYMBOLS, flag_force = 0, flag_copy = 0, result; - const struct option long_options[] = { - {"length", required_argument, NULL, 'l'}, - {"force", no_argument, NULL, 'f'}, - {"copy", no_argument, NULL, 'c'}, - {NULL, 0, NULL, 0} - }; - - while((result = getopt_long(argc, argv, "l:fc", long_options, NULL)) != -1) { - switch(result) { - // if optarg - incorrect number, atoi return 0 - case 'l': { pass_length = atoi(optarg); break; } - case 'f': { flag_force = 1; break; } - case 'c': { flag_copy = 1; break; } - default: printError(STR_GENERATEUSE); - } - } - - if(optind < argc) optind++; // for skip "generate" - #if defined(DEBUG) - for(int i=0; i < argc; i++) printf("arg: %s\n", argv[i]); - printf("passname: %s\n", argv[optind]); - #endif - - char *path_to_password; - if(argv[optind] == NULL) printError(STR_GENERATEUSE); - else path_to_password = argv[optind]; - - if(pass_length < MINLEN_PASSWORD || pass_length > MAXLEN_PASSWORD) - printError("Error: you typed an incorrect number\n"); - - checkForbiddenPaths(path_to_password); - globalSplitPath(path_to_password); - - if(checkFileExist(gPath_pass) == 1) { - if(!flag_force) { - if(getOverwriteAnswer(path_to_password) != 1) - return; - } - } - - // generate password - char gpass[MAXLEN_PASSWORD]; - generatePassword(gpass, pass_length, MAXLEN_PASSWORD); - - insertPass(path_to_password, gpass, flag_copy); - if(!flag_copy) printf("Generated password: %s\n", gpass); - printf("Password added successfully for %s\n", path_to_password); -} - -static void cmd_insert(int argc, char *argv[]) -{ - int flag_echo = 0, flag_force = 0, flag_copy = 0, result; - const struct option long_options[] = { - {"echo", no_argument, NULL, 'e'}, - {"force", no_argument, NULL, 'f'}, - {"copy", no_argument, NULL, 'c'}, - {NULL, 0, NULL, 0} - }; - - while((result = getopt_long(argc, argv, "efc", long_options, NULL)) != -1) { - switch(result) { - case 'e': { flag_echo = 1; break; } - case 'f': { flag_force = 1; break; } - case 'c': { flag_copy = 1; break; } - default: printError(STR_INSERTUSE); - } - } - - if(optind < argc) optind++; // for skip "insert" - #if defined(DEBUG) - for(int i=0; i < argc; i++) printf("arg: %s\n", argv[i]); - printf("passname: %s\n", argv[optind]); - #endif - - char *path_to_password; - if(argv[optind] == NULL) printError(STR_INSERTUSE); - else path_to_password = argv[optind]; - - checkForbiddenPaths(path_to_password); - globalSplitPath(path_to_password); - - if(checkFileExist(gPath_pass) == 1) { - if(!flag_force) { - if(getOverwriteAnswer(path_to_password) != 1) - return; - } - } - - if(userEnterPassword(MINLEN_PASSWORD, MAXLEN_PASSWORD, path_to_password, flag_echo, flag_copy) == 1) { - printf("Password added successfully for %s\n", path_to_password); - } - else - printf("Passwords do not match\n"); -} - -static void cmd_remove(int argc, char *argv[]) -{ - char *path_to_password = argv[2]; - if(path_to_password == NULL) - printError(STR_REMOVEUSE); - - checkForbiddenPaths(path_to_password); - globalSplitPath(path_to_password); - - if(checkFileExist(gPath_pass) != 1) - printError("Error: No such file exists\n"); - - if(deleteFile(gPath_pass)) - deleteEmptyDir(gPath_subdir); -} - -static void cmd_showtree(int argc, char *argv[]) -{ - int flag_copy = 0, result; - char *path; - const struct option long_options[] = { - {"copy", no_argument, NULL, 'c'}, - {NULL, 0, NULL, 0} - }; - - while((result = getopt_long(argc, argv, "c", long_options, NULL)) != -1) { - switch(result) { - case 'c': { flag_copy = 1; break; } - default: printError(STR_SHOWTREEUSE); - } - } - - #if defined(DEBUG) - for(int i=0; i < argc; i++) printf("arg: %s\n", argv[i]); - printf("passname: %s\n", argv[optind]); - #endif - - if(argv[optind] == NULL) { - if(flag_copy) printError(STR_SHOWTREEUSE); - else { - path = (char *) malloc(sizeof(char) * 2); - strcpy(path, "."); - } - } - else path = argv[optind]; - checkForbiddenPaths(path); - - if(opendir(path) != NULL) // if it's directory - { - if(flag_copy) printError("Error: you must type a passname, not a directory\n"); - - char *arg1[] = {"tree", "-C", "--noreport", path, "-o", TREE_OUTPUT_FILE, NULL}; - easyFork("tree", arg1); - - 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 - - if(strcmp(path, ".") == 0) printf("Password Manager\n"); - else printf("Password Manager/%s\n", path); - - char *arg3[] = {"tail", "-n", "+2", TREE_OUTPUT_FILE, NULL}; - easyFork("tail", arg3); // remove working directory - - remove(TREE_OUTPUT_FILE); - } - else - { - globalSplitPath(path); - - if(checkFileExist(gPath_pass) == 1) // exist - { - char password[MAXLEN_PASSWORD]; - getPassword(path, password, sizeof(char)*MAXLEN_PASSWORD, flag_copy); - if(!flag_copy) printf("%s\n", password); - } - else printf("Error: %s is not in the password storage\n", path); - } - - if(argv[1] == NULL) free(path); -} - -static void cmd_help() -{ - -} - -static void 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"); -} - -int main(int argc, char *argv[]) -{ - if(!isatty(0)) { // stdin - printError("lpass: Please, use a terminal to run this program\n"); - } - - /* init global path to root directory */ - 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); - /* end init */ - - unsigned long ihash = WITHOUT_ARGUMENTS; - if(argv[1] != NULL) { - ihash = hash(argv[1]); - } - - if(chdir(gPath_rootdir) != 0 && ihash != HASH_INIT) { - printf("Before starting work, you must initialize LockPassword\n"); - printError(STR_INITUSE); - } - - 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(gPath_subdir != NULL) { - free(gPath_subdir); - free(gPath_pass); - } - free(gPath_rootdir); - return EXIT_SUCCESS; -}
\ No newline at end of file |