]> Nishi Git Mirror - sp.git/commitdiff
パスワードの編集する前に、バックアップを作成する様に
author諏訪子 <suwako@076.moe>
Mon, 23 Sep 2024 07:56:42 +0000 (16:56 +0900)
committer諏訪子 <suwako@076.moe>
Mon, 23 Sep 2024 07:56:42 +0000 (16:56 +0900)
CHANGELOG.md
main.c
src/addpass.c
src/addpass.h
src/common.c
src/common.h

index bcbce916ede2db4e2b639931c96f1d334e5f854d..bcc465c85095570ff0282214d696b04074a0d843 100644 (file)
@@ -5,6 +5,7 @@
 * 静的リンクはデフォルトに
 * simpas情報の表示
 * ベースディレクトリを関数化
+* パスワードの編集する前に、バックアップを作成する様に
 
 # 1.3.0
 * 英訳の追加 (レミリア・スカーレットさん)
diff --git a/main.c b/main.c
index 241571b109f58de781012ae0bd2ac9e3a0f16981..1c568eed80cb2e4d1d71d54461ad0e8a727c5c7a 100644 (file)
--- a/main.c
+++ b/main.c
@@ -9,6 +9,8 @@
 #include "src/otppass.h"
 #include "src/findpass.h"
 
+#include <unistd.h>
+
 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;
index 27d18657c5e62489df1062570303a1aab87d4c8a..49982756faebcdb75373e0b2bfd75ec9eaaa7729 100644 (file)
@@ -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;
 }
index 23918ada7061ede50b21383ecb6c6602e357fd39..5bf0b576a1cdf1441b85fa1b529ce249ce4adc64 100644 (file)
@@ -8,6 +8,6 @@
 
 #include "common.h"
 
-void addpass(char *file);
+int addpass(char *file);
 
 #endif
index 59f26f242670dfffb853c63aad67b1882209f35c..928e4f7eb19f60b2f2deccb348ad3147caa01e0b 100644 (file)
@@ -1,4 +1,5 @@
 #include "common.h"
+#include <stdio.h>
 #include <string.h>
 
 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;
index a8a8b8e7a8ff8e4e32d181fcce6b52c8c3c9a15e..4b8650482f07df5184591733f2f532fe952c65a4 100644 (file)
@@ -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);