diff --git a/NpgsqlBlogProvider/ChangeLog b/NpgsqlBlogProvider/ChangeLog index 26307ecd..b6d696b2 100644 --- a/NpgsqlBlogProvider/ChangeLog +++ b/NpgsqlBlogProvider/ChangeLog @@ -1,3 +1,8 @@ +2015-07-02 Paul Schneider + + * NpgsqlBlogProvider.cs: + * NpgsqlBlogProvider.csproj: + 2015-06-09 Paul Schneider * NpgsqlBlogProvider.csproj: Helps to fix packaging, and diff --git a/NpgsqlBlogProvider/NpgsqlBlogProvider.cs b/NpgsqlBlogProvider/NpgsqlBlogProvider.cs index c6345657..59ed4756 100644 --- a/NpgsqlBlogProvider/NpgsqlBlogProvider.cs +++ b/NpgsqlBlogProvider/NpgsqlBlogProvider.cs @@ -4,6 +4,8 @@ using System.Configuration.Provider; using Npgsql; using System.Collections.Generic; using Yavsc.Model.Blogs; +using Yavsc.Model.Circles; +using System.Web.Mvc; namespace Npgsql.Web.Blog { @@ -28,6 +30,7 @@ namespace Npgsql.Web.Blog cmd.CommandText = "insert into bltag (blid,tag) values (@postid,@tag) returning _id"; cmd.Parameters.AddWithValue("@tag",tag); cmd.Parameters.AddWithValue("@postid",postid); + cnx.Open (); return (long) cmd.ExecuteScalar (); } } @@ -41,20 +44,11 @@ namespace Npgsql.Web.Blog using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "delete from bltag where _id = @tagid"; cmd.Parameters.AddWithValue("@tagid",tagid); + cnx.Open (); cmd.ExecuteNonQuery (); } } /// - /// Gets the post identifier. - /// - /// The post identifier. - /// Username. - /// Title. - public override long GetPostId (string username, string title) - { - throw new NotImplementedException (); - } - /// /// Gets the comments. /// /// The comments. @@ -97,26 +91,30 @@ namespace Npgsql.Web.Blog /// Title. /// Content. /// If set to true visible. - public override void UpdatePost (long postid, string title, string content, bool visible) + /// Circle identifiers + public override void UpdatePost (long postid, string title, string content, + bool visible, long [] cids) { - using (NpgsqlConnection cnx = new NpgsqlConnection(connectionString)) - using (NpgsqlCommand cmd = cnx.CreateCommand()) { - DateTime now = DateTime.Now; - cmd.CommandText = + using (NpgsqlConnection cnx = new NpgsqlConnection(connectionString)) { + using (NpgsqlCommand cmd = cnx.CreateCommand ()) { + DateTime now = DateTime.Now; + cmd.CommandText = "update blog set modified=@now," + " title = @title," + " bcontent=@content, " + " visible = @visible " + "where _id = @id"; - cmd.Parameters.AddWithValue ("@now", now); - cmd.Parameters.AddWithValue ("@title", title); - cmd.Parameters.AddWithValue ("@content", content); - cmd.Parameters.AddWithValue ("@visible", visible); - cmd.Parameters.AddWithValue ("@id", postid); - cnx.Open (); - cmd.ExecuteNonQuery (); + cmd.Parameters.AddWithValue ("@now", now); + cmd.Parameters.AddWithValue ("@title", title); + cmd.Parameters.AddWithValue ("@content", content); + cmd.Parameters.AddWithValue ("@visible", visible); + cmd.Parameters.AddWithValue ("@id", postid); + cnx.Open (); + cmd.ExecuteNonQuery (); + } cnx.Close(); } + UpdatePostCircles (postid, cids); } /// /// Removes the post. @@ -249,6 +247,7 @@ namespace Npgsql.Web.Blog } } } + if (be!=null) SetCirclesOn (be); return be; } /// @@ -280,10 +279,10 @@ namespace Npgsql.Web.Blog using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "select _id,bcontent,modified,posted,visible from blog " + - "where applicationname = @appname and username = @username and title = @title"; - cmd.Parameters.AddWithValue ("@appname", applicationName); - cmd.Parameters.AddWithValue ("@username", username); - cmd.Parameters.AddWithValue ("@title", title); + "where applicationname = :appname and username = :username and title = :title"; + cmd.Parameters.AddWithValue ("appname", applicationName); + cmd.Parameters.AddWithValue ("username", username); + cmd.Parameters.AddWithValue ("title", title); cnx.Open (); using (NpgsqlDataReader rdr = cmd.ExecuteReader()) { if (rdr.Read ()) { @@ -298,21 +297,41 @@ namespace Npgsql.Web.Blog } rdr.Close (); } - if (be!=null) - using (NpgsqlCommand cmdtags = cnx.CreateCommand()) { - List tags = new List (); - cmd.CommandText = "select tag.name from tag,tagged where tag._id = tagged.tagid and tagged.postid = @pid"; - cmd.Parameters.AddWithValue ("@pid", be.Id); - using (NpgsqlDataReader rdrt = cmd.ExecuteReader ()) { - while (rdrt.Read ()) { - tags.Add (rdrt.GetString (0)); + if (be != null) { + using (NpgsqlCommand cmdtags = cnx.CreateCommand ()) { + List tags = new List (); + cmd.CommandText = "select tag.name from tag,tagged where tag._id = tagged.tagid and tagged.postid = :pid"; + cmd.Parameters.AddWithValue ("pid", be.Id); + using (NpgsqlDataReader rdrt = cmd.ExecuteReader ()) { + while (rdrt.Read ()) { + tags.Add (rdrt.GetString (0)); + } } + be.Tags = tags.ToArray (); } - be.Tags = tags.ToArray (); + SetCirclesOn (be); } } return be; } + + private void SetCirclesOn(BlogEntry be) + { + List circles = new List (); + using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) + using (NpgsqlCommand cmdcircles = cnx.CreateCommand ()) { + cmdcircles.CommandText = "select a.circle_id from blog_access a " + + "where a.post_id = :pid"; + cmdcircles.Parameters.AddWithValue ("pid", be.Id); + cnx.Open (); + using (NpgsqlDataReader rdr = cmdcircles.ExecuteReader ()) { + while (rdr.Read ()) { + circles.Add ( rdr.GetInt64 (0) ); + } + } + } + be.AllowedCircles = circles.ToArray(); + } /// /// Post the specified username, title, content and visible. /// @@ -320,59 +339,112 @@ namespace Npgsql.Web.Blog /// Title. /// Content. /// If set to true visible. - public override long Post (string username, string title, string content, bool visible) + /// . + public override long Post (string username, string title, string content, bool visible, long [] circles) { + long pid = 0; if (username == null) throw new ArgumentNullException("username"); if (title == null) throw new ArgumentNullException("title"); if (content == null) throw new ArgumentNullException("content"); - using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) - using (NpgsqlCommand cmd = cnx.CreateCommand()) { - cmd.CommandText = "insert into blog (title,bcontent,modified,posted,visible,username,applicationname)" + - "values (@title,@bcontent,@modified,@posted,@visible,@username,@appname) returning _id"; - cmd.Parameters.AddWithValue ("@title", title); - cmd.Parameters.AddWithValue ("@bcontent", content); - DateTime now = DateTime.Now; - cmd.Parameters.AddWithValue ("@modified", now); - cmd.Parameters.AddWithValue ("@posted", now); - cmd.Parameters.AddWithValue ("@visible", visible); - cmd.Parameters.AddWithValue ("@username", username); - cmd.Parameters.AddWithValue ("@appname", applicationName); + using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { + using (NpgsqlCommand cmd = cnx.CreateCommand ()) { + cmd.CommandText = "insert into blog (title,bcontent,modified,posted,visible,username,applicationname)" + + "values (:title,:bcontent,:modified,:posted,:visible,:username,:appname) returning _id"; + cmd.Parameters.AddWithValue ("title", title); + cmd.Parameters.AddWithValue ("bcontent", content); + DateTime now = DateTime.Now; + cmd.Parameters.AddWithValue ("modified", now); + cmd.Parameters.AddWithValue ("posted", now); + cmd.Parameters.AddWithValue ("visible", visible); + cmd.Parameters.AddWithValue ("username", username); + cmd.Parameters.AddWithValue ("appname", applicationName); + cnx.Open (); + pid = (long)cmd.ExecuteScalar (); + } + cnx.Close (); + } + UpdatePostCircles (pid, circles); + return pid; + } + + private void UpdatePostCircles( long pid, long[] circles) + { + using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) { cnx.Open (); - return (long) cmd.ExecuteScalar(); + using (NpgsqlCommand cmd = cnx.CreateCommand ()) { + cmd.CommandText = "delete from blog_access where post_id = :pid"; + cmd.Parameters.AddWithValue ("pid", pid); + cmd.ExecuteNonQuery (); + } + if (circles!=null) + if (circles.Length>0) + using (NpgsqlCommand cmd = cnx.CreateCommand ()) { + cmd.CommandText = "insert into blog_access (post_id,circle_id) values (:pid,:cid)"; + cmd.Parameters.AddWithValue ("pid", pid); + cmd.Parameters.Add ("cid", NpgsqlTypes.NpgsqlDbType.Bigint); + cmd.Prepare (); + foreach (long ci in circles) { + cmd.Parameters ["cid"].Value = ci; + cmd.ExecuteNonQuery (); + } + } + cnx.Close (); } } /// /// Finds the post. /// /// The post. + /// Reader's Name. /// Pattern. /// Searchflags. /// Page index. /// Page size. /// Total records. - public override BlogEntryCollection FindPost (string pattern, FindBlogEntryFlags searchflags, int pageIndex, int pageSize, out int totalRecords) + public override BlogEntryCollection FindPost (string readersName, string pattern, FindBlogEntryFlags searchflags, int pageIndex, int pageSize, out int totalRecords) { BlogEntryCollection c = new BlogEntryCollection (); totalRecords = 0; using (NpgsqlConnection cnx=new NpgsqlConnection(connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand()) { - cmd.CommandText = "select title,bcontent,modified,posted,username,visible from blog " + - "where applicationname = @appname"; + if (readersName != null) { + cmd.CommandText = "select _id, title,bcontent,modified," + + "posted,username,visible " + + "from blog b left outer join " + + "(select count(*)>0 acc, a.post_id pid " + + "from blog_access a," + + " circle_members m, users u where m.circle_id = a.circle_id " + + " and m.member = u.pkid and u.username = :uname " + + " and u.applicationname = :appname " + + " group by a.post_id) ma on (ma.pid = b._id) " + + "where ( ma.acc IS NULL or ma.acc = TRUE or b.UserName = :uname) "; + cmd.Parameters.AddWithValue ("uname", readersName); + } else { + cmd.CommandText = "select _id, title,bcontent,modified," + + "posted,username,visible " + + "from blog b left outer join " + + "(select count(*)>0 acc, a.post_id pid " + + "from blog_access a" + + " group by a.post_id) ma on (ma.pid = b._id)" + + " where " + + " ma.acc IS NULL and " + + " applicationname = :appname"; + } cmd.Parameters.AddWithValue ("@appname", applicationName); if ((searchflags & FindBlogEntryFlags.MatchContent) > 0) { - cmd.CommandText += " and bcontent like @bcontent"; - cmd.Parameters.AddWithValue ("@bcontent", pattern); + cmd.CommandText += " and bcontent like :bcontent"; + cmd.Parameters.AddWithValue (":bcontent", pattern); } if ((searchflags & FindBlogEntryFlags.MatchTitle) > 0) { - cmd.CommandText += " and title like @title"; - cmd.Parameters.AddWithValue ("@title", pattern); + cmd.CommandText += " and title like :title"; + cmd.Parameters.AddWithValue (":title", pattern); } if ((searchflags & FindBlogEntryFlags.MatchUserName) > 0) { - cmd.CommandText += " and username like @username"; - cmd.Parameters.AddWithValue ("@username", pattern); + cmd.CommandText += " and username like :username"; + cmd.Parameters.AddWithValue (":username", pattern); } if ((searchflags & FindBlogEntryFlags.MatchInvisible) == 0) { cmd.CommandText += " and visible = true"; @@ -397,8 +469,12 @@ namespace Npgsql.Web.Blog } totalRecords++; } + rdr.Close (); } } + foreach (BlogEntry be in c) + SetCirclesOn (be); + return c; } /// @@ -442,11 +518,11 @@ namespace Npgsql.Web.Blog "where blog.posted = lblog.lpost and blog.username = lblog.username " ; */ cmd.CommandText = "select * " + - "from blog where applicationname = @appname and visible = true " + - " order by posted desc limit @len" ; + "from blog where applicationname = :appname and visible = true " + + " order by posted desc limit :len" ; - cmd.Parameters.AddWithValue ("@appname", applicationName); - cmd.Parameters.AddWithValue ("@len", defaultPageSize*10); + cmd.Parameters.AddWithValue ("appname", applicationName); + cmd.Parameters.AddWithValue ("len", defaultPageSize*10); cnx.Open (); using (NpgsqlDataReader rdr = cmd.ExecuteReader()) { totalRecords = 0; @@ -467,6 +543,8 @@ namespace Npgsql.Web.Blog } } } + foreach (BlogEntry be in c) + SetCirclesOn (be); return c; } #endregion diff --git a/NpgsqlBlogProvider/NpgsqlBlogProvider.csproj b/NpgsqlBlogProvider/NpgsqlBlogProvider.csproj index 025a56fb..51c912d4 100644 --- a/NpgsqlBlogProvider/NpgsqlBlogProvider.csproj +++ b/NpgsqlBlogProvider/NpgsqlBlogProvider.csproj @@ -46,6 +46,7 @@ ..\packages\Npgsql.2.2.5\lib\net45\Npgsql.dll + diff --git a/NpgsqlContentProvider/ChangeLog b/NpgsqlContentProvider/ChangeLog index dfc87981..2315799a 100644 --- a/NpgsqlContentProvider/ChangeLog +++ b/NpgsqlContentProvider/ChangeLog @@ -1,3 +1,7 @@ +2015-07-02 Paul Schneider + + * NpgsqlCircleProvider.cs: + 2015-06-18 Paul Schneider * NpgsqlCircleProvider.cs: Fixes the Circle creation diff --git a/NpgsqlContentProvider/NpgsqlCircleProvider.cs b/NpgsqlContentProvider/NpgsqlCircleProvider.cs index 19e1083f..1e9901b8 100644 --- a/NpgsqlContentProvider/NpgsqlCircleProvider.cs +++ b/NpgsqlContentProvider/NpgsqlCircleProvider.cs @@ -26,6 +26,8 @@ using Npgsql; using NpgsqlTypes; using System.Collections.Generic; using System.Web.Security; +using System.Web.Mvc; +using Yavsc.Model; namespace WorkFlowProvider { @@ -43,6 +45,31 @@ namespace WorkFlowProvider #region implemented abstract members of CircleProvider + /// + /// Returns circles from owner. + /// + /// Circle identifiers. + /// Member name. + public override bool Matches (long [] circle_ids, string member) + { + bool result=false; + using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) + using (NpgsqlCommand cmd = cnx.CreateCommand ()) { + cmd.CommandText = "select count(*)>0 from circle_members where _id = :cid and m.member = :mbr"; + cmd.Parameters.Add("cid",NpgsqlDbType.Bigint); + cmd.Parameters.AddWithValue("mbr",member); + cnx.Open (); + cmd.Prepare (); + foreach (long cid in circle_ids) { + result = (bool) cmd.ExecuteScalar(); + if (result) + break; + } + cnx.Close (); + } + return result; + } + /// /// Add the specified user. /// @@ -148,11 +175,12 @@ namespace WorkFlowProvider cmd.Parameters.AddWithValue ("cid", id); cmd.Parameters.Add ("mbr", NpgsqlDbType.Varchar); cmd.Prepare (); - foreach (string user in users) { - object pkid = Membership.GetUser (user).ProviderUserKey; - cmd.Parameters[1].Value = pkid.ToString(); - cmd.ExecuteNonQuery (); - } + if (users!=null) + foreach (string user in users) { + object pkid = Membership.GetUser (user).ProviderUserKey; + cmd.Parameters[1].Value = pkid.ToString(); + cmd.ExecuteNonQuery (); + } } cnx.Close (); } @@ -179,9 +207,9 @@ namespace WorkFlowProvider /// List user's circles. /// /// User. - public override CircleInfoCollection List (string user) + public override IEnumerable List (string user) { - CircleInfoCollection cc = null; + List cc = null; using (NpgsqlConnection cnx = new NpgsqlConnection (connectionString)) using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = "select _id, title from circle where owner = :wnr"; @@ -190,7 +218,7 @@ namespace WorkFlowProvider cmd.Prepare (); using (NpgsqlDataReader rdr = cmd.ExecuteReader ()) { if (rdr.HasRows) { - cc = new CircleInfoCollection (); + cc = new List (); while (rdr.Read ()) { string title = null; int ottl = rdr.GetOrdinal ("title"); @@ -198,7 +226,7 @@ namespace WorkFlowProvider title = rdr.GetString (ottl); long id = (long) rdr.GetInt64 ( rdr.GetOrdinal ("_id")); - cc.Add (new CircleInfo (id,title)); + cc.Add (new ListItem { Value = id.ToString(), Text = title} ); } } rdr.Close (); diff --git a/WebControls/ChangeLog b/WebControls/ChangeLog index 5ffcf544..39e737d9 100644 --- a/WebControls/ChangeLog +++ b/WebControls/ChangeLog @@ -1,3 +1,8 @@ +2015-07-02 Paul Schneider + + * UserCard.cs: + * InputCircle.cs: + 2015-06-10 Paul Schneider * InputCircle.cs: An input control specialized for circle diff --git a/WebControls/InputCircle.cs b/WebControls/InputCircle.cs index 226340b4..753757fa 100644 --- a/WebControls/InputCircle.cs +++ b/WebControls/InputCircle.cs @@ -26,8 +26,11 @@ using System.ComponentModel; using System.Web.UI.WebControls; using Yavsc.Model.Circles; using System.Web.Security; +using System.Collections; +using System.Collections.Generic; +using System.Web.Mvc; -namespace WebControls +namespace Yavsc.WebControls { /// /// Input circle. @@ -63,13 +66,21 @@ namespace WebControls } } /// - /// Gets or sets the value. + /// Gets or sets the The CircleInfo collection. /// /// The value. - [Bindable (true), DefaultValue(""), Localizable(true)] - public string Value { + [Bindable (true), DefaultValue(null), Localizable(true), + Category("Behavior"), + Description("The CircleInfo collection"), + DesignerSerializationVisibility( + DesignerSerializationVisibility.Content), + PersistenceMode(PersistenceMode.InnerDefaultProperty) + ] + public IEnumerable Value { get { - return (string) ViewState["Value"]; + if (ViewState ["Value"] == null) + ViewState ["Value"] = new List (); + return (IEnumerable) ViewState["Value"]; } set { ViewState ["Value"] = value; @@ -134,10 +145,7 @@ namespace WebControls if (Multiple) writer.AddAttribute ("multiple","true"); writer.RenderBeginTag ("select"); - string[] selected = null; - if (!string.IsNullOrWhiteSpace (Value)) { - selected = Value.Split (','); - } + if (EmptyValue!=null) { writer.AddAttribute ("value", ""); writer.RenderBeginTag ("option"); @@ -146,13 +154,15 @@ namespace WebControls } var u = Membership.GetUser (); if (u != null) { - foreach (CircleInfo ci in CircleManager.DefaultProvider.List(u.UserName)) { - if (selected != null) - if (Array.Exists (selected, x => x == ci.Id.ToString ())) - writer.AddAttribute ("selected", null); - writer.AddAttribute ("value", ci.Id.ToString ()); + foreach (Yavsc.Model.ListItem ci in CircleManager.DefaultProvider.List(u.UserName)) { + foreach (SelectListItem sli in Value) + if (sli.Value == ci.Value) { + writer.AddAttribute ("selected", null); + break; + } + writer.AddAttribute ("value", ci.Value ); writer.RenderBeginTag ("option"); - writer.Write (ci.Title); + writer.Write (ci.Text); writer.RenderEndTag (); } } diff --git a/WebControls/UserCard.cs b/WebControls/UserCard.cs index da54a952..a92742de 100644 --- a/WebControls/UserCard.cs +++ b/WebControls/UserCard.cs @@ -26,8 +26,11 @@ using System.Web.UI; using System.ComponentModel; using System.Web.Security; -namespace WebControls +namespace Yavsc.WebControls { + /// + /// User card. + /// [ AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal), @@ -37,9 +40,6 @@ namespace WebControls DefaultProperty ("Name"), ToolboxData ("<{0}:UserCard runat=\"server\"> ") ] - /// - /// User card. - /// public class UserCard: WebControl { /// diff --git a/web/ApiControllers/CircleController.cs b/web/ApiControllers/CircleController.cs index e61bb2f5..ada398fe 100644 --- a/web/ApiControllers/CircleController.cs +++ b/web/ApiControllers/CircleController.cs @@ -24,6 +24,8 @@ using Yavsc.Model.RolesAndMembers; using System.Collections.Generic; using Yavsc.Model.Circles; using System.Web.Security; +using System.Collections.Specialized; +using Yavsc.Model; namespace Yavsc.ApiControllers { @@ -91,12 +93,11 @@ namespace Yavsc.ApiControllers return c; } - /// /// List the circles /// [Authorize] - public CircleInfoCollection List() + public IEnumerable List() { string user = Membership.GetUser ().UserName; return CircleManager.DefaultProvider.List (user); diff --git a/web/ChangeLog b/web/ChangeLog index 81cc3a6c..aaad51ba 100644 --- a/web/ChangeLog +++ b/web/ChangeLog @@ -1,3 +1,20 @@ +2015-07-02 Paul Schneider + + * Web.csproj: + * Web.config: + * instdbws.sql: + * Web.config: + * Edit.aspx: + * YavscHelpers.cs: + * ThanksHelper.cs: + * Circles.aspx: + * BlogsController.cs: + * TitleNotFound.aspx: + * NotAuthorized.aspx: + * TexToPdfFormatter.cs: + * AccountController.cs: + * CircleController.cs: + 2015-06-28 Paul Schneider * AccountController.cs: Fixes the canonical login diff --git a/web/Controllers/AccountController.cs b/web/Controllers/AccountController.cs index 3fb973a7..0dc36fd1 100644 --- a/web/Controllers/AccountController.cs +++ b/web/Controllers/AccountController.cs @@ -309,10 +309,8 @@ namespace Yavsc.Controllers public ActionResult Circles () { string user = Membership.GetUser ().UserName; - CircleInfoCollection cic = CircleManager.DefaultProvider.List (user); - if (cic == null) - cic = new CircleInfoCollection (); - return View (cic); + ViewData["Circles"] = CircleManager.DefaultProvider.List (user); + return View (); } /// /// Logout the specified returnUrl. diff --git a/web/Controllers/BlogsController.cs b/web/Controllers/BlogsController.cs index 997d26d6..5719a329 100644 --- a/web/Controllers/BlogsController.cs +++ b/web/Controllers/BlogsController.cs @@ -17,6 +17,7 @@ using Yavsc.ApiControllers; using Yavsc.Model.RolesAndMembers; using System.Net; using System.Web.Mvc; +using Yavsc.Model.Circles; namespace Yavsc.Controllers { @@ -94,9 +95,6 @@ namespace Yavsc.Controllers return View ("Index", bs); } - - - // page index becomes one-based /// /// Users the posts. /// @@ -112,12 +110,15 @@ namespace Yavsc.Controllers FindBlogEntryFlags sf = FindBlogEntryFlags.MatchUserName; ViewData ["SiteName"] = sitename; ViewData ["BlogUser"] = user; + string readersName = null; // displays invisible items when the logged user is also the author - if (u != null) - if (u.UserName == user) - sf |= FindBlogEntryFlags.MatchInvisible; + if (u != null) { + if (u.UserName == user || Roles.IsUserInRole ("Admin")) + sf |= FindBlogEntryFlags.MatchInvisible; + readersName = u.UserName; + } // find entries - BlogEntryCollection c = BlogManager.FindPost (user, sf, pageIndex, pageSize, out tr); + BlogEntryCollection c = BlogManager.FindPost (readersName, user, sf, pageIndex, pageSize, out tr); // Get author's meta data Profile bupr = new Profile (ProfileBase.Create (user)); ViewData ["BlogUserProfile"] = bupr; @@ -155,7 +156,7 @@ namespace Yavsc.Controllers return View ("TitleNotFound"); Profile pr = new Profile (ProfileBase.Create (e.UserName)); if (pr==null) - return View ("TitleNotFound"); + return View ("NotAuthorized"); ViewData ["BlogUserProfile"] = pr; ViewData ["BlogTitle"] = pr.BlogTitle; ViewData ["Avatar"] = pr.avatar; @@ -163,17 +164,33 @@ namespace Yavsc.Controllers if (u != null) ViewData ["UserName"] = u.UserName; if (!e.Visible || !pr.BlogVisible) { - if (u==null) - return View ("TitleNotFound"); + // only deliver to admins or owner + if (u == null) + return View ("NotAuthorized"); else { - if (u.UserName!=e.UserName) - if (!Roles.IsUserInRole(u.UserName,"Admin")) - return View ("TitleNotFound"); + if (u.UserName != e.UserName) + if (!Roles.IsUserInRole (u.UserName, "Admin")) + return View ("NotAuthorized"); } + } else { + if (!CanViewPost(e,u)) + return View ("NotAuthorized"); } ViewData ["Comments"] = BlogManager.GetComments (e.Id); return View ("UserPost", e); } + private bool CanViewPost (BlogEntry e, MembershipUser u=null) { + if (e.AllowedCircles!=null && e.AllowedCircles.Length > 0) { + // only deliver to admins, owner, or specified circle memebers + if (u == null) + return false; + if (u.UserName != e.UserName) + if (!Roles.IsUserInRole (u.UserName, "Admin")) + if (!CircleManager.DefaultProvider.Matches (e.AllowedCircles, u.UserName)) + return false; + } + return true; + } /// /// Users the post. /// @@ -208,26 +225,14 @@ namespace Yavsc.Controllers if (String.IsNullOrEmpty (title)) title = ""; ViewData ["UserName"] = un; + ViewData["AllowedCircles"] = CircleManager.DefaultProvider.List (Membership.GetUser ().UserName).Select (x => new SelectListItem { + Value = x.Value, + Text = x.Text + }); + return View ("Edit", new BlogEntry { Title = title }); } - /// - /// Validates the post. - /// - /// The post. - /// Model. - [Authorize, - ValidateInput(false)] - public ActionResult ValidatePost (BlogEntry model) - { - string username = Membership.GetUser ().UserName; - ViewData ["SiteName"] = sitename; - ViewData ["BlogUser"] = username; - if (ModelState.IsValid) { - BlogManager.Post (username, model.Title, model.Content, model.Visible); - return UserPost (username, model.Title); - } - return View ("Post", model); - } + /// /// Validates the edit. /// @@ -241,13 +246,14 @@ namespace Yavsc.Controllers ViewData ["BlogUser"] = Membership.GetUser ().UserName; if (ModelState.IsValid) { if (model.Id != 0) - BlogManager.UpdatePost (model.Id, model.Title, model.Content, model.Visible); + BlogManager.UpdatePost (model.Id, model.Title, model.Content, model.Visible, model.AllowedCircles); else - BlogManager.Post (model.UserName, model.Title, model.Content, model.Visible); - return UserPost(model.UserName, model.Title); + model.Id = BlogManager.Post (model.UserName, model.Title, model.Content, model.Visible, model.AllowedCircles); + return RedirectToAction ("UserPost",new { user = model.UserName, title = model.Title }); } return View ("Edit", model); } + /// /// Edit the specified model. /// @@ -256,25 +262,33 @@ namespace Yavsc.Controllers ValidateInput(false)] public ActionResult Edit (BlogEntry model) { - if (model != null) { - string user = Membership.GetUser ().UserName; - Profile pr = new Profile (HttpContext.Profile); + string user = Membership.GetUser ().UserName; + Profile pr = new Profile (HttpContext.Profile); - ViewData ["BlogTitle"] = pr.BlogTitle; - ViewData ["UserName"] = user; - if (model.UserName == null) { - model.UserName = user; - } - BlogEntry e = BlogManager.GetPost (model.UserName, model.Title); - if (e != null) { - if (e.UserName != user) { - return View ("TitleNotFound"); - } - model = e; - ModelState.Clear (); - TryValidateModel (model); + ViewData ["BlogTitle"] = pr.BlogTitle; + ViewData ["UserName"] = user; + if (model.UserName == null) { + model.UserName = user; + } + BlogEntry e = BlogManager.GetPost (model.UserName, model.Title); + if (e != null) { + if (e.UserName != user) { + return View ("NotAuthorized"); } + model = e; + ModelState.Clear (); + TryValidateModel (model); } + + if (model.AllowedCircles==null) + model.AllowedCircles = new long[0]; + + ViewData["AllowedCircles"] = CircleManager.DefaultProvider.List (Membership.GetUser ().UserName).Select (x => new SelectListItem { + Value = x.Value, + Text = x.Text, + Selected = model.AllowedCircles.Contains(long.Parse(x.Value)) + }); + return View (model); } diff --git a/web/Formatters/TexToPdfFormatter.cs b/web/Formatters/TexToPdfFormatter.cs index ed9d9724..7125c8dc 100644 --- a/web/Formatters/TexToPdfFormatter.cs +++ b/web/Formatters/TexToPdfFormatter.cs @@ -112,7 +112,12 @@ namespace Yavsc.Formatters if (contentHeaders != null) SetFileName(contentHeaders, value.GetHashCode ().ToString ()); } - + + /// + /// Sets the name of the file. + /// + /// Content headers. + /// Basename. public static void SetFileName(HttpContentHeaders contentHeaders, string basename) { contentHeaders.ContentDisposition = new ContentDispositionHeaderValue ("attachment") { FileName = "doc-" + basename + ".pdf" diff --git a/web/Helpers/ThanksHelper.cs b/web/Helpers/ThanksHelper.cs index 818d6d61..6b47711b 100644 --- a/web/Helpers/ThanksHelper.cs +++ b/web/Helpers/ThanksHelper.cs @@ -2,6 +2,8 @@ using System; using System.Configuration; using System.Collections.Generic; using System.Web.Mvc; +using System.Linq.Expressions; +using Yavsc.Model.Circles; namespace Yavsc.Helpers { @@ -55,6 +57,7 @@ namespace Yavsc.Helpers result.Add( new Link { Url = e.Url, Image=e.Image, Text = e.Name }); return result.ToArray(); } + } } diff --git a/web/Helpers/YavscHelpers.cs b/web/Helpers/YavscHelpers.cs index 796dd787..984f2626 100644 --- a/web/Helpers/YavscHelpers.cs +++ b/web/Helpers/YavscHelpers.cs @@ -9,6 +9,10 @@ using System.Web.Http.ModelBinding; using Yavsc.Model.RolesAndMembers; using System.Collections.Generic; using System.Collections.Specialized; +using System.Web.Mvc; +using Yavsc.Model.Circles; +using System.Web.UI; +using System.Linq.Expressions; namespace Yavsc.Helpers { @@ -17,9 +21,6 @@ namespace Yavsc.Helpers /// public static class YavscHelpers { - - - private static string siteName = null; /// /// Gets the name of the site. diff --git a/web/Views/Account/Circles.aspx b/web/Views/Account/Circles.aspx index 2a7cf680..ad1335e2 100644 --- a/web/Views/Account/Circles.aspx +++ b/web/Views/Account/Circles.aspx @@ -1,4 +1,4 @@ -<%@ Page Title="Circles" Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage" %> +<%@ Page Title="Circles" Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage" %> <%@ Register Assembly="Yavsc.WebControls" TagPrefix="yavsc" Namespace="Yavsc.WebControls" %> @@ -13,9 +13,9 @@ <% int lc=0; - foreach (CircleInfo ci in Model) { lc++; %> -row" id="c_<%=ci.Id%>"> -<%=ci.Title%> + foreach (SelectListItem ci in ViewData["Circles"]) { lc++; %> +row" id="c_<%=ci.Value%>"> +<%=ci.Text%> " class="actionlink rowbtnrm"/> " class="actionlink rowbtnvw"/> diff --git a/web/Views/Blogs/Edit.aspx b/web/Views/Blogs/Edit.aspx index 319f62af..d0bef3d6 100644 --- a/web/Views/Blogs/Edit.aspx +++ b/web/Views/Blogs/Edit.aspx @@ -1,4 +1,5 @@ <%@ Page Title="Bill edition" Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Models/App.master" %> +<%@ Register Assembly="Yavsc.WebControls" TagPrefix="yavsc" Namespace="Yavsc.WebControls" %> ">