diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/easydir.c | 41 | ||||
| -rw-r--r-- | src/easydir.h | 8 | ||||
| -rw-r--r-- | src/implementation.c | 34 | ||||
| -rw-r--r-- | src/main.c | 347 | 
4 files changed, 205 insertions, 225 deletions
| diff --git a/src/easydir.c b/src/easydir.c index 162bae7..6de77bc 100644 --- a/src/easydir.c +++ b/src/easydir.c @@ -5,43 +5,16 @@  #include <sys/wait.h>  #include <errno.h> +#include "easydir.h"  #include "handerror.h" -int deleteFile(char *file_path) +int checkFileExist(char *source)  { -	char *arguments[] = {"rm", file_path, NULL}; -	easyFork("rm", arguments); - -	return 1; -} - -int deleteEmptyDir(char *dir_path) -{ -	#if defined(DEBUG) -		char *arguments[] = {"rmdir", "-p", dir_path, NULL}; -	#else -		char *arguments[] = {"rmdir", "-p", "--ignore-fail-on-non-empty", dir_path, NULL}; -	#endif -	easyFork("rmdir", arguments); - -	return 1; -} - -int checkFileExist(char *path_to_file) -{ -	FILE *pFile; - -	pFile = fopen(path_to_file, "r+"); // r+ so that errno can equal EISDIR -	if(pFile == NULL) { -		if(errno == ENOENT) // file doesn't exist -			return 0; -		if(errno == EISDIR) // it's directory -			return 2; -		else callError(120); -	} -	fclose(pFile); - -	return 1; +	FILE *file = fopen(source, "r+"); // r+ so that errno can equal EISDIR +	if(!file) +		return errno == EISDIR ? F_ISDIR : F_NOEXIST; +	fclose(file); +	return F_NOEXIST;  }  char *fileCropLineFeed(char *path, char *text, int maxlen) diff --git a/src/easydir.h b/src/easydir.h index 4680709..0ba5677 100644 --- a/src/easydir.h +++ b/src/easydir.h @@ -1,8 +1,12 @@  #ifndef EASYDIR_H  #define EASYDIR_H -int deleteFile(char *file_path); -int deleteEmptyDir(char *dir_path); +enum status_file { +	F_SUCCESS, +	F_NOEXIST, +	F_ISDIR +}; +  int checkFileExist(char *path_to_file);  char *fileCropLineFeed(char *path, char *text, int maxlen); diff --git a/src/implementation.c b/src/implementation.c index 9b93704..17b2c9a 100644 --- a/src/implementation.c +++ b/src/implementation.c @@ -14,15 +14,13 @@  // GPG_PUBLICKEY_MAXLENGTH NNNN  // == global var ==  -extern char *gPath_rootdir; // /home/[username]/.lockpassword/  extern char *gPath_subdir; // example: programming/github.com  extern char *gPath_pass; // example: programming/github.com/joursoir.gpg  static void copyText(char *password)  { -	size_t size = (strlen(gPath_rootdir) + 5 + 1) * sizeof(char); -	char *simple_path = malloc(size); -	snprintf(simple_path, size, "%s%s", gPath_rootdir, ".pass"); +	char *simple_path = malloc(sizeof(char) * (5 + 1)); +	strcpy(simple_path, ".pass");  	if(getenv("DISPLAY") != NULL)  	{ @@ -67,7 +65,7 @@ char *getGPGKey(char *dest, size_t size)  {  	FILE *fileGPG = fopen(".gpg-key", "r");  	if(fileGPG == NULL) { -		if(errno == ENOENT) printError("error: No GPG key exists\n"); +		if(errno == ENOENT) printError("error: No GPG key exists. Use \"lpass init\".");  		callError(121);  	} @@ -107,19 +105,16 @@ void nonvisibleEnter(int status)  {  	struct termios term_settings;  	tcgetattr(0, &term_settings); // get current settings -	if(status == 1) { +	if(status == 1)  		term_settings.c_lflag &= ~ECHO; // flag reset -	} -	else { +	else  		term_settings.c_lflag |= ECHO; -	}  	tcsetattr(0, TCSANOW, &term_settings);  }  void insertPass(char *add_path, char *password, int flag_copy)  { -	/* gPath_rootdir = /home/[username]/.lock-password/ -	add_path = banks/france/[number] +	/* add_path = banks/france/[number]  	gPath_pass = banks/france/[number].gpg  	gPath_subdir = banks/france */ @@ -177,10 +172,10 @@ 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 *pass_one = (char *) malloc(sizeof(char) * maxlen); +	char *pass_one = malloc(sizeof(char) * maxlen);  	int rvalue = 0;  	if(!flag_echo) { -		char *pass_two = (char *) malloc(sizeof(char) * maxlen); +		char *pass_two = malloc(sizeof(char) * maxlen);  		nonvisibleEnter(1); // change terminal work  		typePass("Type your password: ", pass_one, minlen, maxlen); @@ -227,26 +222,21 @@ static void clearStdinBuff()  int getOverwriteAnswer(char *path)  { -	int buffSize = (strlen("Password for '' exists. Overwrite? (Y/N)") + strlen(path) + 1)* sizeof(char); -	char *text = malloc(buffSize); -	snprintf(text, buffSize, "Password for '%s' exists. Overwrite? (Y/N)", path); -	printf("%s ", text); -  	int answer; +	printf("Password for \"%s\" exists. Overwrite? (Y/N)\n", path);  	while((answer = fgetc(stdin)))  	{  		clearStdinBuff();  		switch(answer)  		{  			case 'Y': -			case 'y': { free(text); return 1; } +			case 'y': return 1;  			case 'N': -			case 'n': { free(text); return 0; } +			case 'n': return 0;  			case EOF: printError("Error: Unexpected end of file\n"); -			default: { printf("%s ", text); break; } +			default: { printf("Overwrite? (Y/N) "); break; }  		}  	} -	free(text);  	return -1;  } @@ -13,6 +13,8 @@  #include <dirent.h>  #include <libgen.h>  #include <stdarg.h> +#include <errno.h> +#include <sys/stat.h>  #include "easydir.h"  #include "handerror.h" @@ -26,8 +28,8 @@  #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 LOCKPASS_DIR ".lock-password/" +#define GPGKEY_FILE ".gpg-key"  #define TREE_OUTPUT_FILE ".tree"  #define TEXTEDITOR_FILE ".text-editor" @@ -66,7 +68,6 @@ static struct cmd_struct commands[] = {  };  // == global var ==  -char *gPath_rootdir = NULL; // /home/[username]/.lockpassword/  char *gPath_subdir = NULL; // example: programming/github.com  char *gPath_pass = NULL; // example: programming/github.com/joursoir.gpg @@ -92,26 +93,14 @@ int cmd_init(int argc, char *argv[])  	char *gpg_key = argv[2];  	if(gpg_key == NULL) usageprint("%s", description); -	// 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); -	} +	FILE *filekey = fopen(GPGKEY_FILE, "w");	 +	if(!filekey) +		errprint("fopen() failed"); +  	fputs(gpg_key, filekey);  	fclose(filekey); -	free(path_init_storage);  	printf("LockPassword initialized for %s\n", gpg_key);  	return 0;  } @@ -120,52 +109,57 @@ int cmd_edit(int argc, char *argv[])  {  	const char description[] = "edit [-t=text-editor] passname\n";  	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 +		{"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); +				if(!f_texteditor) +					errprint("fopen() failed");  				fputs(optarg, f_texteditor);  				fclose(f_texteditor);  				printf("You changed text editor to %s\n", optarg); -    			break; -    		} -    		default: usageprint("%s", description); -    	} -    } - -    if(optind < argc) optind++; // for skip "edit" -    dbgprint("passname: %s\n", argv[optind]); -     -    char *path_to_password; -    if(argv[optind] == NULL) usageprint("%s", description); -    else path_to_password = argv[optind]; +				break; +			} +			default: usageprint("%s", description); +		} +	} + +	if(optind < argc) optind++; // for skip "edit" +	dbgprint("passname: %s\n", argv[optind]); + +	if(argv[optind] == NULL) +		usageprint("%s", description); +	char *path_to_password = argv[optind];  	checkForbiddenPaths(path_to_password);  	globalSplitPath(path_to_password); -	if(checkFileExist(gPath_pass) != 1) +	result = checkFileExist(gPath_pass); +	if(result != F_SUCCESS) { +		if(result == F_ISDIR) errprint("It is a directory\n");  		errprint("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); +		if(f_texteditor == NULL) +			errprint("fopen() failed");  		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); +			errprint("fgets() failed");  	}  	fclose(f_texteditor); @@ -207,40 +201,46 @@ int cmd_move(int argc, char *argv[])  	/* we have a two situation:  	1) mv file file  	2) mv file directory */ - +	  	const char description[] = "mv [-f] old-path new-path\n";  	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: usageprint("%s", description); -    	} -    } - -    if(optind < argc) optind++; // for skip "move" -    if(!argv[optind] || !argv[optind+1]) -    	usageprint("%s", description); -    dbgprint("old-path: %s\n", argv[optind]); -    dbgprint("new-path: %s\n", argv[optind+1]); +		{"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: usageprint("%s", description); +		} +	} + +	if(optind < argc) optind++; // for skip "move" +	if(!argv[optind] || !argv[optind+1]) +		usageprint("%s", description); +	dbgprint("old-path: %s\n", argv[optind]); +	dbgprint("new-path: %s\n", argv[optind+1]);  	char *old_path = argv[optind]; -	checkForbiddenPaths(old_path); globalSplitPath(old_path); -	if(checkFileExist(gPath_pass) != 1) errprint("No such old-path exists\n"); +	checkForbiddenPaths(old_path); +	globalSplitPath(old_path); +	result = checkFileExist(gPath_pass); +	if(result != F_SUCCESS) { +		if(result == F_ISDIR) errprint("It is a directory\n"); +		errprint("No such file 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); +	checkForbiddenPaths(new_path); +	globalSplitPath(new_path); -	if(checkFileExist(new_path) == 2) // if new-path = dir +	if(checkFileExist(new_path) == F_ISDIR)  		; -	else if(checkFileExist(gPath_pass) == 1) { // if new-path = file +	else if(checkFileExist(gPath_pass) == F_SUCCESS) {  		if(!flag_force) {  			if(getOverwriteAnswer(new_path) != 1)  				return 1; @@ -252,8 +252,9 @@ int cmd_move(int argc, char *argv[])  	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); +	rmdir(old_path_subdir); +	free(old_path_subdir); +	free(old_path_gpg);  	return 0;  } @@ -263,36 +264,36 @@ int cmd_generate(int argc, char *argv[])  	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'}, -        {"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: usageprint("%s", description); -    	} -    } - -    if(optind < argc) optind++; // for skip "generate" -    dbgprint("passname: %s\n", argv[optind]); -     -    char *path_to_password; -    if(argv[optind] == NULL) usageprint("%s", description); -    else path_to_password = argv[optind]; - -    if(pass_length < MINLEN_PASSWORD || pass_length > MAXLEN_PASSWORD) +		{"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: usageprint("%s", description); +		} +	} + +	if(optind < argc) optind++; // for skip "generate" +	dbgprint("passname: %s\n", argv[optind]); + +	if(argv[optind] == NULL) +		usageprint("%s", description); +	char *path_to_password = argv[optind]; + +	if(pass_length < MINLEN_PASSWORD || pass_length > MAXLEN_PASSWORD)  		errprint("You typed an incorrect number\n");  	checkForbiddenPaths(path_to_password);  	globalSplitPath(path_to_password); -	if(checkFileExist(gPath_pass) == 1) { +	if(checkFileExist(gPath_pass) == F_SUCCESS) {  		if(!flag_force) {  			if(getOverwriteAnswer(path_to_password) != 1)  				return 1; @@ -314,39 +315,40 @@ int cmd_insert(int argc, char *argv[])  	const char description[] = "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'}, -        {"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: usageprint("%s", description); -    	} -    } - -    if(optind < argc) optind++; // for skip "insert" -    dbgprint("passname: %s\n", argv[optind]); -     -    char *path_to_password; -    if(argv[optind] == NULL) usageprint("%s", description); -    else path_to_password = argv[optind]; +		{"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: usageprint("%s", description); +		} +	} + +	if(optind < argc) optind++; // for skip "insert" +	dbgprint("passname: %s\n", argv[optind]); + +	if(argv[optind] == NULL) +		usageprint("%s", description); +	char *path_to_password = argv[optind];  	checkForbiddenPaths(path_to_password);  	globalSplitPath(path_to_password); -	if(checkFileExist(gPath_pass) == 1) { +	if(checkFileExist(gPath_pass) == F_SUCCESS) {  		if(!flag_force) {  			if(getOverwriteAnswer(path_to_password) != 1)  				return 1;  		}  	} -	if(userEnterPassword(MINLEN_PASSWORD, MAXLEN_PASSWORD, path_to_password, flag_echo, flag_copy) == 1) { +	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 @@ -357,18 +359,22 @@ int cmd_insert(int argc, char *argv[])  int cmd_remove(int argc, char *argv[])  {  	const char description[] = "rm passname\n"; -	char *path_to_password = argv[2]; -	if(path_to_password == NULL) +	int res; +	char *path = argv[2]; +	if(!path)  		usageprint("%s", description); -	checkForbiddenPaths(path_to_password); -	globalSplitPath(path_to_password); +	checkForbiddenPaths(path); +	globalSplitPath(path); -	if(checkFileExist(gPath_pass) != 1) +	res = checkFileExist(gPath_pass); +	if(res != F_SUCCESS) { +		if(res == F_ISDIR) errprint("It is a directory\n");  		errprint("No such file exists\n"); +	} -	if(deleteFile(gPath_pass)) -		deleteEmptyDir(gPath_subdir); +	if(unlink(gPath_pass) == 0) +		rmdir(gPath_subdir);  	return 0;  } @@ -378,27 +384,26 @@ int 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: usageprint("%s", description); -    	} -    } - -    if(!argv[optind]) { -    	if(flag_copy) -    		usageprint("%s", description); -    	else { -    		path = (char *) malloc(sizeof(char) * 2); -    		strcpy(path, "."); -    	} -    } -    else path = argv[optind]; -    checkForbiddenPaths(path); +		{"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: usageprint("%s", description); +		} +	} + +	if(argv[optind]) { +		path = malloc(sizeof(char) * (strlen(argv[optind]) + 1)); +		strcpy(path, argv[optind]); +		checkForbiddenPaths(path); +	} +	else { +		path = malloc(sizeof(char) * 2); +		strcpy(path, "."); +	}  	if(opendir(path)) // if it's directory  	{ @@ -415,7 +420,7 @@ int cmd_showtree(int argc, char *argv[])  		else printf("Password Manager/%s\n", path);  		char *arg3[] = {"tail", "-n", "+2", TREE_OUTPUT_FILE, NULL}; -		easyFork("tail", arg3); // remove working directory +		easyFork("tail", arg3); // remove working directory from output  		remove(TREE_OUTPUT_FILE);  	} @@ -423,7 +428,7 @@ int cmd_showtree(int argc, char *argv[])  	{  		globalSplitPath(path); -		if(checkFileExist(gPath_pass) == 1) // exist +		if(checkFileExist(gPath_pass) == F_SUCCESS)  		{  			char password[MAXLEN_PASSWORD];  			getPassword(path, password, sizeof(char)*MAXLEN_PASSWORD, flag_copy); @@ -432,7 +437,7 @@ int cmd_showtree(int argc, char *argv[])  		else errprint("%s is not in the password storage\n", path);  	} -	if(argv[1] == NULL) free(path); +	free(path);  	return 0;  } @@ -483,40 +488,48 @@ static struct cmd_struct *get_cmd(const char *name)  	return NULL;  } +static int gotoMainDir() +{ +	char *env_home = getenv("HOME"); +	int len_rootdir = strlen(env_home) + 1 + strlen(LOCKPASS_DIR) + 1; +	char *rootdir = malloc(sizeof(char) * len_rootdir); +	sprintf(rootdir, "%s/%s", env_home, LOCKPASS_DIR); + +	if(chdir(rootdir)) // failed +	{ +		// create main directory: +		if(mkdir(rootdir, S_IRWXU)) { +			if(errno != EEXIST) +				errprint("mkdir() failed\n"); +		} + +		// try again: +		return chdir(rootdir); +	} + +	return 0; +} +  int main(int argc, char *argv[])  {  	if(!isatty(STDIN_FILENO))  		errprint("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' - -	gPath_rootdir = (char *) malloc(sizeof(char) * len_rootdir); -	strcpy(gPath_rootdir, getenv("HOME")); -	strcat(gPath_rootdir, LOCKPASS_DIR); -	/* end init */ +	if(gotoMainDir()) +		errprint("chdir() failed\n"); +	int ret = 0;  	char *cmd = (argv[1] != NULL) ? argv[1] : "";  	struct cmd_struct *ptr; - -	int dir = chdir(gPath_rootdir); - -	int ret = 0;  	if((ptr = get_cmd(cmd)))  		ret = ptr->func(argc, argv); -	else { -		if(dir != 0) { -			errprint("Before starting work, you must initialize LockPassword\n"); -			return 1; -		} +	else  		ret = cmd_showtree(argc, argv); -	}  	if(gPath_subdir != NULL) {  		free(gPath_subdir);  		free(gPath_pass);  	} -	free(gPath_rootdir);  	return ret;  }
\ No newline at end of file | 
