diff options
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  | 
