/* * Box Social™ * http://boxsocial.net/ * Copyright © 2007, David Lachlan Smith * * $Id:$ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Reflection; using System.Web; using BoxSocial.IO; namespace BoxSocial.Internals { public enum PermissionTypes : byte { View = 0x0, Interact = 0x02, CreateAndEdit = 0x04, Delete = 0x08, } public struct PermissionInfo { public string Key; public string Description; public PermissionTypes PermissionType; public PermissionInfo(string key, string description, PermissionTypes type) { this.Key = key; this.Description = description; this.PermissionType = type; } } [DataTable("account_control_permissions")] public class AccessControlPermission : NumberedItem { [DataField("permission_id", DataFieldKeys.Primary)] long permissionId; [DataField("permission_name", DataFieldKeys.Unique, "u_key", 31)] string permissionName; [DataField("permission_item_type_id", DataFieldKeys.Unique, "u_key")] long itemTypeId; [DataField("permission_description", 63)] string permissionDescription; [DataField("permission_type")] byte permissionType; private string permissionAssembly; private string permissionDescriptionCache; public long PermissionId { get { return permissionId; } } public string Name { get { return permissionName; } set { SetProperty("permissionName", value); } } public PermissionTypes PermissionType { get { return (PermissionTypes)permissionType; } set { SetProperty("permissionType", (byte)value); } } public long ItemTypeId { get { return itemTypeId; } } public ItemType ItemType { get { return new ItemType(core, itemTypeId); } } public string Description { get { if (permissionDescription.StartsWith("{L_") && permissionDescription.EndsWith("}")) { string key = permissionDescription.Substring(3, permissionDescription.Length - 4); if (core.Prose.ContainsKey(key)) { permissionDescriptionCache = core.Prose.GetString(key); } else if ((!string.IsNullOrEmpty(permissionAssembly)) && core.Prose.ContainsKey(permissionAssembly, key)) { permissionDescriptionCache = core.Prose.GetString(permissionAssembly, key); } } else { permissionDescriptionCache = permissionDescription; } return permissionDescriptionCache; } set { SetProperty("permissionType", value); } } public AccessControlPermission(Core core, long permissionId) : base (core) { ItemLoad += new ItemLoadHandler(AccessControlPermission_ItemLoad); try { LoadItem(permissionId); } catch (InvalidItemException) { AccessControlPermission acp = new AccessControlPermission(core, permissionId); throw new InvalidAccessControlPermissionException(acp.Name); } } public AccessControlPermission(Core core, long typeId, string permissionName) : base(core) { ItemLoad += new ItemLoadHandler(AccessControlPermission_ItemLoad); SelectQuery query = GetSelectQueryStub(); query.AddCondition("permission_item_type_id", typeId); query.AddCondition("permission_name", permissionName); DataTable dt = core.Db.Query(query); if (dt.Rows.Count == 1) { loadItemInfo(dt.Rows[0]); } else { throw new InvalidAccessControlPermissionException(); } } public AccessControlPermission(Core core, DataRow permissionRow) : base(core) { ItemLoad += new ItemLoadHandler(AccessControlPermission_ItemLoad); try { loadItemInfo(permissionRow); } catch (InvalidItemException) { throw new InvalidAccessControlPermissionException(); } } private void AccessControlPermission_ItemLoad() { } public static AccessControlPermission Create(Core core, ItemType type, string permissionName, string permissionDescription, PermissionTypes permissionType) { return Create(core, type.TypeId, permissionName, permissionDescription, permissionType); } public static AccessControlPermission Create(Core core, long typeId, string permissionName, string permissionDescription, PermissionTypes permissionType) { AccessControlPermission acp = (AccessControlPermission)Item.Create(core, typeof(AccessControlPermission), new FieldValuePair("permission_item_type_id", typeId), new FieldValuePair("permission_name", permissionName), new FieldValuePair("permission_description", permissionDescription), new FieldValuePair("permission_type", (byte)permissionType)); return acp; } public static List GetPermissions(Core core, IPermissibleItem item) { List permissions = new List(); SelectQuery sQuery = Item.GetSelectQueryStub(typeof(AccessControlPermission)); sQuery.AddCondition("permission_item_type_id", item.ItemKey.TypeId); sQuery.AddSort(SortOrder.Ascending, "permission_type"); DataTable permissionsTable = core.Db.Query(sQuery); foreach (DataRow dr in permissionsTable.Rows) { permissions.Add(new AccessControlPermission(core, dr)); } return permissions; } public new void Delete() { base.Delete(); } public void SetAssembly(Assembly value) { permissionAssembly = value.GetName().Name; } public override long Id { get { return permissionId; } } public override string Uri { get { throw new NotImplementedException(); } } } public class InvalidAccessControlPermissionException : Exception { public InvalidAccessControlPermissionException() : base("Invalid Data Supplied") { } public InvalidAccessControlPermissionException(string permission) : base ("`" + permission + "` permission not found") { } } }