summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael <[email protected]>2017-05-17 09:52:57 -0400
committerMichael <[email protected]>2017-05-17 09:52:57 -0400
commit7e54c9b3fad48c7bce1134f7937924f120f1999c (patch)
treef922e35184e7e9f0cc90d0dc11f4541a414d35bd
parent1abd027bdbd55fac59ad5bcdd8df301bb2499204 (diff)
downloadproject-unite-7e54c9b3fad48c7bce1134f7937924f120f1999c.tar.gz
project-unite-7e54c9b3fad48c7bce1134f7937924f120f1999c.tar.bz2
project-unite-7e54c9b3fad48c7bce1134f7937924f120f1999c.zip
More fixes, specifically with forum
-rw-r--r--Project-Unite/ACL.cs159
-rw-r--r--Project-Unite/Models/AdminViewModels.cs21
-rw-r--r--Project-Unite/Models/ForumCategory.cs50
-rw-r--r--Project-Unite/Models/IdentityModels.cs1
-rw-r--r--Project-Unite/Views/Forum/Index.cshtml28
-rw-r--r--Project-Unite/Views/Forum/ViewForum.cshtml171
6 files changed, 135 insertions, 295 deletions
diff --git a/Project-Unite/ACL.cs b/Project-Unite/ACL.cs
index 5155573..74ac07e 100644
--- a/Project-Unite/ACL.cs
+++ b/Project-Unite/ACL.cs
@@ -224,37 +224,26 @@ namespace Project_Unite
public static bool CanSee(string userName, string fId)
{
-
-
- if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(fId))
- return false;
-
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);
+ var user = db.Users.FirstOrDefault(x => x.UserName == userName);
+ var frm = db.ForumCategories.FirstOrDefault(x => x.Id == fId);
+ if (frm == null) return false;
+ if (user == null) {
+ return frm.VisibleToGuests;
}
- 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)
+ else
{
- UpdateACLDefinitions(fId);
- return true;
+ if (user.HighestRole.IsAdmin)
+ return frm.AdminPermission > 0;
+ if (user.HighestRole.IsDeveloper)
+ return frm.DeveloperPermission > 0;
+ if (user.HighestRole.IsModerator)
+ return frm.ModeratorPermission > 0;
+ if (user.HighestRole.IsMember)
+ return frm.MemberPermission > 0;
+
}
- return (int)perms.Permissions >= (int)PermissionPreset.CanRead;
+ return false;
}
public static bool UserEmailConfirmed(string username)
@@ -278,39 +267,26 @@ namespace Project_Unite
public static bool CanReply(string userName, string fId)
{
-
-
- if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(fId))
- return false;
- if (HttpContext.Current.User.Identity.IsGuest())
- 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)
+ var user = db.Users.FirstOrDefault(x => x.UserName == userName);
+ var frm = db.ForumCategories.FirstOrDefault(x => x.Id == fId);
+ if (frm == null) return false;
+ if (user == null)
{
- userRoles.Add(db.Roles.FirstOrDefault(r => r.Id == usrRole.RoleId) as Role);
+ return false;
}
- 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)
+ else
{
- UpdateACLDefinitions(fId);
- return true;
+ if (user.HighestRole.IsAdmin)
+ return frm.AdminPermission > 1;
+ if (user.HighestRole.IsDeveloper)
+ return frm.DeveloperPermission > 1;
+ if (user.HighestRole.IsModerator)
+ return frm.ModeratorPermission > 1;
+ if (user.HighestRole.IsMember)
+ return frm.MemberPermission > 1;
}
- return perms.Permissions >= PermissionPreset.CanReply;
+ return false;
}
public static ApplicationUser GetUserInfo(string id)
@@ -320,69 +296,26 @@ namespace Project_Unite
public static bool CanPost(string userName, string fId)
{
-
-
- if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(fId))
- return false;
- if (HttpContext.Current.User.Identity.IsGuest())
- 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)
+ var user = db.Users.FirstOrDefault(x => x.UserName == userName);
+ var frm = db.ForumCategories.FirstOrDefault(x => x.Id == fId);
+ if (frm == null) return false;
+ if (user == null)
{
- UpdateACLDefinitions(fId);
- return true;
+ return false;
}
- 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())
+ else
{
- var roles = db.Roles.ToArray();
- foreach(var role in roles)
- {
- if (db.ForumPermissions.FirstOrDefault(x => x.CategoryId == fid && x.RoleId == role.Id) == null)
- {
- 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();
+ if (user.HighestRole.IsAdmin)
+ return frm.AdminPermission > 2;
+ if (user.HighestRole.IsDeveloper)
+ return frm.DeveloperPermission > 2;
+ if (user.HighestRole.IsModerator)
+ return frm.ModeratorPermission > 2;
+ if (user.HighestRole.IsMember)
+ return frm.MemberPermission > 2;
}
-
+ return false;
}
public static bool CanManageRole(string userId, string roleId)
diff --git a/Project-Unite/Models/AdminViewModels.cs b/Project-Unite/Models/AdminViewModels.cs
index 23935d3..a03775e 100644
--- a/Project-Unite/Models/AdminViewModels.cs
+++ b/Project-Unite/Models/AdminViewModels.cs
@@ -7,27 +7,6 @@ using System.Web.Mvc;
namespace Project_Unite.Models
{
- public class AdminAccessControlViewModel
- {
- public AdminAccessControlViewModel()
- {
-
- }
-
- public AdminAccessControlViewModel(Dictionary<string, ForumPermission[]> modelList)
- {
- ACLList = new List<ForumPermission>();
- foreach(var v in modelList.Values)
- {
- ACLList.AddRange(v);
- }
- IDs = modelList.Keys.ToList();
- }
-
- public List<string> IDs { get; set; }
- public List<ForumPermission> ACLList { get; set; }
- }
-
public class CreateUserModel
{
diff --git a/Project-Unite/Models/ForumCategory.cs b/Project-Unite/Models/ForumCategory.cs
index da5a9c9..52e184e 100644
--- a/Project-Unite/Models/ForumCategory.cs
+++ b/Project-Unite/Models/ForumCategory.cs
@@ -39,28 +39,12 @@ namespace Project_Unite.Models
public virtual string Parent { get; set; }
- public ForumPermission[] Permissions { get
- {
- var db = new ApplicationDbContext();
- return db.ForumPermissions.Where(x => x.CategoryId == this.Id).ToArray();
- }
- }
- }
-
- public class ForumPermission
- {
- [Key]
- public string Id { get; set; }
-
- [Required]
- public string CategoryId { get; set; }
-
- [Required]
- public string RoleId { get; set; }
+ public int AdminPermission { get; set; }
+ public int DeveloperPermission { get; set; }
+ public int ModeratorPermission { get; set; }
+ public int MemberPermission { get; set; }
- [Required]
- [EnumDataType(typeof(PermissionPreset))]
- public PermissionPreset Permissions { get; set; }
+ public bool VisibleToGuests { get; set; }
}
public class ForumPost
@@ -124,8 +108,32 @@ namespace Project_Unite.Models
public bool IsLocked { get; set; }
+ public int Priority
+ {
+ get
+ {
+ int priority = 0;
+ if (IsSticky)
+ priority = 1;
+ if (IsAnnounce)
+ priority = 2;
+ if (IsSticky && IsAnnounce)
+ priority = 3;
+ return priority;
+ }
+ }
+
public DateTime StartedAt { get; set; }
public string Subject { get; set; }
+ public bool ShouldShow
+ {
+ get
+ {
+ if (IsUnlisted == true)
+ return HttpContext.Current.User?.Identity?.IsModerator() == true;
+ return true;
+ }
+ }
public string AuthorId { get; set; }
public bool IsSticky { get; set; }
public bool IsAnnounce { get; set; }
diff --git a/Project-Unite/Models/IdentityModels.cs b/Project-Unite/Models/IdentityModels.cs
index 46c8e56..a16dfe7 100644
--- a/Project-Unite/Models/IdentityModels.cs
+++ b/Project-Unite/Models/IdentityModels.cs
@@ -241,7 +241,6 @@ namespace Project_Unite.Models
public DbSet<UserPost> UserPosts { get; set; }
public DbSet<ForumPostEdit> ForumPostEdits { get; set; }
public DbSet<Like> Likes { get; set; }
- public DbSet<ForumPermission> ForumPermissions { get; set; }
public DbSet<BannedIP> BannedIPs { get; set; }
public DbSet<AuditLog> AuditLogs { get; set; }
public System.Data.Entity.DbSet<Project_Unite.Models.Role> IdentityRoles { get; set; }
diff --git a/Project-Unite/Views/Forum/Index.cshtml b/Project-Unite/Views/Forum/Index.cshtml
index 8e26c24..b579eeb 100644
--- a/Project-Unite/Views/Forum/Index.cshtml
+++ b/Project-Unite/Views/Forum/Index.cshtml
@@ -2,12 +2,16 @@
@{
ViewBag.Title = "Forums";
+ bool noForums = true;
}
<h2>Welcome to the forums.</h2>
@foreach (var cat in Model)
{
+ if (ACL.CanSee(User?.Identity?.Name, cat.Id))
+ {
+ noForums = false;
<table class="table">
<tr>
<th>@cat.Name</th>
@@ -16,16 +20,21 @@
<th>Most Recent Post</th>
</tr>
@foreach (var subcat in cat.Children)
- {
+ {
+ if (ACL.CanSee(User?.Identity?.Name, subcat.Id))
+ {
<tr>
<td>@Html.ActionLink(subcat.Name, "ViewForum", "Forum", new { id = subcat.Id }, null) <br/>
<p>@subcat.Description</p>
- @if(subcat.Children.Length > 0)
+ @if (subcat.Children.Length > 0)
{
<p><strong>Subforums: </strong>
- @foreach(var subfrm in subcat.Children)
+ @foreach (var subfrm in subcat.Children)
{
+ if (ACL.CanSee(User?.Identity?.Name, subfrm.Id))
+ {
<em> @Html.ActionLink(subfrm.Name, "ViewForum", "Forum", new { id = subfrm.Id }, null)&nbsp;</em>
+ }
}
</p>
}
@@ -34,6 +43,17 @@
<td></td>
<td></td>
</tr>
- }
+ }
+ }
</table>
+ }
+}
+
+@if(noForums == true)
+{
+ <div class="panel panel-danger">
+ <div class="panel-body">
+ <p><span class="glyphicon glyphicon-ban-circle"></span> <strong>No forums to show!</strong> There are no forums that you have read access to. If you are a guest, please @Html.ActionLink("log in", "Login", "Account"). If not, please contact an admin.</p>
+ </div>
+ </div>
} \ No newline at end of file
diff --git a/Project-Unite/Views/Forum/ViewForum.cshtml b/Project-Unite/Views/Forum/ViewForum.cshtml
index 01f1d01..e4b528f 100644
--- a/Project-Unite/Views/Forum/ViewForum.cshtml
+++ b/Project-Unite/Views/Forum/ViewForum.cshtml
@@ -5,160 +5,61 @@
<h2>@Model.Name</h2>
-@if (Model.Parent == "root")
-{
- @Html.ActionLink("Back", "Index", "Forum", null, new { @class = "btn btn-default" })
-
-}
-else
-{
- @Html.ActionLink("Back", "ViewForum", "Forum", new { id=Model.Parent}, new { @class = "btn btn-default" })
-}
-
+<ul class="nav nav-tabs">
+ <li><a href="#" onclick="window.history.back()"><span class="glyphicon glyphicon-arrow-left"></span> Back</a></li>
@if(ACL.CanPost(User.Identity.Name, Model.Id))
{
- @Html.ActionLink("New topic", "CreateTopic", "Forum", new { id=Model.Id}, new { @class = "btn btn-default" })
+ <li>@Html.ActionLink("New topic", "CreateTopic", "Forum", new { id=Model.Id}, null)</li>
}
-
+</ul>
<p>@Model.Description</p>
@if (Model.Children.Length > 0)
{
- <table class="table">
- <tr>
- <th>Subforums</th>
- <th>Topics</th>
- <th>Posts</th>
- <th>Most Recent Post</th>
- </tr>
- @foreach (var cat in Model.Children)
+ <div class="row">
+ <div class="col-xs-6">Subforums</div>
+ <div class="col-xs-2">Topics</div>
+ <div class="col-xs-2">Posts</div>
+ <div class="col-xs-2">Most Recent Post</div>
+ </div>
+ foreach (var cat in Model.Children)
{
- <tr>
- <td>@Html.ActionLink(cat.Name, "ViewForum", "Forum", new { id = cat.Id }, null)
+ <div class="row">
+ <div class="col-xs-6">@Html.ActionLink(cat.Name, "ViewForum", "Forum", new { id = cat.Id }, null)
<p>@cat.Description</p>
- </td>
- <td>
+ </div>
+ <div class="col-xs-2">
@cat.Topics.Length
- </td>
- <td></td>
- <td></td>
- </tr>
+ </div>
+ <div class="col-xs-2"></div>
+ <div class="col-xs-2"></div>
+ </div>
}
- </table>
}
<hr/>
@if (Model.Topics.Length > 0)
{
- <table class="table">
- <tr>
- <th>Topics</th>
- <th>Posts</th>
- <th>Most recent post</th>
- </tr>
- @{
- var stickies = Model.Topics.Where(x => x.IsSticky == true);
- var stickiesSorted = stickies.OrderByDescending(x => x.StartedAt);
- var topicsSorted = Model.Topics.Where(x => x.IsSticky != true).OrderByDescending(x => x.StartedAt);
- }
-
- @foreach (var topic in stickiesSorted)
- {
- bool showTopic = true;
- if (topic.IsUnlisted == true)
- {
- if(!ACL.Granted(User.Identity.Name, "CanSeeUnlistedTopics"))
- {
- showTopic = false;
- }
- }
-
- if (showTopic == true)
- {
- <tr>
- <td><span class="glyphicon glyphicon-star"></span>&nbsp;
- @if(topic.IsUnlisted == true)
- {
- <span class="glyphicon glyphicon-eye-close"></span>
- }
- @if (topic.IsLocked == true)
- {
- <span class="glyphicon glyphicon-lock"></span>
- }
-
- @Html.ActionLink(topic.Subject, "ViewTopic", "Forum", new { id = topic.Discriminator }, null)
- <p>Started by @Html.UserLink(topic.AuthorId) on @topic.StartedAt</p>
- </td>
- <td>
- @topic.Posts.Length
- </td>
- <td style="text-align:center">
- @if (topic.Posts.Length > 0)
- {
- var mostRecent = topic.Posts.OrderByDescending(x => x.PostedAt).First();
- <strong>Re: @topic.Subject</strong>
- <em>by @Html.UserLink(mostRecent.AuthorId)</em>
- <p><em>at @mostRecent.PostedAt</em></p>
- }
- else
- {
- <em>No posts.</em>
- }
- </td>
- </tr>
- }
- }
- @foreach (var topic in topicsSorted)
- {
-
- bool showTopic = true;
- if (topic.IsUnlisted == true)
- {
- if (!ACL.Granted(User.Identity.Name, "CanSeeUnlistedTopics"))
+ <div class="row">
+ <div class="col-xs-6">Topics</div>
+ <div class="col-xs-2">Posts</div>
+ <div class="col-xs-4">Most recent post</div>
+ </div>
+ var topics = Model.Topics.Where(x => x.ShouldShow == true).OrderByDescending(x=>x.StartedAt).ThenByDescending(x=>x.Priority);
+ foreach(var topic in topics)
{
- showTopic = false;
+ <div class="row">
+ <div class="col-xs-6">
+ @Html.ActionLink(topic.Subject, "ViewTopic", "Forum", new { id = topic.Discriminator }, null)
+ <br/>
+ <p><strong>Started by </strong> @Html.UserLink(topic.AuthorId) <strong>at </strong> @topic.StartedAt &bull; <span class="glyphicon glyphicon-thumbs-up"></span> @topic.Likes.Length &bull; <span class="glyphicon glyphicon-thumbs-down"></span> @topic.Dislikes.Length</p>
+ </div>
+ <div class="col-xs-2">
+ <strong>@topic.Posts.Length</strong>
+ </div>
+ </div>
}
- }
-
- if (showTopic == true)
- {
- <tr>
- <td>
- @if(topic.IsUnlisted == true)
- {
- <span class="glyphicon glyphicon-eye-close"></span>
- }
-
- @if (topic.IsLocked == true)
- {
- <span class="glyphicon glyphicon-lock"></span>
- }
- @Html.ActionLink(topic.Subject, "ViewTopic", "Forum", new { id = topic.Discriminator }, null)
- <p>Started by @Html.UserLink(topic.AuthorId) on @topic.StartedAt</p>
- </td>
- <td>
- @topic.Posts.Length
- </td>
- <td style="text-align:center">
- @if (topic.Posts.Length > 0)
- {
- var mostRecent = topic.Posts.OrderByDescending(x => x.PostedAt).First();
- <strong>Re: @topic.Subject</strong>
- <em>by @Html.UserLink(mostRecent.AuthorId)</em>
- <p><em>at @mostRecent.PostedAt</em></p>
- }
- else
- {
- <em>No posts.</em>
- }
- </td>
- </tr>
- }
- }
-
-
- </table>
}
else
{