From ecafc09bfdf2da164f710df5c0c50298f4fce873 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Mon, 23 Sep 2024 16:56:42 +0900 Subject: [PATCH] =?utf8?q?=E3=83=91=E3=82=B9=E3=83=AF=E3=83=BC=E3=83=89?= =?utf8?q?=E3=81=AE=E7=B7=A8=E9=9B=86=E3=81=99=E3=82=8B=E5=89=8D=E3=81=AB?= =?utf8?q?=E3=80=81=E3=83=90=E3=83=83=E3=82=AF=E3=82=A2=E3=83=83=E3=83=97?= =?utf8?q?=E3=82=92=E4=BD=9C=E6=88=90=E3=81=99=E3=82=8B=E6=A7=98=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + main.c | 32 ++++++++++++++++++++++++++++++-- src/addpass.c | 38 ++++++++++++++++++++------------------ src/addpass.h | 2 +- src/common.c | 28 ++++++++++++++++++++++++++++ src/common.h | 1 + 6 files changed, 81 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcbce91..bcc465c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * 静的リンクはデフォルトに * simpas情報の表示 * ベースディレクトリを関数化 +* パスワードの編集する前に、バックアップを作成する様に # 1.3.0 * 英訳の追加 (レミリア・スカーレットさん) diff --git a/main.c b/main.c index 241571b..1c568ee 100644 --- a/main.c +++ b/main.c @@ -9,6 +9,8 @@ #include "src/otppass.h" #include "src/findpass.h" +#include + const char *sofname = "sp"; const char *version = "1.4.0"; const char *avalopt = "adefgilosvy"; @@ -45,6 +47,33 @@ char *getfullpath(char *arg) { return fullPath; } +void editpass(char *file) { + char *lang = getlang(); + +#if defined(__HAIKU__) + const char *tmpfile = "/boot/system/cache/sp-tmp.gpg"; +#else + const char *tmpfile = "/tmp/sp-tmp.gpg"; +#endif + tmpcopy(file, tmpfile); + if (delpass(file, 1) != 0) { + if (strncmp(lang, "en", 2) == 0) + perror("Editing failed: Failed to delete."); + else perror("編集に失敗:削除に失敗"); + return; + } + if (addpass(file) != 0) { + tmpcopy(tmpfile, file); + unlink(tmpfile); + if (strncmp(lang, "en", 2) == 0) + perror("Editing failed: Failed to add."); + else perror("編集に失敗:追加に失敗"); + return; + } + + unlink(tmpfile); +} + int main(int argc, char *argv[]) { if (argc < 2) { usage(); @@ -78,8 +107,7 @@ int main(int argc, char *argv[]) { else if (strcmp(argv[1], "-a") == 0) addpass(argv[2]); else if (strcmp(argv[1], "-d") == 0) delpass(argv[2], 0); else if (strcmp(argv[1], "-e") == 0) { - delpass(argv[2], 1); - addpass(argv[2]); + editpass(argv[2]); } else if (strcmp(argv[1], "-o") == 0) { char *fullPath = getfullpath(argv[2]); if (fullPath == NULL) return -1; diff --git a/src/addpass.c b/src/addpass.c index 27d1865..4998275 100644 --- a/src/addpass.c +++ b/src/addpass.c @@ -36,7 +36,7 @@ void getpasswd(char *prompt, char *pw, size_t pwlen) { tcsetattr(fileno(stdin), TCSANOW, &old); } -void addpass(char *file) { +int addpass(char *file) { char *lang = getlang(); // パスを準備 @@ -52,7 +52,7 @@ void addpass(char *file) { const char *ero = (strncmp(lang, "en", 2) == 0 ? "Failed to allocate memory" : "メモリを割当に失敗"); fprintf(stderr, "%s\n", ero); - return; + return -1; } // ファイルが既に存在するかどうか確認 @@ -73,7 +73,7 @@ void addpass(char *file) { file ); free(gpgpathchk); - return; + return -1; } free(gpgpathchk); @@ -93,7 +93,7 @@ void addpass(char *file) { "Password does not match. Terminating..." : "パスワードが一致していません。終了…"); fprintf(stderr, "%s\n", ero); - return; + return -1; } // パスワードを保存する @@ -114,7 +114,7 @@ void addpass(char *file) { const char *ero = (strncmp(lang, "en", 2) == 0 ? "Failed to generate GPGME" : "GPGMEを創作に失敗"); fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err)); - return; + return -1; } // GPGMEは非対話的モードに設定 @@ -124,7 +124,7 @@ void addpass(char *file) { "Failed to set pinentry mode" : "pinentryモードを設定に失敗"); fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err)); gpgme_release(ctx); - return; + return -1; } // パスワードからデータオブジェクトを創作 @@ -134,7 +134,7 @@ void addpass(char *file) { "Failed to make data object" : "データオブジェクトを創作に失敗"); fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err)); gpgme_release(ctx); - return; + return -1; } gpgme_data_new(&out); @@ -150,7 +150,7 @@ void addpass(char *file) { const char *ero = (strncmp(lang, "en", 2) == 0 ? "Failed to open .gpg-id file" : ".gpg-idファイルを開くに失敗"); fprintf(stderr, "%s\n", ero); - return; + return -1; } char *keyid = malloc(256); @@ -160,7 +160,7 @@ void addpass(char *file) { fprintf(stderr, "%s\n", ero); fclose(keyfile); free(keyid); - return; + return -1; } keyid[strcspn(keyid, "\n")] = 0; @@ -172,7 +172,7 @@ void addpass(char *file) { "Failed to get key" : "鍵Dを受取に失敗"); fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err)); free(keyid); - return; + return -1; } if (key[0] == NULL) { @@ -180,7 +180,7 @@ void addpass(char *file) { "Error: Key is NULL" : "エラー:鍵はNULLです"); fprintf(stderr, "%s\n", ero); free(keyid); - return; + return -1; } free(keyid); @@ -192,7 +192,7 @@ void addpass(char *file) { "Failed to encrypt" : "暗号化に失敗"); fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err)); cleanup(ctx, key[0], in, out); - return; + return -1; } // 暗号化したファイルを開く @@ -202,7 +202,7 @@ void addpass(char *file) { "Failed to allocate memory" : "メモリを割当に失敗"); fprintf(stderr, "%s\n", ero); cleanup(ctx, key[0], in, out); - return; + return -1; } // ディレクトリを創作 @@ -220,7 +220,7 @@ void addpass(char *file) { fprintf(stderr, "%s\n", ero); free(gpgpath); cleanup(ctx, key[0], in, out); - return; + return -1; } } @@ -233,7 +233,7 @@ void addpass(char *file) { fprintf(stderr, "%s\n", ero); free(gpgpath); cleanup(ctx, key[0], in, out); - return; + return -1; } gpgfile = fopen(gpgpath, "wb"); @@ -243,7 +243,7 @@ void addpass(char *file) { fprintf(stderr, "%s\n", ero); free(gpgpath); cleanup(ctx, key[0], in, out); - return; + return -1; } // データが保存したかどうか確認 @@ -255,7 +255,7 @@ void addpass(char *file) { fclose(gpgfile); free(gpgpath); cleanup(ctx, key[0], in, out); - return; + return -1; } // 復号化したパスワードを表示する @@ -271,7 +271,7 @@ void addpass(char *file) { fprintf(stderr, "%s\n", ero); free(gpgpath); cleanup(ctx, key[0], in, out); - return; + return -1; } } @@ -283,4 +283,6 @@ void addpass(char *file) { const char *msg = (strncmp(lang, "en", 2) == 0 ? "The password got saved." : "パスワードを保存出来ました。"); printf("%s\n", msg); + + return 0; } diff --git a/src/addpass.h b/src/addpass.h index 23918ad..5bf0b57 100644 --- a/src/addpass.h +++ b/src/addpass.h @@ -8,6 +8,6 @@ #include "common.h" -void addpass(char *file); +int addpass(char *file); #endif diff --git a/src/common.c b/src/common.c index 59f26f2..928e4f7 100644 --- a/src/common.c +++ b/src/common.c @@ -1,4 +1,5 @@ #include "common.h" +#include #include char *getbasedir(int trailing) { @@ -75,6 +76,33 @@ int mkdir_r(const char *path, mode_t mode) { return 0; } +int tmpcopy(const char *inpath, const char *outpath) { + FILE *src = fopen(inpath, "rb"); + if (!src) { + return -1; + } + + FILE *dst = fopen(outpath, "wb"); + if (!dst) { + fclose(src); + return -1; + } + + size_t n, m; + unsigned char buf[8192]; + do { + n = fread(buf, 1, sizeof buf, src); + if (n) m = fwrite(buf, 1, n, dst); + else m = 0; + } while ((n > 0) && (n == m)); + if (m) return -1; + + fclose(src); + fclose(dst); + + return 0; +} + void initList(List *list) { list->head = NULL; list->tail = NULL; diff --git a/src/common.h b/src/common.h index a8a8b8e..4b86504 100644 --- a/src/common.h +++ b/src/common.h @@ -24,6 +24,7 @@ typedef struct { char *getbasedir(int trailing); char *getlang(); int mkdir_r(const char *path, mode_t mode); +int tmpcopy(const char *inpath, const char *outpath); // C言語のvector void initList(List *list); -- 2.43.0