Add server deletion

This commit is contained in:
oupson 2023-03-05 09:38:38 +01:00
parent ce0ef8f689
commit 9c02a19710
Signed by: oupson
GPG Key ID: 3BD88615552EFCB7
3 changed files with 106 additions and 25 deletions

View File

@ -35,37 +35,54 @@ namespace Footerm {
public signal void on_server_selected(Footerm.Model.Server server);
private Footerm.Services.Config config;
construct {
this.new_server.on_new_server.connect((server) => {
this.newpane_stack.set_visible_child(server_list.get_parent());
var action_row = new Adw.ActionRow ();
action_row.set_title (server.name);
action_row.set_activatable (true);
action_row.activated.connect (() => {
this.on_server_selected (server);
});
server_list.add (action_row);
server_list.add(this.build_action_row(server));
});
this.newpane_add_button.clicked.connect(() => {
this.newpane_stack.set_visible_child(new_server.get_parent());
});
try {
var config = Footerm.Services.Config.get_instance ();
this.config = Footerm.Services.Config.get_instance();
var stored_server_list = config.get_server_list ();
var stored_server_list = this.config.get_server_list();
foreach (var server in stored_server_list) {
this.server_list.add(this.build_action_row(server));
}
} catch (Error e) {
GLib.warning("Failed to read server list : %s", e.message);
}
}
private Adw.ActionRow build_action_row(Footerm.Model.Server server) {
var action_row = new Adw.ActionRow();
action_row.set_title(server.name);
action_row.set_activatable(true);
action_row.activated.connect(() => {
this.on_server_selected(server);
});
server_list.add (action_row);
}
var delete_button = new Gtk.Button();
delete_button.set_icon_name("edit-delete-symbolic");
delete_button.set_valign(Gtk.Align.CENTER);
delete_button.add_css_class("edit-icon");
delete_button.add_css_class("flat");
delete_button.clicked.connect(() => {
this.config.delete_server.begin(server, (obj, res) => {
try {
this.config.delete_server.end(res);
this.server_list.remove(action_row);
} catch (Error e) {
GLib.warning ("Failed to read server list : %s", e.message);
}
// TODO WARN USER
warning("Failed to delete : %s", e.message);
}
});
});
action_row.add_suffix(delete_button);
return action_row;
}
}
}

View File

@ -162,5 +162,61 @@ namespace Footerm.Services {
server.id = (int) this.db.last_insert_rowid();
}
public async void delete_server(Footerm.Model.Server server) throws ConfigError, SecretError, Error {
var stm_str = "SELECT COUNT(serverId) FROM SERVER WHERE serverHostName = ? AND serverPort = ? AND serverUsername = ? AND serverAuthentificationType = 'password'";
Sqlite.Statement stm;
var ec = this.db.prepare_v2(stm_str, stm_str.length, out stm);
if (ec != Sqlite.OK) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
ec = stm.bind_text(1, server.hostname);
if (ec != Sqlite.OK) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
ec = stm.bind_int(2, server.port);
if (ec != Sqlite.OK) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
ec = stm.bind_text(3, server.username);
if (ec != Sqlite.OK) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
ec = stm.step();
if (ec != Sqlite.ROW) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
var delete_from_secret = stm.column_int(0) == 1;
stm.reset();
stm_str = "DELETE FROM SERVER WHERE serverId = ?";
ec = this.db.prepare_v2(stm_str, stm_str.length, out stm);
if (ec != Sqlite.OK) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
ec = stm.bind_int(1, server.id);
if (ec != Sqlite.OK) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
ec = stm.step();
if (ec != Sqlite.DONE) {
throw new ConfigError.DATABASE(@"Can't delete server: $(db.errcode ()): $(db.errmsg ())");
}
stm.reset();
if (delete_from_secret) {
var secrets = Secrets.get_instance();
yield secrets.delete_password(server);
}
}
}
}

View File

@ -64,5 +64,13 @@ namespace Footerm.Services {
return yield Secret.password_lookupv(this.password_schema, attributes, null);
}
public async void delete_password(Footerm.Model.Server server) throws Error {
var attributes = new GLib.HashTable<string, string> (str_hash, str_equal);
attributes["hostname"] = server.hostname;
attributes["port"] = server.port.to_string();
attributes["username"] = server.username;
yield Secret.password_clearv(this.password_schema, attributes, null);
}
}
}