The user details page was modified to show the password expiration
date next to the existing password field.

Fixed problem resetting password in self-service mode. The JSON
interface for the passwd command requires the username to be
specified although the equivalent CLI command doesn't require it.

Ticket #2064

--
Endi S. Dewata
From 6342643e434c2781107dd2888c05eb6385213c61 Mon Sep 17 00:00:00 2001
From: Endi Sukma Dewata <edew...@redhat.com>
Date: Tue, 31 Jan 2012 13:41:28 -0600
Subject: [PATCH] Show password expiration date.

The user details page was modified to show the password expiration
date next to the existing password field.

Fixed problem resetting password in self-service mode. The JSON
interface for the passwd command requires the username to be
specified although the equivalent CLI command doesn't require it.

Ticket #2064
---
 install/ui/field.js                    |   21 ++++++++++++++++-
 install/ui/host.js                     |   40 --------------------------------
 install/ui/test/bin/update_ipa_init.sh |    1 +
 install/ui/test/data/ipa_init.json     |    1 +
 install/ui/user.js                     |   29 ++++++++++++----------
 install/ui/widget.js                   |   39 +++++++++++++++++++++++++++++++
 ipalib/plugins/internal.py             |    1 +
 7 files changed, 78 insertions(+), 54 deletions(-)

