Revision: 49
Author: tmyroadctfig
Date: 2006-06-23 04:10:20 -0700 (Fri, 23 Jun 2006)
ViewCVS: http://svn.sourceforge.net/nmailserver/?rev=49&view=rev
Log Message:
-----------
Added parent folder to store folders. Other work on admin web pages.
Modified Paths:
--------------
NMail/branches/luke-dev/NMail/DataTypes/LocalStore/MailDomain.cs
NMail/branches/luke-dev/NMail/DataTypes/StoreFolder.cs
NMail/branches/luke-dev/NMail/NMail.csproj
NMail/branches/luke-dev/NMail.Administration.Web/App_Code/MailDomainDataSource.cs
NMail/branches/luke-dev/NMail.Administration.Web/FolderDetails.aspx
NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx
NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx.cs
NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx
NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx.cs
NMail/branches/luke-dev/NMail.Administration.Web/MasterPage.master
NMail/branches/luke-dev/NMail.Administration.Web/StyleSheet.css
NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx
NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx.cs
NMail/branches/luke-dev/NMail.Administration.Web/ViewFolders.aspx
NMail/branches/luke-dev/NMail.LocalStore/LocalStore.cs
NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStore.sql
NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStoreData.cs
NMail/branches/luke-dev/NMail.Server/NMail.Server.csproj
NMail/branches/luke-dev/NMail.Server.Console/NMailConsoleServer.cs
Added Paths:
-----------
NMail/branches/luke-dev/NMail.Administration.Web/Bin/NMail.Server.dll.refresh
NMail/branches/luke-dev/NMail.Administration.Web/Bin/NMail.dll.refresh
NMail/branches/luke-dev/NMail.Administration.Web/Bin/log4net.dll.refresh
Modified: NMail/branches/luke-dev/NMail/DataTypes/LocalStore/MailDomain.cs
===================================================================
--- NMail/branches/luke-dev/NMail/DataTypes/LocalStore/MailDomain.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail/DataTypes/LocalStore/MailDomain.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -28,7 +28,7 @@
/// A mail domain maps users and administrators to a set of hosts that the store
/// accepts mail for.
/// </summary>
- [Serializable]
+ [Serializable]
public class MailDomain {
public MailDomain(int mailDomainId, Host primaryHost) {
this.mailDomainId = mailDomainId;
@@ -73,8 +73,8 @@
return this.additionalHosts.ToArray();
}
set {
- this.additionalHosts.Clear();
- this.additionalHosts.AddRange(value);
+ this.additionalHosts.Clear();
+ this.additionalHosts.AddRange(value);
}
}
@@ -89,7 +89,7 @@
}
set {
this.mailboxMappings.Clear();
- this.mailboxMappings.AddRange(value);
+ this.mailboxMappings.AddRange(value);
}
}
@@ -102,10 +102,10 @@
get {
return this.allowedActions.ToArray();
}
- set {
- this.allowedActions.Clear();
- this.allowedActions.AddRange(value);
- }
+ set {
+ this.allowedActions.Clear();
+ this.allowedActions.AddRange(value);
+ }
}
private List<ILocalStoreRecipientValidator> allowedValidators = new List<ILocalStoreRecipientValidator>();
@@ -119,7 +119,7 @@
}
set {
this.allowedValidators.Clear();
- this.allowedValidators.AddRange(value);
+ this.allowedValidators.AddRange(value);
}
}
@@ -134,76 +134,78 @@
}
set {
this.defaultActions.Clear();
- this.defaultActions.AddRange(value);
+ this.defaultActions.AddRange(value);
}
}
// TODO: add in a recipient validator tree here
- /// <summary>
- /// Maps a given mailbox to a user.
- /// </summary>
- /// <param name="mailbox">The mailbox to lookup.</param>
- /// <returns>The username or null.</returns>
- public string MapMailboxToUser(string mailbox) {
- string result = null;
+ /// <summary>
+ /// Maps a given mailbox to a user.
+ /// </summary>
+ /// <param name="mailbox">The mailbox to lookup.</param>
+ /// <returns>The username or null.</returns>
+ public string MapMailboxToUser(string mailbox) {
+ string result = null;
- // Search for a valid mapping for the mailbox
- for (int i = 0; result == null && i < this.mailboxMappings.Count; i++) {
- result = this.mailboxMappings[i].MapMailboxToUser(mailbox);
- }
+ // Search for a valid mapping for the mailbox
+ for (int i = 0; result == null && i < this.mailboxMappings.Count; i++) {
+ result = this.mailboxMappings[i].MapMailboxToUser(mailbox);
+ }
- return result;
- }
+ // TODO: this should also check if the user belongs to the given mail domain
- public ILocalStoreRecipientValidator GetRecipientValidator(string name) {
- name = name.Trim().ToLower();
+ return result;
+ }
- foreach (ILocalStoreRecipientValidator validator in this.allowedValidators) {
- if (validator.Name.Trim().ToLower() == name) {
- return validator;
- }
- }
+ public ILocalStoreRecipientValidator GetRecipientValidator(string name) {
+ name = name.Trim().ToLower();
- return null;
- }
+ foreach (ILocalStoreRecipientValidator validator in this.allowedValidators) {
+ if (validator.Name.Trim().ToLower() == name) {
+ return validator;
+ }
+ }
+ return null;
+ }
- public ILocalStoreDeliveryAction GetDeliveryAction(string name) {
- name = name.Trim().ToLower();
- foreach (ILocalStoreDeliveryAction action in this.allowedActions) {
- if (action.Name.Trim().ToLower() == name) {
- return action;
- }
- }
+ public ILocalStoreDeliveryAction GetDeliveryAction(string name) {
+ name = name.Trim().ToLower();
- return null;
- }
+ foreach (ILocalStoreDeliveryAction action in this.allowedActions) {
+ if (action.Name.Trim().ToLower() == name) {
+ return action;
+ }
+ }
- /// <summary>
- /// Processes the incomming message against the list of delivery actions.
- /// </summary>
- /// <param name="delivery">The delivery in progress.</param>
- /// <param name="username">The associated username.</param>
- /// <returns>The result of the delivery attempt.</returns>
- public DeliveryResult ProcessDelivery(LocalStoreDelivery delivery, IAuthenticationToken username) {
- for (int i = 0; i < this.defaultActions.Count; i++) {
- string name = this.defaultActions[i].Name;
- string data = null;
- if (delivery.Recipient != null) {
- data = delivery.Recipient.Mailbox.GetDataPairValue(name);
- }
+ return null;
+ }
- DeliveryResult result = this.defaultActions[i].ProcessDelivery(delivery, username, data);
+ /// <summary>
+ /// Processes the incomming message against the list of delivery actions.
+ /// </summary>
+ /// <param name="delivery">The delivery in progress.</param>
+ /// <param name="username">The associated username.</param>
+ /// <returns>The result of the delivery attempt.</returns>
+ public DeliveryResult ProcessDelivery(LocalStoreDelivery delivery, IAuthenticationToken username) {
+ for (int i = 0; i < this.defaultActions.Count; i++) {
+ string name = this.defaultActions[i].Name;
+ string data = null;
+ if (delivery.Recipient != null) {
+ data = delivery.Recipient.Mailbox.GetDataPairValue(name);
+ }
- if (result.Type != DeliveryResultType.Success) {
- return result;
- }
- }
+ DeliveryResult result = this.defaultActions[i].ProcessDelivery(delivery, username, data);
- return new DeliveryResult(DeliveryResultType.Success, null);
- }
+ if (result.Type != DeliveryResultType.Success) {
+ return result;
+ }
+ }
+
+ return new DeliveryResult(DeliveryResultType.Success, null);
+ }
}
}
Modified: NMail/branches/luke-dev/NMail/DataTypes/StoreFolder.cs
===================================================================
--- NMail/branches/luke-dev/NMail/DataTypes/StoreFolder.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail/DataTypes/StoreFolder.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -30,9 +30,11 @@
/// </summary>
/// <param name="newFolder">The folder name.</param>
/// <param name="folderId">The folder Id.</param>
+ /// <param name="parentId">The Id of this folder's parent or null if non.</param>
/// <param name="hasChildren">A flag indicating if this folder has subfolder.s</param>
- public StoreFolder(string newFolder, int folderId, bool hasChildren) : base(newFolder) {
+ public StoreFolder(string newFolder, int folderId, int? parentId, bool hasChildren) : base(newFolder) {
this.folderId = folderId;
+ this.parentId = parentId;
this.hasChildren = hasChildren;
}
@@ -42,9 +44,11 @@
/// <param name="newNameSpace">The namespace the folder belongs to.</param>
/// <param name="newFolder">The folder name.</param>
/// <param name="folderId">The folder Id.</param>
+ /// <param name="parentId">The Id of this folder's parent or null if non.</param>
/// <param name="hasChildren">A flag indicating if this folder has subfolder.s</param>
- public StoreFolder(string newNameSpace, string newFolder, int folderId, bool hasChildren) : base(newNameSpace, newFolder) {
+ public StoreFolder(string newNameSpace, string newFolder, int folderId, int? parentId, bool hasChildren) : base(newNameSpace, newFolder) {
this.folderId = folderId;
+ this.parentId = parentId;
this.hasChildren = hasChildren;
}
@@ -61,6 +65,20 @@
this.folderId = value;
}
}
+
+ private int? parentId;
+
+ /// <summary>
+ /// The Id of this folder's parent or null if non.
+ /// </summary>
+ public int? ParentId {
+ get {
+ return this.parentId;
+ }
+ set {
+ this.parentId = value;
+ }
+ }
private bool hasChildren;
Modified: NMail/branches/luke-dev/NMail/NMail.csproj
===================================================================
--- NMail/branches/luke-dev/NMail/NMail.csproj 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail/NMail.csproj 2006-06-23 11:10:20 UTC (rev 49)
@@ -290,7 +290,10 @@
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
- <PostBuildEvent>
- </PostBuildEvent>
+ <PostBuildEvent>if not exist "$(SolutionDir)References\NMail\$(ConfigurationName)" (
+ mkdir "$(SolutionDir)References\NMail\$(ConfigurationName)";
+)
+
+copy "$(TargetPath)" "$(SolutionDir)References\NMail\$(ConfigurationName)";</PostBuildEvent>
</PropertyGroup>
</Project>
\ No newline at end of file
Modified: NMail/branches/luke-dev/NMail.Administration.Web/App_Code/MailDomainDataSource.cs
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/App_Code/MailDomainDataSource.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/App_Code/MailDomainDataSource.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -52,7 +52,7 @@
return null;
}
- public static void UpdateMailDomain(int mailDomainId, string primaryHost)
+ public static LocalStoreMailDomainResult UpdateMailDomain(int mailDomainId, string primaryHost)
{
MailDomain updatedMailDomain = new MailDomain(mailDomainId, new Host(primaryHost));
@@ -60,7 +60,7 @@
IAuthenticationToken authToken = (IAuthenticationToken)session["AuthToken"];
ILocalStore localStore = (ILocalStore)session["LocalStore"];
- localStore.UpdateMailDomain(authToken, updatedMailDomain);
+ return localStore.UpdateMailDomain(authToken, updatedMailDomain);
}
public static LocalStoreMailDomainResult CreateMailDomain(Host primaryHost)
@@ -71,5 +71,14 @@
return localStore.CreateMailDomain(authToken, primaryHost);
}
+
+ public static LocalStoreMailDomainResult DeleteMailDomain(int mailDomainId)
+ {
+ IHttpSessionState session = SessionStateUtility.GetHttpSessionStateFromContext(HttpContext.Current);
+ IAuthenticationToken authToken = (IAuthenticationToken)session["AuthToken"];
+ ILocalStore localStore = (ILocalStore)session["LocalStore"];
+
+ return localStore.DeleteMailDomain(authToken, mailDomainId);
+ }
}
}
Added: NMail/branches/luke-dev/NMail.Administration.Web/Bin/NMail.Server.dll.refresh
===================================================================
(Binary files differ)
Property changes on: NMail/branches/luke-dev/NMail.Administration.Web/Bin/NMail.Server.dll.refresh
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/branches/luke-dev/NMail.Administration.Web/Bin/NMail.dll.refresh
===================================================================
(Binary files differ)
Property changes on: NMail/branches/luke-dev/NMail.Administration.Web/Bin/NMail.dll.refresh
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/branches/luke-dev/NMail.Administration.Web/Bin/log4net.dll.refresh
===================================================================
(Binary files differ)
Property changes on: NMail/branches/luke-dev/NMail.Administration.Web/Bin/log4net.dll.refresh
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: NMail/branches/luke-dev/NMail.Administration.Web/FolderDetails.aspx
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/FolderDetails.aspx 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/FolderDetails.aspx 2006-06-23 11:10:20 UTC (rev 49)
@@ -22,6 +22,8 @@
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<Fields>
<asp:BoundField DataField="FolderId" HeaderText="Folder Id" SortExpression="FolderId" InsertVisible="False" ReadOnly="True" />
+ <asp:HyperLinkField DataNavigateUrlFields="ParentId" DataNavigateUrlFormatString="FolderDetails.aspx?FolderId={0}"
+ DataTextField="ParentId" HeaderText="Parent Id" />
<asp:BoundField DataField="FolderName" HeaderText="Folder Name" ReadOnly="True" SortExpression="FolderName" />
<asp:BoundField DataField="NameSpace" HeaderText="Namespace" ReadOnly="True" SortExpression="NameSpace" InsertVisible="False" />
<asp:CheckBoxField DataField="HasChildren" HeaderText="Has Children" SortExpression="HasChildren" InsertVisible="False" ReadOnly="True" />
@@ -77,7 +79,7 @@
<asp:Label ID="AclStatusLabel" runat="server"></asp:Label>
<h2>Folder ACL</h2>
- <asp:GridView ID="AclGridView" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataSourceID="FolderAclDataSource" ShowFooter="True" DataKeyNames="Identifier" OnRowDeleting="AclGridView_RowDeleting">
+ <asp:GridView ID="AclGridView" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" DataSourceID="FolderAclDataSource" ShowFooter="True" DataKeyNames="Identifier">
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
<EditRowStyle BackColor="#2461BF" />
Modified: NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx 2006-06-23 11:10:20 UTC (rev 49)
@@ -1,4 +1,4 @@
-<%@ Page Language="C#" CodeFile="Login.aspx.cs" Inherits="Login" MasterPageFile="~/MasterPage.master" Title="NMail Administration - Login" %>
+<%@ Page Language="C#" CodeFile="Login.aspx.cs" Inherits="NMail.Administration.Web.Login" MasterPageFile="~/MasterPage.master" Title="NMail Administration - Login" %>
<asp:Content ID="Content" ContentPlaceHolderID="ContentPlaceHolder" Runat="Server">
<asp:LoginView ID="LoginView" runat="server">
Modified: NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx.cs
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/Login.aspx.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -18,20 +18,23 @@
using NMail.IO;
using NMail.Server;
-public partial class Login : System.Web.UI.Page
+namespace NMail.Administration.Web
{
- protected void Login_Authenticate(object sender, AuthenticateEventArgs e)
- {
- System.Web.UI.WebControls.Login login = (System.Web.UI.WebControls.Login)this.LoginView.FindControl("Login");
+ public partial class Login : System.Web.UI.Page
+ {
+ protected void Login_Authenticate(object sender, AuthenticateEventArgs e)
+ {
+ System.Web.UI.WebControls.Login login = (System.Web.UI.WebControls.Login)this.LoginView.FindControl("Login");
- RemoteAdministration ra = (RemoteAdministration)Activator.GetObject(typeof(RemoteAdministration), "tcp://localhost:7877/RemoteAdministration.rem");
- IAuthenticationToken authToken = ra.NMailServer.AuthenticationProvider.Authenticate(login.UserName, login.Password);
+ RemoteAdministration ra = (RemoteAdministration)Activator.GetObject(typeof(RemoteAdministration), "tcp://localhost:7877/RemoteAdministration.rem");
+ IAuthenticationToken authToken = ra.NMailServer.AuthenticationProvider.Authenticate(login.UserName, login.Password);
- if (authToken != null)
- {
- e.Authenticated = true;
- Session["AuthToken"] = authToken;
- Session["LocalStore"] = ra.NMailServer.LocalStore;
+ if (authToken != null)
+ {
+ e.Authenticated = true;
+ Session["AuthToken"] = authToken;
+ Session["LocalStore"] = ra.NMailServer.LocalStore;
+ }
}
- }
+ }
}
\ No newline at end of file
Modified: NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx 2006-06-23 11:10:20 UTC (rev 49)
@@ -1,21 +1,49 @@
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="MailDomainDetails.aspx.cs" Inherits="MailDomainDetails" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder" Runat="Server">
- <asp:DetailsView ID="DetailsView1" runat="server" CellPadding="4" DataSourceID="MailDomainDataSource"
- ForeColor="#333333" GridLines="None" Height="50px" Width="125px">
- <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
- <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />
- <EditRowStyle BackColor="#2461BF" />
- <RowStyle BackColor="#EFF3FB" />
- <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
- <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />
- <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
- <AlternatingRowStyle BackColor="White" />
- </asp:DetailsView>
- <asp:ObjectDataSource ID="MailDomainDataSource" runat="server" SelectMethod="GetMailDomain"
- TypeName="NMail.Administration.Web.MailDomainDataSource">
- <SelectParameters>
- <asp:QueryStringParameter Name="mailDomainId" QueryStringField="MailDomainId" Type="Int32" />
- </SelectParameters>
- </asp:ObjectDataSource>
+ <asp:Image ID="StatusImage" runat="server" Visible="false" />
+ <asp:Label ID="StatusMessage" runat="server"></asp:Label>
+
+ <asp:Panel ID="ConfirmPanel" runat="server" Visible="false">
+ <br />
+ <div style="border-right: black thin solid; padding-right: 0.5em; border-top: black thin solid; padding-left: 0.5em; padding-bottom: 0.5em; border-left: black thin solid; color: red; padding-top: 0.5em; border-bottom: black thin solid;">
+ <img src="Images/Tango/Question.png" />
+ Really delete this mail domain?
+ <asp:Button ID="yesBtn" runat="server" Text="Yes" OnClick="yesBtn_Click" />
+ <asp:Button ID="noBtn" runat="server" Text="No" OnClick="noBtn_Click" /></div>
+ </asp:Panel>
+
+ <asp:Panel ID="MainPanel" runat="server">
+ <h2>Mail Domain Details</h2>
+ <asp:DetailsView ID="MailDomainDetailsView" runat="server" CellPadding="4" DataSourceID="MailDomainDataSource"
+ ForeColor="#333333" GridLines="None" AutoGenerateRows="False" OnItemDeleting="MailDomainDetailsView_ItemDeleting">
+ <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
+ <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />
+ <EditRowStyle BackColor="#2461BF" />
+ <RowStyle BackColor="#EFF3FB" />
+ <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
+ <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />
+ <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
+ <AlternatingRowStyle BackColor="White" />
+ <Fields>
+ <asp:BoundField DataField="MailDomainId" HeaderText="Mail Domain Id" SortExpression="MailDomainId" />
+ <asp:BoundField DataField="PrimaryHost" HeaderText="Primary Host" SortExpression="PrimaryHost" />
+ <asp:CommandField ShowEditButton="True" />
+ <asp:CommandField ShowDeleteButton="True" />
+ </Fields>
+ </asp:DetailsView>
+ <asp:ObjectDataSource ID="MailDomainDataSource" runat="server" SelectMethod="GetMailDomain"
+ TypeName="NMail.Administration.Web.MailDomainDataSource" UpdateMethod="UpdateMailDomain" DeleteMethod="DeleteMailDomain" OnDeleted="MailDomainDataSource_Deleted" OnDeleting="MailDomainDataSource_Deleting">
+ <SelectParameters>
+ <asp:QueryStringParameter Name="mailDomainId" QueryStringField="MailDomainId" Type="Int32" />
+ </SelectParameters>
+ <UpdateParameters>
+ <asp:Parameter Name="mailDomainId" Type="Int32" />
+ <asp:Parameter Name="primaryHost" Type="String" />
+ </UpdateParameters>
+ <DeleteParameters>
+ <asp:Parameter Name="mailDomainId" Type="Int32" />
+ </DeleteParameters>
+ </asp:ObjectDataSource>
+ </asp:Panel>
</asp:Content>
Modified: NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx.cs
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/MailDomainDetails.aspx.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -9,6 +9,62 @@
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
+using NMail;
+using NMail.DataTypes;
+
public partial class MailDomainDetails : System.Web.UI.Page
-{
+{
+ #region Mail Domain Deletion Events
+
+ protected void yesBtn_Click(object sender, EventArgs e)
+ {
+ // Got confirmation, send the delete command and hide the confirmation panel
+ this.MailDomainDataSource.Delete();
+ this.ConfirmPanel.Visible = false;
+ }
+
+ protected void noBtn_Click(object sender, EventArgs e)
+ {
+ // Got a cancel, hide the confirmation panel
+ this.ConfirmPanel.Visible = false;
+ }
+
+ protected void MailDomainDetailsView_ItemDeleting(object sender, DetailsViewDeleteEventArgs e)
+ {
+ // Display the confirmation panel and canel the event
+ this.ConfirmPanel.Visible = true;
+ e.Cancel = true;
+ }
+
+ protected void MailDomainDataSource_Deleted(object sender, ObjectDataSourceStatusEventArgs e)
+ {
+ LocalStoreMailDomainResult result = (LocalStoreMailDomainResult)e.ReturnValue;
+
+ // Display the result of the attempt to delete the mail domain
+ switch (result)
+ {
+ case LocalStoreMailDomainResult.OkSuccessful:
+ this.StatusMessage.Text = "Mail domain deleted.";
+ this.StatusImage.ImageUrl = Request.ApplicationPath + @"/Images/GreenLight.png";
+
+ // Hide these controls, they shouldn't have any data now
+ this.MainPanel.Visible = false;
+ break;
+
+ default:
+ this.StatusMessage.Text = string.Format("Unknown error occured while attempting to delete the mail domain: {0}", result.ToString());
+ this.StatusImage.ImageUrl = Request.ApplicationPath + @"/Images/Tango/Error.png";
+ break;
+ }
+
+ this.StatusImage.Visible = true;
+ }
+
+ protected void MailDomainDataSource_Deleting(object sender, ObjectDataSourceMethodEventArgs e)
+ {
+ e.InputParameters["mailDomainId"] = Request.QueryString["MailDomainId"];
+ }
+ #endregion
+
+
}
Modified: NMail/branches/luke-dev/NMail.Administration.Web/MasterPage.master
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/MasterPage.master 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/MasterPage.master 2006-06-23 11:10:20 UTC (rev 49)
@@ -1,5 +1,4 @@
<%@ Master Language="C#" %>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
@@ -23,50 +22,61 @@
}
</script>
-<html xmlns="http://www.w3.org/1999/xhtml" >
+<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
- <title>Untitled Page</title>
- <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
+ <title>Untitled Page</title>
+ <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
- <form id="MainForm" runat="server">
+ <form id="MainForm" runat="server">
<table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%">
- <tr>
- <td colspan="2" style="vertical-align: middle; width: 100%; background-color: #507cd1; border-bottom-width: thin; border-bottom-color: darkgray;">
- <h1 style="color: white"> <img src="Images/nmail-logo-white.png" style="vertical-align: middle" /> NMail Web Administration</h1>
- </td>
- </tr>
- <tr>
- <td colspan="2" style="border-bottom: darkgray thick solid; background-color: #eff3fb;">
- <table style="width: 100%">
- <tr>
- <td style="width: 100%"><asp:SiteMapPath ID="SiteMapPath" runat="server" Font-Names="Verdana" Font-Size="0.8em" PathSeparator=" : " >
- <PathSeparatorStyle Font-Bold="True" ForeColor="#1C5E55" />
- <CurrentNodeStyle ForeColor="#333333" />
- <NodeStyle Font-Bold="True" ForeColor="#666666" />
- <RootNodeStyle Font-Bold="True" ForeColor="#1C5E55" />
- </asp:SiteMapPath></td>
- <td style="text-align: right;"><asp:LoginStatus ID="LoginStatus" runat="server" /></td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td style="border-right-style: solid; border-right-color: darkgray; padding-right: 1em; padding-left: 1em; padding-bottom: 1em; padding-top: 1em; vertical-align: top; background-color: #eff3fb; height: 100%;">
- <asp:TreeView ID="TreeView" runat="server" DataSourceID="SiteMapDataSource" OnTreeNodeDataBound="TreeView_TreeNodeDataBound">
- </asp:TreeView>
- <asp:SiteMapDataSource ID="SiteMapDataSource" runat="server" />
- </td>
- <td style="width: 100%; padding-right: 1em; padding-left: 1em; padding-bottom: 1em; padding-top: 1em; vertical-align: top;">
- <asp:ContentPlaceHolder ID="ContentPlaceHolder" runat="server">
- </asp:ContentPlaceHolder>
- </td>
- </tr>
- <tr>
- <td style="border-right-style: solid; background-color: #eff3fb; text-align: center; border-right-color: darkgray; top: 100%;"><a href="http://nmailserver.sourceforege.net">NMail homepage.</a></td>
- <td style="height: 18px"></td>
- </tr>
- </table>
- </form>
+ <tr>
+ <td colspan="2" style="vertical-align: middle; width: 100%;">
+ <div class="box">
+ <h1>
+ <img src="Images/nmail-logo.png" style="vertical-align: middle" />
+ NMail Web Administration</h1>
+ <table>
+ <tr>
+ <td style="width: 100%">
+ <asp:SiteMapPath ID="SiteMapPath" runat="server" Font-Names="Verdana" Font-Size="0.8em"
+ PathSeparator=" : ">
+ <PathSeparatorStyle Font-Bold="True" ForeColor="#1C5E55" />
+ <CurrentNodeStyle ForeColor="#333333" />
+ <NodeStyle Font-Bold="True" ForeColor="#666666" />
+ <RootNodeStyle Font-Bold="True" ForeColor="#1C5E55" />
+ </asp:SiteMapPath>
+ </td>
+ <td>
+ <asp:LoginStatus ID="LoginStatus" runat="server" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td style="vertical-align: top; height: 100%;">
+ <div class="box">
+ <asp:TreeView ID="TreeView" runat="server" DataSourceID="SiteMapDataSource" OnTreeNodeDataBound="TreeView_TreeNodeDataBound">
+ </asp:TreeView>
+ <asp:SiteMapDataSource ID="SiteMapDataSource" runat="server" />
+ </div>
+ </td>
+ <td style="width: 100%; vertical-align: top;">
+ <div style="padding: 0.5em">
+ <asp:ContentPlaceHolder ID="ContentPlaceHolder" runat="server">
+ </asp:ContentPlaceHolder>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align: center; top: 100%;">
+ <a href="http://nmailserver.sourceforege.net">NMail homepage.</a></td>
+ <td>
+ </td>
+ </tr>
+ </table>
+ </form>
</body>
</html>
Modified: NMail/branches/luke-dev/NMail.Administration.Web/StyleSheet.css
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/StyleSheet.css 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/StyleSheet.css 2006-06-23 11:10:20 UTC (rev 49)
@@ -13,4 +13,12 @@
font-size: large;
margin-bottom: 0.5em;
margin-top: 1em;
+}
+
+.box
+{
+ background-color: #eff3fb;
+ margin: 0.5em;
+ border: #507cd1 thin solid;
+ padding: 0.5em;
}
\ No newline at end of file
Modified: NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx 2006-06-23 11:10:20 UTC (rev 49)
@@ -12,63 +12,65 @@
<asp:Button ID="noBtn" runat="server" Text="No" OnClick="noBtn_Click" /></div>
</asp:Panel>
- <h2>User Details</h2>
- <asp:DetailsView ID="UserDetailsView" runat="server" AutoGenerateRows="False" CellPadding="4"
- DataSourceID="UserDataSource" ForeColor="#333333" GridLines="None" OnItemDeleting="UserDetailsView_ItemDeleting">
- <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
- <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />
- <EditRowStyle BackColor="#2461BF" />
- <RowStyle BackColor="#EFF3FB" />
- <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
- <Fields>
- <asp:BoundField DataField="Username" HeaderText="Username" SortExpression="Username" />
- <asp:BoundField DataField="UserId" HeaderText="User Id" ReadOnly="True" SortExpression="UserId" />
- <asp:BoundField DataField="UserFolderId" HeaderText="User Initial Folder Id" SortExpression="UserFolderId" />
- <asp:BoundField DataField="QuotaWarnLimit" HeaderText="Quota Warn Limit" SortExpression="QuotaWarnLimit" />
- <asp:BoundField DataField="QuotaHardLimit" HeaderText="Quota Hard Limit" SortExpression="QuotaHardLimit" />
- <asp:CommandField ShowDeleteButton="True" />
- </Fields>
- <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />
- <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
- <AlternatingRowStyle BackColor="White" />
- </asp:DetailsView>
- <asp:ObjectDataSource ID="UserDataSource" runat="server"
- SelectMethod="GetUser" TypeName="NMail.Administration.Web.UserDataSource" DeleteMethod="DeleteUser" OnDeleting="UserDataSource_Deleting" OnDeleted="UserDataSource_Deleted">
- <SelectParameters>
- <asp:QueryStringParameter Name="userId" QueryStringField="UserId" Type="Int32" />
- </SelectParameters>
- <DeleteParameters>
- <asp:Parameter Name="userId" Type="Int32" />
- </DeleteParameters>
- </asp:ObjectDataSource>
-
- <h2>User's Folders</h2>
- <asp:GridView ID="UserFoldersGridView" runat="server" AutoGenerateColumns="False" CellPadding="4"
- DataSourceID="UserFolderDataSource" ForeColor="#333333" GridLines="None">
- <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
- <Columns>
- <asp:BoundField DataField="FolderId" HeaderText="Folder Id" SortExpression="FolderId" />
- <asp:BoundField DataField="FolderName" HeaderText="Folder Name" ReadOnly="True" SortExpression="FolderName" />
- <asp:BoundField DataField="NameSpace" HeaderText="Namespace" ReadOnly="True" SortExpression="NameSpace" />
- <asp:CheckBoxField DataField="HasChildren" HeaderText="Has Children" SortExpression="HasChildren" />
- <asp:HyperLinkField DataNavigateUrlFields="FolderId" DataNavigateUrlFormatString="FolderDetails.aspx?FolderId={0}"
- Text="details" />
- </Columns>
- <RowStyle BackColor="#EFF3FB" />
- <EditRowStyle BackColor="#2461BF" />
- <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
- <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
- <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
- <AlternatingRowStyle BackColor="White" />
- <EmptyDataTemplate>
- The user doesn't have any folders.
- </EmptyDataTemplate>
- </asp:GridView>
- <asp:ObjectDataSource ID="UserFolderDataSource" runat="server" SelectMethod="GetUserFolders"
- TypeName="NMail.Administration.Web.UserDataSource">
- <SelectParameters>
- <asp:QueryStringParameter Name="userId" QueryStringField="UserId" Type="Int32" />
- </SelectParameters>
- </asp:ObjectDataSource>
+ <asp:Panel ID="MainPanel" runat="server">
+ <h2>User Details</h2>
+ <asp:DetailsView ID="UserDetailsView" runat="server" AutoGenerateRows="False" CellPadding="4"
+ DataSourceID="UserDataSource" ForeColor="#333333" GridLines="None" OnItemDeleting="UserDetailsView_ItemDeleting">
+ <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
+ <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />
+ <EditRowStyle BackColor="#2461BF" />
+ <RowStyle BackColor="#EFF3FB" />
+ <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
+ <Fields>
+ <asp:BoundField DataField="Username" HeaderText="Username" SortExpression="Username" />
+ <asp:BoundField DataField="UserId" HeaderText="User Id" ReadOnly="True" SortExpression="UserId" />
+ <asp:BoundField DataField="UserFolderId" HeaderText="User Initial Folder Id" SortExpression="UserFolderId" />
+ <asp:BoundField DataField="QuotaWarnLimit" HeaderText="Quota Warn Limit" SortExpression="QuotaWarnLimit" />
+ <asp:BoundField DataField="QuotaHardLimit" HeaderText="Quota Hard Limit" SortExpression="QuotaHardLimit" />
+ <asp:CommandField ShowDeleteButton="True" />
+ </Fields>
+ <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />
+ <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
+ <AlternatingRowStyle BackColor="White" />
+ </asp:DetailsView>
+ <asp:ObjectDataSource ID="UserDataSource" runat="server"
+ SelectMethod="GetUser" TypeName="NMail.Administration.Web.UserDataSource" DeleteMethod="DeleteUser" OnDeleting="UserDataSource_Deleting" OnDeleted="UserDataSource_Deleted">
+ <SelectParameters>
+ <asp:QueryStringParameter Name="userId" QueryStringField="UserId" Type="Int32" />
+ </SelectParameters>
+ <DeleteParameters>
+ <asp:Parameter Name="userId" Type="Int32" />
+ </DeleteParameters>
+ </asp:ObjectDataSource>
+
+ <h2>User's Folders</h2>
+ <asp:GridView ID="UserFoldersGridView" runat="server" AutoGenerateColumns="False" CellPadding="4"
+ DataSourceID="UserFolderDataSource" ForeColor="#333333" GridLines="None">
+ <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
+ <Columns>
+ <asp:BoundField DataField="FolderId" HeaderText="Folder Id" SortExpression="FolderId" />
+ <asp:BoundField DataField="FolderName" HeaderText="Folder Name" ReadOnly="True" SortExpression="FolderName" />
+ <asp:BoundField DataField="NameSpace" HeaderText="Namespace" ReadOnly="True" SortExpression="NameSpace" />
+ <asp:CheckBoxField DataField="HasChildren" HeaderText="Has Children" SortExpression="HasChildren" />
+ <asp:HyperLinkField DataNavigateUrlFields="FolderId" DataNavigateUrlFormatString="FolderDetails.aspx?FolderId={0}"
+ Text="details" />
+ </Columns>
+ <RowStyle BackColor="#EFF3FB" />
+ <EditRowStyle BackColor="#2461BF" />
+ <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
+ <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
+ <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
+ <AlternatingRowStyle BackColor="White" />
+ <EmptyDataTemplate>
+ The user doesn't have any folders.
+ </EmptyDataTemplate>
+ </asp:GridView>
+ <asp:ObjectDataSource ID="UserFolderDataSource" runat="server" SelectMethod="GetUserFolders"
+ TypeName="NMail.Administration.Web.UserDataSource">
+ <SelectParameters>
+ <asp:QueryStringParameter Name="userId" QueryStringField="UserId" Type="Int32" />
+ </SelectParameters>
+ </asp:ObjectDataSource>
+ </asp:Panel>
</asp:Content>
Modified: NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx.cs
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/UserDetails.aspx.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -30,8 +30,7 @@
this.StatusImage.ImageUrl = Request.ApplicationPath + @"/Images/GreenLight.png";
// Hide these controls, they shouldn't have any data now
- this.UserDetailsView.Visible = false;
- this.UserFoldersGridView.Visible = false;
+ this.MainPanel.Visible = false;
break;
case LocalStoreUserResult.UserStillHasFolders:
Modified: NMail/branches/luke-dev/NMail.Administration.Web/ViewFolders.aspx
===================================================================
--- NMail/branches/luke-dev/NMail.Administration.Web/ViewFolders.aspx 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.Administration.Web/ViewFolders.aspx 2006-06-23 11:10:20 UTC (rev 49)
@@ -6,6 +6,8 @@
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<Columns>
<asp:BoundField DataField="FolderId" HeaderText="Folder Id" SortExpression="FolderId" />
+ <asp:HyperLinkField DataNavigateUrlFields="ParentId" DataNavigateUrlFormatString="FolderDetails.aspx?FolderId={0}"
+ DataTextField="ParentId" HeaderText="Parent Id" />
<asp:BoundField DataField="FolderName" HeaderText="Folder Name" ReadOnly="True" SortExpression="FolderName" />
<asp:BoundField DataField="NameSpace" HeaderText="Namespace" ReadOnly="True" SortExpression="NameSpace" />
<asp:CheckBoxField DataField="HasChildren" HeaderText="Has Children" SortExpression="HasChildren" />
Modified: NMail/branches/luke-dev/NMail.LocalStore/LocalStore.cs
===================================================================
--- NMail/branches/luke-dev/NMail.LocalStore/LocalStore.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.LocalStore/LocalStore.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -203,10 +203,10 @@
/// <returns>The result of the delivery.</returns>
public DeliveryResult DeliverMessage(IAuthenticationToken authToken, Message message, StoreFolder folder) {
- LocalStoreDelivery lsd = new LocalStoreDelivery((Message) null, folder);
+ LocalStoreData.DeliverMessage(message, folder);
+ return new DeliveryResult(DeliveryResultType.Success, null);
- // Need to get a mail domain for the user here...
- throw new NotImplementedException();
+ // TODO: lookup a maildomain or a system wide delivery chain to process the message
//// Pass through the default chain
//DeliveryActionList deliveryChain = LocalStoreConfiguration.Current.DeliveryChain;
@@ -504,7 +504,8 @@
public StoreFolder[] GetChildren(IAuthenticationToken authToken, StoreFolder parent) {
// Ensure the user has rights to list the folders
- if (hasFolderPrivilege(authToken.Username, parent.FolderId, StoreFolderPrivilege.Lookup)) {
+ if (parent != null
+ && hasFolderPrivilege(authToken.Username, parent.FolderId, StoreFolderPrivilege.Lookup)) {
// Return the children
return LocalStoreData.GetChildren(parent);
Modified: NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStore.sql
===================================================================
--- NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStore.sql 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStore.sql 2006-06-23 11:10:20 UTC (rev 49)
@@ -1,5 +1,4 @@
-
-DROP DATABASE IF EXISTS NMailLocalStore;
+DROP DATABASE IF EXISTS NMailLocalStore;
CREATE DATABASE NMailLocalStore;
USE NMailLocalStore;
@@ -210,19 +209,23 @@
OUT Result INT
)
BEGIN
-
+ DECLARE Username VARCHAR(100);
+
START TRANSACTION;
/* Check if the parameters are valid. */
- IF ParentId IS NULL OR
- EXISTS (SELECT f.FolderId FROM Folder f WHERE f.FolderId = ParentId) THEN
+ IF (ParentId IS NULL OR EXISTS (SELECT f.FolderId FROM Folder f WHERE f.FolderId = ParentId)) THEN
/* Check for duplicate folders. */
IF NOT EXISTS (SELECT f.FolderId FROM Folder f WHERE f.Name LIKE Name) THEN
- INSERT INTO Folder (ParentFolderId, NamespaceId, Name, OwnerUserId, NextMessageId) VALUES (ParentId, NamespaceId, Name, UserId, 1);
+ INSERT INTO Folder (FolderId, ParentFolderId, NamespaceId, Name, OwnerUserId, NextMessageId) VALUES (NULL, ParentId, NamespaceId, Name, UserId, 1);
SELECT LAST_INSERT_ID() INTO FolderId;
-
+
+ SELECT u.Username INTO Username FROM `User` u WHERE u.UserId = UserId;
+
+ INSERT INTO FolderAcl (FolderAclId, Identifier, FolderId, Allow, Privilege) VALUES (NULL, Username, FolderId, 1, 0xffffffff);
+
/* Ok successful. */
SELECT 0 INTO Result;
@@ -273,6 +276,38 @@
END
//
+DROP PROCEDURE IF EXISTS RenameFolder //
+CREATE PROCEDURE RenameFolder
+(
+ FolderId INT,
+ NewName VARCHAR(1000),
+ OUT Result INT
+)
+BEGIN
+ START TRANSACTION;
+
+ /* Check if the folder already exists. */
+ IF EXISTS (SELECT f.FolderId FROM Folder f WHERE f.Name LIKE NewName) THEN
+
+ /* Update the folder name. */
+ UPDATE
+ Folder
+ SET
+ Name = NewName
+ WHERE
+ FolderId = FolderId;
+
+ /* TODO: update any child names */
+
+ ELSE
+ /* Already exists. */
+ SELECT 1 INTO Result;
+ END IF;
+
+ COMMIT;
+END
+//
+
DROP PROCEDURE IF EXISTS GetFolders //
CREATE PROCEDURE GetFolders
(
@@ -280,7 +315,7 @@
BEGIN
SELECT
- f.FolderId, f.Name, n.Name AS NameSpace
+ f.FolderId, f.Name, f.ParentFolderId, n.Name AS NameSpace
FROM
Folder f, Namespace n
WHERE
@@ -288,7 +323,86 @@
END
//
+DROP PROCEDURE IF EXISTS GetFolderChildIds //
+CREATE PROCEDURE GetFolderChildIds
+(
+ FolderId INT
+)
+BEGIN
+ SELECT
+ f.FolderId
+ FROM
+ Folder f
+ WHERE
+ f.ParentFolderId = FolderId;
+END
+//
+
+DROP PROCEDURE IF EXISTS GetFolderId //
+CREATE PROCEDURE GetFolderId
+(
+ Name VARCHAR(1000),
+ NameSpace VARCHAR(100),
+ OUT FolderId INT
+)
+BEGIN
+
+ SELECT
+ f.FolderId
+ INTO
+ FolderId
+ FROM
+ Folder f, Namespace n
+ WHERE
+ f.Name LIKE Name AND
+ n.Name LIKE NameSpace AND
+ f.NameSpaceId = n.NameSpaceId;
+END
+//
+
+DROP PROCEDURE IF EXISTS GetFolder //
+CREATE PROCEDURE GetFolder
+(
+ FolderId INT,
+ OUT ParentId INT,
+ OUT Name VARCHAR(1000),
+ OUT NameSpace VARCHAR(100),
+ OUT Children INT,
+ OUT Result INT
+)
+BEGIN
+
+ START TRANSACTION;
+
+ IF EXISTS (SELECT f.Name FROM Folder f WHERE f.FolderId = FolderId) THEN
+
+ SELECT
+ f.ParentFolderId, f.Name, n.Name
+ INTO
+ ParentId, Name, NameSpace
+ FROM
+ Folder f, Namespace n
+ WHERE
+ f.NameSpaceId = n.NameSpaceId
+ AND f.FolderId = FolderId;
+
+ SELECT COUNT(*) INTO Children FROM Folder f WHERE f.ParentFolderId = FolderId;
+
+ /* Successful. */
+ SELECT 0 INTO Result;
+
+ ELSE
+ /* No such folder. */
+ SELECT 3 INTO Result;
+ END IF;
+
+ COMMIT;
+
+END
+//
+
+
-- -----------------------------------------------------------------------
--
-- User related stored procedures
@@ -538,7 +652,7 @@
BEGIN
SELECT
- f.FolderId, f.Name, n.Name AS NameSpace
+ f.FolderId, f.ParentFolderId, f.Name, n.Name AS NameSpace
FROM
Folder f, Namespace n
WHERE
@@ -853,9 +967,92 @@
COMMIT;
END
+//
+
+DROP PROCEDURE IF EXISTS AddMailDomain //
+CREATE PROCEDURE AddMailDomain
+(
+ PrimaryHost VARCHAR(255),
+ ObjectData LONGBLOB,
+ OUT MailDomainId INT,
+ OUT Result INT
+)
+BEGIN
+ START TRANSACTION;
+
+ /* Check if the name is valid. */
+ IF NOT EXISTS (SELECT m.MailDomainId FROM MailDomain m WHERE m.PrimaryHost LIKE PrimaryHost) THEN
+
+ INSERT INTO MailDomain (PrimaryHost, ObjectData) VALUES (PrimaryHost, ObjectData);
+
+ SELECT LAST_INSERT_ID() INTO MailDomainId;
+
+ /* Ok successful. */
+ SELECT 0 INTO Result;
+
+ ELSE
+ /* Already exists. */
+ SELECT 1 INTO Result;
+ END IF;
+
+ COMMIT;
+END
+//
+
+DROP PROCEDURE IF EXISTS UpdateMailDomain //
+CREATE PROCEDURE UpdateMailDomain
+(
+ PrimaryHost VARCHAR(255),
+ ObjectData LONGBLOB,
+ OUT Result INT
+)
+BEGIN
+ START TRANSACTION;
+
+ /* Check if the name is valid. */
+ IF NOT EXISTS (SELECT m.MailDomainId FROM MailDomain m WHERE m.PrimaryHost LIKE PrimaryHost AND m.MailDomainId != MailDomainId) THEN
+
+ UPDATE MailDomain m SET m.PrimaryHost = PrimaryHost, m.ObjectData = ObjectData WHERE m.MailDomainId = MailDomainId;
+
+ /* Ok successful. */
+ SELECT 0 INTO Result;
+
+ ELSE
+ /* Already exists. */
+ SELECT 1 INTO Result;
+ END IF;
+
+ COMMIT;
+END
//
+DROP PROCEDURE IF EXISTS DeleteMailDomain //
+CREATE PROCEDURE DeleteMailDomain
+(
+ DeleteMailDomainId INT,
+ OUT Result INT
+)
+BEGIN
+ START TRANSACTION;
+
+ /* Check if the name is valid. */
+ IF EXISTS (SELECT m.MailDomainId FROM MailDomain m WHERE m.MailDomainId = DeleteMailDomainId) THEN
+
+ DELETE FROM MailDomain WHERE MailDomainId = DeleteMailDomainId;
+
+ /* Ok successful. */
+ SELECT 0 INTO Result;
+
+ ELSE
+ /* No such mail domain. */
+ SELECT 2 INTO Result;
+ END IF;
+ COMMIT;
+END
+//
+
+
-- -----------------------------------------------------------------------
--
-- System ACL related stored procedures
@@ -919,19 +1116,3 @@
INSERT INTO `Group` (Name) VALUES ("Administrators");
INSERT INTO UserGroupMap (GroupId, UserId) VALUES (1, 1);
INSERT INTO Acl (Identifier, Allow, Privilege, Resource) VALUES ("Administrator", 1, 0xffffff, "System"); -- All privs
-
--- TODO: remove, for testing only
-INSERT INTO User (UserName, Password, UserFolderId) VALUES ("Testing1", "changeme", 2);
-INSERT INTO User (UserName, Password, UserFolderId) VALUES ("Testing2", "changeme", 2);
-INSERT INTO User (UserName, Password, UserFolderId) VALUES ("Testing3", "changeme", 2);
-
-INSERT INTO `Group` (Name) VALUES ("Test1");
-INSERT INTO `Group` (Name) VALUES ("Test2");
-INSERT INTO `Group` (Name) VALUES ("Test3");
-
-INSERT INTO UserGroupMap (UserId, GroupId) VALUES (2, 1);
-INSERT INTO UserGroupMap (UserId, GroupId) VALUES (2, 2);
-INSERT INTO UserGroupMap (UserId, GroupId) VALUES (3, 3);
-
-
-INSERT INTO GroupGroupMap (ParentId, GroupId) VALUES (3, 2);
\ No newline at end of file
Modified: NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStoreData.cs
===================================================================
--- NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStoreData.cs 2006-06-18 09:43:19 UTC (rev 48)
+++ NMail/branches/luke-dev/NMail.LocalStoreData.MySql/MySqlLocalStoreData.cs 2006-06-23 11:10:20 UTC (rev 49)
@@ -26,6 +26,7 @@
using MySql.Data.MySqlClient;
using NMail.Authentication;
+using NMail.Configuration;
using NMail.DataTypes;
using NMail.DataTypes.ACLs;
using NMail.DataTypes.LocalStore;
@@ -173,82 +174,42 @@
#region Folder Retrieval and Manipulation
- private bool hasChildren(int folderId, MySqlConnection cnn, MySqlTransaction transaction) {
- using (MySqlCommand cmd = cnn.CreateCommand()) {
- cmd.Transaction = transaction;
- cmd.CommandText = "SELECT COUNT(f.FolderId) FROM Folder f WHERE f.ParentFolderId = ?FolderId";
- cmd.Parameters.Add("FolderId", folderId);
- long count = (long)cmd.ExecuteScalar();
-
- return (count > 0);
- }
- }
-
#region GetNominalStoreFolder
public StoreFolder GetNominalStoreFolder(string username) {
using (MySqlConnection cnn = GetConnection()) {
using (MySqlCommand cmd = cnn.CreateCommand()) {
- cmd.CommandText = "SELECT n.Name as Namespace, f.Name as FolderName, f.FolderId as FolderId FROM User u, Folder f, Namespace n WHERE u.UserFolderId = f.FolderId AND n.NameSpaceId = f.NameSpaceId AND u.Username = ?Username";
- cmd.Parameters.Add("Username", username);
+ LocalStoreUser user = GetUser(username);
- using(MySqlDataReader reader = cmd.ExecuteReader()) {
- StoreFolder result = null;
- if (reader.Read()) {
- result = new StoreFolder(
- (string) reader["Namespace"],
- (string) reader["FolderName"],
- (int) reader["FolderId"],
- false);
- }
- reader.Close();
-
- if (result != null) {
- result.HasChildren = hasChildren(result.FolderId, cnn, null);
- }
+ if (user == null) {
+ return null;
+ }
- return result;
- }
+ return GetStoreFolder(user.UserFolderId);
}
}
}
#endregion
#region GetStoreFolder
- private int? getStoreFolderId(Folder folder, MySqlConnection cnn, MySqlTransaction transaction) {
+
+ private StoreFolder getStoreFolder(Folder folder, MySqlConnection cnn, MySqlTransaction transaction) {
using (MySqlCommand cmd = cnn.CreateCommand()) {
cmd.Transaction = transaction;
- cmd.CommandText = "SELECT f.FolderId FROM Namespace n, Folder f WHERE n.NamespaceId = f.NamespaceId AND n.Name = ?Namespace AND f.Name LIKE ?FolderName";
- cmd.Parameters.Add("FolderName", folder.FolderName);
- cmd.Parameters.Add("Namespace", folder.NameSpace);
+ cmd.CommandType = CommandType.StoredProcedure;
+ cmd.CommandText = "GetFolderId";
+ cmd.Parameters.Add("FolderId", MySqlDbType.Int32);
+ cmd.Parameters.Add("Name", folder.FolderName);
+ cmd.Parameters.Add("NameSpace", folder.NameSpace);
+ cmd.Parameters["FolderId"].Direction = ParameterDirection.Output;
- object o = cmd.ExecuteScalar();
- return (o == null) ? null : (int?)o;
- }
- }
+ cmd.ExecuteNonQuery();
- private StoreFolder getStoreFolder(int folderId) {
- using (MySqlConnection cnn = GetConnection()) {
- using (MySqlCommand cmd = cnn.CreateCommand()) {
- cmd.CommandText = "SELECT n.Name as Namespace, f.Name as FolderName FROM Folder f, Namespace n WHERE f.NamespaceId = n.NamespaceId AND f.FolderId = ?FolderId";
- cmd.Parameters.Add("FolderId", folderId);
+ int? folderId = (int?) cmd.Parameters["FolderId"].Value;
- using (MySqlDataReader reader = cmd.ExecuteReader()) {
- if (reader.Read()) {
- StoreFolder result = new StoreFolder(
- (string)reader["Namespace"],
- (string)reader["FolderName"],
- folderId,
- false);
-
- reader.Close();
-
- result.HasChildren = hasChildren(folderId, cnn, null);
- return result;
-
- } else {
- return null;
- }
- }
+ if (folderId.HasValue) {
+ return GetStoreFolder(folderId.Value);
+ } else {
+ return null;
}
}
}
@@ -258,51 +219,60 @@
return getStoreFolder(folder, cnn, null);
}
}
-
- private StoreFolder getStoreFolder(Folder folder, MySqlConnection cnn, MySqlTransaction transaction) {
- int? folderId = getStoreFolderId(folder, cnn, transaction);
-
- if (folderId.HasValue) {
- return new StoreFolder(folder.NameSpace,
- folder.FolderName,
- folderId.Value,
- hasChildren(folderId.Value, cnn, transaction));
- } else {
- return null;
- }
- }
public StoreFolder GetStoreFolder(int folderId) {
using (MySqlConnection cnn = GetConnection()) {
- return getStoreFolder(folderId);
+ using (MySqlCommand cmd = cnn.CreateCommand()) {
+ cmd.CommandType = CommandType.StoredProcedure;
+ cmd.CommandText = "GetFolder";
+ cmd.Parameters.Add("FolderId", folderId);
+ cmd.Parameters.Add("ParentId", MySqlDbType.Int32);
+ cmd.Parameters.Add("Name", MySqlDbType.String);
+ cmd.Parameters.Add("NameSpace", MySqlDbType.String);
+ cmd.Parameters.Add("Children", MySqlDbType.Int32);
+ cmd.Parameters.Add("Result", MySqlDbType.Int32);
+ cmd.Parameters["ParentId"].Direction = ParameterDirection.Output;
+ cmd.Parameters["Name"].Direction = ParameterDirection.Output;
+ cmd.Parameters["NameSpace"].Direction = ParameterDirection.Output;
+ cmd.Parameters["Children"].Direction = ParameterDirection.Output;
+ cmd.Parameters["Result"].Direction = ParameterDirection.Output;
+
+ cmd.ExecuteNonQuery();
+
+ int resultValue = (int) cmd.Parameters["Result"].Value;
+ LocalStoreFolderResult result = (LocalStoreFolderResult) resultValue;
+
+ // Check if the lookup succeeded
+ if (result != LocalStoreFolderResult.OkSuccessful) {
+ return null;
+ }
+
+ // Parse out all the returned values
+ string name = (string) cmd.Parameters["Name"].Value;
+ string nameSpace = (string) cmd.Parameters["NameSpace"].Value;
+ int children = (int) cmd.Parameters["Children"].Value;
+ int? parentId = (cmd.Parameters["ParentId"].Value == DBNull.Value)
+ ? null
+ : (int?) cmd.Parameters["ParentId"].Value;
+
+ // Return the folder object
+ return new StoreFolder(nameSpace,
+ name,
+ folderId,
+ parentId,
+ (children != 0));
+ }
}
}
#endregion
#region Get Parent Folder
public StoreFolder GetParentFolder(StoreFolder folder) {
- using (MySqlConnection cnn = GetConnection()) {
- return getParentFolder(folder, cnn, null);
+ if (folder.ParentId.HasValue) {
+ return GetStoreFolder(folder.ParentId.Value);
}
- }
- private StoreFolder getParentFolder(StoreFolder folder, MySqlConnection cnn, MySqlTransaction transaction) {
- using (MySqlCommand cmd = cnn.CreateCommand()) {
- cmd.Transaction = transaction;
- cmd.CommandText = "SELECT f.Name, f.FolderId FROM Folder f WHERE f.FolderId IN (SELECT ParentFolderId FROM Folder WHERE FolderId = ?FolderId)";
- cmd.Parameters.Add("FolderId", folder.FolderId);
-
- MySqlDataReader reader = cmd.ExecuteReader();
-
- if (reader.NextResult()) {
- string folderStr = (string) reader["Name"];
- int parentId = (int) reader["FolderId"];
- StoreFolder parent = new StoreFolder(folder.NameSpace, folderStr, parentId, true);
- return parent;
- }
-
- return null;
- }
+ return null;
}
#endregion
@@ -369,6 +339,35 @@
#region RenameFolder
public LocalStoreFolderResult RenameFolder(StoreFolder folder, string newFolderName) {
+ /* Several cases:
+ * a1.b1 -> a1.b2 => simply rename "a1.b1" to "a1.b2"
+ * a1.b1 -> a2.b1 => rename "a1" to "a2" and "a1.b1" to "a2.b1"
+ * a1.b1.c1 -> a1.b2.c1 => rename "a1.b1" to "a1.b2" and "a1.b1.c1" to "a1.b2.c1"
+ * So simply rename the folder and any children.
+ *
+ * Also renaming "a1.b1" to "a2.b2" causes problems so renaming will be limited
+ * to only allow changing the end folder in the hierarchy. For example:
+ * a1.b1 -> a1.b2 is ok
+ * a1 -> a2 is ok
+ * a1.b1 to a2.b1 is not ok
+ */
+
+ // Check only the top level folder is being renamed
+ char[] delim = { NMailConfiguration.Current.LocalStore.FolderDelimiter };
+ string[] folderParts = folder.FolderName.Split(delim);
+ string[] newParts = newFolderName.Split(delim);
+
+ if (folderParts.Length != newParts.Length) {
+ return LocalStoreFolderResult.NotPermitted;
+ }
+
+ for (int i = 0; i < folderParts.Length - 1; i++) {
+ if (!folderParts[i].ToLower().Equals(newParts[i].ToLower())) {
+ return LocalStoreFolderResult.NotPermitted;
+ }
+ }
+
+ // Only the last part of the folder name has changed, proceed with the rename
using (MySqlConnection cnn = GetConnection()) {
MySqlTransaction transaction = cnn.BeginTransaction();
@@ -379,24 +378,9 @@
return LocalStoreFolderResult.AlreadyExists;
}
- // Get the parent folder
- StoreFolder parentFolder = getStoreFolder(folder.Parent, cnn, transaction);
-
- // Rename the folder
- MySqlCommand cmd = cnn.CreateCommand();
- cmd.Transaction = transaction;
- cmd.CommandText = "UPDATE Folder SET Name = ?Name, ParentFolderId = ?ParentFolderId WHERE FolderId = ?FolderId";
- cmd.Parameters.Add("Name", newFolder.FolderName);
- cmd.Parameters.Add("ParentFolderId", parentFolder.FolderId);
- cmd.Parameters.Add("FolderId", folder.FolderId);
-
- if (cmd.ExecuteNonQuery() == 0) {
- transaction.Commit();
- return LocalStoreFolderResult.NonExistent;
- } else {
- transaction.Commit();
- return LocalStoreFolderResult.OkSuccessful;
- }
+ throw new NotImplementedException();
+ // TODO: rename the folder
+ // TODO: recursively rename all children
}
}
#endregion
@@ -405,26 +389,28 @@
public StoreFolder[] GetChildren(StoreFolder parent) {
using (MySqlConnection cnn = GetConnection()) {
using (MySqlCommand cmd = cnn.CreateCommand()) {
- cmd.CommandText = "SELECT n.Name AS Namespace, f.Name as FolderName, f.FolderId as FolderId FROM Folder f, Namespace n WHERE n.NamespaceId = f.NamespaceId AND f.ParentFolderId = ?FolderId";
+ cmd.CommandType = CommandType.StoredProcedure;
+ cmd.CommandText = "GetFolderChildIds";
cmd.Parameters.Add("FolderId", parent.FolderId);
using (MySqlDataReader reader = cmd.ExecuteReader()) {
- List<StoreFolder> children = new List<StoreFolder>();
-
+ List<int> childIds = new List<int>();
+
while (reader.Read()) {
int childFolderId = (int)reader["FolderId"];
- string childMailboxName = (string)reader["FolderName"];
- string childNameSpace = (string)reader["Namespace"];
-
- children.Add(new StoreFolder(childNameSpace,
- childMailboxName,
- childFolderId,
- false));
+ childIds.Add(childFolderId);
}
+
reader.Close();
- for (int i = 0; i < children.Count; i++) {
- children[i].HasChildren = hasChildren(children[i].FolderId, cnn, null);
+ List<StoreFolder> children = new List<StoreFolder>();
+
+ foreach (int childFolderId in childIds) {
+ StoreFolder folder = GetStoreFolder(childFolderId);
+
+ if (folder != null) {
+ children.Add(folder);
+ }
}
return children.ToArray();
@@ -451,9 +437,12 @@
int folderId = (int) reader["FolderId"];
string nameSpace = (string) reader["NameSpace"];
string name = (string) reader["Name"];
+ int? parentId = (reader["ParentFolderId"] == DBNull.Value)
+ ? null
+ : (int?) reader["ParentFolderId"];
// TODO: Get HasChildren from the reader
- folders.Add(new StoreFolder(nameSpace, name, folderId, false));
+ folders.Add(new StoreFolder(nameSpace, name, folderId, parentId, false));
}
return folders.ToArray();
@@ -472,14 +461,19 @@
cmd.Parameters.Add("UserName", userName);
using (MySqlDataReader reader = cmd.ExecuteReader()) {
- List<StoreF...
[truncated message content] |