//
// System.Web.Configuration.AuthConfig
//
// Authors:
//	Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2002 Ximian, Inc (http://www.ximian.com)
//

using System;
using System.Collections;
using System.Configuration;
using System.Xml;

namespace System.Web.Configuration
{
	class AuthConfig
	{
		AuthenticationMode mode;
		string cookieName;
		string cookiePath;
		string loginUrl;
		FormsProtectionEnum protection;
		int timeout;
		FormsAuthPasswordFormat pwdFormat;
		Hashtable credentialUsers;
		bool has_parent;
#if NET_1_1
		bool requireSSL;
		bool slidingExpiration;
#endif

		internal AuthConfig (object parent)
		{
			if (parent is AuthConfig) {
				has_parent = true;
				AuthConfig p = (AuthConfig) parent;
				mode = p.mode;
				cookieName = p.cookieName;
				cookiePath = p.cookiePath;
				loginUrl = p.loginUrl;
				protection = p.protection;
				timeout = p.timeout;
				pwdFormat = p.pwdFormat;
#if NET_1_1
				requireSSL = p.requireSSL;
				slidingExpiration = p.slidingExpiration;
#endif
				credentialUsers = new Hashtable (p.CredentialUsers);
			}
		}

		internal void SetMode (string m)
		{
			if (m == null) {
				// we default to Forms authentication mode, MS defaults to Windows
				if (!has_parent)
					Mode = AuthenticationMode.Forms;
				return;
			}

			Mode = (AuthenticationMode) Enum.Parse (typeof (AuthenticationMode), m, true);
		}

		internal void SetProtection (string prot)
		{
			if (prot == null) {
				if (!has_parent)
					Protection = FormsProtectionEnum.All;
				return;
			}

			Protection = (FormsProtectionEnum) Enum.Parse (typeof (FormsProtectionEnum),
								       prot,
								       true);
		}

		internal void SetTimeout (string minutes)
		{
			if (minutes != null) {
				Timeout = Int32.Parse (minutes);
				return;
			}

			if (!has_parent)
				Timeout = 30;
		}

		internal void SetPasswordFormat (string pwdFormat)
		{
			if (pwdFormat == null) {
				if (!has_parent)
					PasswordFormat = FormsAuthPasswordFormat.Clear;
				return;
			}

			PasswordFormat =
				(FormsAuthPasswordFormat) Enum.Parse (typeof (FormsAuthPasswordFormat),
								      pwdFormat,
								      true);
		}

		internal AuthenticationMode Mode {
			get { return mode; }
			set { mode = value; }
		}

		internal string CookieName {
			get {
				if (cookieName == null)
					cookieName = ".ASPXAUTH";

				return cookieName;
			}
			set {
				if (value == null)
					return;

				cookieName = value;
			}
		}

		internal string CookiePath {
			get {
				if (cookiePath == null)
					cookiePath = "/";

				return cookiePath;
			}
			set {
				if (value == null)
					return;

				cookiePath = value;
			}
		}

		internal string LoginUrl {
			get {
				if (loginUrl == null)
					loginUrl = "login.aspx";

				return loginUrl;
			}
			set {
				if (value == null)
					return;

				loginUrl = value;
			}
		}

		internal FormsProtectionEnum Protection {
			get { return protection; }
			set { protection = value; }
		}

		internal int Timeout {
			get { return timeout; }
			set {
				if (value <= 0)
					throw new ArgumentException ("Timeout must be > 0", "value");

				timeout = value;
			}
		}

		internal FormsAuthPasswordFormat PasswordFormat {
			get { return pwdFormat; }
			set { pwdFormat = value; }
		}

		internal Hashtable CredentialUsers {
			get {
				if (credentialUsers == null)
					credentialUsers = new Hashtable ();

				return credentialUsers;
			}
		}

#if NET_1_1
		internal bool RequireSSL {
			get { return requireSSL; }
			set { requireSSL = value; }
		}

		internal bool SlidingExpiration {
			get { return slidingExpiration; }
			set { slidingExpiration = value; }
		}
#endif
	}
}

