PageRenderTime 53ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/BlogEngine/DotNetSlave.BusinessLogic/Providers/DbRoleProvider.cs

#
C# | 584 lines | 359 code | 92 blank | 133 comment | 34 complexity | f19448a353f975ae39a018a1044a6e01 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, BSD-3-Clause
  1. namespace BlogEngine.Core.Providers
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Collections.Specialized;
  6. using System.Configuration;
  7. using System.Configuration.Provider;
  8. using System.Data;
  9. using System.Data.Common;
  10. using System.Web.Security;
  11. /// <summary>
  12. /// Generic Db Role Provider
  13. /// </summary>
  14. public class DbRoleProvider : RoleProvider
  15. {
  16. #region Constants and Fields
  17. /// <summary>
  18. /// The application name.
  19. /// </summary>
  20. private string applicationName;
  21. /// <summary>
  22. /// The conn string name.
  23. /// </summary>
  24. private string connStringName;
  25. /// <summary>
  26. /// The parm prefix.
  27. /// </summary>
  28. private string parmPrefix;
  29. /// <summary>
  30. /// The table prefix.
  31. /// </summary>
  32. private string tablePrefix;
  33. #endregion
  34. #region Properties
  35. /// <summary>
  36. /// Gets or sets the application name as set in the web.config
  37. /// otherwise returns BlogEngine. Set will throw an error.
  38. /// </summary>
  39. public override string ApplicationName
  40. {
  41. get
  42. {
  43. return this.applicationName;
  44. }
  45. set
  46. {
  47. throw new NotImplementedException();
  48. }
  49. }
  50. #endregion
  51. #region Public Methods
  52. /// <summary>
  53. /// Adds all users in user array to all roles in role array
  54. /// </summary>
  55. /// <param name="usernames">A string array of user names to be added to the specified roles.</param>
  56. /// <param name="roleNames">A string array of the role names to add the specified user names to.</param>
  57. public override void AddUsersToRoles(string[] usernames, string[] roleNames)
  58. {
  59. using (var conn = this.CreateConnection())
  60. {
  61. if (conn.HasConnection)
  62. {
  63. using (var cmd = conn.CreateCommand())
  64. {
  65. cmd.CommandType = CommandType.Text;
  66. var parms = cmd.Parameters;
  67. foreach (var user in usernames)
  68. {
  69. //parms.Clear();
  70. //cmd.CommandText = string.Format("SELECT UserID FROM {0}Users WHERE BlogID = {1}blogid AND UserName = {1}user", this.tablePrefix, this.parmPrefix);
  71. //parms.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  72. //parms.Add(conn.CreateParameter(FormatParamName("user"), user));
  73. //var userId = Int32.Parse(cmd.ExecuteScalar().ToString());
  74. foreach (var role in roleNames)
  75. {
  76. if (!role.Equals(BlogConfig.AnonymousRole))
  77. {
  78. //parms.Clear();
  79. //cmd.CommandText = string.Format("SELECT RoleID FROM {0}Roles WHERE BlogID = {1}blogid AND Role = {1}role", this.tablePrefix, this.parmPrefix);
  80. //parms.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  81. //parms.Add(conn.CreateParameter(FormatParamName("role"), role));
  82. //var roleId = Int32.Parse(cmd.ExecuteScalar().ToString());
  83. parms.Clear();
  84. cmd.CommandText = string.Format("INSERT INTO {0}UserRoles (BlogID, UserName, Role) VALUES ({1}blogID, {1}username, {1}role)", this.tablePrefix, this.parmPrefix);
  85. parms.Add(conn.CreateParameter(FormatParamName("blogID"), Blog.CurrentInstance.Id.ToString()));
  86. parms.Add(conn.CreateParameter(FormatParamName("username"), user.Trim()));
  87. parms.Add(conn.CreateParameter(FormatParamName("role"), role.Trim()));
  88. cmd.ExecuteNonQuery();
  89. }
  90. }
  91. }
  92. }
  93. }
  94. }
  95. // This needs to be called in order to keep the Right class in sync.
  96. Right.RefreshAllRights();
  97. }
  98. /// <summary>
  99. /// Adds a new role to the database
  100. /// </summary>
  101. /// <param name="roleName">The name of the role to create.</param>
  102. public override void CreateRole(string roleName)
  103. {
  104. using (var conn = this.CreateConnection())
  105. {
  106. if (conn.HasConnection)
  107. {
  108. using (var cmd = conn.CreateTextCommand(string.Format("INSERT INTO {0}Roles (BlogID, role) VALUES ({1}blogid, {1}role)", this.tablePrefix, this.parmPrefix)))
  109. {
  110. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  111. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("role"), roleName));
  112. cmd.ExecuteNonQuery();
  113. }
  114. }
  115. }
  116. // This needs to be called in order to keep the Right class in sync.
  117. Right.RefreshAllRights();
  118. }
  119. /// <summary>
  120. /// Removes a role from database
  121. /// </summary>
  122. /// <param name="roleName">The name of the role to delete.</param>
  123. /// <param name="throwOnPopulatedRole">If true, throw an exception if <paramref name="roleName"/> has one or more members and do not delete <paramref name="roleName"/>.</param>
  124. /// <returns>The delete role.</returns>
  125. public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
  126. {
  127. var success = false;
  128. if (!Security.IsSystemRole(roleName))
  129. {
  130. using (var conn = this.CreateConnection())
  131. {
  132. if (conn.HasConnection)
  133. {
  134. using (var cmd = conn.CreateTextCommand(string.Format("DELETE FROM {0}Roles WHERE BlogID = {1}blogid AND Role = {1}role", this.tablePrefix, this.parmPrefix)))
  135. {
  136. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  137. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("role"), roleName));
  138. cmd.ExecuteNonQuery();
  139. success = true;
  140. }
  141. }
  142. }
  143. }
  144. // This needs to be called in order to keep the Right class in sync.
  145. Right.RefreshAllRights();
  146. return success;
  147. }
  148. /// <summary>
  149. /// Returns all users in selected role with names that match usernameToMatch
  150. /// </summary>
  151. /// <param name="roleName">The role to search in.</param>
  152. /// <param name="usernameToMatch">The user name to search for.</param>
  153. /// <returns>
  154. /// A string array containing the names of all the users where the user name matches <paramref name="usernameToMatch"/> and the user is a member of the specified role.
  155. /// </returns>
  156. public override string[] FindUsersInRole(string roleName, string usernameToMatch)
  157. {
  158. var users = new List<string>();
  159. using (var conn = this.CreateConnection())
  160. {
  161. if (conn.HasConnection)
  162. {
  163. var sqlQuery = string.Format(
  164. " SELECT ur.UserName " +
  165. " FROM {0}UsersRoles ur " +
  166. " WHERE ur.BlogID = {1}blogid " +
  167. " AND ur.Role = {1}role " +
  168. " AND ur.UserName LIKE {1}name", this.tablePrefix, this.parmPrefix);
  169. using (var cmd = conn.CreateTextCommand(sqlQuery))
  170. {
  171. var parms = cmd.Parameters;
  172. parms.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  173. parms.Add(conn.CreateParameter(FormatParamName("role"), roleName));
  174. parms.Add(conn.CreateParameter(FormatParamName("name"), string.Format("{0}%", usernameToMatch)));
  175. using (var rdr = cmd.ExecuteReader())
  176. {
  177. while (rdr.Read())
  178. {
  179. if (!rdr.IsDBNull(0))
  180. {
  181. users.Add(rdr.GetString(0));
  182. }
  183. }
  184. }
  185. }
  186. }
  187. }
  188. return users.ToArray();
  189. }
  190. /// <summary>
  191. /// Returns array of all roles in database
  192. /// </summary>
  193. /// <returns>
  194. /// A string array containing the names of all the roles stored in the data source for the configured applicationName.
  195. /// </returns>
  196. public override string[] GetAllRoles()
  197. {
  198. var roles = new List<string>();
  199. using (var conn = this.CreateConnection())
  200. {
  201. if (conn.HasConnection)
  202. {
  203. using (var cmd = conn.CreateTextCommand(string.Format("SELECT role FROM {0}Roles WHERE BlogID = {1}blogid ", this.tablePrefix, this.parmPrefix)))
  204. {
  205. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  206. using (var rdr = cmd.ExecuteReader())
  207. {
  208. while (rdr.Read())
  209. {
  210. if (!rdr.IsDBNull(0))
  211. {
  212. roles.Add(rdr.GetString(0));
  213. }
  214. }
  215. }
  216. }
  217. }
  218. }
  219. return roles.ToArray();
  220. }
  221. /// <summary>
  222. /// Return an array of roles that user is in
  223. /// </summary>
  224. /// <param name="username">The user to return a list of roles for.</param>
  225. /// <returns>
  226. /// A string array containing the names of all the roles that the specified user is in for the configured applicationName.
  227. /// </returns>
  228. public override string[] GetRolesForUser(string username)
  229. {
  230. var roles = new List<string>();
  231. using (var conn = this.CreateConnection())
  232. {
  233. if (conn.HasConnection)
  234. {
  235. var sqlQuery = string.Format(
  236. " SELECT ur.role " +
  237. " FROM {0}UserRoles ur " +
  238. " WHERE ur.BlogID = {1}blogid " +
  239. " AND ur.UserName = {1}name", this.tablePrefix, this.parmPrefix);
  240. using (var cmd = conn.CreateTextCommand(sqlQuery))
  241. {
  242. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  243. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("name"), username));
  244. using (var rdr = cmd.ExecuteReader())
  245. {
  246. while (rdr.Read())
  247. {
  248. if (!rdr.IsDBNull(0))
  249. {
  250. roles.Add(rdr.GetString(0));
  251. }
  252. }
  253. }
  254. }
  255. }
  256. }
  257. return roles.ToArray();
  258. }
  259. /// <summary>
  260. /// Returns array of users in selected role
  261. /// </summary>
  262. /// <param name="roleName">The name of the role to get the list of users for.</param>
  263. /// <returns>
  264. /// A string array containing the names of all the users who are members of the specified role for the configured applicationName.
  265. /// </returns>
  266. public override string[] GetUsersInRole(string roleName)
  267. {
  268. var users = new List<string>();
  269. using (var conn = this.CreateConnection())
  270. {
  271. if (conn.HasConnection)
  272. {
  273. var sqlQuery = string.Format(
  274. " SELECT ur.UserName " +
  275. " FROM {0}UserRoles ur " +
  276. " WHERE ur.BlogID = {1}blogid " +
  277. " AND ur.Role = {1}role", this.tablePrefix, this.parmPrefix);
  278. using (var cmd = conn.CreateTextCommand(sqlQuery))
  279. {
  280. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  281. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("role"), roleName));
  282. using (var rdr = cmd.ExecuteReader())
  283. {
  284. while (rdr.Read())
  285. {
  286. if (!rdr.IsDBNull(0))
  287. {
  288. users.Add(rdr.GetString(0));
  289. }
  290. }
  291. }
  292. }
  293. }
  294. }
  295. return users.ToArray();
  296. }
  297. /// <summary>
  298. /// Initializes the provider
  299. /// </summary>
  300. /// <param name="name">
  301. /// Configuration name
  302. /// </param>
  303. /// <param name="config">
  304. /// Configuration settings
  305. /// </param>
  306. public override void Initialize(string name, NameValueCollection config)
  307. {
  308. if (config == null)
  309. {
  310. throw new ArgumentNullException("config");
  311. }
  312. if (String.IsNullOrEmpty(name))
  313. {
  314. name = "DbMembershipProvider";
  315. }
  316. if (String.IsNullOrEmpty(config["description"]))
  317. {
  318. config.Remove("description");
  319. config.Add("description", "Generic Database Membership Provider");
  320. }
  321. base.Initialize(name, config);
  322. if (config["connectionStringName"] == null)
  323. {
  324. // default to BlogEngine
  325. config["connectionStringName"] = "BlogEngine";
  326. }
  327. this.connStringName = config["connectionStringName"];
  328. config.Remove("connectionStringName");
  329. if (config["tablePrefix"] == null)
  330. {
  331. // default
  332. config["tablePrefix"] = "be_";
  333. }
  334. this.tablePrefix = config["tablePrefix"];
  335. config.Remove("tablePrefix");
  336. if (config["parmPrefix"] == null)
  337. {
  338. // default
  339. config["parmPrefix"] = "@";
  340. }
  341. this.parmPrefix = config["parmPrefix"];
  342. config.Remove("parmPrefix");
  343. if (config["applicationName"] == null)
  344. {
  345. // default to BlogEngine
  346. config["applicationName"] = "BlogEngine";
  347. }
  348. this.applicationName = config["applicationName"];
  349. config.Remove("applicationName");
  350. // Throw an exception if unrecognized attributes remain
  351. if (config.Count > 0)
  352. {
  353. var attr = config.GetKey(0);
  354. if (!String.IsNullOrEmpty(attr))
  355. {
  356. throw new ProviderException(string.Format("Unrecognized attribute: {0}", attr));
  357. }
  358. }
  359. }
  360. /// <summary>
  361. /// Check to see if user is in a role
  362. /// </summary>
  363. /// <param name="username">The user name to search for.</param>
  364. /// <param name="roleName">The role to search in.</param>
  365. /// <returns>The is user in role.</returns>
  366. public override bool IsUserInRole(string username, string roleName)
  367. {
  368. var roleFound = false;
  369. using (var conn = this.CreateConnection())
  370. {
  371. if (conn.HasConnection)
  372. {
  373. var sqlQuery = string.Format(
  374. " SELECT ur.UserRoleID " +
  375. " FROM {0}UserRoles ur " +
  376. " WHERE ur.BlogID = {1}blogid " +
  377. " AND ur.UserName = {1}name " +
  378. " AND ur.role = {1}role", this.tablePrefix, this.parmPrefix);
  379. using (var cmd = conn.CreateTextCommand(sqlQuery))
  380. {
  381. var parms = cmd.Parameters;
  382. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  383. parms.Add(conn.CreateParameter(FormatParamName("name"), username));
  384. parms.Add(conn.CreateParameter(FormatParamName("role"), roleName));
  385. using (var rdr = cmd.ExecuteReader())
  386. {
  387. roleFound = rdr.Read();
  388. }
  389. }
  390. }
  391. }
  392. return roleFound;
  393. }
  394. /// <summary>
  395. /// Removes all users in user array from all roles in role array
  396. /// </summary>
  397. /// <param name="usernames">A string array of user names to be removed from the specified roles.</param>
  398. /// <param name="roleNames">A string array of role names to remove the specified user names from.</param>
  399. public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
  400. {
  401. using (var conn = this.CreateConnection())
  402. {
  403. if (conn.HasConnection)
  404. {
  405. using (var cmd = conn.CreateCommand())
  406. {
  407. cmd.CommandType = CommandType.Text;
  408. var parms = cmd.Parameters;
  409. foreach (var user in usernames)
  410. {
  411. //parms.Clear();
  412. //cmd.CommandText = string.Format("SELECT UserID FROM {0}Users WHERE BlogID = {1}blogid AND UserName = {1}user", this.tablePrefix, this.parmPrefix);
  413. //parms.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  414. //parms.Add(conn.CreateParameter(FormatParamName("user"), user));
  415. //int userId;
  416. //try
  417. //{
  418. // userId = Int32.Parse(cmd.ExecuteScalar().ToString());
  419. //}
  420. //catch
  421. //{
  422. // userId = 0;
  423. //}
  424. //if (userId <= 0)
  425. //{
  426. // continue;
  427. //}
  428. foreach (var role in roleNames)
  429. {
  430. //parms.Clear();
  431. //cmd.CommandText = string.Format("SELECT RoleID FROM {0}Roles WHERE BlogID = {1}blogid AND Role = {1}role", this.tablePrefix, this.parmPrefix);
  432. //parms.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  433. //parms.Add(conn.CreateParameter(FormatParamName("role"), role));
  434. //var roleId = Int32.Parse(cmd.ExecuteScalar().ToString());
  435. parms.Clear();
  436. cmd.CommandText = string.Format("DELETE FROM {0}UserRoles WHERE BlogID = {1}blogid AND UserName = {1}username AND Role = {1}role", this.tablePrefix, this.parmPrefix);
  437. parms.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  438. parms.Add(conn.CreateParameter(FormatParamName("username"), user.Trim()));
  439. parms.Add(conn.CreateParameter(FormatParamName("role"), role.Trim()));
  440. cmd.ExecuteNonQuery();
  441. }
  442. }
  443. }
  444. }
  445. }
  446. // This needs to be called in order to keep the Right class in sync.
  447. Right.RefreshAllRights();
  448. }
  449. /// <summary>
  450. /// Checks to see if role exists
  451. /// </summary>
  452. /// <param name="roleName">The name of the role to search for in the data source.</param>
  453. /// <returns>The role exists.</returns>
  454. public override bool RoleExists(string roleName)
  455. {
  456. var roleFound = false;
  457. using (var conn = this.CreateConnection())
  458. {
  459. if (conn.HasConnection)
  460. {
  461. using (var cmd = conn.CreateTextCommand(string.Format("SELECT roleID FROM {0}Roles WHERE BlogID = {1}blogid AND role = {1}role", this.tablePrefix, this.parmPrefix)))
  462. {
  463. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("blogid"), Blog.CurrentInstance.Id.ToString()));
  464. cmd.Parameters.Add(conn.CreateParameter(FormatParamName("role"), roleName));
  465. using (var rdr = cmd.ExecuteReader())
  466. {
  467. roleFound = rdr.Read();
  468. }
  469. }
  470. }
  471. }
  472. return roleFound;
  473. }
  474. #endregion
  475. #region "Methods"
  476. private DbConnectionHelper CreateConnection()
  477. {
  478. var settings = ConfigurationManager.ConnectionStrings[this.connStringName];
  479. return new DbConnectionHelper(settings);
  480. }
  481. /// <summary>
  482. /// Returns a formatted parameter name to include this DbRoleProvider instance's paramPrefix.
  483. /// </summary>
  484. /// <param name="parameterName"></param>
  485. /// <returns></returns>
  486. private string FormatParamName(string parameterName)
  487. {
  488. return String.Format("{0}{1}", this.parmPrefix, parameterName);
  489. }
  490. #endregion
  491. }
  492. }