From: <mar...@us...> - 2010-02-13 20:41:29
|
Revision: 22 http://cronoscontrol.svn.sourceforge.net/cronoscontrol/?rev=22&view=rev Author: marioarce Date: 2010-02-13 20:41:22 +0000 (Sat, 13 Feb 2010) Log Message: ----------- Ticket #6 Custom Role Provider for CronosControl * Implements the methods of RoleProvider to provide the ASP.NET role services for CronosControl TrackerManager.cs * Added the methods AddUsersToRoles(), GetRolesForUser(), IsUserInRole() that supports the Custom Role Provider for CronosControl * Modified the method AddTracker() in order to use the CronosControlContext instead of SettingManager Modified Paths: -------------- source/trunk/CronosControl/Libraries/BusinessLogic/Tracker/TrackerManager.cs Added Paths: ----------- source/trunk/CronosControl/Libraries/BusinessLogic/Profile/CronosControlRoleProvider.cs Added: source/trunk/CronosControl/Libraries/BusinessLogic/Profile/CronosControlRoleProvider.cs =================================================================== --- source/trunk/CronosControl/Libraries/BusinessLogic/Profile/CronosControlRoleProvider.cs (rev 0) +++ source/trunk/CronosControl/Libraries/BusinessLogic/Profile/CronosControlRoleProvider.cs 2010-02-13 20:41:22 UTC (rev 22) @@ -0,0 +1,220 @@ +//------------------------------------------------------------------------------ +// The contents of this file are subject to the GNU General Public License Version 3.0 ("License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.cronoscontrol.net/license.html. +// +// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. +// See the License for the specific language governing rights and limitations under the License. +// +// The Original Code is CronosControl. +// The Initial Developer of the Original Code is WebImageConsulting http://www.wicnow.com/. +// All Rights Reserved. +// +// Contributor(s): Mario Alberto Arce, _______. +//------------------------------------------------------------------------------ + +using System; +using System.Linq; +using System.Text; +using System.Web.Security; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration.Provider; +using CronosControl.Model; +using CronosControl.BusinessLogic.Tracker; + +namespace CronosControl.BusinessLogic.Profile +{ + /// <summary> + /// Manages storage of role membership information for Cronos Control in a data source. + /// </summary> + public class CronosControlRoleProvider : RoleProvider + { + #region Fields + private string _AppName; + #endregion + + #region Methods + /// <summary> + /// Adds the specified user names to the specified roles for the configured applicationName + /// </summary> + /// <param name="usernames">A string array of user names to be added to the specified roles.</param> + /// <param name="roleNames">A string array of the role names to add the specified user names to.</param> + public override void AddUsersToRoles(string[] usernames, string[] roleNames) + { + try + { + TrackerManager.AddUsersToRoles(usernames, roleNames); + } + catch (Exception ex) + { + throw new ProviderException(ex.Message, ex); + } + } + + /// <summary> + /// Adds a new role to the data source for the configured applicationName. + /// </summary> + /// <param name="roleName">The name of the role to create.</param> + public override void CreateRole(string roleName) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Removes a role from the data source for the configured applicationName. + /// </summary> + /// <param name="roleName">The name of the role to delete.</param> + /// <param name="throwOnPopulatedRole">If true, throw an exception if roleName has one or more members and do not delete roleName.</param> + /// <returns>true if the role was successfully deleted; otherwise, false.</returns> + public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Gets an array of user names in a role where the user name contains the specified user name to match. + /// </summary> + /// <param name="roleName">The role to search in.</param> + /// <param name="usernameToMatch">The user name to search for.</param> + /// <returns>A string array containing the names of all the users where the user name matches usernameToMatch and the user is a member of the specified role.</returns> + public override string[] FindUsersInRole(string roleName, string usernameToMatch) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Gets a list of all the roles for the configured applicationName. + /// </summary> + /// <returns>A string array containing the names of all the roles stored in the data source for the configured applicationName.</returns> + public override string[] GetAllRoles() + { + throw new NotImplementedException(); + } + + /// <summary> + /// Gets a list of the roles that a specified user is in for the configured applicationName. + /// </summary> + /// <param name="username">The user to return a list of roles for.</param> + /// <returns>A string array containing the names of all the roles that the specified user is in for the configured applicationName.</returns> + public override string[] GetRolesForUser(string username) + { + User user = TrackerManager.GetTrackerByUsername(username); + if (user == null) + return new string[] { }; + + return TrackerManager.GetRolesForUser(username); + } + + /// <summary> + /// Gets a list of users in the specified role for the configured applicationName. + /// </summary> + /// <param name="roleName">The name of the role to get the list of users for.</param> + /// <returns>A string array containing the names of all the users who are members of the specified role for the configured applicationName.</returns> + public override string[] GetUsersInRole(string roleName) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Initializes the provider. + /// </summary> + /// <param name="name">The friendly name of the provider.</param> + /// <param name="config">A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider.</param> + public override void Initialize(string name, NameValueCollection config) + { + if (config == null) + { + throw new ArgumentNullException("config"); + } + if (string.IsNullOrEmpty(name)) + { + name = "StoreRoleProvider"; + } + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", "Roles Provider"); + } + base.Initialize(name, config); + this._AppName = config["applicationName"]; + if (string.IsNullOrEmpty(this._AppName)) + { + this._AppName = "CronosControl"; + } + if (this._AppName.Length > 0x100) + { + throw new ProviderException("Provider application name too long"); + } + config.Remove("applicationName"); + + string connectionStringName = config["connectionStringName"]; + if (string.IsNullOrEmpty(connectionStringName)) + { + this._AppName = "CronosControlEntities"; + } + config.Remove("connectionStringName"); + + if (config.Count > 0) + { + string text2 = config.GetKey(0); + if (!string.IsNullOrEmpty(text2)) + { + throw new ProviderException(string.Format("Provider unrecognized attribute {0}", text2)); + } + } + } + + /// <summary> + /// Gets a value indicating whether the specified user is in the specified role for the configured applicationName. + /// </summary> + /// <param name="username">The user name to search for.</param> + /// <param name="roleName">The role to search in.</param> + /// <returns>true if the specified user is in the specified role for the configured applicationName; otherwise, false.</returns> + public override bool IsUserInRole(string username, string roleName) + { + User user = TrackerManager.GetTrackerByUsername(username); + if (user == null) + return false; + + return TrackerManager.IsUserInRole(username, roleName); + } + + /// <summary> + /// Removes the specified user names from the specified roles for the configured applicationName. + /// </summary> + /// <param name="usernames">A string array of user names to be removed from the specified roles.</param> + /// <param name="roleNames">A string array of role names to remove the specified user names from.</param> + public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) + { + throw new NotImplementedException(); + } + + /// <summary> + /// Gets a value indicating whether the specified role name already exists in the role data source for the configured applicationName. + /// </summary> + /// <param name="roleName">The name of the role to search for in the data source.</param> + /// <returns>true if the role name already exists in the data source for the configured applicationName; otherwise, false.</returns> + public override bool RoleExists(string roleName) + { + throw new NotImplementedException(); + } + #endregion + + #region Properties + /// <summary> + /// Gets or sets the name of the application to store and retrieve role information for. + /// </summary> + public override string ApplicationName + { + get + { + return this._AppName; + } + set + { + this._AppName = value; + } + } + #endregion + } +} Modified: source/trunk/CronosControl/Libraries/BusinessLogic/Tracker/TrackerManager.cs =================================================================== --- source/trunk/CronosControl/Libraries/BusinessLogic/Tracker/TrackerManager.cs 2010-02-10 04:00:26 UTC (rev 21) +++ source/trunk/CronosControl/Libraries/BusinessLogic/Tracker/TrackerManager.cs 2010-02-13 20:41:22 UTC (rev 22) @@ -17,11 +17,12 @@ using System.Text; using System.Web.Security; using System.Collections.Generic; +using System.Configuration.Provider; using System.Security.Cryptography; using CronosControl.Model; -using CronosControl.BusinessLogic.Configuration.Settings; using CronosControl.Business; using CronosControl.Common.Utils; +using CronosControl.BusinessLogic.Configuration.Settings; namespace CronosControl.BusinessLogic.Tracker { @@ -64,7 +65,7 @@ status = MembershipCreateStatus.InvalidEmail; - int idCompany = Convert.ToInt32(SettingManager.Current["base", "idCompany"]); + int idCompany = CronosControlContext.Current.CurrentCompany.IdCompany; passwordHash = CreatePasswordMd5Hash(password); User userEntity = new User(); @@ -92,6 +93,45 @@ } /// <summary> + /// Adds the specified user names to the specified roles for the configured applicationName + /// </summary> + /// <param name="usernames">A string array of user names to be added to the specified roles.</param> + /// <param name="roleNames">A string array of the role names to add the specified user names to.</param> + public static void AddUsersToRoles(string[] usernames, string[] roleNames) + { + foreach (string username in usernames) + { + // get User + User user = GetTrackerByUsername(username); + if (user == null) + { + // user not found!, continue... + continue; + } + + foreach (var roleName in roleNames) + { + CronosControlEntities cronosControlEntities = new CronosControlEntities(); + // get Role + Role role = (from r in cronosControlEntities.Role + where r.Name.Equals(roleName) + select r).First<Role>(); + + Project project = CronosControlContext.Current.CurrentProject; + + // assign role to the user + UserProjectRole userProjectRole = new UserProjectRole(); + userProjectRole.Role = role; + userProjectRole.Project = project; + userProjectRole.IdUser = user.IdUser; + + cronosControlEntities.AddToUserProjectRole(userProjectRole); + cronosControlEntities.SaveChanges(); + } + } + } + + /// <summary> /// Creates a salt /// </summary> /// <param name="size">A salt size</param> @@ -152,6 +192,40 @@ } /// <summary> + /// Gets a list of the roles that a specified user is in for the configured applicationName. + /// </summary> + /// <param name="username">The user to return a list of roles for.</param> + /// <returns>A string array containing the names of all the roles that the specified user is in for the configured applicationName.</returns> + public static string[] GetRolesForUser(string username) + { + // get User + User user = GetTrackerByUsername(username); + if (user == null) + { + // user not found! + return new string[] { }; + } + + CronosControlEntities cronosControlEntities = new CronosControlEntities(); + + Project project = CronosControlContext.Current.CurrentProject; + + // get UserProjectRole + List<string> userProjectRoles = (from upr in cronosControlEntities.UserProjectRole + join ro in cronosControlEntities.Role + on new { upr.Role.IdRole } equals new { ro.IdRole } + where (upr.IdUser == user.IdUser && upr.Project.IdProject == project.IdProject) + select ro.Name).ToList<string>(); + + string[] result = new string[userProjectRoles.Count]; + for (int i = 0; i < userProjectRoles.Count; i++) + { + result[i] = userProjectRoles[i]; + } + return result; + } + + /// <summary> /// Gets a tracket by email /// </summary> /// <param name="Username">Tracker email</param> @@ -199,15 +273,46 @@ if (string.IsNullOrEmpty(username)) return null; + User user; CronosControlEntities cronosControlEntities = new CronosControlEntities(); - User user = (from u in cronosControlEntities.User - where u.Username.Equals(username) - select u).First<User>(); + try + { + user = (from u in cronosControlEntities.User + where u.Username.Equals(username) + select u).First<User>(); + } + catch + { + return null; + } return user; } /// <summary> + /// Gets a value indicating whether the specified user is in the specified role for the configured applicationName. + /// </summary> + /// <param name="username">The user name to search for.</param> + /// <param name="roleName">The role to search in.</param> + /// <returns>true if the specified user is in the specified role for the configured applicationName; otherwise, false.</returns> + public static bool IsUserInRole(string username, string roleName) + { + if (string.IsNullOrEmpty(username)) + return false; + if (string.IsNullOrEmpty(roleName)) + return false; + + User user = GetTrackerByUsername(username); + + CronosControlEntities cronosControlEntities = new CronosControlEntities(); + int result = (from upr in cronosControlEntities.UserProjectRole + where (upr.IdUser == 1 && upr.Role.Name.Equals(roleName)) + select upr).Count<UserProjectRole>(); + + return (result == 1); + } + + /// <summary> /// Login a tracker /// </summary> /// <param name="Email">A tracker username</param> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |