소스 검색

Roughly validate input of sign in parameters

Matthias Vogelgesang 7 년 전
부모
커밋
d472f72fc7
2개의 변경된 파일94개의 추가작업 그리고 2개의 파일을 삭제
  1. 88 2
      src/iridium-signin-dialog.c
  2. 6 0
      src/iridium-signin-dialog.ui

+ 88 - 2
src/iridium-signin-dialog.c

@@ -22,9 +22,12 @@
 struct _IridiumSigninDialog
 {
   GtkDialog  parent_instance;
+  GtkWidget *sign_in_button;
   GtkEntry  *server_entry;
   GtkEntry  *email_entry;
   GtkEntry  *password_entry;
+  GRegex    *url_regex;
+  GRegex    *email_regex;
 };
 
 G_DEFINE_TYPE (IridiumSigninDialog, iridium_signin_dialog, GTK_TYPE_DIALOG)
@@ -53,22 +56,105 @@ iridium_signin_dialog_get_password (IridiumSigninDialog *dialog)
   return gtk_entry_get_text (dialog->password_entry);
 }
 
+static gboolean
+password_entry_valid (IridiumSigninDialog *dialog)
+{
+  return gtk_entry_get_text_length (dialog->password_entry) > 0;
+}
+
+static gboolean
+server_entry_valid (IridiumSigninDialog *dialog)
+{
+  return g_regex_match (dialog->url_regex, gtk_entry_get_text (dialog->server_entry), 0, NULL);
+}
+
+static gboolean
+email_entry_valid (IridiumSigninDialog *dialog)
+{
+  return g_regex_match (dialog->email_regex, gtk_entry_get_text (dialog->email_entry), 0, NULL);
+}
+
+static gboolean
+entries_valid (IridiumSigninDialog *dialog)
+{
+  return server_entry_valid (dialog) &&
+         email_entry_valid (dialog) &&
+         password_entry_valid (dialog);
+}
+
+static void
+set_sign_in_button_sensitivity (IridiumSigninDialog *dialog)
+{
+  gtk_widget_set_sensitive (dialog->sign_in_button, entries_valid (dialog));
+}
+
+static void
+on_server_entry_changed (IridiumSigninDialog *dialog,
+                         gpointer user_data)
+{
+  gtk_entry_set_icon_from_icon_name (dialog->server_entry, 0,
+    server_entry_valid (dialog) ? NULL : "dialog-warning");
+
+  set_sign_in_button_sensitivity (dialog);
+}
+
+static void
+on_email_entry_changed (IridiumSigninDialog *dialog,
+                        gpointer user_data)
+{
+  gtk_entry_set_icon_from_icon_name (dialog->email_entry, 0,
+    email_entry_valid (dialog) ? NULL : "dialog-warning");
+
+  set_sign_in_button_sensitivity (dialog);
+}
+
+static void
+on_password_entry_changed (IridiumSigninDialog *dialog,
+                           gpointer user_data)
+{
+  gtk_entry_set_icon_from_icon_name (dialog->password_entry, 0,
+    password_entry_valid (dialog) ? NULL : "dialog-warning");
+
+  set_sign_in_button_sensitivity (dialog);
+}
+
+static void
+iridium_signin_finalize (GObject *object)
+{
+  IridiumSigninDialog *self;
+
+  self = IRIDIUM_SIGNIN_DIALOG (object);
+  g_regex_unref (self->url_regex);
+  g_regex_unref (self->email_regex);
+}
+
 static void
 iridium_signin_dialog_class_init (IridiumSigninDialogClass *klass)
 {
+  GObjectClass *oclass;
   GtkWidgetClass *widget_class;
-  
+
+  oclass = G_OBJECT_CLASS (klass);
   widget_class = GTK_WIDGET_CLASS (klass);
 
+  oclass->finalize = iridium_signin_finalize;
+
   gtk_widget_class_set_template_from_resource (widget_class, "/net/bloerg/Iridium/iridium-signin-dialog.ui");
   gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, server_entry);
   gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, email_entry);
   gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, password_entry);
+  gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, sign_in_button);
+
+  gtk_widget_class_bind_template_callback (widget_class, on_server_entry_changed);
+  gtk_widget_class_bind_template_callback (widget_class, on_email_entry_changed);
+  gtk_widget_class_bind_template_callback (widget_class, on_password_entry_changed);
 }
 
 static void
 iridium_signin_dialog_init (IridiumSigninDialog *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
-}
 
+  self->url_regex = g_regex_new ("https?:\\/\\/[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)", 0, 0, NULL);
+  self->email_regex = g_regex_new (".+@.+\\..+", 0, 0, NULL);
+}

+ 6 - 0
src/iridium-signin-dialog.ui

@@ -42,7 +42,9 @@
               <object class="GtkEntry" id="server_entry">
                 <property name="visible">True</property>
                 <property name="hexpand">True</property>
+                <property name="primary-icon-name">dialog-warning</property>
                 <property name="input-purpose">GTK_INPUT_PURPOSE_URL</property>
+                <signal name="changed" handler="on_server_entry_changed" object="IridiumSigninDialog"/>
               </object>
               <packing>
                 <property name="left-attach">1</property>
@@ -64,7 +66,9 @@
               <object class="GtkEntry" id="email_entry">
                 <property name="visible">True</property>
                 <property name="hexpand">True</property>
+                <property name="primary-icon-name">dialog-warning</property>
                 <property name="input-purpose">GTK_INPUT_PURPOSE_EMAIL</property>
+                <signal name="changed" handler="on_email_entry_changed" object="IridiumSigninDialog"/>
               </object>
               <packing>
                 <property name="left-attach">1</property>
@@ -87,7 +91,9 @@
                 <property name="visible">True</property>
                 <property name="hexpand">True</property>
                 <property name="visibility">False</property>
+                <property name="primary-icon-name">dialog-warning</property>
                 <property name="input-purpose">GTK_INPUT_PURPOSE_PASSWORD</property>
+                <signal name="changed" handler="on_password_entry_changed" object="IridiumSigninDialog"/>
               </object>
               <packing>
                 <property name="left-attach">1</property>