/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="identifier">ACL identifier (normally user or group name).</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="rights">Identifier rights.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>folder</b>,<b>identifier</b>,<b>rights</b> or <b>response</b> is null reference.</exception> internal IMAP_e_SetAcl(string folder, string identifier, IMAP_Flags_SetType flagsSetType, string rights, IMAP_r_ServerStatus response) { if (folder == null) { throw new ArgumentNullException("folder"); } if (identifier == null) { throw new ArgumentNullException("identifier"); } if (rights == null) { throw new ArgumentNullException("rights"); } if (response == null) { throw new ArgumentNullException("response"); } m_pResponse = response; m_Folder = folder; m_Identifier = identifier; m_SetType = flagsSetType; m_Rights = rights; }
/// <summary> /// Default constructor. /// </summary> /// <param name="session">Owner IMAP session.</param> /// <param name="folderName">Folder name which ACL to set.</param> /// <param name="userName">User name which ACL to set.</param> /// <param name="flagsSetType">Specifies how flags must be stored.</param> /// <param name="aclFlags">Flags which to store.</param> public IMAP_SETACL_eArgs(IMAP_Session session,string folderName,string userName,IMAP_Flags_SetType flagsSetType,IMAP_ACL_Flags aclFlags) { m_pSession = session; m_pFolderName = folderName; m_UserName = userName; m_FlagsSetType = flagsSetType; m_ACL_Flags = aclFlags; }
/// <summary> /// Default constructor. /// </summary> /// <param name="session">Owner IMAP session.</param> /// <param name="folderName">Folder name which ACL to set.</param> /// <param name="userName">User name which ACL to set.</param> /// <param name="flagsSetType">Specifies how flags must be stored.</param> /// <param name="aclFlags">Flags which to store.</param> public IMAP_SETACL_eArgs(IMAP_Session session, string folderName, string userName, IMAP_Flags_SetType flagsSetType, IMAP_ACL_Flags aclFlags) { m_pSession = session; m_pFolderName = folderName; m_UserName = userName; m_FlagsSetType = flagsSetType; m_ACL_Flags = aclFlags; }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="msgInfo">Message info.</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="flags">Flags.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>folder</b>,<b>msgInfo</b>,<b>flags</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Store(string folder,IMAP_MessageInfo msgInfo,IMAP_Flags_SetType flagsSetType,string[] flags,IMAP_r_ServerStatus response) { if(folder == null){ throw new ArgumentNullException("folder"); } if(msgInfo == null){ throw new ArgumentNullException("msgInfo"); } if(flags == null){ throw new ArgumentNullException("flags"); } m_pResponse = response; m_Folder = folder; m_pMsgInfo = msgInfo; m_SetType = flagsSetType; m_pFlags = flags; }
internal IMAP_SETACL_eArgs OnSetFolderACL(IMAP_Session session, string folderName, string userName, IMAP_Flags_SetType flagsSetType, IMAP_ACL_Flags aclFlags) { IMAP_SETACL_eArgs eArgs = new IMAP_SETACL_eArgs(session, folderName, userName, flagsSetType, aclFlags); if (SetFolderACL != null) { SetFolderACL(session, eArgs); } return(eArgs); }
/// <summary> /// Updates IMAP message flags. /// </summary> /// <param name="setType">Flags set type.</param> /// <param name="flags">IMAP message flags.</param> /// <exception cref="ArgumentNullException">Is raised when <b>flags</b> is null reference.</exception> internal void UpdateFlags(IMAP_Flags_SetType setType, string[] flags) { if (flags == null) { throw new ArgumentNullException("flags"); } if (setType == IMAP_Flags_SetType.Add) { m_pFlags = IMAP_Utils.MessageFlagsAdd(m_pFlags, flags); } else if (setType == IMAP_Flags_SetType.Remove) { m_pFlags = IMAP_Utils.MessageFlagsRemove(m_pFlags, flags); } else { m_pFlags = flags; } }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="msgInfo">Message info.</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="flags">Flags.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>folder</b>,<b>msgInfo</b>,<b>flags</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Store(string folder, IMAP_MessageInfo msgInfo, IMAP_Flags_SetType flagsSetType, string[] flags, IMAP_r_ServerStatus response) { if (folder == null) { throw new ArgumentNullException("folder"); } if (msgInfo == null) { throw new ArgumentNullException("msgInfo"); } if (flags == null) { throw new ArgumentNullException("flags"); } m_pResponse = response; m_Folder = folder; m_pMsgInfo = msgInfo; m_SetType = flagsSetType; m_pFlags = flags; }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="identifier">ACL identifier (normally user or group name).</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="rights">Identifier rights.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>folder</b>,<b>identifier</b>,<b>rights</b> or <b>response</b> is null reference.</exception> internal IMAP_e_SetAcl(string folder,string identifier,IMAP_Flags_SetType flagsSetType,string rights,IMAP_r_ServerStatus response) { if(folder == null){ throw new ArgumentNullException("folder"); } if(identifier == null){ throw new ArgumentNullException("identifier"); } if(rights == null){ throw new ArgumentNullException("rights"); } if(response == null){ throw new ArgumentNullException("response"); } m_pResponse = response; m_Folder = folder; m_Identifier = identifier; m_SetType = flagsSetType; m_Rights = rights; }
/// <summary> /// Raises <b>Store</b> event. /// </summary> /// <param name="msgInfo">Message info.</param> /// <param name="setType">Flags set type.</param> /// <param name="flags">Flags.</param> /// <param name="response">Default IMAP server response.</param> /// <returns>Returns event args.</returns> private IMAP_e_Store OnStore(IMAP_MessageInfo msgInfo,IMAP_Flags_SetType setType,string[] flags,IMAP_r_ServerStatus response) { IMAP_e_Store eArgs = new IMAP_e_Store(m_pSelectedFolder.Folder,msgInfo,setType,flags,response); if(this.Store != null){ this.Store(this,eArgs); } return eArgs; }
/// <summary> /// Raises <b>SetAcl</b> event. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="identifier">ACL identifier (normally user or group name).</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="rights">Identifier rights.</param> /// <param name="response">Default IMAP server response.</param> /// <returns>Returns event args.</returns> private IMAP_e_SetAcl OnSetAcl(string folder,string identifier,IMAP_Flags_SetType flagsSetType,string rights,IMAP_r_ServerStatus response) { IMAP_e_SetAcl eArgs = new IMAP_e_SetAcl(folder,identifier,flagsSetType,rights,response); if(this.SetAcl != null){ this.SetAcl(this,eArgs); } return eArgs; }
/// <summary> /// Sets specified folder ACL for specified user. /// </summary> /// <param name="accessingUser">User who accesses this method. /// User needs r permission to call this method or Exception is thrown. /// There is special user 'system' for which permission check is skipped.</param> /// <param name="folderOwnerUser">User who's folder it is.</param> /// <param name="folder">Folder what ACL to set. For example: Inbox,Public Folders/Documnets .</param> /// <param name="userOrGroup">>User or user which group ACL set to specified folder.</param> /// <param name="setType">Specifies how ACL flags must be stored (ADD,REMOVE,REPLACE).</param> /// <param name="aclFlags">ACL flags.</param> public void SetFolderACL(string accessingUser,string folderOwnerUser,string folder,string userOrGroup,IMAP_Flags_SetType setType,IMAP_ACL_Flags aclFlags) { /* Implementation notes: *) Validate values. Throw ArgumnetExcetion if invalid values. *) Ensure that folder owner user exists. *) Ensure that user or user group exists. *) Normalize folder. Remove '/' from folder start and end, ... . *) Do Shared Folders mapping. *) Ensure that folder exists. Throw Exception if don't. *) See if user has sufficient permissions. User requires 'a' permission. There is builtin user system, skip ACL for it. *) Set folder ACL folder. */ //--- Validate values -------------------// ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); ArgsValidator.ValidateUserName(userOrGroup); //---------------------------------------// // Ensure that folder owner user exists. if(!UserExists(folderOwnerUser)){ throw new Exception("User '" + folderOwnerUser + "' doesn't exist !"); } // Ensure that user or user group exists. Skip check for anyone. if(userOrGroup.ToLower() != "anyone" && !GroupExists(userOrGroup)){ if(!UserExists(userOrGroup)){ throw new Exception("Invalid userOrGroup value, there is no such user or group '" + userOrGroup + "' !"); } } // Normalize folder. Remove '/' from folder start and end. folder = API_Utlis.NormalizeFolder(folder); // Do Shared Folders mapping. string originalFolder = folder; SharedFolderMapInfo mappedFolder = MapSharedFolder(originalFolder); if(mappedFolder.IsSharedFolder){ folderOwnerUser = mappedFolder.FolderOnwer; folder = mappedFolder.Folder; if(folderOwnerUser == "" || folder == ""){ throw new ArgumentException("Specified root folder '" + originalFolder + "' isn't accessible !"); } } // Ensure that folder doesn't exists. Throw Exception if don't. if(!FolderExists(folderOwnerUser + "/" + folder)){ throw new Exception("Folder '" + folder + "' doesn't exist !"); } // See if user has sufficient permissions. User requires 'a' permission. // There is builtin user system, skip ACL for it. if(accessingUser.ToLower() != "system"){ IMAP_ACL_Flags acl = GetUserACL(folderOwnerUser,folder,accessingUser); if((acl & IMAP_ACL_Flags.a) == 0){ throw new InsufficientPermissionsException("Insufficient permissions for folder '" + accessingUser + "/" + folder + "' !"); } } //--- Set folder ACL IMAP_ACL_Flags currentACL_Flags = GetUserACL(folderOwnerUser,folder,folderOwnerUser); if(setType == IMAP_Flags_SetType.Replace){ currentACL_Flags = aclFlags; } else if(setType == IMAP_Flags_SetType.Add){ currentACL_Flags |= aclFlags; } else if(setType == IMAP_Flags_SetType.Remove){ currentACL_Flags &= ~aclFlags; } using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_SetFolderACL")){ sqlCmd.AddParameter("_folderOwnerUser",NpgsqlDbType.Varchar,folderOwnerUser); sqlCmd.AddParameter("_folderName" ,NpgsqlDbType.Varchar,folder); sqlCmd.AddParameter("_userOrGroup" ,NpgsqlDbType.Varchar,userOrGroup); sqlCmd.AddParameter("_permissions" ,NpgsqlDbType.Varchar,IMAP_Utils.ACL_to_String(currentACL_Flags)); DataSet ds = sqlCmd.Execute(); } }
public void SetFolderACL(string accessingUser, string folderOwnerUser, string folder, string userOrGroup, IMAP_Flags_SetType setType, IMAP_ACL_Flags aclFlags) { this.m_UpdSync.BeginUpdate(); try { ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); ArgsValidator.ValidateUserName(userOrGroup); if (!this.UserExists(folderOwnerUser)) { throw new Exception("User '" + folderOwnerUser + "' doesn't exist !"); } if (userOrGroup.ToLower() != "anyone" && !this.GroupExists(userOrGroup) && !this.UserExists(userOrGroup)) { throw new Exception("Invalid userOrGroup value, there is no such user or group '" + userOrGroup + "' !"); } folder = API_Utlis.NormalizeFolder(folder); string text = folder; xml_API.SharedFolderMapInfo sharedFolderMapInfo = this.MapSharedFolder(text); if (sharedFolderMapInfo.IsSharedFolder) { folderOwnerUser = sharedFolderMapInfo.FolderOnwer; folder = sharedFolderMapInfo.Folder; if (folderOwnerUser == "" || folder == "") { throw new ArgumentException("Specified root folder '" + text + "' isn't accessible !"); } } if (!this.FolderExists(folderOwnerUser + "/" + folder)) { throw new Exception("Folder '" + folder + "' doesn't exist !"); } if (accessingUser.ToLower() != "system") { IMAP_ACL_Flags userACL = this.GetUserACL(folderOwnerUser, folder, accessingUser); if ((userACL & IMAP_ACL_Flags.a) == IMAP_ACL_Flags.None) { throw new InsufficientPermissionsException(string.Concat(new string[] { "Insufficient permissions for folder '", accessingUser, "/", folder, "' !" })); } } using (DataView dataView = new DataView(this.dsImapACL.Tables["ACL"])) { dataView.RowFilter = string.Concat(new string[] { "Folder='", folderOwnerUser, "/", folder, "' AND User='******'" }); if (dataView.Count == 0) { DataRow dataRow = dataView.Table.NewRow(); dataRow["Folder"] = folderOwnerUser + "/" + folder; dataRow["User"] = userOrGroup; dataRow["Permissions"] = IMAP_Utils.ACL_to_String(aclFlags); dataView.Table.Rows.Add(dataRow); } else { IMAP_ACL_Flags iMAP_ACL_Flags = IMAP_Utils.ACL_From_String(dataView[0]["Permissions"].ToString()); if (setType == IMAP_Flags_SetType.Replace) { dataView[0]["Permissions"] = IMAP_Utils.ACL_to_String(aclFlags); } else { if (setType == IMAP_Flags_SetType.Add) { iMAP_ACL_Flags |= aclFlags; dataView[0]["Permissions"] = IMAP_Utils.ACL_to_String(iMAP_ACL_Flags); } else { if (setType == IMAP_Flags_SetType.Remove) { iMAP_ACL_Flags &= ~aclFlags; dataView[0]["Permissions"] = IMAP_Utils.ACL_to_String(iMAP_ACL_Flags); } } } } this.dsImapACL.WriteXml(this.m_DataPath + "IMAP_ACL.xml", XmlWriteMode.IgnoreSchema); } } catch (Exception ex) { throw ex; } finally { this.m_UpdSync.EndUpdate(); } }
internal IMAP_SETACL_eArgs OnSetFolderACL(IMAP_Session session,string folderName,string userName,IMAP_Flags_SetType flagsSetType,IMAP_ACL_Flags aclFlags) { IMAP_SETACL_eArgs eArgs = new IMAP_SETACL_eArgs(session,folderName,userName,flagsSetType,aclFlags); if(this.SetFolderACL != null){ this.SetFolderACL(session,eArgs); } return eArgs; }
/// <summary> /// Sets specified folder ACL for specified user. /// </summary> /// <param name="accessingUser">User who accesses this method. /// User needs r permission to call this method or Exception is thrown. /// There is special user 'system' for which permission check is skipped.</param> /// <param name="folderOwnerUser">User who's folder it is.</param> /// <param name="folder">Folder what ACL to set. For example: Inbox,Public Folders/Documnets .</param> /// <param name="userOrGroup">>User or user which group ACL set to specified folder.</param> /// <param name="setType">Specifies how ACL flags must be stored (ADD,REMOVE,REPLACE).</param> /// <param name="aclFlags">ACL flags.</param> public void SetFolderACL(string accessingUser,string folderOwnerUser,string folder,string userOrGroup,IMAP_Flags_SetType setType,IMAP_ACL_Flags aclFlags) { m_UpdSync.BeginUpdate(); try{ /* Implementation notes: *) Validate values. Throw ArgumnetExcetion if invalid values. *) Ensure that folder owner user exists. *) Ensure that user or user group exists. *) Normalize folder. Remove '/' from folder start and end, ... . *) Do Shared Folders mapping. *) Ensure that folder exists. Throw Exception if don't. *) See if user has sufficient permissions. User requires 'a' permission. There is builtin user system, skip ACL for it. *) Set folder ACL folder. */ //--- Validate values -------------------// ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); ArgsValidator.ValidateUserName(userOrGroup); //---------------------------------------// // Ensure that folder owner user exists. if(!UserExists(folderOwnerUser)){ throw new Exception("User '" + folderOwnerUser + "' doesn't exist !"); } // Ensure that user or user group exists. Skip check for anyone. if(userOrGroup.ToLower() != "anyone" && !GroupExists(userOrGroup)){ if(!UserExists(userOrGroup)){ throw new Exception("Invalid userOrGroup value, there is no such user or group '" + userOrGroup + "' !"); } } // Normalize folder. Remove '/' from folder start and end. folder = API_Utlis.NormalizeFolder(folder); // Do Shared Folders mapping. string originalFolder = folder; SharedFolderMapInfo mappedFolder = MapSharedFolder(originalFolder); if(mappedFolder.IsSharedFolder){ folderOwnerUser = mappedFolder.FolderOnwer; folder = mappedFolder.Folder; if(folderOwnerUser == "" || folder == ""){ throw new ArgumentException("Specified root folder '" + originalFolder + "' isn't accessible !"); } } // Ensure that folder doesn't exists. Throw Exception if don't. if(!FolderExists(folderOwnerUser + "/" + folder)){ throw new Exception("Folder '" + folder + "' doesn't exist !"); } // See if user has sufficient permissions. User requires 'a' permission. // There is builtin user system, skip ACL for it. if(accessingUser.ToLower() != "system"){ IMAP_ACL_Flags acl = GetUserACL(folderOwnerUser,folder,accessingUser); if((acl & IMAP_ACL_Flags.a) == 0){ throw new InsufficientPermissionsException("Insufficient permissions for folder '" + accessingUser + "/" + folder + "' !"); } } //--- Set folder ACL using(DataView dv = new DataView(dsImapACL.Tables["ACL"])){ dv.RowFilter = "Folder='" + folderOwnerUser + "/" + folder + "' AND User='******'"; // ACL entry for specified user doesn't exists, add it if(dv.Count == 0){ DataRow dr = dv.Table.NewRow(); dr["Folder"] = folderOwnerUser + "/" + folder; dr["User"] = userOrGroup; dr["Permissions"] = IMAP_Utils.ACL_to_String(aclFlags); dv.Table.Rows.Add(dr); } else{ IMAP_ACL_Flags currentACL_Flags = IMAP_Utils.ACL_From_String(dv[0]["Permissions"].ToString()); if(setType == IMAP_Flags_SetType.Replace){ dv[0]["Permissions"] = IMAP_Utils.ACL_to_String(aclFlags); } else if(setType == IMAP_Flags_SetType.Add){ currentACL_Flags |= aclFlags; dv[0]["Permissions"] = IMAP_Utils.ACL_to_String(currentACL_Flags); } else if(setType == IMAP_Flags_SetType.Remove){ currentACL_Flags &= ~aclFlags; dv[0]["Permissions"] = IMAP_Utils.ACL_to_String(currentACL_Flags); } } dsImapACL.WriteXml(m_DataPath + "IMAP_ACL.xml",XmlWriteMode.IgnoreSchema); } } catch(Exception x){ throw x; } finally{ m_UpdSync.EndUpdate(); } }
/// <summary> /// Updates IMAP message flags. /// </summary> /// <param name="setType">Flags set type.</param> /// <param name="flags">IMAP message flags.</param> /// <exception cref="ArgumentNullException">Is raised when <b>flags</b> is null reference.</exception> internal void UpdateFlags(IMAP_Flags_SetType setType,string[] flags) { if(flags == null){ throw new ArgumentNullException("flags"); } if(setType == IMAP_Flags_SetType.Add){ m_pFlags = IMAP_Utils.MessageFlagsAdd(m_pFlags,flags); } else if(setType == IMAP_Flags_SetType.Remove){ m_pFlags = IMAP_Utils.MessageFlagsRemove(m_pFlags,flags); } else{ m_pFlags = flags; } }