Ejemplo n.º 1
0
        /// <summary>
        /// Gets all posts by the specified user in the specified category name
        /// </summary>
        /// <param name="username"></param>
        /// <param name="categoryName"></param>
        /// <param name="numberOfPosts"></param>
        public PostCollection PostsByUserAndCategory(string username, string categoryName, int numberOfPosts)
        {
            Category      category = GetCategory(categoryName);
            IGraffitiUser user     = GraffitiUsers.GetUser(username);

            return(PostsByUserAndCategory(user, category, numberOfPosts));
        }
Ejemplo n.º 2
0
        public void RenameUser(string oldUserName, string newUserName)
        {
            oldUserName = oldUserName.ToLower();
            User user = (User)GraffitiUsers.GetUser(oldUserName);

            user.Name = newUserName;
            GraffitiUsers.Save(user, null);
        }
Ejemplo n.º 3
0
        public static int CommitPost(Post p, IGraffitiUser user, bool isFeaturedPost, bool isFeaturedCategory)
        {
            Permission perm   = RolePermissionManager.GetPermissions(p.CategoryId, user);
            bool       isMan  = perm.Publish;
            bool       isEdit = GraffitiUsers.IsAdmin(user);

            if (isMan || isEdit)
            {
                p.IsPublished = (p.PostStatus == PostStatus.Publish);
            }
            else
            {
                p.IsPublished = false;

                if (p.PostStatus != PostStatus.Draft && p.PostStatus != PostStatus.PendingApproval)
                {
                    p.PostStatus = PostStatus.Draft;
                }
            }

            p.ModifiedBy = user.Name;

            if (p.IsNew) //No VERSION WORK, just save it.
            {
                p.Version = 1;
                p.Save(user.Name, SiteSettings.CurrentUserTime);
            }
            else if (p.IsPublished) //Make a copy of the current post, then save this one.
            {
                Post old_Post = new Post(p.Id);

                //if(old_Post.PostStatus == PostStatus.Publish)
                VersionPost(old_Post);

                p.Version = GetNextVersionId(p.Id, p.Version);
                p.Save(user.Name);
            }
            else
            {
                p.Version = GetNextVersionId(p.Id, p.Version);
                VersionPost(p);
                Post.UpdatePostStatus(p.Id, p.PostStatus);
            }

            ProcessFeaturedPosts(p, user, isFeaturedPost, isFeaturedCategory);

            if (p.PostStatus == PostStatus.PendingApproval)
            {
                SendPReqiresApprovalMessage(p, user);
            }
            else if (p.PostStatus == PostStatus.RequiresChanges)
            {
                SendRequestedChangesMessage(p, user);
            }

            return(p.Id);
        }
Ejemplo n.º 4
0
        public static void SendPReqiresApprovalMessage(Post p, IGraffitiUser user)
        {
            var users = new List <IGraffitiUser>();

            foreach (IGraffitiUser u in GraffitiUsers.GetUsers("*"))
            {
                if (GraffitiUsers.IsAdmin(u) || RolePermissionManager.GetPermissions(p.CategoryId, u).Publish)
                {
                    users.Add(u);
                }
            }

            Macros m = new Macros();
            EmailTemplateToolboxContext pttc = new EmailTemplateToolboxContext();

            pttc.Put("sitesettings", SiteSettings.Get());
            pttc.Put("post", p);
            pttc.Put("user", user);
            pttc.Put("macros", m);
            pttc.Put("home", m.FullUrl(new Urls().Home));
            pttc.Put("adminUrl",
                     m.FullUrl(VirtualPathUtility.ToAbsolute("~/graffiti-admin/posts/write/")) + "?id=" + p.Id + "&v=" +
                     p.Version);

            string adminApprovalUrl = m.FullUrl(VirtualPathUtility.ToAbsolute("~/api/approve.ashx")) +
                                      "?key={0}&u={1}&id={2}&v={3}";

            EmailTemplate template = new EmailTemplate();

            template.Context      = pttc;
            template.Subject      = "You have content to approve: " + p.Title;
            template.TemplateName = "QueuedPost.view";

            foreach (IGraffitiUser admin in users)
            {
                template.Context.Put("adminApprovalUrl",
                                     string.Format(adminApprovalUrl, admin.UniqueId, admin.Name, p.Id, p.Version));

                try
                {
                    template.To = admin.Email;
                    Emailer.Send(template);

                    //Emailer.Send("QueuedPost.view", admin.Email, "You have content to approve: " + p.Title, pttc);
                }
                catch (Exception ex)
                {
                    Log.Error("Email Error", ex.Message);
                }
            }

            Log.Info("Post approval email", "{0} user(s) were sent an email to approve the post \"{1}\" (id: {2}).", users.Count,
                     p.Title, p.Id);
        }
