diff --git a/README.md b/README.md index efebab6..6f8f48c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,27 @@ シンプルなパスワードマネージャー ## インストールする方法 +### CRUX +```sh +doas prt-get depinst gpgme gnupg pinentry +``` + +### Artix +```sh +doas pacman -S base-devel gpgme gnupg pinentry +``` + +### OpenBSD +```sh +doas pkg_add gmake gpgme gnupg pinentry +``` + +### FreeBSD +```sh +doas pkg install gmake gpgme gnupg pinentry +``` + +### 全部 ```sh mkdir -p ~/.local/share/sp gpg --generate-key diff --git a/delpass.c b/delpass.c index 406bbbc..73e5509 100644 --- a/delpass.c +++ b/delpass.c @@ -4,23 +4,39 @@ #include "delpass.h" -void delpass(char* file) { +int delpass(char* file) { // パスを準備 char pwfile[512]; char* homedir = getenv("HOME"); if (homedir == NULL) { perror("ホームディレクトリを受取に失敗。"); - return; + return -1; } char* basedir = "/.local/share/sp/"; char* ext = ".gpg"; - snprintf(pwfile, sizeof(pwfile), "%s%s%s%s", homedir, basedir, file, ext); + int needed = snprintf(pwfile, sizeof(pwfile), "%s%s%s%s", homedir, basedir, file, ext); + if (needed >= (int)sizeof(pwfile)) { + fprintf(stderr, "エラー:パスが長すぎる。\n"); + return -1; + } + + // 削除を確認する + printf("パスワード「%s」を本当に削除する事が宜しいでしょうか? (y/N): ", file); + int confirm = getchar(); + if (confirm != 'y' && confirm != 'Y') { + printf("削除しませんでした。\n"); + return -1; + } + + int ch; + while ((ch = getchar()) != '\n' && ch != EOF); if (unlink(pwfile) == -1) { perror("パスワードを削除出来ませんですた。"); + return -1; } printf("パスワードを削除しました。\n"); - return; + return -1; } diff --git a/delpass.h b/delpass.h index db43a4e..58f4afc 100644 --- a/delpass.h +++ b/delpass.h @@ -1,6 +1,6 @@ #ifndef DELPASS_H #define DELPASS_H -void delpass(char* file); +int delpass(char* file); #endif diff --git a/main.c b/main.c index 2a24e43..e0d80f5 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -22,7 +23,7 @@ void helpme() { //printf("%s -i :GPGと使ってパスワードストレージを初期設定\n", sofname); printf("%s -s <パスワード名> :パスワードを表示\n", sofname); printf("%s -y <パスワード名> :パスワードを表示せずクリップボードにコピーする\n", sofname); - //printf("%s -l :パスワード一覧を表示\n", sofname); + printf("%s -l :パスワード一覧を表示\n", sofname); printf("%s -a <パスワード名> :パスワードを追加\n", sofname); printf("%s -d <パスワード名> :パスワードを削除\n", sofname); //printf("%s -g <文字数> [risk|secure] <パスワード名> :希望文字数でパスワードをランダムに作成する。risk=英数字のみ(不安)、secure=英数字+特別文字(デフォルト)を使用\n", sofname); @@ -40,7 +41,19 @@ int main (int argc, char* argv[]) { if (argc == 3 && strcmp(argv[1], "-i") == 0) printf("TODO: 初期設定\n"); else if (argc == 3 && strcmp(argv[1], "-s") == 0) showpass(argv[2]); else if (argc == 3 && strcmp(argv[1], "-y") == 0) yankpass(argv[2]); - else if (argc == 2 && strcmp(argv[1], "-l") == 0) printf("TODO: 一覧\n"); + else if (argc == 2 && strcmp(argv[1], "-l") == 0) { + char basePath[512]; + char* homedir = getenv("HOME"); + if (homedir == NULL) { + perror("ホームディレクトリを受取に失敗。"); + return -1; + } + + char* basedir = "/.local/share/sp/"; + snprintf(basePath, sizeof(basePath), "%s%s", homedir, basedir); + + listpass(basePath, 0); + } else if (argc == 3 && strcmp(argv[1], "-a") == 0) addpass(argv[2]); else if (argc == 3 && strcmp(argv[1], "-d") == 0) delpass(argv[2]); else if ((argc == 4 || argc == 5) && strcmp(argv[1], "-g") == 0) printf("TODO: パスワードを創作\n");