Example #1
0
        /// <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);
        }
Example #2
0
        /// <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;
 }
Example #4
0
        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;
 }
Example #6
0
 /// <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;
 }
Example #8
0
        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;
                }
            }
        }
Example #9
0
        /// <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);
        }
Example #10
0
 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;
         }
     }
 }
Example #11
0
 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);
        }
Example #13
0
        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);
        }
Example #15
0
        /// <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;
        }
Example #16
0
        /// <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);
            }
        }
Example #17
0
        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();
            }
        }
Example #18
0
 /// <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;
 }
Example #19
0
 /// <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;
 }
Example #20
0
 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);
			}
		}
Example #22
0
        /// <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);
            }
        }
Example #23
0
        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();
            }
        }
Example #25
0
		/// <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;
		}