Ejemplo n.º 5
0
        protected override void Authenticate()
        {
            if (GraffitiUsers.Current == null)
            {
                Response.Redirect("~/login/");
            }

            if (!GraffitiUsers.IsAdmin(GraffitiUsers.Current))
            {
                Response.Redirect("~/");
            }
        }
Ejemplo n.º 6
0
        public static RolePermissionsCollection GetRolePermissions()
        {
            if (rolePermissions == null)
            {
                rolePermissions = RolePermissionsCollection.FetchAll();

                #region This block will only run the first time this method is called to insert the everyone/manager/contributor roles

                // check for and insert the everyone role
                RolePermissions temp = rolePermissions.Find(
                    delegate(RolePermissions rp)
                {
                    return(rp.RoleName == GraffitiUsers.EveryoneRole);
                });

                if (temp == null)
                {
                    GraffitiUsers.AddUpdateRole(GraffitiUsers.EveryoneRole, true, false, false);
                    rolePermissions = RolePermissionsCollection.FetchAll();
                }

                // check for and insert the manager role
                temp = rolePermissions.Find(
                    delegate(RolePermissions rp)
                {
                    return(rp.RoleName == GraffitiUsers.ManagerRole);
                });

                if (temp == null)
                {
                    GraffitiUsers.AddUpdateRole(GraffitiUsers.ManagerRole, true, true, true);
                    rolePermissions = RolePermissionsCollection.FetchAll();
                }

                // check for and insert the comtributor role
                temp = rolePermissions.Find(
                    delegate(RolePermissions rp)
                {
                    return(rp.RoleName == GraffitiUsers.ContributorRole);
                });

                if (temp == null)
                {
                    GraffitiUsers.AddUpdateRole(GraffitiUsers.ContributorRole, true, true, false);
                    rolePermissions = RolePermissionsCollection.FetchAll();
                }

                #endregion
            }

            return(rolePermissions);
        }
Ejemplo n.º 7
0
        protected override void Authenticate()
        {
            if (GraffitiUsers.Current == null)
            {
                Response.Redirect("~/login/");
            }

            if (!RolePermissionManager.CanViewControlPanel(GraffitiUsers.Current) &&
                !GraffitiUsers.IsAdmin(GraffitiUsers.Current))
            {
                Response.Redirect("~/");
            }
        }
Ejemplo n.º 8
0
        protected static bool ValidateUser(string username, string password)
        {
            IGraffitiUser userToLogin = GraffitiUsers.Login(username, password, true);

            if (userToLogin != null)
            {
                //HttpContext.Current.User = userToLogin;
                return(true);
            }

            Log.Warn("Security", "Invalid login attempt by {0}", username);

            return(false);
        }
Ejemplo n.º 9
0
        public bool ChangePassword(string username, string old_password, string new_password)
        {
            username = username.ToLower();
            User user = Login(username, old_password) as User;

            if (user != null)
            {
                user.Password = new_password;
                GraffitiUsers.Save(user, null);
                return(true);
            }

            return(false);
        }
Ejemplo n.º 10
0
        public bool ChangePassword(string username, string password)
        {
            username = username.ToLower();
            User user = User.FetchByColumn(User.Columns.Name, username);

            if (!user.IsNew)
            {
                user.Password = password;
                GraffitiUsers.Save(user, null);
                return(true);
            }

            return(false);
        }
Ejemplo n.º 11
0
        public void RemoveUserFromRole(string userName, string roleName)
        {
            userName = userName.ToLower();
            Query q = UserRole.CreateQuery();

            q.AndWhere(UserRole.Columns.UserId, (GraffitiUsers.GetUser(userName) as User).Id);
            q.AndWhere(UserRole.Columns.RoleName, roleName);
            UserRoleCollection urCol = new UserRoleCollection();

            urCol.LoadAndCloseReader(q.ExecuteReader());
            if (urCol.Count > 0)
            {
                UserRole.Destroy(urCol[0].Id);
            }
        }
