#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";
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();
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;
tcsetattr(fileno(stdin), TCSANOW, &old);
}
-void addpass(char *file) {
+int addpass(char *file) {
char *lang = getlang();
// パスを準備
const char *ero = (strncmp(lang, "en", 2) == 0 ?
"Failed to allocate memory" : "メモリを割当に失敗");
fprintf(stderr, "%s\n", ero);
- return;
+ return -1;
}
// ファイルが既に存在するかどうか確認
file
);
free(gpgpathchk);
- return;
+ return -1;
}
free(gpgpathchk);
"Password does not match. Terminating..." :
"パスワードが一致していません。終了…");
fprintf(stderr, "%s\n", ero);
- return;
+ return -1;
}
// パスワードを保存する
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は非対話的モードに設定
"Failed to set pinentry mode" : "pinentryモードを設定に失敗");
fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err));
gpgme_release(ctx);
- return;
+ return -1;
}
// パスワードからデータオブジェクトを創作
"Failed to make data object" : "データオブジェクトを創作に失敗");
fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err));
gpgme_release(ctx);
- return;
+ return -1;
}
gpgme_data_new(&out);
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);
fprintf(stderr, "%s\n", ero);
fclose(keyfile);
free(keyid);
- return;
+ return -1;
}
keyid[strcspn(keyid, "\n")] = 0;
"Failed to get key" : "鍵Dを受取に失敗");
fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err));
free(keyid);
- return;
+ return -1;
}
if (key[0] == NULL) {
"Error: Key is NULL" : "エラー:鍵はNULLです");
fprintf(stderr, "%s\n", ero);
free(keyid);
- return;
+ return -1;
}
free(keyid);
"Failed to encrypt" : "暗号化に失敗");
fprintf(stderr, "%s: %s\n", ero, gpgme_strerror(err));
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
// 暗号化したファイルを開く
"Failed to allocate memory" : "メモリを割当に失敗");
fprintf(stderr, "%s\n", ero);
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
// ディレクトリを創作
fprintf(stderr, "%s\n", ero);
free(gpgpath);
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
}
fprintf(stderr, "%s\n", ero);
free(gpgpath);
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
gpgfile = fopen(gpgpath, "wb");
fprintf(stderr, "%s\n", ero);
free(gpgpath);
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
// データが保存したかどうか確認
fclose(gpgfile);
free(gpgpath);
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
// 復号化したパスワードを表示する
fprintf(stderr, "%s\n", ero);
free(gpgpath);
cleanup(ctx, key[0], in, out);
- return;
+ return -1;
}
}
const char *msg = (strncmp(lang, "en", 2) == 0 ?
"The password got saved." : "パスワードを保存出来ました。");
printf("%s\n", msg);
+
+ return 0;
}