From 77eed811f5e617c2639b0ce8a13db179e583a433 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sat, 21 Nov 2015 00:36:40 +0100 Subject: [PATCH] =?UTF-8?q?Nouvelles=20fonctionalit=C3=A9s:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Gestion des déploiement de configurations - Ajout et suppression d'utilisateurs au groupes (autres que celui des admins) - Page à customiser en cas d'accès à une ressource d'accès restreint, qui par défaut n'indique que le nom de controleur et celui de la methode concérnée, et qui ajoute, seulement dans le cas ou l'utilisateur est administrateur, les noms de groupes ou d'utilisateur autorisés, avec la mentions "admins only" invitant à la discretion. * Microsoft.Web.XmlTransform.dll: Copié de l'import Nuget de Mono.Web.Xdt (transformations de fichiers de configuration) * yavsc.admin.js: Implémente les méthodes Javascript de l'interface utilisateur de suppression et d'ajout d'un utilisateur à un groupe: un widget jQuery pour la suppression, l'accès à l'API * RestrictedArea.aspx: Page vue par l'utilisateur si par malheur il suivait un lien vers un contenu d'accès restreint, à la place d'un code Http 404 ou autre. Si cet utilisateur est administrateur, la page lui affiche les rôles ou utilisateurs autorisés à accèder au contenu. * RestrictedArea.aspx: * RestrictedArea.aspx: * RestrictedArea.aspx: * RestrictedArea.aspx: * RestrictedArea.aspx: * RestrictedArea.aspx: * RestrictedArea.aspx: Page vue par l'utilisateur si par malheur il suivait un lien vers un contenu d'accès restreint, à la place d'un code Http 404 ou autre. Si cet utilisateur est administrateur, la page lui affiche les rôles ou utilisateurs autorisés à accèder au contenu. * Makefile: retour au débuggage de la copie de travaille, et pas de la déployée. La copie de travail sera avec les mots de passe, et donc toujours différente de celle sous git, mais c'est pas grave. * AccountController.cs: Evite de mettre à jour un mot de passe avec des valeures non attendues * style.css: corrige un mouvement de la disposition au survol de la souris * AuthorizeAttribute.cs: enlève la redirection à l'accès restreint, et fixe pas la même la transmission des données `Roles` et `Users` de la vue * AdminController.cs: Evite de supprimer un utilisateur d'un groupe avec des valeures non attendues * HomeController.cs: Il n'y avait pas à créer de methode pour la vue publique de l'accès restreint. * YavscAjaxHelper.cs: évite d'avoir à convertir en chaine les valeurs de la vue. * App.master: Cette page maître affiche encore beaucoup de billets de blog, on y installe le coteur, de base. Ça changera quand les blogs auront (enfin) leur page maître dédiée. * AppAdmin.master: synchronisation avec la page maître principale (thémes) * NoLogin.master: synchronisation avec la page maître principale.(thémes) * yavsc.rate.js: supprime l'initialisation de tous les type de cotes depuis le script global. C'est fait sur les pages qui en ont besoin, et seulement pour les types de cotes concernés. * AddUserToRole.ascx: Ce formulaire est maintenant à la fois opérationel depuis une interface web sans javascript, et à la Ajax quand Javascript activé. * UsersInRole.aspx: implémente l'interface utilisateur pour l'ajout et la suppression d'un utilisateur à un groupe * Skills.aspx: initialise le coteur js des compétences site * UserSkills.aspx: initialise le coteur js de compétences utilisateur * Web.csproj: un script et des pages d'erreur d'accès, il en faut une par controlleur s'il veut restreindre ses accès sans rendre de code Http 403 ou 404. * UserNameBase.cs: Permet l'usage des espaces dans les noms d'utilisateurs, à la création legacy, ou autres usage du nom d'utilisateur. --- ChangeLog | 5 ++ Makefile | 6 +- web/ApiControllers/AccountController.cs | 28 +++++-- web/App_Themes/style.css | 7 +- web/AuthorizeAttribute.cs | 7 +- web/ChangeLog | 84 +++++++++++++++++++++ web/Controllers/AdminController.cs | 9 ++- web/Controllers/HomeController.cs | 4 - web/Helpers/YavscAjaxHelper.cs | 24 +++--- web/Microsoft.Web.XmlTransform.dll | Bin 0 -> 84480 bytes web/Models/App.master | 3 + web/Models/AppAdmin.master | 12 +-- web/Models/NoLogin.master | 13 ++-- web/Scripts/yavsc.admin.js | 37 +++++++++ web/Scripts/yavsc.rate.js | 6 -- web/Views/Account/RestrictedArea.aspx | 13 ++++ web/Views/Admin/AddUserToRole.ascx | 29 ++++--- web/Views/Admin/RestrictedArea.aspx | 13 ++++ web/Views/Admin/UsersInRole.aspx | 14 +++- web/Views/BackOffice/RestrictedArea.aspx | 13 ++++ web/Views/Blogs/RestrictedArea.aspx | 13 ++++ web/Views/FileSystem/RestrictedArea.aspx | 13 ++++ web/Views/FrontOffice/RestrictedArea.aspx | 13 ++++ web/Views/FrontOffice/Skills.aspx | 5 ++ web/Views/FrontOffice/UserSkills.aspx | 5 ++ web/Views/Google/RestrictedArea.aspx | 13 ++++ web/Views/Home/RestrictedArea.aspx | 6 +- web/Web.csproj | 8 ++ yavscModel/ChangeLog | 6 ++ yavscModel/RolesAndMembers/UserNameBase.cs | 2 +- 30 files changed, 348 insertions(+), 63 deletions(-) create mode 100755 web/Microsoft.Web.XmlTransform.dll create mode 100644 web/Scripts/yavsc.admin.js create mode 100644 web/Views/Account/RestrictedArea.aspx create mode 100644 web/Views/Admin/RestrictedArea.aspx create mode 100644 web/Views/BackOffice/RestrictedArea.aspx create mode 100644 web/Views/Blogs/RestrictedArea.aspx create mode 100644 web/Views/FileSystem/RestrictedArea.aspx create mode 100644 web/Views/FrontOffice/RestrictedArea.aspx create mode 100644 web/Views/Google/RestrictedArea.aspx diff --git a/ChangeLog b/ChangeLog index 8c8064aa..13ecca77 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-11-21 Paul Schneider + + * Makefile: retour au débuggage de la copie de travaille, et + pas de la déployée + 2015-11-19 Paul Schneider * .gitignore: ignore my new config transformation sources diff --git a/Makefile b/Makefile index 9482a98a..fbda41d6 100644 --- a/Makefile +++ b/Makefile @@ -59,8 +59,8 @@ distclean: clean sourcepkg: git archive --format=tar --prefix=yavsc-$(CONFIG)/ $(CONFIG) | bzip2 > yavsc-$(CONFIG).tar.bz2 -start_xsp: deploy - (cd $(LDYDESTDIR); export MONO_OPTIONS=--debug; xsp4 --port 8080) +start_xsp: build + (cd web; export MONO_OPTIONS=--debug; xsp4 --port 8080) xmldoc: $(patsubst %,web/bin/%,$(DOCASSBS)) mdoc-update $^ $(patsubst %.dll,-i%.xml,$^) --out web/xmldoc @@ -84,3 +84,5 @@ nuget_restore: nuget_update: for prj in ITContentProvider NpgsqlBlogProvider NpgsqlContentProvider NpgsqlMRPProviders Presta SalesCatalog TestAPI web WebControls yavscclient yavscModel; do nuget update "$${prj}/packages.config" ; done + + diff --git a/web/ApiControllers/AccountController.cs b/web/ApiControllers/AccountController.cs index 397113b0..bb3c6c7b 100644 --- a/web/ApiControllers/AccountController.cs +++ b/web/ApiControllers/AccountController.cs @@ -96,20 +96,32 @@ namespace Yavsc.ApiControllers [ValidateAjax] public void ResetPassword (LostPasswordModel model) { - StringDictionary errors; - MembershipUser user; - YavscHelpers.ValidatePasswordReset (model, out errors, out user); - foreach (string key in errors.Keys) - ModelState.AddModelError (key, errors [key]); - if (user != null && ModelState.IsValid) - Url.SendActivationMessage (user); + if (ModelState.IsValid) { + StringDictionary errors; + MembershipUser user; + YavscHelpers.ValidatePasswordReset (model, out errors, out user); + foreach (string key in errors.Keys) + ModelState.AddModelError (key, errors [key]); + if (user != null && ModelState.IsValid) + Url.SendActivationMessage (user); + } } [ValidateAjax] [Authorize(Roles="Admin")] public void AddUserToRole(UserRole model) { - Roles.AddUserToRole (model.UserName, model.Role); + if (ModelState.IsValid) + Roles.AddUserToRole (model.UserName, model.Role); + } + + [ValidateAjax] + [Authorize(Roles="Admin")] + public void RemoveUserFromRole(UserRole model) + { + if (ModelState.IsValid) + Roles.RemoveUserFromRoles (model.UserName, + new string [] { model.Role } ); } } diff --git a/web/App_Themes/style.css b/web/App_Themes/style.css index 2fb4dd2f..7b308238 100644 --- a/web/App_Themes/style.css +++ b/web/App_Themes/style.css @@ -154,13 +154,16 @@ ul.editablelist>li { border: solid grey 1px; border-radius: 1em; } - +ul.editablelist>li:before { + font-family: 'FontAwesome'; + content: "\f007"; + } ul.editablelist>li:hover { background-color: rgba(128,0,0,0.5); cursor:pointer; } -ul.editablelist>li:hover:after { +ul.editablelist>li:hover:before { font-family: 'FontAwesome'; content: "\f00d"; } diff --git a/web/AuthorizeAttribute.cs b/web/AuthorizeAttribute.cs index 05ddb9ab..a184cf41 100644 --- a/web/AuthorizeAttribute.cs +++ b/web/AuthorizeAttribute.cs @@ -40,11 +40,16 @@ namespace Yavsc { // let the client know which role were allowed here // filterContext.ActionDescriptor.ControllerDescriptor. - filterContext.Result = new System.Web.Mvc.RedirectResult ("~/Home/RestrictedArea"); + var result = new System.Web.Mvc.ViewResult(); + filterContext.Controller.ViewData ["ActionName"] = filterContext.ActionDescriptor.ActionName; filterContext.Controller.ViewData ["ControllerName"] = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; filterContext.Controller.ViewData ["Roles"] = Roles; filterContext.Controller.ViewData ["Users"] = Users; + result.ViewName = "RestrictedArea"; + result.ViewData = filterContext.Controller.ViewData; + filterContext.Result = result; + } else filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden); } diff --git a/web/ChangeLog b/web/ChangeLog index 53a4664a..ed07c255 100644 --- a/web/ChangeLog +++ b/web/ChangeLog @@ -1,3 +1,87 @@ +2015-11-21 Paul Schneider + + * Microsoft.Web.XmlTransform.dll: Copié de l'import Nuget de + Mono.Web.Xdt (transformations de fichiers de configuration) + + * yavsc.admin.js: Implémente les méthodes Javascript de + l'interface utilisateur de suppression et d'ajout d'un + utilisateur à un groupe: + un widget jQuery pour la suppression, l'accès à l'API + + * RestrictedArea.aspx: Page vue par l'utilisateur si par + malheur il suivait un lien vers un contenu d'accès restreint, + à la place d'un code Http 404 ou autre. + Si cet utilisateur est administrateur, la page lui affiche les + rôles ou utilisateurs autorisés à accèder au contenu. + + + * RestrictedArea.aspx: + * RestrictedArea.aspx: + * RestrictedArea.aspx: + * RestrictedArea.aspx: + * RestrictedArea.aspx: + * RestrictedArea.aspx: + * RestrictedArea.aspx: Page vue par l'utilisateur si par + malheur il suivait un lien vers un contenu d'accès restreint, + à la place d'un code Http 404 ou autre. + Si cet utilisateur est administrateur, la page lui affiche les + rôles ou utilisateurs autorisés à accèder au contenu. + + * AccountController.cs: Evite de mettre à jour un mot de passe + avec des valeures non attendues + + * style.css: corrige un mouvement de la disposition au survol + de la souris + + * AuthorizeAttribute.cs: enlève la redirection à l'accès + restreint, et fixe pas la même la transmission des données + `Roles` et `Users` de la vue + + + * AdminController.cs: Evite de supprimer un utilisateur d'un + groupe avec des valeures non attendues + + * HomeController.cs: Il n'y avait pas à créer de methode pour + la vue publique de l'accès restreint. + + * YavscAjaxHelper.cs: évite d'avoir à convertir en chaine les + valeurs de la vue. + + + * App.master: Cette page maître affiche encore beaucoup de + billets de blog, on y installe le coteur, de base. Ça changera + quand les blogs auront (enfin) leur page maître dédiée. + + + * AppAdmin.master: synchronisation avec la page maître + principale (thémes) + + * NoLogin.master: synchronisation avec la page maître + principale.(thémes) + + * yavsc.rate.js: supprime l'initialisation de tous les type de + cotes depuis le script global. + C'est fait sur les pages qui en ont besoin, et seulement pour + les types de cotes concernés. + + * AddUserToRole.ascx: Ce formulaire est maintenant à la fois + opérationel depuis une interface web sans javascript, et à la + Ajax quand Javascript activé. + + + * UsersInRole.aspx: implémente l'interface utilisateur pour + l'ajout et la suppression d'un utilisateur à un groupe + + * Skills.aspx: initialise le coteur js des compétences site + + * UserSkills.aspx: initialise le coteur js de compétences + utilisateur + + * Web.csproj: un script et des pages d'erreur d'accès, il en + faut une par controlleur + qui restreint quelque de ses accès. + + 2015-11-19 Paul Schneider * PayPalController.cs: implements a Paypal controller diff --git a/web/Controllers/AdminController.cs b/web/Controllers/AdminController.cs index d292d4da..8a137198 100644 --- a/web/Controllers/AdminController.cs +++ b/web/Controllers/AdminController.cs @@ -133,6 +133,7 @@ namespace Yavsc.Controllers BuildBackupList (datac); return View (datac); } + private void BuildBackupList(DataAccess datac) { // build ViewData ["Backups"]; @@ -151,16 +152,18 @@ namespace Yavsc.Controllers /// Rolename. /// Return URL. [Authorize(Roles="Admin")] - public ActionResult RemoveFromRole(string username, string rolename, string returnUrl) + public ActionResult RemoveUserFromRole(string username, string rolename, string returnUrl) { - Roles.RemoveUserFromRole(username,rolename); + if (ModelState.IsValid) + Roles.RemoveUserFromRole(username,rolename); return Redirect(returnUrl); } [Authorize(Roles="Admin")] public ActionResult AddUserToRole(string username, string rolename, string returnUrl) { - Roles.AddUsersToRole(new string[] { username } ,rolename); + if (ModelState.IsValid) + Roles.AddUsersToRole(new string[] { username } ,rolename); return Redirect(returnUrl); } /// diff --git a/web/Controllers/HomeController.cs b/web/Controllers/HomeController.cs index 0a59f638..35bb3cbb 100644 --- a/web/Controllers/HomeController.cs +++ b/web/Controllers/HomeController.cs @@ -101,10 +101,6 @@ namespace Yavsc.Controllers return View (); } - public ActionResult RestrictedArea () - { - return View (); - } /// /// Contact the specified email, reason and body. /// diff --git a/web/Helpers/YavscAjaxHelper.cs b/web/Helpers/YavscAjaxHelper.cs index 83487ba6..d7dedfd2 100644 --- a/web/Helpers/YavscAjaxHelper.cs +++ b/web/Helpers/YavscAjaxHelper.cs @@ -36,12 +36,12 @@ namespace Yavsc.Helpers /// Helper. /// Message. /// Click action. - public static void Notify(this AjaxHelper helper, string message, string click_action=null) { + public static void Notify(this AjaxHelper helper, object message, string click_action=null) { if (helper.ViewData ["Notifications"] == null) helper.ViewData ["Notifications"] = new List (); (helper.ViewData ["Notifications"] as List).Add ( - new Notification { body = QuoteJavascriptString(message), + new Notification { body = QuoteJavascriptString((string)message), click_action = click_action } ) ; } @@ -50,15 +50,21 @@ namespace Yavsc.Helpers /// /// The javascript string. /// String. - public static string QuoteJavascriptString(string str) + public static string QuoteJavascriptString(object str) { - str = str.Replace ("\n", "\\n"); - if (str.Contains ("'")) - if (str.Contains ("\"")) - return "'" + str.Replace ("'", "\\'") + "'"; + string tmpstr = (string) str; + tmpstr = tmpstr.Replace ("\n", "\\n"); + if (tmpstr.Contains ("'")) + if (tmpstr.Contains ("\"")) + return "'" + tmpstr.Replace ("'", "\\'") + "'"; else - return "\"" + str + "\""; - return "'" + str + "'"; + return "\"" + tmpstr + "\""; + return "'" + tmpstr + "'"; + } + + public static string JString(this AjaxHelper helper, object str) + { + return QuoteJavascriptString (str); } } } diff --git a/web/Microsoft.Web.XmlTransform.dll b/web/Microsoft.Web.XmlTransform.dll new file mode 100755 index 0000000000000000000000000000000000000000..af41f33eb54aef08d20ce5eb25a92f2f186c9fa2 GIT binary patch literal 84480 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 literal 0 HcmV?d00001 diff --git a/web/Models/App.master b/web/Models/App.master index 5581077f..8099d811 100644 --- a/web/Models/App.master +++ b/web/Models/App.master @@ -23,6 +23,9 @@ Page.StyleSheetTheme = (string) Profile.UITheme; %> <%=Ajax.GlobalizationScript()%> diff --git a/web/Models/AppAdmin.master b/web/Models/AppAdmin.master index 77f74720..fdd1c29f 100644 --- a/web/Models/AppAdmin.master +++ b/web/Models/AppAdmin.master @@ -4,18 +4,14 @@ <% ViewState["orgtitle"] = Html.Translate(Page.Title); %> <% Page.Title = ViewState["orgtitle"] + " - " + YavscHelpers.SiteName; Page.Theme = (string) Profile.UITheme; -Page.StyleSheetTheme = (string) Profile.UITheme; - -%> +Page.StyleSheetTheme = (string) Profile.UITheme; %> - - + -" /> -" /> +<%= Html.ThemeCSSLinks(Page.StyleSheetTheme,"style")%> " /> " /> " /> @@ -49,7 +45,7 @@ var apiBaseUrl = '<%=Url.Content(Yavsc.WebApiConfig.UrlPrefixRelative)%>'; $(document).ready(function(){ <% foreach (Notification note in (IEnumerable) ViewData ["Notifications"] ) { if (note.click_action == null) {%> Yavsc.notice(<%=note.body%>); <% } -else {%> Yavsc.notice(<%=note.body%>, <%=note.click_action%>); <% } %> +else {%> Yavsc.notice(<%=note.body%>, <%=note.click_action%>, <%=note.click_action_name%>); <% } %> <% } %> }); diff --git a/web/Models/NoLogin.master b/web/Models/NoLogin.master index 0bb0b48a..522b627f 100644 --- a/web/Models/NoLogin.master +++ b/web/Models/NoLogin.master @@ -4,18 +4,14 @@ <% ViewState["orgtitle"] = Html.Translate(Page.Title); %> <% Page.Title = ViewState["orgtitle"] + " - " + YavscHelpers.SiteName; Page.Theme = (string) Profile.UITheme; -Page.StyleSheetTheme = (string) Profile.UITheme; - -%> +Page.StyleSheetTheme = (string) Profile.UITheme; %> - -" /> -" /> +<%= Html.ThemeCSSLinks(Page.StyleSheetTheme,"style")%> " /> " /> " /> @@ -27,9 +23,14 @@ Page.StyleSheetTheme = (string) Profile.UITheme; <%=Ajax.GlobalizationScript()%> + + diff --git a/web/Scripts/yavsc.admin.js b/web/Scripts/yavsc.admin.js new file mode 100644 index 00000000..a66dab22 --- /dev/null +++ b/web/Scripts/yavsc.admin.js @@ -0,0 +1,37 @@ + +var Admin = (function(){ +var self = {}; +self.addUserToRole = function (user,role,callback) { + Yavsc.ajax('Account/AddUserToRole', + { username: user, role: role }, callback ); +}; +self.removeUserFromRole = function (user,role,callback) { + Yavsc.ajax('Account/RemoveUserFromRole', + { username: user, role: role }, callback ); + } + +return self; +})(); + +(function() { + (function(jQuery) { + return jQuery.widget('Yavsc.decharger', { + options: { + roleName: 'Admin', + }, + _create: function() { + var _this = this; + var $bgobj = $(this.element); + // console.log ('Dechargeable:'+$bgobj.text()); + $bgobj.click(function() { + var user = $bgobj.text(); + Admin.removeUserFromRole(user,_this.options.roleName, + function() { + $bgobj.remove(); + }); + }); + }, +}); +})(jQuery); +}).call(this); + diff --git a/web/Scripts/yavsc.rate.js b/web/Scripts/yavsc.rate.js index 58f22d96..febdc9a7 100644 --- a/web/Scripts/yavsc.rate.js +++ b/web/Scripts/yavsc.rate.js @@ -49,9 +49,3 @@ }, })})(jQuery); }).call(this); - - $(document).ready(function(){ - $('[data-type="rate-site-skill"]').rate({target: 'Skill/RateSkill'}); - $('[data-type="rate-user-skill"]').rate({target: 'Skill/RateUserSkill'}); - $('[data-type="rate-bill"]').rate({target: 'Blogs/Rate'}); - }); diff --git a/web/Views/Account/RestrictedArea.aspx b/web/Views/Account/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/Account/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
+ <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
+ + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
+ + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
+ Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
+ <% } %> +
\ No newline at end of file diff --git a/web/Views/Admin/AddUserToRole.ascx b/web/Views/Admin/AddUserToRole.ascx index 214282db..8aaf2c2a 100644 --- a/web/Views/Admin/AddUserToRole.ascx +++ b/web/Views/Admin/AddUserToRole.ascx @@ -1,18 +1,17 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%= Html.ValidationSummary() %> -<% using(Html.BeginForm("AddUserToRole", "Admin")) - { %> +
-
<% if (ViewData ["UserName"] != null) { %> <%= Html.Hidden("RoleName",ViewData ["RoleName"]) %> <% } else { %>
- + +
+ <%= Html.ValidationMessage("UserName", "*") %>
<% } %> - <% if (ViewData ["RoleName"] != null) { %> <%= Html.Hidden("RoleName",ViewData ["RoleName"]) %> <% } else { %> @@ -22,8 +21,20 @@ <%= Html.ValidationMessage("RoleName", "*") %> <% } %> - -<%= Html.Hidden("ReturnUrl", Request.Url.PathAndQuery ) %> - + +" onclick="return ajaxSubmit();" >
-<% } %> \ No newline at end of file +
diff --git a/web/Views/Admin/RestrictedArea.aspx b/web/Views/Admin/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/Admin/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
+ <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
+ + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
+ + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
+ Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
+ <% } %> +
\ No newline at end of file diff --git a/web/Views/Admin/UsersInRole.aspx b/web/Views/Admin/UsersInRole.aspx index 7b073f84..d00255ac 100644 --- a/web/Views/Admin/UsersInRole.aspx +++ b/web/Views/Admin/UsersInRole.aspx @@ -2,7 +2,16 @@ <% ViewState["orgtitle"] = string.Format ( LocalizedText.UsersInRole , Html.Encode(ViewData["RoleName"])); %> <% Page.Title = ViewState["orgtitle"] + " - " + YavscHelpers.SiteName; %> - + + + +

"> @@ -11,7 +20,8 @@

-
    +
      " data-type="userlist"> + <%foreach (string username in (string[]) ViewData["UsersInRole"]){ %>
    • <%= username %>
    • <% } %> diff --git a/web/Views/BackOffice/RestrictedArea.aspx b/web/Views/BackOffice/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/BackOffice/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
      + <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
      + + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
      + + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
      + Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
      + <% } %> +
      \ No newline at end of file diff --git a/web/Views/Blogs/RestrictedArea.aspx b/web/Views/Blogs/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/Blogs/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
      + <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
      + + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
      + + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
      + Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
      + <% } %> +
      \ No newline at end of file diff --git a/web/Views/FileSystem/RestrictedArea.aspx b/web/Views/FileSystem/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/FileSystem/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
      + <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
      + + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
      + + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
      + Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
      + <% } %> +
      \ No newline at end of file diff --git a/web/Views/FrontOffice/RestrictedArea.aspx b/web/Views/FrontOffice/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/FrontOffice/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
      + <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
      + + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
      + + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
      + Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
      + <% } %> +
      \ No newline at end of file diff --git a/web/Views/FrontOffice/Skills.aspx b/web/Views/FrontOffice/Skills.aspx index f14932cf..dccba582 100644 --- a/web/Views/FrontOffice/Skills.aspx +++ b/web/Views/FrontOffice/Skills.aspx @@ -2,6 +2,11 @@ + diff --git a/web/Views/FrontOffice/UserSkills.aspx b/web/Views/FrontOffice/UserSkills.aspx index 91ae4482..ba60e268 100644 --- a/web/Views/FrontOffice/UserSkills.aspx +++ b/web/Views/FrontOffice/UserSkills.aspx @@ -2,6 +2,11 @@ + diff --git a/web/Views/Google/RestrictedArea.aspx b/web/Views/Google/RestrictedArea.aspx new file mode 100644 index 00000000..cfbca610 --- /dev/null +++ b/web/Views/Google/RestrictedArea.aspx @@ -0,0 +1,13 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master"%> + + Ce contenu est d'accès restreint :
      + <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
      + + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: + Ci après les tièrces parties autorisée actuellement :
      + + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
      + Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
      + <% } %> +
      \ No newline at end of file diff --git a/web/Views/Home/RestrictedArea.aspx b/web/Views/Home/RestrictedArea.aspx index c5661362..cfbca610 100644 --- a/web/Views/Home/RestrictedArea.aspx +++ b/web/Views/Home/RestrictedArea.aspx @@ -3,9 +3,11 @@ Ce contenu est d'accès restreint :
      <<%= Html.Encode(ViewData["ControllerName"]) %>/<%= Html.Encode(ViewData["ActionName"]) %>>
      - + <% if (Roles.IsUserInRole("Admin")) { %> + Admin only: Ci après les tièrces parties autorisée actuellement :
      - Roles autorisés :<%= Html.Encode(ViewData["Roles"]) %>
      + Roles autorisés : <%= Html.Encode(ViewData["Roles"]) %>
      Utilisateurs autorisés :<%= Html.Encode(ViewData["Users"]) %>
      + <% } %>
      \ No newline at end of file diff --git a/web/Web.csproj b/web/Web.csproj index 09cfaae6..70ec4def 100644 --- a/web/Web.csproj +++ b/web/Web.csproj @@ -498,6 +498,14 @@ + + + + + + + + diff --git a/yavscModel/ChangeLog b/yavscModel/ChangeLog index 2875730b..f8e81113 100644 --- a/yavscModel/ChangeLog +++ b/yavscModel/ChangeLog @@ -1,3 +1,9 @@ +2015-11-21 Paul Schneider + + * UserNameBase.cs: Permet l'usage des espaces dans les noms + d'utilisateurs, + à la création legacy, ou autres usage du nom d'utilisateur. + 2015-11-19 Paul Schneider * YavscModel.csproj: Lua config diff --git a/yavscModel/RolesAndMembers/UserNameBase.cs b/yavscModel/RolesAndMembers/UserNameBase.cs index f6a51328..f362566d 100644 --- a/yavscModel/RolesAndMembers/UserNameBase.cs +++ b/yavscModel/RolesAndMembers/UserNameBase.cs @@ -31,7 +31,7 @@ namespace Yavsc.Model.RolesAndMembers /// /// The name of the user. [Localizable(true), Required(ErrorMessage = "S'il vous plait, entrez un nom d'utilisateur") - ,Display(ResourceType=typeof(LocalizedText),Name="User_name"),RegularExpression("([a-z]|[A-Z]|[0-9] )+")] + ,Display(ResourceType=typeof(LocalizedText),Name="User_name"),RegularExpression(@"^[a-zA-Z .-_#]{1,100}$")] public string UserName { get; set; } }