Ejemplo n.º 12
0
        public static void SendRequestedChangesMessage(Post p, IGraffitiUser user)
        {
            List <IGraffitiUser> users = new List <IGraffitiUser>();

            foreach (IGraffitiUser u in GraffitiUsers.GetUsers("*"))
            {
                if (GraffitiUsers.IsAdmin(u) || RolePermissionManager.GetPermissions(p.CategoryId, u).Publish)
                {
                    users.Add(u);
                }
            }

            Macros m = new Macros();

            EmailTemplateToolboxContext pttc = new EmailTemplateToolboxContext();

            pttc.Put("sitesettings", SiteSettings.Get());
            pttc.Put("post", p);
            pttc.Put("user", user);
            pttc.Put("macros", m);
            pttc.Put("home", m.FullUrl(new Urls().Home));
            pttc.Put("adminUrl",
                     m.FullUrl(VirtualPathUtility.ToAbsolute("~/graffiti-admin/posts/write/")) + "?id=" + p.Id + "&v=" +
                     p.Version);

            EmailTemplate template = new EmailTemplate();

            template.Context      = pttc;
            template.To           = p.User.Email;
            template.Subject      = "Changes Requested: " + p.Title;
            template.TemplateName = "RequestChanges.view";

            try
            {
                Emailer.Send(template);
                //Emailer.Send("RequestChanges.view", p.User.Email, "Changes Requested: " + p.Title, pttc);
                Log.Info("Post Changes Email", p.User.Email + " was sent an email requesting changes");
            }
            catch (Exception ex)
            {
                Log.Error("Email Requested Changes Error", ex.Message);
            }
        }
Ejemplo n.º 13
0
        public void AddUserToRole(string userName, string RoleName)
        {
            userName = userName.ToLower();
            User user = (User)GraffitiUsers.GetUser(userName);

            Query q = UserRole.CreateQuery();

            q.AndWhere(UserRole.Columns.UserId, user.Id);
            q.AndWhere(UserRole.Columns.RoleName, RoleName);
            UserRoleCollection urCol = new UserRoleCollection();

            urCol.LoadAndCloseReader(q.ExecuteReader());
            if (urCol.Count == 0)
            {
                UserRole ur = new UserRole();
                ur.UserId   = user.Id;
                ur.RoleName = RoleName;
                ur.Save();
            }
        }
