From dfb90ca2942b901edb1e0e94e9456aa41f48061f Mon Sep 17 00:00:00 2001 From: Randall Date: Thu, 4 Aug 2022 03:22:01 -0400 Subject: [PATCH] password-pasture (GUI) - Initial commit --- password-pasture/CMakeLists.txt | 16 ++ password-pasture/build.sh | 5 + password-pasture/main.c | 194 ++++++++++++++++++ password-pasture/requirements.txt | 3 + .../sshyp-full.png.REMOVED.git-id | 1 + 5 files changed, 219 insertions(+) create mode 100644 password-pasture/CMakeLists.txt create mode 100755 password-pasture/build.sh create mode 100644 password-pasture/main.c create mode 100644 password-pasture/requirements.txt create mode 100644 password-pasture/sshyp-full.png.REMOVED.git-id diff --git a/password-pasture/CMakeLists.txt b/password-pasture/CMakeLists.txt new file mode 100644 index 0000000..bd166ba --- /dev/null +++ b/password-pasture/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.23) +project(password_pasture C) + +set(CMAKE_C_STANDARD 17) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK4 REQUIRED gtk4) + +include_directories(${GTK4_INCLUDE_DIRS}) +link_directories(${GTK4_LIBRARY_DIRS}) + +add_definitions(${GTK4_CFLAGS_OTHER}) + +add_executable(password_pasture main.c) + +target_link_libraries(password_pasture ${GTK4_LIBRARIES}) \ No newline at end of file diff --git a/password-pasture/build.sh b/password-pasture/build.sh new file mode 100755 index 0000000..11b2db4 --- /dev/null +++ b/password-pasture/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh +rm -rf cmake-build-debug CMakeFiles cmake_install.cmake CMakeCache.txt Makefile +cmake ./ +sleep 10 # prevents clock skew +make diff --git a/password-pasture/main.c b/password-pasture/main.c new file mode 100644 index 0000000..f4ab71f --- /dev/null +++ b/password-pasture/main.c @@ -0,0 +1,194 @@ +#include +//#include + + + +void password_convert(GtkEntryBuffer *buffer) +{ + const char *password = gtk_entry_buffer_get_text(buffer); + char *com1 = "gpg --pinentry-mode loopback --batch --passphrase-fd 0 --armor -qd --output /dev/null ~/.config/sshyp/lock.gpg <<< '"; + char *com2 = "'"; + char dest[1000]; + strcpy(dest, com1); + strcat(dest, password); + strcat(dest, com2); + system(dest); +} + +void password_prompt(GtkWindow *window) +{ + GtkWidget *dialog; + GtkWidget *password_entry; + GtkWidget *box_header; + GtkWidget *button_unlock, *button_cancel; + GtkWidget *dialog_header; + GtkWidget *content_area; + + dialog = gtk_dialog_new(); + + password_entry = gtk_entry_new(); + gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); + gtk_entry_set_placeholder_text(GTK_ENTRY(password_entry), "passphrase"); + dialog_header = gtk_header_bar_new(); + box_header = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_widget_set_halign(box_header, GTK_ALIGN_CENTER); + gtk_box_set_homogeneous(GTK_BOX(box_header), TRUE); + gtk_header_bar_set_show_title_buttons(GTK_HEADER_BAR(dialog_header), FALSE); + button_unlock = gtk_button_new_with_label("unlock"); + button_cancel = gtk_button_new_with_label("cancel"); + gtk_box_append(GTK_BOX(box_header), button_unlock); + gtk_box_append(GTK_BOX(box_header), button_cancel); + gtk_header_bar_set_title_widget(GTK_HEADER_BAR(dialog_header), box_header); + gtk_window_set_title(GTK_WINDOW(dialog), ""); + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(window)); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + gtk_window_set_default_size(GTK_WINDOW(dialog), 50, 50); + // add password entry to dialog content area + content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + gtk_box_append(GTK_BOX(content_area), password_entry); + gtk_window_set_titlebar(GTK_WINDOW(dialog), dialog_header); + gtk_widget_show(dialog); + // button actions + g_signal_connect_swapped(button_cancel, "clicked", G_CALLBACK(gtk_window_close), dialog); + g_signal_connect_swapped(button_unlock, "clicked", G_CALLBACK(password_convert), gtk_entry_get_buffer(GTK_ENTRY(password_entry))); + g_signal_connect_swapped(button_unlock, "clicked", G_CALLBACK(gtk_window_close), dialog); +} + + +void sshyp_sync() +{ + system("sshyp sync"); +} + +void gpg_lock() +{ + system("gpgconf --reload gpg-agent"); +} + +static void activate(GtkApplication* app) +{ + GtkWidget *window; + GtkWidget *button_debug, *button_sync, *button_lock, *button_unlock, *button_shear, *button_read; + GtkWidget *button_copy_pwd, *button_copy_usr, *button_copy_url, *button_copy_nte, *button_copy_mfa; + GtkWidget *button_edit_pwd, *button_edit_usr, *button_edit_url, *button_edit_nte; + GtkWidget *grid_main, *grid_browse; + GtkWidget *box_pwd, *box_usr, *box_url, *box_nte, *box_mfa; + GtkWidget *header_bar; + GtkWidget *stack, *stack_browse; + GtkWidget *stack_switcher, *stack_switcher_browse; + GtkWidget *box_home, *sshyp_logo, *label_home1; + + window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW(window), ""); + gtk_window_set_default_size(GTK_WINDOW(window), 720, 1440); + + header_bar = gtk_header_bar_new(); + + button_sync = gtk_button_new_from_icon_name("view-refresh"); + g_signal_connect(button_sync, "clicked", G_CALLBACK(sshyp_sync), NULL); + gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button_sync); + + button_unlock = gtk_button_new_from_icon_name("changes-allow"); + g_signal_connect_swapped(button_unlock, "clicked", G_CALLBACK(password_prompt), window); + gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button_unlock); + + button_lock = gtk_button_new_from_icon_name("changes-prevent"); + g_signal_connect(button_lock, "clicked", G_CALLBACK(gpg_lock), NULL); + gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button_lock); + + button_debug = gtk_button_new_from_icon_name("applications-science"); + g_signal_connect(button_debug, "clicked", G_CALLBACK(NULL), NULL); + gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), button_debug); + + grid_main = gtk_grid_new(); + gtk_widget_set_halign(grid_main, GTK_ALIGN_CENTER); + gtk_widget_set_valign(grid_main, GTK_ALIGN_START); + gtk_window_set_child(GTK_WINDOW(window), grid_main); + + // start stack stuff + stack = gtk_stack_new(); + gtk_stack_set_transition_type(GTK_STACK(stack), GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT); + gtk_grid_attach(GTK_GRID(grid_main), stack, 0, 0, 1, 1); + + // home + box_home = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); + sshyp_logo = gtk_image_new_from_file("PLACEHOLDER"); + gtk_image_set_pixel_size(GTK_IMAGE(sshyp_logo), 300); + label_home1 = gtk_label_new("password pasture\nexperimental gui client for sshyp"); + gtk_label_set_justify(GTK_LABEL(label_home1), GTK_JUSTIFY_CENTER); + gtk_label_set_markup(GTK_LABEL(label_home1), "password pasture\nexperimental gui client for sshyp"); + gtk_box_append(GTK_BOX(box_home), sshyp_logo); + gtk_box_append(GTK_BOX(box_home), label_home1); + gtk_stack_add_titled(GTK_STACK(stack), box_home, "home", "home"); + + // browse + // resources + button_shear = gtk_button_new_from_icon_name("edit-delete"); + button_read = gtk_button_new_from_icon_name("mail-read"); + stack_browse = gtk_stack_new(); + box_pwd = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(box_pwd), TRUE); + button_copy_pwd = gtk_button_new_from_icon_name("edit-copy"); + button_edit_pwd = gtk_button_new_from_icon_name("document-edit"); + gtk_box_append(GTK_BOX(box_pwd), button_copy_pwd); + gtk_box_append(GTK_BOX(box_pwd), button_edit_pwd); + gtk_stack_add_titled(GTK_STACK(stack_browse), box_pwd, "password", "password"); + box_usr = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(box_usr), TRUE); + button_copy_usr = gtk_button_new_from_icon_name("edit-copy"); + button_edit_usr = gtk_button_new_from_icon_name("document-edit"); + gtk_box_append(GTK_BOX(box_usr), button_copy_usr); + gtk_box_append(GTK_BOX(box_usr), button_edit_usr); + gtk_stack_add_titled(GTK_STACK(stack_browse), box_usr, "username", "username"); + box_url = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(box_url), TRUE); + button_copy_url = gtk_button_new_from_icon_name("edit-copy"); + button_edit_url = gtk_button_new_from_icon_name("document-edit"); + gtk_box_append(GTK_BOX(box_url), button_copy_url); + gtk_box_append(GTK_BOX(box_url), button_edit_url); + gtk_stack_add_titled(GTK_STACK(stack_browse), box_url, "url", "url"); + box_nte = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(box_nte), TRUE); + button_copy_nte = gtk_button_new_from_icon_name("edit-copy"); + button_edit_nte = gtk_button_new_from_icon_name("document-edit"); + gtk_box_append(GTK_BOX(box_nte), button_copy_nte); + gtk_box_append(GTK_BOX(box_nte), button_edit_nte); + gtk_stack_add_titled(GTK_STACK(stack_browse), box_nte, "note", "note"); + box_mfa = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(box_mfa), TRUE); + button_copy_mfa = gtk_button_new_from_icon_name("edit-copy"); + gtk_box_append(GTK_BOX(box_mfa), button_copy_mfa); + gtk_stack_add_titled(GTK_STACK(stack_browse), box_mfa, "mfa", "mfa"); + stack_switcher_browse = gtk_stack_switcher_new(); + gtk_stack_switcher_set_stack(GTK_STACK_SWITCHER(stack_switcher_browse), GTK_STACK(stack_browse)); + grid_browse = gtk_grid_new(); + gtk_widget_set_halign(grid_browse, GTK_ALIGN_START); + gtk_widget_set_valign(grid_browse, GTK_ALIGN_START); + gtk_grid_attach(GTK_GRID(grid_browse), button_shear, 0, 0, 1, 2); + gtk_grid_attach(GTK_GRID(grid_browse), button_read, 1, 0, 1, 2); + gtk_grid_attach(GTK_GRID(grid_browse), stack_switcher_browse, 2, 1, 1, 1); + gtk_grid_attach(GTK_GRID(grid_browse), stack_browse, 2, 0, 1, 1); + gtk_stack_add_titled(GTK_STACK(stack), grid_browse, "browse", "browse"); + + stack_switcher = gtk_stack_switcher_new(); + gtk_stack_switcher_set_stack(GTK_STACK_SWITCHER(stack_switcher), GTK_STACK(stack)); + gtk_header_bar_pack_start(GTK_HEADER_BAR(header_bar), stack_switcher); + // end stack stuff + + gtk_window_set_titlebar(GTK_WINDOW(window), header_bar); + gtk_widget_show(window); +} + +int main(int argc, + char **argv) +{ + GtkApplication *app; + int status; + + app = gtk_application_new("org.rwinkhart.sshyp", G_APPLICATION_FLAGS_NONE); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + + return status; +} diff --git a/password-pasture/requirements.txt b/password-pasture/requirements.txt new file mode 100644 index 0000000..bcf80ca --- /dev/null +++ b/password-pasture/requirements.txt @@ -0,0 +1,3 @@ +arch: base-devel gtk4 cmake make gcc + +alpine: build-base gtk4.0 gtk4.0-dev cmake make gcc binutils abuild diff --git a/password-pasture/sshyp-full.png.REMOVED.git-id b/password-pasture/sshyp-full.png.REMOVED.git-id new file mode 100644 index 0000000..94f9cec --- /dev/null +++ b/password-pasture/sshyp-full.png.REMOVED.git-id @@ -0,0 +1 @@ +89fbbcf15e7fb786db4e2551dc3234615c57f77e \ No newline at end of file