190 lines
5.2 KiB
C++
190 lines
5.2 KiB
C++
#include "common.hh"
|
|
#include "editpass.hh"
|
|
#include "delpass.hh"
|
|
#include "addpass.hh"
|
|
#include "../main.hh"
|
|
|
|
#include <FL/Fl_Window.H>
|
|
#include <FL/fl_ask.H>
|
|
|
|
#include <string>
|
|
#include <unistd.h>
|
|
#include <vector>
|
|
|
|
Editpass edit;
|
|
|
|
struct InputData {
|
|
Fl_Input *txtin;
|
|
Fl_Secret_Input *pass1;
|
|
Fl_Secret_Input *pass2;
|
|
Fl_Window *dialog;
|
|
};
|
|
|
|
void Editpass::setFile(std::string &f) {
|
|
edit.file = f;
|
|
}
|
|
|
|
std::string Editpass::getFile() {
|
|
return file;
|
|
}
|
|
|
|
bool Editpass::exec(const std::string &file, const std::string &pass) {
|
|
std::string lang = Common::getlang();
|
|
|
|
Common c;
|
|
c.tmpcopy(file, "/tmp/simpas-tmp.gpg");
|
|
|
|
Delpass d;
|
|
bool isdel = d.exec(file, true);
|
|
if (!isdel) {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ? "Failed to edit." : "編集に失敗。");
|
|
fl_alert("%s", err.c_str());
|
|
return false;
|
|
}
|
|
|
|
Addpass a;
|
|
bool isadd = a.exec(file, pass, true);
|
|
if (!isadd) {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ? "Failed to edit." : "編集に失敗。");
|
|
fl_alert("%s", err.c_str());
|
|
// TODO: うまく動いているかの確認。それは次のバージョンから・・・
|
|
/* std::vector<std::string> tokens = Common::explode(file, '/'); */
|
|
/* std::string passpath = tokens[0]; */
|
|
|
|
/* for (size_t i = 1; i < tokens.size(); ++i) { */
|
|
/* if (i == tokens.size() - 1) continue; */
|
|
/* passpath += "/" + tokens[i]; */
|
|
/* } */
|
|
|
|
/* for (int i = tokens.size() - 1; i >= 0; ++i) { */
|
|
/* if (c.mkdir_r(passpath, 0755) == -1) break; */
|
|
|
|
/* size_t last_slash = passpath.find_last_of('/'); */
|
|
/* if (last_slash != std::string::npos) passpath.erase(last_slash); */
|
|
/* } */
|
|
c.tmpcopy("/tmp/simpas-tmp.gpg", file);
|
|
unlink("/tmp/simpas-tmp.gpg");
|
|
return false;
|
|
}
|
|
|
|
std::string msg =
|
|
(lang.compare(0, 2, "en") == 0 ? "Edit success." : "編集に成功。");
|
|
fl_alert("%s", msg.c_str());
|
|
unlink("/tmp/simpas-tmp.gpg");
|
|
|
|
return true;
|
|
}
|
|
|
|
void Editpass::edit_cb(Fl_Widget *, void *data) {
|
|
InputData *inputs = (InputData *)data;
|
|
std::string lang = Common::getlang();
|
|
|
|
if (inputs) {
|
|
file = inputs->txtin->value();
|
|
if (file.empty()) {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ?
|
|
"Please fill in the path." :
|
|
"パスをご入力下さい。");
|
|
fl_alert("%s", err.c_str());
|
|
return;
|
|
}
|
|
inputpass1 = inputs->pass1->value();
|
|
if (inputpass1.empty()) {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ?
|
|
"Please fill in the password." :
|
|
"パスワードをご入力下さい。");
|
|
fl_alert("%s", err.c_str());
|
|
return;
|
|
}
|
|
inputpass2 = inputs->pass2->value();
|
|
if (inputpass2.empty()) {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ?
|
|
"Please fill in the password (confirm)." :
|
|
"パスワード (確認)をご入力下さい。");
|
|
fl_alert("%s", err.c_str());
|
|
return;
|
|
}
|
|
|
|
if (inputpass1 != inputpass2) {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ?
|
|
"Password does not match." :
|
|
"パスワードが一致していません。");
|
|
fl_alert("%s", err.c_str());
|
|
return;
|
|
}
|
|
|
|
if (exec(file, inputpass1)) {
|
|
inputs->dialog->hide();
|
|
}
|
|
} else {
|
|
std::string err =
|
|
(lang.compare(0, 2, "en") == 0 ?
|
|
"Please fill in all the fields." :
|
|
"全てのフィールドをご入力下さい。");
|
|
fl_alert("%s", err.c_str());
|
|
}
|
|
}
|
|
|
|
void Editpass::dialog_cb(Fl_Widget *w, void *data) {
|
|
(void)w;
|
|
(void)data;
|
|
std::string lang = Common::getlang();
|
|
Fl_Window *dialog = new Fl_Window(400, 160,
|
|
(lang.compare(0, 2, "en") == 0 ? "Edit password" : "パスワードの編集"));
|
|
|
|
Fl_Input *txtin = new Fl_Input(150, 20, 180, 30,
|
|
(lang.compare(0, 2, "en") == 0 ? "Path:" : "パス:"));
|
|
Fl_Secret_Input *pass1 = new Fl_Secret_Input(150, 20, 180, 30,
|
|
(lang.compare(0, 2, "en") == 0 ? "Password:" : "パスワード:"));
|
|
Fl_Secret_Input *pass2 = new Fl_Secret_Input(150, 60, 180, 30,
|
|
(lang.compare(0, 2, "en") == 0 ? "Password (confirm):" : "パスワード (確認):"));
|
|
dialog->add(pass1);
|
|
dialog->add(pass2);
|
|
txtin->hide();
|
|
txtin->value(edit.getFile().c_str());
|
|
|
|
InputData *inputs = new InputData();
|
|
inputs->txtin = txtin;
|
|
inputs->pass1 = pass1;
|
|
inputs->pass2 = pass2;
|
|
inputs->dialog = dialog;
|
|
|
|
Fl_Button *okbtn = new Fl_Button(60, 110, 80, 30, "OK");
|
|
Fl_Button *cancelbtn = new Fl_Button(160, 110, 80, 30,
|
|
(lang.compare(0, 2, "en") == 0 ? "Cancel" : "キャンセル"));
|
|
|
|
okbtn->callback(static_ok_cb, inputs);
|
|
cancelbtn->callback(static_cancel_cb, dialog);
|
|
|
|
dialog->add(okbtn);
|
|
dialog->add(cancelbtn);
|
|
|
|
dialog->end();
|
|
dialog->set_modal();
|
|
dialog->show();
|
|
}
|
|
|
|
void Editpass::static_ok_cb(Fl_Widget *w, void *data) {
|
|
(void)w;
|
|
InputData *inputs = (InputData *)data;
|
|
|
|
edit.edit_cb(nullptr, inputs);
|
|
std::vector<std::string> fpaths;
|
|
std::string rdir = Common::getbasedir(false);
|
|
std::string curpath = inputs->txtin->value();
|
|
clearpaths(false, curpath);
|
|
scandir(rdir, rdir, fpaths);
|
|
updatelist();
|
|
browse(curpath, false);
|
|
}
|
|
|
|
void Editpass::static_cancel_cb(Fl_Widget *w, void *data) {
|
|
((Editpass *)data)->cancel_cb(w, data);
|
|
}
|