Example #1
0
        /// <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;
 }
Example #3
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;
 }
Example #4
0
        /// <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;
        }
Example #5
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);
        }
Example #6
0
        /// <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;
            }
        }
Example #7
0
        /// <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;
        }
Example #8
0
        /// <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();
            }
        }
Example #12
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();
            }
        }
		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;
		}
Example #14
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();
			}
		}
Example #15
0
        /// <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;
            }
        }