diff --git a/install/ui/field.js b/install/ui/field.js
index c448c41c59cd1c33cc90221ccb36749780a136f5..38d71b476899d2dee05f9c7d95af8ef350f6edf2 100644
--- a/install/ui/field.js
+++ b/install/ui/field.js
@@ -34,6 +34,7 @@ IPA.field = function(spec) {
     that.name = spec.name;
     that.label = spec.label;
     that.tooltip = spec.tooltip;
+    that.formatter = spec.formatter;
 
     that.widget = null;
     that.widget_name = spec.widget;
@@ -194,7 +195,25 @@ IPA.field = function(spec) {
     };
 
     that.update = function() {
-        if(that.widget && that.widget.update) that.widget.update(that.values);
+
+        if (!that.widget || !that.widget.update) return;
+
+        var formatted_values;
+
+        // The formatter is currently only used on read-only fields only
+        // because it cannot parse formatted values back to internal values.
+        if (that.formatter && that.read_only) {
+            formatted_values = [];
+            for (var i=0; that.values && i<that.values.length; i++) {
+                var value = that.values[i];
+                var formatted_value = that.formatter.format(value);
+                formatted_values.push(formatted_value);
+            }
+        } else {
+            formatted_values = that.values;
+        }
+
+        that.widget.update(formatted_values);
     };
 
     that.get_update_info = function() {
diff --git a/install/ui/host.js b/install/ui/host.js
index 12748f673709a012c6f699d326ff2664df7ae1e0..299d147a0a5fdcb5b3b17f9c454eccd29ba0731f 100644
--- a/install/ui/host.js
+++ b/install/ui/host.js
@@ -466,46 +466,6 @@ IPA.host_dnsrecord_entity_link_field = function(spec){
 IPA.field_factories['host_dnsrecord_entity_link'] = IPA.host_dnsrecord_entity_link_field;
 IPA.widget_factories['host_dnsrecord_entity_link'] = IPA.link_widget;
 
-/* Take an LDAP format date in UTC and format it */
-IPA.utc_date_column_formatter = function(spec) {
-
-    spec = spec || {};
-
-    var that = IPA.formatter(spec);
-
-    that.format = function(value) {
-
-        if (!value) return '';
-
-        // verify length
-        if (value.length  != '20101119025910Z'.length) {
-            return value;
-        }
-
-        /* We only handle GMT */
-        if (value.charAt(value.length -1) !== 'Z') {
-            return value;
-        }
-
-        var date = new Date();
-
-        date.setUTCFullYear(
-            value.substring(0, 4),    // YYYY
-            value.substring(4, 6)-1,  // MM (0-11)
-            value.substring(6, 8));   // DD (1-31)
-
-        date.setUTCHours(
-            value.substring(8, 10),   // HH (0-23)
-            value.substring(10, 12),  // MM (0-59)
-            value.substring(12, 14)); // SS (0-59)
-
-        return date.toString();
-    };
-
-    return that;
-};
-
-
 IPA.force_host_add_checkbox_widget = function(spec) {
     var metadata = IPA.get_command_option('host_add', spec.name);
     spec.label = metadata.label;
diff --git a/install/ui/test/bin/update_ipa_init.sh b/install/ui/test/bin/update_ipa_init.sh
index 26cbc9679f6cef6b17adc4003b9f98a9197cfec9..11cd03749767ce07626ee129561ad38339c26886 100755
--- a/install/ui/test/bin/update_ipa_init.sh
+++ b/install/ui/test/bin/update_ipa_init.sh
@@ -43,6 +43,7 @@ json="{
 curl -v\
  -H "Content-Type: application/json"\
  -H "Accept: applicaton/json"\
+ -H "Referer: https://`hostname`/ipa/xml"\
  --negotiate\
  --delegation always\
  -u :\
diff --git a/install/ui/test/data/ipa_init.json b/install/ui/test/data/ipa_init.json
index 0f6667face24a9633596dfdb11b8d8aae4fbca41..fc8ec06bca142b8fc02cda00aa2fa9f890c9931f 100644
--- a/install/ui/test/data/ipa_init.json
+++ b/install/ui/test/data/ipa_init.json
@@ -335,6 +335,7 @@
                             "contact": "Contact Settings",
                             "employee": "Employee Information",
                             "error_changing_status": "Error changing account status",
+                            "krbpasswordexpiration": "Password expiration",
                             "mailing": "Mailing Address",
                             "misc": "Misc. Information",
                             "status_confirmation": "Are you sure you want to ${action} the user?<br/>The change will take effect immediately.",
diff --git a/install/ui/user.js b/install/ui/user.js
index a0cecc7b99e29d358824e664e13789089f0decce..b1dd8a6136bf6ec629b1141b6a23162f773c3763 100644
--- a/install/ui/user.js
+++ b/install/ui/user.js
@@ -82,6 +82,12 @@ IPA.user.entity = function(spec) {
                             factory: IPA.user_password_widget,
                             name: 'userpassword'
                         },
+                        {
+                            name: 'krbpasswordexpiration',
+                            label: IPA.messages.objects.user.krbpasswordexpiration,
+                            read_only: true,
+                            formatter: IPA.utc_date_formatter()
+                        },
                         'uidnumber',
                         'gidnumber',
                         'loginshell',
@@ -551,11 +557,11 @@ IPA.user_password_widget = function(spec) {
 
     that.show_dialog = function() {
 
-        that.pkey = IPA.nav.get_state('user-pkey');
-        that.self_service = that.pkey === IPA.whoami.uid[0];
+        var pkey = IPA.nav.get_state('user-pkey');
+        var self_service = pkey === IPA.whoami.uid[0];
 
         var sections = [];
-        if(that.self_service) {
+        if (self_service) {
             sections.push({
                 fields: [
                     {
@@ -600,7 +606,7 @@ IPA.user_password_widget = function(spec) {
 
                 var current_password;
 
-                if (that.self_service) {
+                if (self_service) {
                     current_password = record.current_password[0];
                     if (!current_password) {
                         alert(IPA.messages.password.current_password_required);
@@ -617,11 +623,15 @@ IPA.user_password_widget = function(spec) {
                 }
 
                 that.set_password(
+                    pkey,
                     current_password,
                     new_password,
                     function(data, text_status, xhr) {
                         alert(IPA.messages.password.password_change_complete);
                         dialog.close();
+                        // refresh password expiration field
+                        var facet = IPA.current_entity.get_facet();
+                        facet.refresh();
                     },
                     function(xhr, text_status, error_thrown) {
                         dialog.close();
@@ -641,18 +651,11 @@ IPA.user_password_widget = function(spec) {
         dialog.open(that.container);
     };
 
-    that.set_password = function(current_password, password, on_success, on_error) {
-
-        var args;
-        if (that.self_service) {
-            args = [];
-        } else {
-            args = [that.pkey];
-        }
+    that.set_password = function(pkey, current_password, password, on_success, on_error) {
 
         var command = IPA.command({
             method: 'passwd',
-            args: args,
+            args: [ pkey ],
             options: {
                 current_password: current_password,
                 password: password
diff --git a/install/ui/widget.js b/install/ui/widget.js
index 5ab28cb667983de34b96d0c75b03f293c2927587..04c35bb6e270950b480c169975eb4e5b4b4f5fdb 100644
--- a/install/ui/widget.js
+++ b/install/ui/widget.js
@@ -1054,6 +1054,45 @@ IPA.boolean_status_formatter = function(spec) {
     return that;
 };
 
+/* Take an LDAP format date in UTC and format it */
+IPA.utc_date_formatter = function(spec) {
+
+    spec = spec || {};
+
+    var that = IPA.formatter(spec);
+
+    that.format = function(value) {
+
+        if (!value) return '';
+
+        // verify length
+        if (value.length  != 'YYYYmmddHHMMSSZ'.length) {
+            return value;
+        }
+
+        /* We only handle GMT */
+        if (value.charAt(value.length -1) !== 'Z') {
+            return value;
+        }
+
+        var date = new Date();
+
+        date.setUTCFullYear(
+            value.substring(0, 4),    // YYYY
+            value.substring(4, 6)-1,  // mm (0-11)
+            value.substring(6, 8));   // dd (1-31)
+
+        date.setUTCHours(
+            value.substring(8, 10),   // HH (0-23)
+            value.substring(10, 12),  // MM (0-59)
+            value.substring(12, 14)); // SS (0-59)
+
+        return date.toString();
+    };
+
+    return that;
+};
+
 /*
   The entity name must be set in the spec either directly or via entity.name
 */
diff --git a/ipalib/plugins/internal.py b/ipalib/plugins/internal.py
index a2d8e98caedcde9be39c952ba70abbfdb774deaa..aaa01b7d7c764d2fad9c5f4a9329b00dd0b2988d 100644
--- a/ipalib/plugins/internal.py
+++ b/ipalib/plugins/internal.py
@@ -474,6 +474,7 @@ class i18n_messages(Command):
                 "contact": _("Contact Settings"),
                 "employee": _("Employee Information"),
                 "error_changing_status": _("Error changing account status"),
+                "krbpasswordexpiration": _("Password expiration"),
                 "mailing": _("Mailing Address"),
                 "misc": _("Misc. Information"),
                 "status_confirmation": _("Are you sure you want to ${action} the user?<br/>The change will take effect immediately."),
-- 
1.7.7.1.msysgit.0

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to