Ejemplo n.º 14
0
        public static void DeleteRole(string roleName)
        {
            // Remove users from role
            List <IGraffitiUser> roleUsers = GraffitiUsers.GetUsers(roleName);

            if (roleUsers != null && roleUsers.Count > 0)
            {
                foreach (IGraffitiUser user in roleUsers)
                {
                    GraffitiUsers.RemoveUserFromRole(user.Name, roleName);
                }
            }

            RolePermissionsCollection         rp  = RolePermissionManager.GetRolePermissions();
            RoleCategoryPermissionsCollection rpc = RolePermissionManager.GetRoleCategoryPermissions();

            foreach (RolePermissions rperm in rp)
            {
                if (String.Compare(rperm.RoleName, roleName, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    RolePermissions.Destroy(RolePermissions.Columns.RoleName, rperm.RoleName);
                    break;
                }
            }

            foreach (RoleCategoryPermissions rcatperm in rpc)
            {
                if (String.Compare(rcatperm.RoleName, roleName, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    RoleCategoryPermissions.Destroy(RolePermissions.Columns.RoleName, rcatperm.RoleName);
                    break;
                }
            }

            RolePermissionManager.MarkDirty();

            // Remove role from other membership databases
            controller.DeleteRole(roleName);
        }
Ejemplo n.º 15
0
        public static bool CanViewControlPanel(IGraffitiUser user)
        {
            if (user == null)
            {
                return(false);
            }

            if (GraffitiUsers.IsAdmin(user))
            {
                return(true);
            }

            foreach (string role in user.Roles)
            {
                foreach (RolePermissions rp in GetRolePermissions())
                {
                    if (rp.RoleName == role)
                    {
                        if (rp.HasEdit || rp.HasPublish)
                        {
                            return(true);
                        }
                    }
                }

                foreach (RoleCategoryPermissions rcp in GetRoleCategoryPermissions())
                {
                    if (rcp.RoleName == role)
                    {
                        if (rcp.HasEdit || rcp.HasPublish)
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 16
0
        public MetaWeblog.UserInfo getUserInfo(string appKey, string username, string password)
        {
            if (ValidateUser(username, password))
            {
                IGraffitiUser gu = GraffitiUsers.GetUser(username);
                UserInfo      ui = new UserInfo();
                ui.userid    = gu.Name;
                ui.firstname = gu.ProperName;
                ui.lastname  = "";

                ui.email = gu.Email;

                ui.nickname = gu.ProperName;


                ui.url = gu.WebSite ?? new Macros().FullUrl(new Urls().Home);


                return(ui);
            }
            throw new XmlRpcFaultException(0, "User does not exist");
        }
Ejemplo n.º 17
0
        public static Permission GetPermissions(int categoryId, IGraffitiUser user, bool calledFromMultipleCategoryPage)
        {
            string[] roles;

            // if there is no users, setup the roles collection to be everyone
            if (user == null)
            {
                roles = new string[1] {
                    GraffitiUsers.EveryoneRole
                };
            }
            else             // get the users roles
            {
                roles = user.Roles;
            }

            Permission p = new Permission();

            // if the user is an admin, they have access to everything
            if (GraffitiUsers.IsAdmin(user))
            {
                p.Read    = true;
                p.Edit    = true;
                p.Publish = true;

                return(p);
            }

            // determines if category permissions are setup, which overrides individual role permissions
            bool setInCategoryPermissions = false;

            if (categoryId != -1 || calledFromMultipleCategoryPage)
            {
                foreach (string role in roles)
                {
                    foreach (RoleCategoryPermissions rcp in GetRoleCategoryPermissions())
                    {
                        if (rcp.RoleName == role)
                        {
                            if (rcp.CategoryId == categoryId || calledFromMultipleCategoryPage)
                            {
                                // only set it if it's false. if another permissions allowed this category,
                                // the user has permissions
                                if (!p.Read)
                                {
                                    p.Read = rcp.HasRead;
                                }

                                if (!p.Edit)
                                {
                                    p.Edit = rcp.HasEdit;
                                }

                                if (!p.Publish)
                                {
                                    p.Publish = rcp.HasPublish;
                                }
                            }

                            setInCategoryPermissions = true;
                        }
                    }
                }
            }

            if (!setInCategoryPermissions)
            {
                foreach (string role in roles)
                {
                    foreach (RolePermissions rp in GetRolePermissions())
                    {
                        if (rp.RoleName == role)
                        {
                            // only set it if it's false. if another permissions allowed,
                            // the user has permissions
                            if (!p.Read)
                            {
                                p.Read = rp.HasRead;
                            }

                            if (!p.Edit)
                            {
                                p.Edit = rp.HasEdit;
                            }

                            if (!p.Publish)
                            {
                                p.Publish = rp.HasPublish;
                            }
                        }
                    }
                }
            }

            return(p);
        }
Ejemplo n.º 18
0
        private static Graffiti.Core.Category AddOrFetchCategory(string name, IGraffitiUser user)
        {
            int index = name.IndexOf(">");

            if (index > -1)
            {
                string parentName = name.Substring(0, index).Trim();
                string childName  = name.Substring(index + 1).Trim();

                Graffiti.Core.Category parent = new CategoryController().GetCachedCategory(parentName, true);

                if (parent != null)
                {
                    foreach (Graffiti.Core.Category childCategory in parent.Children)
                    {
                        if (Util.AreEqualIgnoreCase(childCategory.Name, childName))
                        {
                            return(childCategory);
                        }
                    }

                    if (GraffitiUsers.IsAdmin(user))
                    {
                        Core.Category child = new Core.Category();
                        child.Name     = HttpUtility.HtmlEncode(childName);
                        child.ParentId = parent.Id;
                        child.Save();

                        return(child);
                    }
                }
                else
                {
                    if (GraffitiUsers.IsAdmin(user))
                    {
                        parent      = new Core.Category();
                        parent.Name = HttpUtility.HtmlEncode(parentName);
                        parent.Save();

                        Core.Category child = new Core.Category();
                        child.Name     = HttpUtility.HtmlEncode(childName);
                        child.ParentId = parent.Id;
                        child.Save();

                        return(child);
                    }
                }
            }
            else
            {
                Core.Category category = new CategoryController().GetCachedCategory(name, true);
                if (category == null)
                {
                    if (GraffitiUsers.IsAdmin(user))
                    {
                        category      = new Core.Category();
                        category.Name = name;
                        category.Save();
                    }
                }

                return(category);
            }

            Log.Warn("Categories", "The user {0} does not have permission to create the category {1}", user.ProperName, HttpUtility.HtmlEncode(name));
            throw new Exception("You do not have permission to create a new category or sub-category");
        }
Ejemplo n.º 19
0
        private string GetBreadCrumbs()
        {
            Urls          urls   = new Urls();
            StringBuilder crumbs = new StringBuilder();

            if (Page.MasterPageFile.EndsWith("AdminModal.master"))
            {
                crumbs.Append("<div class=\"breadcrumbs_modal\">");
            }
            else
            {
                crumbs.Append("<div class=\"breadcrumbs\">");
            }

            switch (_sectionName)
            {
            case Section.ThemeEdit:
            {
                crumbs.Append(GetHyperLink("Presentation", ResolveUrl("~/graffiti-admin/presentation/"), true));
                crumbs.Append(GetHyperLink("Themes", ResolveUrl("~/graffiti-admin/presentation/themes/"), true));

                string theme = HttpContext.Current.Request.QueryString[QueryStringKey.Theme];
                crumbs.Append(GetHyperLink(theme, String.Format("EditTheme.aspx?{0}={1}", QueryStringKey.Theme, theme), false));
            }
            break;

            case Section.ConfigureTheme:
            {
                crumbs.Append(GetHyperLink("Presentation", ResolveUrl("~/graffiti-admin/presentation/"), true));
                crumbs.Append(GetHyperLink("Themes", ResolveUrl("~/graffiti-admin/presentation/themes/"), true));

                string theme = HttpContext.Current.Request.QueryString[QueryStringKey.Theme];
                crumbs.Append(GetHyperLink(theme, String.Format("EditTheme.aspx?{0}={1}", QueryStringKey.Theme, theme), true));

                crumbs.Append(GetHyperLink("Configure Theme",
                                           ResolveUrl("~/graffiti-admin/presentation/themes/ConfigureTheme.aspx?" +
                                                      QueryStringKey.Theme + "=" + theme), false));
            }
            break;

            case Section.Widget:

                crumbs.Append(GetHyperLink("Presentation", ResolveUrl("~/graffiti-admin/presentation/"), true));
                crumbs.Append(GetHyperLink("Widgets", ResolveUrl("~/graffiti-admin/presentation/widgets/"), true));

                break;

            case Section.WidgetEdit:

                crumbs.Append(GetHyperLink("Presentation", ResolveUrl("~/graffiti-admin/presentation/"), true));
                crumbs.Append(GetHyperLink("Widgets", ResolveUrl("~/graffiti-admin/presentation/widgets/"), true));

                Widget widget = Widgets.Fetch(new Guid(HttpContext.Current.Request.QueryString[QueryStringKey.Id]));
                crumbs.Append(GetHyperLink(widget.Name, String.Format("edit.aspx?{0}={1}", QueryStringKey.Id, widget.Id), false));

                break;

            case Section.SiteSettings:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Settings", ResolveUrl("~/graffiti-admin/site-options/settings/"), false));

                break;

            case Section.Configuration:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Configuration", ResolveUrl("~/graffiti-admin/site-options/configuration/"), false));

                break;

            case Section.Utilities:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Utilities", ResolveUrl("~/graffiti-admin/site-options/utilities/"), false));

                break;

            case Section.RebuildPages:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Utilities", ResolveUrl("~/graffiti-admin/site-options/utilities/"), true));
                crumbs.Append(GetHyperLink("Rebuild Pages", ResolveUrl("~/graffiti-admin/site-options/utilities/RebuildPages.aspx"),
                                           false));

                break;

            case Section.Logs:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Utilities", ResolveUrl("~/graffiti-admin/site-options/utilities/"), true));
                crumbs.Append(GetHyperLink("Logs", ResolveUrl("~/graffiti-admin/site-options/utilities/LogViewer.aspx"), false));

                break;

            case Section.Migrator:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Utilities", ResolveUrl("~/graffiti-admin/site-options/utilities/"), true));
                crumbs.Append(GetHyperLink("Migrator", ResolveUrl("~/graffiti-admin/site-options/utilities/migrator/"), false));

                break;

            case Section.Comments:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Comments", ResolveUrl("~/graffiti-admin/site-options/comments/"), false));

                break;


            case Section.CustomFields:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Custom Fields", ResolveUrl("~/graffiti-admin/site-options/custom-fields/"), true));

                string customFieldId   = HttpContext.Current.Request.QueryString[QueryStringKey.Id];
                int    fieldCategoryId = int.Parse(HttpContext.Current.Request.QueryString["category"] ?? "-1");

                if (!String.IsNullOrEmpty(customFieldId))
                {
                    CustomFormSettings csf = CustomFormSettings.Get(fieldCategoryId, false);

                    CustomField cf = null;
                    Guid        g  = new Guid(customFieldId);
                    foreach (CustomField cfx in csf.Fields)
                    {
                        if (cfx.Id == g)
                        {
                            cf = cfx;
                            break;
                        }
                    }

                    if (cf != null)
                    {
                        crumbs.Append(GetHyperLink(cf.Name, ResolveUrl("~/graffiti-admin/site-options/custom-fields/?id=" + cf.Id), false));
                    }
                }

                break;

            case Section.Themes:

                crumbs.Append(GetHyperLink("Presentation", ResolveUrl("~/graffiti-admin/presentation/"), true));
                crumbs.Append(GetHyperLink("Themes", ResolveUrl("~/graffiti-admin/presentation/themes/"), false));

                break;

            case Section.SortHomePosts:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Home Page", ResolveUrl("~/graffiti-admin/site-options/homesort/"), false));

                break;

            case Section.Licensing:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Licensing", ResolveUrl("~/graffiti-admin/site-options/licensing/"), false));

                break;

            case Section.Categories:
            {
                string id = HttpContext.Current.Request.QueryString[QueryStringKey.Id];

                if (String.IsNullOrEmpty(id))
                {
                    return(string.Empty);
                }

                var categories = new List <Category>();

                Category c = new Category(id);
                categories.Add(c);

                Category parent;

                if (c.ParentId != -1)
                {
                    parent = c;

                    bool noMoreParents = false;

                    while (!noMoreParents)
                    {
                        parent = new Category(parent.ParentId);
                        if (parent.Id != 0)
                        {
                            categories.Insert(0, parent);
                        }
                        else
                        {
                            noMoreParents = true;
                        }
                    }
                }

                crumbs.Append(GetHyperLink("Categories", ResolveUrl("~/graffiti-admin/categories/"), true));

                int counter  = 0;
                int catCount = categories.Count;

                foreach (Category tempcat in categories)
                {
                    counter++;

                    bool addArrow = counter == catCount ? false : true;

                    crumbs.Append(GetHyperLink(tempcat.Name, ResolveUrl("~/graffiti-admin/categories/?id=" + tempcat.Id), addArrow));
                }
            }
            break;

            case Section.SortPosts:
            {
                string id = HttpContext.Current.Request.QueryString[QueryStringKey.Id];

                if (String.IsNullOrEmpty(id))
                {
                    return(string.Empty);
                }

                var categories = new List <Category>();

                Category c = new Category(id);
                categories.Add(c);

                Category parent;

                if (c.ParentId != -1)
                {
                    parent = c;

                    bool noMoreParents = false;

                    while (!noMoreParents)
                    {
                        parent = new Category(parent.ParentId);
                        if (parent.Id != 0)
                        {
                            categories.Insert(0, parent);
                        }
                        else
                        {
                            noMoreParents = true;
                        }
                    }
                }

                crumbs.Append(GetHyperLink("Categories", ResolveUrl("~/graffiti-admin/categories/"), true));
                foreach (Category tempcat in categories)
                {
                    crumbs.Append(GetHyperLink(tempcat.Name, ResolveUrl("~/graffiti-admin/categories/?id=" + tempcat.Id), true));
                }

                crumbs.Append(GetHyperLink("Order Posts", ResolveUrl("~/graffiti-admin/categories/PostSortOrder.aspx?id=" + id),
                                           false));
            }
            break;


            case Section.SiteComments:

                string commentId = HttpContext.Current.Request.QueryString[QueryStringKey.Id];

                if (String.IsNullOrEmpty(commentId))
                {
                    return(string.Empty);
                }

                Comment comment = new Comment(commentId);

                crumbs.Append(GetHyperLink("Comments", ResolveUrl("~/graffiti-admin/comments/"), true));
                crumbs.Append(GetHyperLink(comment.Name + " @ " + comment.Published,
                                           ResolveUrl("~/graffiti-admin/comments/?id=" + comment.Id), false));

                break;

            case Section.Navigation:

                crumbs.Append(GetHyperLink("Presentation", ResolveUrl("~/graffiti-admin/presentation/"), true));
                crumbs.Append(GetHyperLink("Navigation", ResolveUrl("~/graffiti-admin/presentation/navigation/"), false));

                break;

            case Section.UserManagement:

                crumbs.Append(GetHyperLink("User Management", ResolveUrl("~/graffiti-admin/user-management/"), true));

                string user = HttpContext.Current.Request.QueryString[QueryStringKey.User];

                if (!String.IsNullOrEmpty(user))
                {
                    crumbs.Append(GetHyperLink("Users", ResolveUrl("~/graffiti-admin/user-management/users"), true));

                    IGraffitiUser graffitiUser = GraffitiUsers.GetUser(user);
                    crumbs.Append(GetHyperLink(graffitiUser.Name,
                                               ResolveUrl("~/graffiti-admin/user-management/users/?user="******"Users", ResolveUrl("~/graffiti-admin/user-management/users"), false));
                }

                break;

            case Section.Roles:

                crumbs.Append(GetHyperLink("User Management", ResolveUrl("~/graffiti-admin/user-management/"), true));

                string role =
                    HttpUtility.HtmlEncode(
                        HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request.QueryString[QueryStringKey.Role]));

                if (!String.IsNullOrEmpty(role))
                {
                    crumbs.Append(GetHyperLink("Roles", ResolveUrl("~/graffiti-admin/user-management/roles"), true));

                    crumbs.Append(GetHyperLink(role, ResolveUrl("~/graffiti-admin/user-management/roles/?role=" + role), false));
                }
                else
                {
                    crumbs.Append(GetHyperLink("Roles", ResolveUrl("~/graffiti-admin/user-management/roles"), false));
                }

                break;

            case Section.ChangePassword:

                string cpUser = HttpContext.Current.Request.QueryString[QueryStringKey.User];

                if (String.IsNullOrEmpty(cpUser))
                {
                    return(string.Empty);
                }

                IGraffitiUser graffitiUser1 = GraffitiUsers.GetUser(cpUser);

                crumbs.Append(GetHyperLink("User Management", ResolveUrl("~/graffiti-admin/user-management/"), true));
                crumbs.Append(GetHyperLink("Users", ResolveUrl("~/graffiti-admin/user-management/users/"), true));
                crumbs.Append(GetHyperLink(graffitiUser1.Name,
                                           ResolveUrl("~/graffiti-admin/user-management/users/?user="******"Change Password",
                                           ResolveUrl("~/graffiti-admin/user-management/users/changepassword.aspx?user="******"Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Plug-Ins", ResolveUrl("~/graffiti-admin/site-options/plug-ins/"), false));

                break;

            case Section.PlugInsEdit:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Plug-Ins", ResolveUrl("~/graffiti-admin/site-options/plug-ins/"), true));

                EventDetails ed = Core.Events.GetEvent(HttpContext.Current.Request.QueryString["t"]);

                crumbs.Append(GetHyperLink(ed.Event.Name,
                                           ResolveUrl("~/graffiti-admin/site-options/plug-ins/edit.aspx?t=") +
                                           HttpContext.Current.Request.QueryString["t"], false));

                break;

            case Section.Packages:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Packages", ResolveUrl("~/graffiti-admin/site-options/packages/"), false));

                break;

            case Section.EmailSettings:

                crumbs.Append(GetHyperLink("Site Options", ResolveUrl("~/graffiti-admin/site-options/"), true));
                crumbs.Append(GetHyperLink("Email Settings", ResolveUrl("~/graffiti-admin/site-options/email-settings/"), false));

                break;

            case Section.WidgetMarketplace:

                crumbs.Append(GetHyperLink("All Widgets", urls.AdminMarketplace("Widgets"), true));

                CatalogInfo widgets = Marketplace.Marketplace.Catalogs[CatalogType.Widgets];

                int    categoryId = 0;
                string category   = HttpContext.Current.Request.QueryString["category"];
                if (!string.IsNullOrEmpty(category))
                {
                    try
                    {
                        categoryId = int.Parse(category);
                    }
                    catch
                    {
                    }
                }

                if ((categoryId != 0) && widgets.Categories.ContainsKey(categoryId))
                {
                    CategoryInfo categoryInfo = widgets.Categories[categoryId];
                    crumbs.Append(GetHyperLink(categoryInfo.Name,
                                               urls.AdminMarketplace("Widgets") + "&category=" + categoryInfo.Id.ToString(), false));
                }

                string creatorId = string.Empty;
                if (!string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["creator"]))
                {
                    creatorId = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString["creator"]);
                }

                if (!string.IsNullOrEmpty(creatorId) && (Marketplace.Marketplace.Creators.ContainsKey(creatorId)))
                {
                    CreatorInfo creatorInfo = Marketplace.Marketplace.Creators[creatorId];
                    crumbs.Append(GetHyperLink(creatorInfo.Name,
                                               urls.AdminMarketplace("Widgets") + "&creator=" + HttpUtility.UrlEncode(creatorInfo.Id),
                                               false));
                }

                int    itemId = 0;
                string item   = HttpContext.Current.Request.QueryString["item"];
                if (!string.IsNullOrEmpty(item))
                {
                    try
                    {
                        itemId = int.Parse(item);
                    }
                    catch
                    {
                    }
                }

                if ((itemId != 0) && (widgets.Items.ContainsKey(itemId)))
                {
                    ItemInfo     itemInfo     = widgets.Items[itemId];
                    CategoryInfo categoryInfo = itemInfo.Category;
                    if (categoryInfo != null)
                    {
                        crumbs.Append(GetHyperLink(categoryInfo.Name,
                                                   urls.AdminMarketplace("Widgets") + "&category=" + categoryInfo.Id.ToString(), true));
                        crumbs.Append(GetHyperLink(itemInfo.Name, urls.AdminMarketplaceItem("Widgets", itemInfo.Id), false));
                    }
                }

                break;

            case Section.ThemeMarketplace:

                crumbs.Append(GetHyperLink("All Themes", urls.AdminMarketplace("Themes"), true));

                CatalogInfo themeCatalog = Marketplace.Marketplace.Catalogs[CatalogType.Themes];

                categoryId = 0;
                category   = HttpContext.Current.Request.QueryString["category"];
                if (!string.IsNullOrEmpty(category))
                {
                    try
                    {
                        categoryId = int.Parse(category);
                    }
                    catch
                    {
                    }
                }

                if ((categoryId != 0) && (themeCatalog.Categories.ContainsKey(categoryId)))
                {
                    CategoryInfo categoryInfo = themeCatalog.Categories[categoryId];
                    crumbs.Append(GetHyperLink(categoryInfo.Name,
                                               urls.AdminMarketplace("Themes") + "&category=" + categoryInfo.Id.ToString(), false));
                }

                creatorId = string.Empty;
                if (!string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["creator"]))
                {
                    creatorId = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString["creator"]);
                }

                if (!string.IsNullOrEmpty(creatorId) && (Marketplace.Marketplace.Creators.ContainsKey(creatorId)))
                {
                    CreatorInfo creatorInfo = Marketplace.Marketplace.Creators[creatorId];
                    crumbs.Append(GetHyperLink(creatorInfo.Name,
                                               urls.AdminMarketplace("Themes") + "&creator=" + HttpUtility.UrlEncode(creatorInfo.Id),
                                               false));
                }

                itemId = 0;
                item   = HttpContext.Current.Request.QueryString["item"];
                if (!string.IsNullOrEmpty(item))
                {
                    try
                    {
                        itemId = int.Parse(item);
                    }
                    catch
                    {
                    }
                }

                if ((itemId != 0) && (themeCatalog.Items.ContainsKey(itemId)))
                {
                    ItemInfo     itemInfo     = themeCatalog.Items[itemId];
                    CategoryInfo categoryInfo = itemInfo.Category;
                    if (categoryInfo != null)
                    {
                        crumbs.Append(GetHyperLink(categoryInfo.Name,
                                                   urls.AdminMarketplace("Themes") + "&category=" + categoryInfo.Id.ToString(), true));
                        crumbs.Append(GetHyperLink(itemInfo.Name, urls.AdminMarketplaceItem("Themes", itemInfo.Id), false));
                    }
                }

                break;

            case Section.PluginMarketplace:

                crumbs.Append(GetHyperLink("All Plugins", urls.AdminMarketplace("Plugins"), true));

                CatalogInfo plugins = Marketplace.Marketplace.Catalogs[CatalogType.Plugins];

                categoryId = 0;
                category   = HttpContext.Current.Request.QueryString["category"];
                if (!string.IsNullOrEmpty(category))
                {
                    try
                    {
                        categoryId = int.Parse(category);
                    }
                    catch
                    {
                    }
                }

                if ((categoryId != 0) && plugins.Categories.ContainsKey(categoryId))
                {
                    CategoryInfo categoryInfo = plugins.Categories[categoryId];
                    crumbs.Append(GetHyperLink(categoryInfo.Name,
                                               urls.AdminMarketplace("Plugins") + "&category=" + categoryInfo.Id.ToString(), false));
                }

                creatorId = string.Empty;
                if (!string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["creator"]))
                {
                    creatorId = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString["creator"]);
                }

                if (!string.IsNullOrEmpty(creatorId) && (Marketplace.Marketplace.Creators.ContainsKey(creatorId)))
                {
                    CreatorInfo creatorInfo = Marketplace.Marketplace.Creators[creatorId];
                    crumbs.Append(GetHyperLink(creatorInfo.Name,
                                               urls.AdminMarketplace("Plugins") + "&creator=" + HttpUtility.UrlEncode(creatorInfo.Id),
                                               false));
                }

                itemId = 0;
                item   = HttpContext.Current.Request.QueryString["item"];
                if (!string.IsNullOrEmpty(item))
                {
                    try
                    {
                        itemId = int.Parse(item);
                    }
                    catch
                    {
                    }
                }

                if ((itemId != 0) && (plugins.Items.ContainsKey(itemId)))
                {
                    ItemInfo     itemInfo     = plugins.Items[itemId];
                    CategoryInfo categoryInfo = itemInfo.Category;
                    if (categoryInfo != null)
                    {
                        crumbs.Append(GetHyperLink(categoryInfo.Name,
                                                   urls.AdminMarketplace("Plugins") + "&category=" + categoryInfo.Id.ToString(), true));
                        crumbs.Append(GetHyperLink(itemInfo.Name, urls.AdminMarketplaceItem("Plugins", itemInfo.Id), false));
                    }
                }

                break;

                // more breadcrumb logic here, add a value to the enum
            }

            crumbs.Append("</div>");

            return(crumbs.ToString());
        }