/// <summary> /// Adds specified user or group permissions to active folder. /// </summary> /// <param name="userOrGroup">User or group.</param> /// <param name="permissions">Permissions to allow.</param> /// <returns>Returns added UserFolderAcl.</returns> public UserFolderAcl Add(string userOrGroup, IMAP_ACL_Flags permissions) { /* SetUserFolderAcl <virtualServerID> "<folderOwnerUser>" "<folder>" "<userOrGroup>" <flags:int32> * Responses: +OK * -ERR <errorText> */ string id = Guid.NewGuid().ToString(); // Call TCP SetUserFolderAcl m_pFolder.User.VirtualServer.Server.TcpClient.TcpStream.WriteLine("SetUserFolderAcl " + m_pFolder.User.VirtualServer.VirtualServerID + " " + TextUtils.QuoteString(m_pFolder.User.UserName) + " " + TextUtils.QuoteString(m_pFolder.FolderFullPath) + " " + TextUtils.QuoteString(userOrGroup) + " " + (int)permissions); string response = m_pFolder.User.VirtualServer.Server.ReadLine(); if (!response.ToUpper().StartsWith("+OK")) { throw new Exception(response); } UserFolderAcl acl = new UserFolderAcl(this, m_pFolder, userOrGroup, permissions); m_pAclEntries.Add(acl); return(acl); }
/// <summary> /// Converts IMAP_ACL_Flags to string. /// </summary> /// <param name="flags">Flags to convert.</param> /// <returns></returns> public static string ACL_to_String(IMAP_ACL_Flags flags) { string retVal = ""; if((flags & IMAP_ACL_Flags.l) != 0){ retVal += "l"; } if((flags & IMAP_ACL_Flags.r) != 0){ retVal += "r"; } if((flags & IMAP_ACL_Flags.s) != 0){ retVal += "s"; } if((flags & IMAP_ACL_Flags.w) != 0){ retVal += "w"; } if((flags & IMAP_ACL_Flags.i) != 0){ retVal += "i"; } if((flags & IMAP_ACL_Flags.p) != 0){ retVal += "p"; } if((flags & IMAP_ACL_Flags.c) != 0){ retVal += "c"; } if((flags & IMAP_ACL_Flags.d) != 0){ retVal += "d"; } if((flags & IMAP_ACL_Flags.a) != 0){ retVal += "a"; } return retVal; }
internal UserFolderAcl(UserFolderAclCollection owner, UserFolder folder, string userOrGroup, IMAP_ACL_Flags permissions) { this.m_pOwner = owner; this.m_pFolder = folder; this.m_UserOrGroup = userOrGroup; this.m_Permissions = permissions; }
public UserFolderAcl Add(string userOrGroup, IMAP_ACL_Flags permissions) { Guid.NewGuid().ToString(); this.m_pFolder.User.VirtualServer.Server.TCP_Client.TcpStream.WriteLine(string.Concat(new object[] { "SetUserFolderAcl ", this.m_pFolder.User.VirtualServer.VirtualServerID, " ", TextUtils.QuoteString(this.m_pFolder.User.UserName), " ", TextUtils.QuoteString(this.m_pFolder.FolderFullPath), " ", TextUtils.QuoteString(userOrGroup), " ", (int)permissions })); string text = this.m_pFolder.User.VirtualServer.Server.ReadLine(); if (!text.ToUpper().StartsWith("+OK")) { throw new Exception(text); } UserFolderAcl userFolderAcl = new UserFolderAcl(this, this.m_pFolder, userOrGroup, permissions); this.m_pAclEntries.Add(userFolderAcl); return(userFolderAcl); }
/// <summary> /// Default constructor. /// </summary> /// <param name="owner">Owner UserFolderAclCollection collection that owns this object.</param> /// <param name="folder">Folder to what that ACl entry applies.</param> /// <param name="userOrGroup">User or group to who this acl apply.</param> /// <param name="permissions">Permissions to owner folder.</param> internal UserFolderAcl(UserFolderAclCollection owner,UserFolder folder,string userOrGroup,IMAP_ACL_Flags permissions) { m_pOwner = owner; m_pFolder = folder; m_UserOrGroup = userOrGroup; m_Permissions = permissions; }
/// <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; }
private void m_pTab_Security_Permissions_ItemChecked(object sender, ItemCheckedEventArgs e) { if (m_EvensLocked) { return; } // See if permissions has changed, if so update them. if (m_pTab_Security_UsersOrGroups.SelectedItems.Count > 0) { //--- Construct ACl flags ---------------// IMAP_ACL_Flags acl = IMAP_ACL_Flags.None; if (m_pTab_Security_Permissions.Items[0].Checked) { acl |= IMAP_ACL_Flags.a; } if (m_pTab_Security_Permissions.Items[1].Checked) { acl |= IMAP_ACL_Flags.l; } if (m_pTab_Security_Permissions.Items[2].Checked) { acl |= IMAP_ACL_Flags.c; } if (m_pTab_Security_Permissions.Items[3].Checked) { acl |= IMAP_ACL_Flags.r; } if (m_pTab_Security_Permissions.Items[4].Checked) { acl |= IMAP_ACL_Flags.i | IMAP_ACL_Flags.p; } if (m_pTab_Security_Permissions.Items[5].Checked) { acl |= IMAP_ACL_Flags.d; } if (m_pTab_Security_Permissions.Items[6].Checked) { acl |= IMAP_ACL_Flags.w | IMAP_ACL_Flags.s; } //--------------------------------------// UserFolderAcl aclEntry = (UserFolderAcl)m_pTab_Security_UsersOrGroups.SelectedItems[0].Tag; if (aclEntry.Permissions != acl) { aclEntry.Permissions = acl; } } }
/// <summary> /// Gets myrights to specified folder. /// </summary> /// <param name="folderName"></param> /// <returns></returns> public IMAP_ACL_Flags GetFolderMyrights(string folderName) { if (!m_Connected) { throw new Exception("You must connect first !"); } if (!m_Authenticated) { throw new Exception("You must authenticate first !"); } IMAP_ACL_Flags aclFlags = IMAP_ACL_Flags.None; m_pSocket.SendLine("a1 MYRIGHTS \"" + EncodeUtf7(folderName) + "\""); // Must get lines with * and cmdTag + OK or cmdTag BAD/NO string reply = m_pSocket.ReadLine(); if (reply.StartsWith("*")) { // Read multiline response while (reply.StartsWith("*")) { // Get rid of * reply = reply.Substring(1).Trim(); if (reply.ToUpper().IndexOf("MYRIGHTS") > -1) { aclFlags = IMAP_Utils.ACL_From_String(reply.Substring(0, reply.IndexOf(" ")).Trim()); } reply = m_pSocket.ReadLine(); } } reply = reply.Substring(reply.IndexOf(" ")).Trim(); // Remove Cmd tag if (!reply.ToUpper().StartsWith("OK")) { throw new Exception("Server returned:" + reply); } return(aclFlags); }
private void m_pTab_Security_Permissions_ItemChecked(object sender, ItemCheckedEventArgs e) { if (this.m_EvensLocked) { return; } if (this.m_pTab_Security_UsersOrGroups.SelectedItems.Count > 0) { IMAP_ACL_Flags iMAP_ACL_Flags = IMAP_ACL_Flags.None; if (this.m_pTab_Security_Permissions.Items[0].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.a; } if (this.m_pTab_Security_Permissions.Items[1].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.l; } if (this.m_pTab_Security_Permissions.Items[2].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.c; } if (this.m_pTab_Security_Permissions.Items[3].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.r; } if (this.m_pTab_Security_Permissions.Items[4].Checked) { iMAP_ACL_Flags |= (IMAP_ACL_Flags)48; } if (this.m_pTab_Security_Permissions.Items[5].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.d; } if (this.m_pTab_Security_Permissions.Items[6].Checked) { iMAP_ACL_Flags |= (IMAP_ACL_Flags)12; } UserFolderAcl userFolderAcl = (UserFolderAcl)this.m_pTab_Security_UsersOrGroups.SelectedItems[0].Tag; if (userFolderAcl.Permissions != iMAP_ACL_Flags) { userFolderAcl.Permissions = iMAP_ACL_Flags; } } }
private void m_pTab_Security_Permissions_ItemCheck(object sender, ItemCheckEventArgs e) { if (this.m_EvensLocked) { return; } if (this.m_pTab_Security_UsersOrGroups.SelectedItems.Count > 0) { IMAP_ACL_Flags iMAP_ACL_Flags = IMAP_ACL_Flags.None; if ((e.Index == 0 && e.NewValue == CheckState.Checked) || (e.Index != 0 && this.m_pTab_Security_Permissions.Items[0].Checked)) { iMAP_ACL_Flags |= IMAP_ACL_Flags.a; } if ((e.Index == 1 && e.NewValue == CheckState.Checked) || (e.Index != 1 && this.m_pTab_Security_Permissions.Items[1].Checked)) { iMAP_ACL_Flags |= IMAP_ACL_Flags.l; } if ((e.Index == 2 && e.NewValue == CheckState.Checked) || (e.Index != 2 && this.m_pTab_Security_Permissions.Items[2].Checked)) { iMAP_ACL_Flags |= IMAP_ACL_Flags.c; } if ((e.Index == 3 && e.NewValue == CheckState.Checked) || (e.Index != 3 && this.m_pTab_Security_Permissions.Items[3].Checked)) { iMAP_ACL_Flags |= IMAP_ACL_Flags.r; } if ((e.Index == 4 && e.NewValue == CheckState.Checked) || (e.Index != 4 && this.m_pTab_Security_Permissions.Items[4].Checked)) { iMAP_ACL_Flags |= (IMAP_ACL_Flags)48; } if ((e.Index == 5 && e.NewValue == CheckState.Checked) || (e.Index != 5 && this.m_pTab_Security_Permissions.Items[5].Checked)) { iMAP_ACL_Flags |= IMAP_ACL_Flags.d; } if ((e.Index == 6 && e.NewValue == CheckState.Checked) || (e.Index != 6 && this.m_pTab_Security_Permissions.Items[6].Checked)) { iMAP_ACL_Flags |= (IMAP_ACL_Flags)12; } UserFolderAcl userFolderAcl = (UserFolderAcl)this.m_pTab_Security_UsersOrGroups.SelectedItems[0].Tag; if (userFolderAcl.Permissions != iMAP_ACL_Flags) { userFolderAcl.Permissions = iMAP_ACL_Flags; } } }
/// <summary> /// Parses IMAP_ACL_Flags from string. /// </summary> /// <param name="aclString">String from where to convert</param> /// <returns></returns> public static IMAP_ACL_Flags ACL_From_String(string aclString) { IMAP_ACL_Flags retVal = IMAP_ACL_Flags.None; aclString = aclString.ToLower(); if (aclString.IndexOf('l') > -1) { retVal |= IMAP_ACL_Flags.l; } if (aclString.IndexOf('r') > -1) { retVal |= IMAP_ACL_Flags.r; } if (aclString.IndexOf('s') > -1) { retVal |= IMAP_ACL_Flags.s; } if (aclString.IndexOf('w') > -1) { retVal |= IMAP_ACL_Flags.w; } if (aclString.IndexOf('i') > -1) { retVal |= IMAP_ACL_Flags.i; } if (aclString.IndexOf('p') > -1) { retVal |= IMAP_ACL_Flags.p; } if (aclString.IndexOf('c') > -1) { retVal |= IMAP_ACL_Flags.c; } if (aclString.IndexOf('d') > -1) { retVal |= IMAP_ACL_Flags.d; } if (aclString.IndexOf('a') > -1) { retVal |= IMAP_ACL_Flags.a; } return(retVal); }
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> /// Converts IMAP_ACL_Flags to string. /// </summary> /// <param name="flags">Flags to convert.</param> /// <returns></returns> public static string ACL_to_String(IMAP_ACL_Flags flags) { string retVal = ""; if ((flags & IMAP_ACL_Flags.l) != 0) { retVal += "l"; } if ((flags & IMAP_ACL_Flags.r) != 0) { retVal += "r"; } if ((flags & IMAP_ACL_Flags.s) != 0) { retVal += "s"; } if ((flags & IMAP_ACL_Flags.w) != 0) { retVal += "w"; } if ((flags & IMAP_ACL_Flags.i) != 0) { retVal += "i"; } if ((flags & IMAP_ACL_Flags.p) != 0) { retVal += "p"; } if ((flags & IMAP_ACL_Flags.c) != 0) { retVal += "c"; } if ((flags & IMAP_ACL_Flags.d) != 0) { retVal += "d"; } if ((flags & IMAP_ACL_Flags.a) != 0) { retVal += "a"; } return(retVal); }
/// <summary> /// Adds specified user or group permissions to active folder. /// </summary> /// <param name="userOrGroup">User or group.</param> /// <param name="permissions">Permissions to allow.</param> /// <returns>Returns added UserFolderAcl.</returns> public UserFolderAcl Add(string userOrGroup,IMAP_ACL_Flags permissions) { /* SetUserFolderAcl <virtualServerID> "<folderOwnerUser>" "<folder>" "<userOrGroup>" <flags:int32> Responses: +OK -ERR <errorText> */ string id = Guid.NewGuid().ToString(); // Call TCP SetUserFolderAcl m_pFolder.User.VirtualServer.Server.TcpClient.TcpStream.WriteLine("SetUserFolderAcl " + m_pFolder.User.VirtualServer.VirtualServerID + " " + TextUtils.QuoteString(m_pFolder.User.UserName) + " " + TextUtils.QuoteString(m_pFolder.FolderFullPath) + " " + TextUtils.QuoteString(userOrGroup) + " " + (int)permissions); string response = m_pFolder.User.VirtualServer.Server.ReadLine(); if(!response.ToUpper().StartsWith("+OK")){ throw new Exception(response); } UserFolderAcl acl = new UserFolderAcl(this,m_pFolder,userOrGroup,permissions); m_pAclEntries.Add(acl); return acl; }
/// <summary> /// Sets specified user ACL permissions for specified folder. /// </summary> /// <param name="folderName">Folder name which ACL to set.</param> /// <param name="userName">User name who's ACL to set.</param> /// <param name="acl">ACL permissions to set.</param> public void SetFolderACL(string folderName, string userName, IMAP_ACL_Flags acl) { if (!m_Connected) { throw new Exception("You must connect first !"); } if (!m_Authenticated) { throw new Exception("You must authenticate first !"); } m_pSocket.SendLine("a1 SETACL \"" + EncodeUtf7(folderName) + "\" \"" + userName + "\" " + IMAP_Utils.ACL_to_String(acl)); string reply = m_pSocket.ReadLine(); reply = reply.Substring(reply.IndexOf(" ")).Trim(); // Remove Cmd tag if (!reply.ToUpper().StartsWith("OK")) { throw new Exception("Server returned:" + reply); } }
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(); } }
/// <summary> /// Default constructor. /// </summary> /// <param name="name">Authentication identifier name. Normally this is user or group name.</param> /// <param name="rights">Rights associated with this ACL entry.</param> public IMAP_Acl(string name, IMAP_ACL_Flags rights) { m_Name = name; m_Rights = rights; }
private void wfrm_User_FolderProperties_FormClosing(object sender, FormClosingEventArgs e) { try { if (this.m_pTab_Security_UsersOrGroups.SelectedItems.Count > 0) { IMAP_ACL_Flags iMAP_ACL_Flags = IMAP_ACL_Flags.None; if (this.m_pTab_Security_Permissions.Items[0].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.a; } if (this.m_pTab_Security_Permissions.Items[1].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.l; } if (this.m_pTab_Security_Permissions.Items[2].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.c; } if (this.m_pTab_Security_Permissions.Items[3].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.r; } if (this.m_pTab_Security_Permissions.Items[4].Checked) { iMAP_ACL_Flags |= (IMAP_ACL_Flags)48; } if (this.m_pTab_Security_Permissions.Items[5].Checked) { iMAP_ACL_Flags |= IMAP_ACL_Flags.d; } if (this.m_pTab_Security_Permissions.Items[6].Checked) { iMAP_ACL_Flags |= (IMAP_ACL_Flags)12; } UserFolderAcl userFolderAcl = (UserFolderAcl)this.m_pTab_Security_UsersOrGroups.SelectedItems[0].Tag; if (userFolderAcl.Permissions != iMAP_ACL_Flags) { userFolderAcl.Permissions = iMAP_ACL_Flags; userFolderAcl.Commit(); } } if (this.m_pTab_Sharing_DontShare.Checked && this.m_ShareName != "") { SharedRootFolder rootFolderByName = this.m_pVirtualServer.RootFolders.GetRootFolderByName(this.m_ShareName); rootFolderByName.Owner.Remove(rootFolderByName); } else if (this.m_pTab_Sharing_Share.Checked && this.m_ShareName != this.m_pTab_Sharing_ShareName.Text) { if (this.m_pVirtualServer.RootFolders.Contains(this.m_ShareName)) { SharedRootFolder rootFolderByName2 = this.m_pVirtualServer.RootFolders.GetRootFolderByName(this.m_ShareName); rootFolderByName2.Enabled = true; rootFolderByName2.Name = this.m_pTab_Sharing_ShareName.Text; rootFolderByName2.Commit(); } else { this.m_pVirtualServer.RootFolders.Add(true, this.m_pTab_Sharing_ShareName.Text, "", SharedFolderRootType.BoundedRootFolder, this.m_pFolder.User.UserName, this.m_pFolder.FolderFullPath); } } } catch (Exception x) { ErrorForm errorForm = new ErrorForm(x, new StackTrace()); errorForm.ShowDialog(null); if (MessageBox.Show(this, "Do you want to reconfigure ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { e.Cancel = true; } } }
/// <summary> /// Sets specified user ACL permissions for specified folder. /// </summary> /// <param name="folderName">Folder name which ACL to set.</param> /// <param name="userName">User name who's ACL to set.</param> /// <param name="acl">ACL permissions to set.</param> public void SetFolderACL(string folderName,string userName,IMAP_ACL_Flags acl) { if(!m_Connected){ throw new Exception("You must connect first !"); } if(!m_Authenticated){ throw new Exception("You must authenticate first !"); } m_pSocket.SendLine("a1 SETACL \"" + EncodeUtf7(folderName) + "\" \"" + userName + "\" " + IMAP_Utils.ACL_to_String(acl)); string reply = m_pSocket.ReadLine(); reply = reply.Substring(reply.IndexOf(" ")).Trim(); // Remove Cmd tag if(!reply.ToUpper().StartsWith("OK")){ throw new Exception("Server returned:" + reply); } }
/// <summary> /// Sets specified user ACL permissions for specified folder. /// </summary> /// <param name="folderName">Folder name which ACL to set.</param> /// <param name="userName">User name who's ACL to set.</param> /// <param name="acl">ACL permissions to set.</param> /// <exception cref="ObjectDisposedException">Is raised when this object is disposed and this method is accessed.</exception> /// <exception cref="InvalidOperationException">Is raised when IMAP client is not connected and authenticated.</exception> public void SetFolderACL(string folderName, string userName, IMAP_ACL_Flags acl) { if (this.IsDisposed) { throw new ObjectDisposedException(this.GetType().Name); } if (!this.IsConnected) { throw new InvalidOperationException("You must connect first."); } if (!this.IsAuthenticated) { throw new InvalidOperationException("The SETACL command is only valid in authenticated state."); } // Ensure that we send right separator to server, we accept both \ and /. folderName = folderName.Replace('\\', this.PathSeparator).Replace('/', this.PathSeparator); string line = GetNextCmdTag() + " SETACL " + TextUtils.QuoteString(Core.Encode_IMAP_UTF7_String(folderName)) + " " + TextUtils.QuoteString(userName) + " " + IMAP_Utils.ACL_to_String(acl); int countWritten = this.TcpStream.WriteLine(line); LogAddWrite(countWritten, line); line = this.ReadLine(); line = RemoveCmdTag(line); if (!line.ToUpper().StartsWith("OK")) { throw new IMAP_ClientException(line); } }
private void wfrm_User_FolderProperties_FormClosing(object sender, FormClosingEventArgs e) { try{ // See if permissions has chanhed, if so update them, if (m_pTab_Security_UsersOrGroups.SelectedItems.Count > 0) { //--- Construct ACl flags ---------------// IMAP_ACL_Flags acl = IMAP_ACL_Flags.None; if (m_pTab_Security_Permissions.Items[0].Checked) { acl |= IMAP_ACL_Flags.a; } if (m_pTab_Security_Permissions.Items[1].Checked) { acl |= IMAP_ACL_Flags.l; } if (m_pTab_Security_Permissions.Items[2].Checked) { acl |= IMAP_ACL_Flags.c; } if (m_pTab_Security_Permissions.Items[3].Checked) { acl |= IMAP_ACL_Flags.r; } if (m_pTab_Security_Permissions.Items[4].Checked) { acl |= IMAP_ACL_Flags.i | IMAP_ACL_Flags.p; } if (m_pTab_Security_Permissions.Items[5].Checked) { acl |= IMAP_ACL_Flags.d; } if (m_pTab_Security_Permissions.Items[6].Checked) { acl |= IMAP_ACL_Flags.w | IMAP_ACL_Flags.s; } //--------------------------------------// UserFolderAcl aclEntry = (UserFolderAcl)m_pTab_Security_UsersOrGroups.SelectedItems[0].Tag; if (aclEntry.Permissions != acl) { aclEntry.Permissions = acl; aclEntry.Commit(); } } //--- See if sharing data changed ------------------------------------------------------------ // Sharing removed if (m_pTab_Sharing_DontShare.Checked && m_ShareName != "") { SharedRootFolder root = m_pVirtualServer.RootFolders.GetRootFolderByName(m_ShareName); root.Owner.Remove(root); } else if (m_pTab_Sharing_Share.Checked && m_ShareName != m_pTab_Sharing_ShareName.Text) { // Update shared root folder info if (m_pVirtualServer.RootFolders.Contains(m_ShareName)) { SharedRootFolder root = m_pVirtualServer.RootFolders.GetRootFolderByName(m_ShareName); root.Enabled = true; root.Name = m_pTab_Sharing_ShareName.Text; root.Commit(); } // Add new shared root folder else { m_pVirtualServer.RootFolders.Add( true, m_pTab_Sharing_ShareName.Text, "", SharedFolderRootType_enum.BoundedRootFolder, m_pFolder.User.UserName, m_pFolder.FolderFullPath ); } } //------------------------------------------------------------------------------------------- } catch (Exception x) { wfrm_sys_Error frm = new wfrm_sys_Error(x, new System.Diagnostics.StackTrace()); frm.ShowDialog(null); if (MessageBox.Show(this, "Do you want to reconfigure ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { e.Cancel = true; } } }
/// <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(); } }
/// <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(); } }
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; }