summaryrefslogtreecommitdiff
path: root/Project-Unite/ACL.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Project-Unite/ACL.cs')
-rw-r--r--Project-Unite/ACL.cs318
1 files changed, 318 insertions, 0 deletions
diff --git a/Project-Unite/ACL.cs b/Project-Unite/ACL.cs
new file mode 100644
index 0000000..d85c896
--- /dev/null
+++ b/Project-Unite/ACL.cs
@@ -0,0 +1,318 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using Project_Unite.Models;
+using Microsoft.AspNet.Identity.Owin;
+using System.Web.Mvc;
+using System.Diagnostics;
+using System.Web.Mvc.Html;
+using System.Data.Entity;
+
+namespace Project_Unite
+{
+ public static class ACL
+ {
+ public static IHtmlString Markdown(this HtmlHelper hpr, string md)
+ {
+ return hpr.Raw(CommonMark.CommonMarkConverter.Convert(hpr.Encode(md)));
+ }
+
+ public static IHtmlString UserLink(this HtmlHelper hpr, string userId)
+ {
+ using(var db = new ApplicationDbContext())
+ {
+ var usr = db.Users.Include(x=>x.Roles).FirstOrDefault(x => x.Id == userId);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ var userRole = userRoles.OrderByDescending(m => m.Priority).First();
+ return hpr.ActionLink(usr.DisplayName, "ViewProfile", "Profiles", new { name = usr.UserName }, new { style = @"color: " + userRole.ColorHex });
+
+ }
+ }
+
+ public static IHtmlString UserName(this HtmlHelper hpr, string userId)
+ {
+ using (var db = new ApplicationDbContext())
+ {
+ var usr = db.Users.Include(x => x.Roles).FirstOrDefault(x => x.Id == userId);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ var userRole = userRoles.OrderByDescending(m => m.Priority).First();
+ return hpr.Raw($@"<strong style=""color:{userRole.ColorHex}"">{hpr.Encode(usr.DisplayName)}</strong>");
+
+ }
+ }
+
+
+ public static string UserNameRaw(string userId)
+ {
+ using (var db = new ApplicationDbContext())
+ {
+ var usr = db.Users.Include(x => x.Roles).FirstOrDefault(x => x.Id == userId);
+
+
+ return usr.DisplayName;
+
+ }
+ }
+
+ public static string UserNameFromEmailRaw(string userId)
+ {
+ using (var db = new ApplicationDbContext())
+ {
+ var usr = db.Users.Include(x => x.Roles).FirstOrDefault(x => x.UserName == userId);
+
+
+ return usr.DisplayName;
+
+ }
+ }
+
+ public static bool CanSee(string userName, string fId)
+ {
+
+
+ if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(fId))
+ return false;
+ if (!Granted(userName, "CanPostTopics"))
+ return false; //obviously if this role has a global restraint for this ACL def we shouldn't let them post in ANY forum.
+
+ var db = new ApplicationDbContext();
+
+ var usr = db.Users.Include(x => x.Roles).FirstOrDefault(u => u.UserName == userName);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ db.Dispose();
+ var userRole = userRoles.OrderByDescending(m => m.Priority).First();
+
+ db = new ApplicationDbContext();
+
+
+
+
+ var forums = db.ForumCategories;
+ var forum = forums.First(x => x.Id == fId);
+ var perms = forum.Permissions.FirstOrDefault(x => x.RoleId == userRole.Id);
+ if (perms == null)
+ {
+ UpdateACLDefinitions(fId);
+ return true;
+ }
+ return (int)perms.Permissions >= (int)PermissionPreset.CanRead;
+ }
+
+ public static bool UserEmailConfirmed(string username)
+ {
+ if (string.IsNullOrWhiteSpace(username))
+ return true;
+ return new ApplicationDbContext().Users.FirstOrDefault(x => x.UserName == username).EmailConfirmed;
+ }
+
+ public static Role LowestPriorityRole()
+ {
+ var db = new ApplicationDbContext();
+ var roles = db.Roles;
+ List<Role> actualRoles = new List<Role>();
+ foreach (Role r in roles)
+ {
+ actualRoles.Add(r);
+ }
+ return actualRoles.OrderBy(x => x.Priority).First();
+ }
+
+ public static bool CanReply(string userName, string fId)
+ {
+
+
+ if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(fId))
+ return false;
+ if (!Granted(userName, "CanPostTopics"))
+ return false; //obviously if this role has a global restraint for this ACL def we shouldn't let them post in ANY forum.
+
+ var db = new ApplicationDbContext();
+
+ var usr = db.Users.Include(x => x.Roles).FirstOrDefault(u => u.UserName == userName);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ db.Dispose();
+ var userRole = userRoles.OrderByDescending(m => m.Priority).First();
+
+ db = new ApplicationDbContext();
+
+
+
+
+ var forums = db.ForumCategories;
+ var forum = forums.First(x => x.Id == fId);
+ var perms = forum.Permissions.FirstOrDefault(x => x.RoleId == userRole.Id);
+ if (perms == null)
+ {
+ UpdateACLDefinitions(fId);
+ return true;
+ }
+ return perms.Permissions >= PermissionPreset.CanReply;
+ }
+
+ public static ApplicationUser GetUserInfo(string id)
+ {
+ return new ApplicationDbContext().Users.FirstOrDefault(x => x.Id == id);
+ }
+
+ public static bool CanPost(string userName, string fId)
+ {
+
+
+ if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(fId))
+ return false;
+ if (!Granted(userName, "CanPostTopics"))
+ return false; //obviously if this role has a global restraint for this ACL def we shouldn't let them post in ANY forum.
+
+ var db = new ApplicationDbContext();
+
+ var usr = db.Users.Include(x => x.Roles).FirstOrDefault(u => u.UserName == userName);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ db.Dispose();
+ var userRole = userRoles.OrderByDescending(m => m.Priority).First();
+
+ db = new ApplicationDbContext();
+
+
+
+
+ var forums = db.ForumCategories;
+ var forum = forums.First(x => x.Id == fId);
+ var perms = forum.Permissions.FirstOrDefault(x=>x.RoleId==userRole.Id);
+ if (perms == null)
+ {
+ UpdateACLDefinitions(fId);
+ return true;
+ }
+ return perms.Permissions >= PermissionPreset.CanPost;
+ }
+
+ public static void UpdateACLDefinitions(string fid)
+ {
+ var db = new ApplicationDbContext();
+ var forum = db.ForumCategories.FirstOrDefault(x => x.Id == fid);
+ if (forum == null)
+ return;
+ int recordsAdded = 0;
+
+ if (forum.Permissions.Length < db.Roles.Count())
+ {
+ var rolesToAdd = db.Roles.Where(r => forum.Permissions.FirstOrDefault(p => p.RoleId == r.Id) == null);
+ foreach(var role in rolesToAdd)
+ {
+ var perm = new ForumPermission();
+ perm.Id = Guid.NewGuid().ToString();
+ perm.CategoryId = forum.Id;
+ perm.RoleId = role.Id;
+ perm.Permissions = PermissionPreset.CanPost;
+ db.ForumPermissions.Add(perm);
+ recordsAdded++;
+ }
+ db.AuditLogs.Add(new AuditLog("system", AuditLogLevel.Admin, $"Automatic forum ACL update occurred - Forum: {forum.Name}, records added: {recordsAdded}."));
+ db.SaveChanges();
+ }
+
+ }
+
+ public static bool CanManageRole(string userId, string roleId)
+ {
+ try
+ {
+ if (!Granted(userId, "CanEditRoles"))
+ return false;
+
+ var db = new ApplicationDbContext();
+
+ var usr = db.Users.FirstOrDefault(u => u.UserName == userId);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ var manageRole = (Role)db.Roles.FirstOrDefault(x => x.Id == roleId);
+
+ db.Dispose();
+ var userRole = (Role)userRoles.OrderByDescending(m => m.Priority).First();
+ if (manageRole.Priority > userRole.Priority)
+ return false;
+
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+
+ public static ForumCategory GetForumById(string id)
+ {
+ var db = new ApplicationDbContext();
+
+ return db.ForumCategories.FirstOrDefault(x => x.Id == id);
+
+ }
+
+ public static bool Granted(string userName, string prop)
+ {
+ if (string.IsNullOrWhiteSpace(prop))
+ return true;
+
+ try
+ {
+ var db = new ApplicationDbContext();
+
+ var usr = db.Users.FirstOrDefault(u => u.UserName == userName);
+
+ var userRoles = new List<Role>();
+ foreach (var usrRole in usr.Roles)
+ {
+ userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ }
+ db.Dispose();
+ var userRole = userRoles.OrderByDescending(m => m.Priority).First();
+
+ var t = userRole.GetType();
+ foreach (var propInf in t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
+ {
+ if (propInf.Name == prop && propInf.PropertyType == typeof(bool))
+ return (bool)propInf.GetValue(userRole);
+ }
+
+ return false;
+ }
+ catch (Exception ex)
+ {
+ Debug.Print(ex.ToString());
+ return false;
+ }
+
+ }
+ }
+} \ No newline at end of file