aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--implementation.c32
-rw-r--r--main.c147
2 files changed, 103 insertions, 76 deletions
diff --git a/implementation.c b/implementation.c
index 0ef17c1..f695b01 100644
--- a/implementation.c
+++ b/implementation.c
@@ -12,17 +12,22 @@
// == global var ==
extern char *gPath_rootdir;
+extern char *gSecret_gpgkey;
char* getPassword(char *path, char *password, int maxlen)
{
- FILE *filePass;
- filePass = fopen(path, "r");
- if(filePass == NULL) {
- if(errno == ENOENT) { // file doesn't exist
- printError("lpass: No such file exists\n");
- }
- callError(110);
+ // gpg
+ int pid = fork();
+ if(pid == 1) callError(126);
+ if(pid == 0) {
+ execlp("gpg", "-d", "--quiet", "-r", gSecret_gpgkey, "-o", "gap", path, NULL);
+ perror("gpg");
+ exit(4);
}
+ wait(&pid);
+
+ FILE *filePass = fopen("gap", "r");
+ if(filePass == NULL) callError(127);
char sign[maxlen];
if(!fgets(sign, sizeof(sign), filePass)) {
@@ -31,6 +36,8 @@ char* getPassword(char *path, char *password, int maxlen)
strcpy(password, sign);
fclose(filePass);
+
+ remove("gap");
return password;
}
@@ -91,6 +98,17 @@ void insertPass(char *add_path, char *password)
fputs(password, filePass);
fclose(filePass);
+ // gpg
+ int pid = fork();
+ if(pid == 1) callError(225);
+ if(pid == 0) {
+ execlp("gpg", "-a", "-r", gSecret_gpgkey, "-e", file_path, NULL);
+ perror("gpg");
+ exit(4);
+ }
+ wait(&pid);
+ remove(file_path);
+
free(main_path);
free(file_path);
}
diff --git a/main.c b/main.c
index cd368df..cace9d0 100644
--- a/main.c
+++ b/main.c
@@ -5,6 +5,7 @@
#include <sys/wait.h>
#include <getopt.h>
#include <dirent.h>
+#include <errno.h>
#include "easydir.h"
#include "handerror.h"
@@ -32,6 +33,7 @@
// == global var ==
char *gPath_rootdir;
+char *gSecret_gpgkey;
static void cmd_init(int argc, char *argv[])
{
@@ -156,6 +158,36 @@ static void cmd_insert(int argc, char *argv[])
printf("Passwords do not match\n");
}
+static void cmd_remove(int argc, char *argv[])
+{
+ char *path_to_password = argv[2];
+
+ 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");
+
+ if(checkFileExist(path_with_gpg) == 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);
+ }
+
+ free(path_with_gpg);
+ free(main_path);
+ free(file_path);
+}
+
static void cmd_showtree(char *path)
{
if(opendir(path) != NULL) { // if it's directory
@@ -163,15 +195,33 @@ static void cmd_showtree(char *path)
pid = fork();
if(pid == -1) callError(101);
if(pid == 0) { /* new process */
- execlp("tree", "tree", "-C", "--noreport", path, NULL);
+ 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);
+
+ 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 password[MAXLEN_PASSWORD];
- getPassword(path, password, MAXLEN_PASSWORD);
+ getPassword(path_with_gpg, password, MAXLEN_PASSWORD);
+
+ free(path_with_gpg);
+
printf("%s\n", password);
}
}
@@ -205,6 +255,30 @@ int main(int argc, char *argv[])
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) ) {
printError("Before starting work, you must initialize LockPassword\nUse: lpass init [gpg key]\n");
}
@@ -235,7 +309,7 @@ int main(int argc, char *argv[])
}
case HASH_REMOVE:
case HASH_DELETE: {
- printf("borrr\n");
+ cmd_remove(argc, argv);
break;
}
case HASH_HELP: {
@@ -248,6 +322,7 @@ int main(int argc, char *argv[])
}
default:
{
+ // fix [./lpass ..]
int newlen_rootdir = len_rootdir - strlen(STORAGEPASS_DIR) - 1;
gPath_rootdir[newlen_rootdir-1] = '\0';
@@ -274,70 +349,4 @@ int main(int argc, char *argv[])
free(gPath_rootdir);
return EXIT_SUCCESS;
-
- /*char rootPath = "";
- int result = 0;
- if(result != -1)
- {
- switch(result) {
- case 'g': {
- char *passPath = argv[argc-1];
- char *lenPass = optarg;
-
- if(checkFileExist(passPath) == 1) {
- // ask user about change pass
- int buffSize = (strlen("Do you want generate new password and paste it in '' (Y/N)?") + strlen(passPath)) * sizeof(char) + sizeof(char);
- char *str = malloc(buffSize);
-
- snprintf(str, buffSize, "Do you want generate new password and paste it in '%s' (Y/N)?", passPath);
- if(getAnswer(str) != 1) {
- // free(str);
- return 0;
- }
- free(str);
- }
-
- int n_symbols = 0;
- if(strcmp(lenPass, passPath) == 0)
- n_symbols = STANDARD_AMOUNT_GENERATE_SYMBOLS;
- else n_symbols = atoi(lenPass);
-
-
- if(n_symbols < 1 || n_symbols > 127) {
- printError("lpass: you typed an incorrect number");
- }
-
- // generate password
- char gpass[MAXLEN_PASSWORD];
- generatePassword(gpass, n_symbols, MAXLEN_PASSWORD);
-
- insertPass(rootPath, passPath, gpass);
- printf("Generated password: %s\n", gpass);
- printf("Password added successfully for %s\n", passPath);
-
- break;
- }
- case 'R': {
- if(checkFileExist(optarg) == 0) {
- printError("lpass: No such file exists\n");
- }
-
- // check working
- char *main_path, *file_path;
- main_path = (char *) malloc( sizeof(char) * (strlen(optarg)+1) );
- file_path = (char *) malloc( sizeof(char) * (strlen(optarg)+1) );
-
- if(splitPath(optarg, main_path, file_path) == NULL) { // check correct input
- printError("lpass: The path you specified is incorrect\n");
- }
-
- if(deleteFile(optarg)) {
- deleteEmptyDir(main_path);
- }
-
- free(main_path);
- free(file_path);
- break;
- }
- }*/
} \ No newline at end of file