From e1ca8c235c5bdd9001c2bbabaded1f1773196eca Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Mon, 12 Nov 2007 14:19:05 -0500 Subject: Initial support for policy editing More work is needed as the values are currently hardcoded and not saved --- ipa-server/ipa-gui/ipagui/controllers.py | 4 + ipa-server/ipa-gui/ipagui/forms/Makefile.am | 4 +- ipa-server/ipa-gui/ipagui/forms/ipapolicy.py | 29 +++++++ .../ipa-gui/ipagui/subcontrollers/Makefile.am | 2 + .../ipa-gui/ipagui/subcontrollers/ipapolicy.py | 96 ++++++++++++++++++++++ ipa-server/ipa-gui/ipagui/subcontrollers/policy.py | 32 ++++++++ ipa-server/ipa-gui/ipagui/templates/Makefile.am | 6 ++ .../ipa-gui/ipagui/templates/ipapolicyedit.kid | 15 ++++ .../ipa-gui/ipagui/templates/ipapolicyeditform.kid | 62 ++++++++++++++ .../ipa-gui/ipagui/templates/ipapolicyshow.kid | 51 ++++++++++++ ipa-server/ipa-gui/ipagui/templates/master.kid | 2 +- .../ipa-gui/ipagui/templates/policyindex.kid | 31 +++++++ .../ipa-gui/ipagui/templates/policylayout.kid | 17 ++++ 13 files changed, 349 insertions(+), 2 deletions(-) create mode 100644 ipa-server/ipa-gui/ipagui/forms/ipapolicy.py create mode 100644 ipa-server/ipa-gui/ipagui/subcontrollers/ipapolicy.py create mode 100644 ipa-server/ipa-gui/ipagui/subcontrollers/policy.py create mode 100644 ipa-server/ipa-gui/ipagui/templates/ipapolicyedit.kid create mode 100644 ipa-server/ipa-gui/ipagui/templates/ipapolicyeditform.kid create mode 100644 ipa-server/ipa-gui/ipagui/templates/ipapolicyshow.kid create mode 100644 ipa-server/ipa-gui/ipagui/templates/policyindex.kid create mode 100644 ipa-server/ipa-gui/ipagui/templates/policylayout.kid (limited to 'ipa-server/ipa-gui') diff --git a/ipa-server/ipa-gui/ipagui/controllers.py b/ipa-server/ipa-gui/ipagui/controllers.py index 5d0bfee03..d1ee22e01 100644 --- a/ipa-server/ipa-gui/ipagui/controllers.py +++ b/ipa-server/ipa-gui/ipagui/controllers.py @@ -17,6 +17,8 @@ import ipa.ipaclient from subcontrollers.user import UserController from subcontrollers.group import GroupController from subcontrollers.delegation import DelegationController +from subcontrollers.policy import PolicyController +from subcontrollers.ipapolicy import IPAPolicyController ipa.config.init_config() @@ -27,6 +29,8 @@ class Root(controllers.RootController): user = UserController() group = GroupController() delegate = DelegationController() + policy = PolicyController() + ipapolicy = IPAPolicyController() @expose(template="ipagui.templates.welcome") @identity.require(identity.not_anonymous()) diff --git a/ipa-server/ipa-gui/ipagui/forms/Makefile.am b/ipa-server/ipa-gui/ipagui/forms/Makefile.am index 5f07e4cb0..5b0bfd337 100644 --- a/ipa-server/ipa-gui/ipagui/forms/Makefile.am +++ b/ipa-server/ipa-gui/ipagui/forms/Makefile.am @@ -4,8 +4,10 @@ appdir = $(IPA_DATA_DIR)/ipagui/forms app_PYTHON = \ __init__.py \ group.py \ + ipapolicy.py \ + policy.py \ user.py \ - delegate.py \ + delegate.py \ $(NULL) EXTRA_DIST = \ diff --git a/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py b/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py new file mode 100644 index 000000000..63eebbe9e --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/forms/ipapolicy.py @@ -0,0 +1,29 @@ +import turbogears +from turbogears import validators, widgets + +class IPAPolicyFields(): + searchlimit = widgets.TextField(name="searchlimit", label="Search Time Limit", attrs=dict(size=6,maxlength=6)) + maxuidlength = widgets.TextField(name="maxuidlength", label="Max. UID Length", attrs=dict(size=3,maxlength=3)) + passwordnotif = widgets.TextField(name="passwordnotif", label="Password Expiration Notification (days)", attrs=dict(size=3,maxlength=3)) + +class IPAPolicyValidator(validators.Schema): + searchlimit = validators.Number(not_empty=True) + maxuidlength = validators.Number(not_empty=True) + passwordnotif = validators.Number(not_empty=True) + +class IPAPolicyForm(widgets.Form): + params = ['ipapolicy_fields'] + + hidden_fields = [ + ] + + validator = IPAPolicyValidator() + + def __init__(self, *args, **kw): + super(IPAPolicyForm,self).__init__(*args, **kw) + (self.template_c, self.template) = widgets.meta.load_kid_template( + "ipagui.templates.ipapolicyeditform") + self.ipapolicy_fields = IPAPolicyFields + + def update_params(self, params): + super(IPAPolicyForm,self).update_params(params) diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/Makefile.am b/ipa-server/ipa-gui/ipagui/subcontrollers/Makefile.am index d409bac7d..2f596f2ef 100644 --- a/ipa-server/ipa-gui/ipagui/subcontrollers/Makefile.am +++ b/ipa-server/ipa-gui/ipagui/subcontrollers/Makefile.am @@ -5,6 +5,8 @@ app_PYTHON = \ __init__.py \ group.py \ ipacontroller.py \ + ipapolicy.py \ + policy.py \ user.py \ delegation.py \ $(NULL) diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/ipapolicy.py b/ipa-server/ipa-gui/ipagui/subcontrollers/ipapolicy.py new file mode 100644 index 000000000..bbef94582 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/subcontrollers/ipapolicy.py @@ -0,0 +1,96 @@ +import os +from pickle import dumps, loads +from base64 import b64encode, b64decode +import copy +import logging + +import cherrypy +import turbogears +from turbogears import controllers, expose, flash +from turbogears import validators, validate +from turbogears import widgets, paginate +from turbogears import error_handler +from turbogears import identity + +from ipacontroller import IPAController +from ipa.entity import utf8_encode_values +from ipa import ipaerror +import ipagui.forms.ipapolicy + +import ldap.dn + +log = logging.getLogger(__name__) + +ipapolicy_edit_form = ipagui.forms.ipapolicy.IPAPolicyForm() + +class IPAPolicyController(IPAController): + + @expose() + def index(self): + raise turbogears.redirect("/ipapolicy/show") + + @expose("ipagui.templates.ipapolicyshow") + @identity.require(identity.not_anonymous()) + def show(self, tg_errors=None): + """Displays the one policy page""" + + # TODO: Get this dict from LDAP + ipapolicy = {} + ipapolicy['searchlimit'] = 2 + ipapolicy['maxuidlength'] = 3 + ipapolicy['passwordnotif'] = 4 + return dict(ipapolicy=ipapolicy,fields=ipagui.forms.ipapolicy.IPAPolicyFields()) + + @expose("ipagui.templates.ipapolicyedit") + @identity.require(identity.not_anonymous()) + def edit(self, tg_errors=None): + """Displays the edit IPA policy form""" + if tg_errors: + turbogears.flash("There were validation errors.
" + + "Please see the messages below for details.") + + try: + # TODO: Get this dict from LDAP + ipapolicy_dict = {} + ipapolicy_dict['searchlimit'] = 2 + ipapolicy_dict['maxuidlength'] = 3 + ipapolicy_dict['passwordnotif'] = 4 + return dict(form=ipapolicy_edit_form, ipapolicy=ipapolicy_dict) + except ipaerror.IPAError, e: + turbogears.flash("IPA Policy edit failed: " + str(e) + "
" + str(e.detail)) + raise turbogears.redirect('/group/show', uid=cn) + + + @expose() + @identity.require(identity.not_anonymous()) + def update(self, **kw): + """Display delegate page""" + self.restrict_post() + client = self.get_ipaclient() + + if kw.get('submit', '').startswith('Cancel'): + turbogears.flash("Edit policy cancelled") + raise turbogears.redirect('/ipapolicy/show') + + tg_errors, kw = self.ipapolicyupdatevalidate(**kw) + if tg_errors: + turbogears.flash("There were validation errors.
" + + "Please see the messages below for details.") + return dict(form=ipapolicy_edit_form, ipapolicy=kw, + tg_template='ipagui.templates.ipapolicyedit') + + try: + + # TODO: Actually save the data + + turbogears.flash("IPA Policy updated") + raise turbogears.redirect('/ipapolicy/show') + except (SyntaxError, ipaerror.IPAError), e: + turbogears.flash("Policy update failed: " + str(e)) + return dict(form=policy_form, policy=kw, + tg_template='ipagui.templates.policyindex') + + @validate(form=ipapolicy_edit_form) + @identity.require(identity.not_anonymous()) + def ipapolicyupdatevalidate(self, tg_errors=None, **kw): + return tg_errors, kw diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/policy.py b/ipa-server/ipa-gui/ipagui/subcontrollers/policy.py new file mode 100644 index 000000000..a9fd3271f --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/subcontrollers/policy.py @@ -0,0 +1,32 @@ +import os +from pickle import dumps, loads +from base64 import b64encode, b64decode +import copy +import logging + +import cherrypy +import turbogears +from turbogears import controllers, expose, flash +from turbogears import validators, validate +from turbogears import widgets, paginate +from turbogears import error_handler +from turbogears import identity + +from ipacontroller import IPAController +from ipa.entity import utf8_encode_values +from ipa import ipaerror + +import ldap.dn + +log = logging.getLogger(__name__) + +class PolicyController(IPAController): + + @expose("ipagui.templates.policyindex") + @identity.require(identity.not_anonymous()) + def index(self, tg_errors=None): + """Displays the one policy page""" + + # TODO: return a dict of the items and URLs to display on + # Manage Policy + return dict() diff --git a/ipa-server/ipa-gui/ipagui/templates/Makefile.am b/ipa-server/ipa-gui/ipagui/templates/Makefile.am index 18db5fffc..a166952e9 100644 --- a/ipa-server/ipa-gui/ipagui/templates/Makefile.am +++ b/ipa-server/ipa-gui/ipagui/templates/Makefile.am @@ -20,8 +20,14 @@ app_DATA = \ groupnewform.kid \ groupnew.kid \ groupshow.kid \ + ipapolicyeditform.kid \ + ipapolicyedit.kid \ + ipapolicyindex.kid \ + ipapolicyshow.kid \ loginfailed.kid \ master.kid \ + policyindex.kid \ + policylayout.kid \ usereditform.kid \ useredit.kid \ userlayout.kid \ diff --git a/ipa-server/ipa-gui/ipagui/templates/ipapolicyedit.kid b/ipa-server/ipa-gui/ipagui/templates/ipapolicyedit.kid new file mode 100644 index 000000000..5987cc40a --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/ipapolicyedit.kid @@ -0,0 +1,15 @@ + + + + + Edit IPA Policy + + +
+

Edit IPA Policy

+ + ${form.display(action=tg.url('/ipapolicy/update'), value=ipapolicy)} +
+ + diff --git a/ipa-server/ipa-gui/ipagui/templates/ipapolicyeditform.kid b/ipa-server/ipa-gui/ipagui/templates/ipapolicyeditform.kid new file mode 100644 index 000000000..2ba5e123b --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/ipapolicyeditform.kid @@ -0,0 +1,62 @@ +
+ +
+ + + + + + + + +
+ +

Search

+ + + + + +
+ + + +
+ +

Password Policy

+ + + + + + + + + +
+ + + +
+ + + +
+ + +
diff --git a/ipa-server/ipa-gui/ipagui/templates/ipapolicyshow.kid b/ipa-server/ipa-gui/ipagui/templates/ipapolicyshow.kid new file mode 100644 index 000000000..f47dfc27f --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/ipapolicyshow.kid @@ -0,0 +1,51 @@ + + + + +Manage IPA Policy + + + + + + + +

Manage IPA Policy

+ +

Search

+ + + + + +
+ ${ipapolicy.get("searchlimit")}
+ +

Password Policy

+ + + + + + + + + +
+ ${ipapolicy.get("passwordnotif")}
+ ${ipapolicy.get("maxuidlength")}
+
+ + + + + diff --git a/ipa-server/ipa-gui/ipagui/templates/master.kid b/ipa-server/ipa-gui/ipagui/templates/master.kid index fd527a278..4fa27e6c5 100644 --- a/ipa-server/ipa-gui/ipagui/templates/master.kid +++ b/ipa-server/ipa-gui/ipagui/templates/master.kid @@ -78,7 +78,7 @@
  • Find Groups