Auth support

This commit is contained in:
asonix 2021-05-05 18:56:41 -05:00
parent 99533be690
commit b3e0e9f71d
3 changed files with 98 additions and 45 deletions

View file

@ -180,12 +180,9 @@ public class Streamdeck.Daemon : Object {
obs_state_signal (state);
}
public async void authenticate_obs () throws GLib.Error {
public async void authenticate_obs (string passw0rt) throws GLib.Error {
disconnected_err ();
// TODO: secure passw0rt storage
var passw0rt = "passw0rt";
var state = yield backend_object.login (passw0rt);
obs_state_signal (state);
}
@ -244,8 +241,6 @@ public class Streamdeck.Daemon : Object {
if (state == "Disconnected") {
yield connect_obs ();
} else if (state == "Unauthenticated") {
yield authenticate_obs ();
} else if (state == "Connected") {
var new_scenes = yield load_scenes ();
scenes_signal (new_scenes);

View file

@ -1,12 +1,48 @@
namespace Streamdeck.Views {
public class ObsView : Gtk.Grid {
construct {
column_spacing = 12;
row_spacing = 12;
halign = Gtk.Align.CENTER;
margin = 24;
margin_top = 64;
public class ObsView : Gtk.Stack {
private Gtk.EntryBuffer auth_buffer;
construct {
var base_grid = build_grid ();
build_inputs (base_grid);
base_grid.attach (build_button (), 1, 2);
var auth_grid = build_grid ();
build_inputs (auth_grid);
build_auth (auth_grid);
auth_grid.attach (build_button (), 1, 3);
add_named (base_grid, "base-grid");
add_named (auth_grid, "auth-grid");
show_all ();
}
private Gtk.Grid build_grid () {
var grid = new Gtk.Grid ();
grid.column_spacing = 12;
grid.row_spacing = 12;
grid.halign = Gtk.Align.CENTER;
grid.margin_top = 64;
return grid;
}
private void build_auth (Gtk.Grid grid) {
var auth_label = new Gtk.Label (_("Password:"));
var auth_entry = new Gtk.Entry ();
auth_entry.valign = Gtk.Align.CENTER;
auth_entry.set_visibility (false);
auth_entry.set_input_purpose (Gtk.InputPurpose.PASSWORD);
auth_entry.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL);
auth_buffer = auth_entry.get_buffer ();
grid.attach (auth_label, 0, 2);
grid.attach (auth_entry, 1, 2);
}
private void build_inputs (Gtk.Grid grid) {
var host_label = new Gtk.Label (_("Hostname:"));
var host_entry = new Gtk.Entry ();
host_entry.valign = Gtk.Align.CENTER;
@ -19,16 +55,6 @@ namespace Streamdeck.Views {
port_entry.valign = Gtk.Align.CENTER;
port_entry.snap_to_ticks = true;
var connect_button = new Gtk.Button ();
switch (Daemon.instance.get_obs_state ()) {
case "Disconnected":
connect_button.label = _("Connect");
break;
default:
connect_button.label = _("Reconnect");
break;
}
App.obs_settings.bind (
"host",
host_buffer,
@ -43,6 +69,55 @@ namespace Streamdeck.Views {
GLib.SettingsBindFlags.DEFAULT
);
grid.attach (host_label, 0, 0);
grid.attach (host_entry, 1, 0);
grid.attach (port_label, 0, 1);
grid.attach (port_entry, 1, 1);
}
private Gtk.Button build_button () {
var connect_button = new Gtk.Button ();
switch (Daemon.instance.get_obs_state ()) {
case "Disconnected":
connect_button.label = _("Connect");
break;
case "Unauthenticated":
connect_button.label = _("Login");
break;
default:
connect_button.label = _("Reconnect");
break;
}
Daemon.instance.obs_state_signal.connect ((_obj, state) => {
if (!connect_button.sensitive) {
connect_button.sensitive = true;
}
switch (state) {
case "Disconnected":
connect_button.label = _("Connect");
if (auth_buffer.length > 0) {
set_visible_child_name ("auth-grid");
} else {
set_visible_child_name ("base-grid");
}
break;
case "Unauthenticated":
connect_button.label = _("Login");
set_visible_child_name ("auth-grid");
break;
default:
if (auth_buffer.length > 0) {
set_visible_child_name ("auth-grid");
} else {
set_visible_child_name ("base-grid");
}
connect_button.label = _("Reconnect");
break;
}
});
connect_button.clicked.connect (() => {
connect_button.sensitive = false;
switch (Daemon.instance.get_obs_state ()) {
@ -55,6 +130,9 @@ namespace Streamdeck.Views {
}
});
break;
case "Unauthenticated":
Daemon.instance.authenticate_obs.begin (auth_buffer.text);
break;
default:
Daemon.instance.disconnect_obs.begin ((_obj, res) => {
try {
@ -67,28 +145,7 @@ namespace Streamdeck.Views {
}
});
Daemon.instance.obs_state_signal.connect ((_obj, state) => {
if (!connect_button.sensitive) {
connect_button.sensitive = true;
}
switch (state) {
case "Disconnected":
connect_button.label = _("Connect");
break;
default:
connect_button.label = _("Reconnect");
break;
}
});
attach (host_label, 0, 0);
attach (host_entry, 1, 0);
attach (port_label, 0, 1);
attach (port_entry, 1, 1);
attach (connect_button, 1, 2);
show_all ();
return connect_button;
}
}
}

View file

@ -86,6 +86,7 @@ namespace Streamdeck.Widgets {
Daemon.instance.remove_command.begin (info.serial_number, key, (_obj, res) => {
try {
Daemon.instance.remove_command.end (res);
Daemon.instance.update_command_cache (info.serial_number);
row_map.unset (key);
list_box.remove (row);