diff options
Diffstat (limited to 'src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdAjaxTextBox.cs')
-rw-r--r-- | src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdAjaxTextBox.cs | 877 |
1 files changed, 0 insertions, 877 deletions
diff --git a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdAjaxTextBox.cs b/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdAjaxTextBox.cs deleted file mode 100644 index 8be097f..0000000 --- a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdAjaxTextBox.cs +++ /dev/null @@ -1,877 +0,0 @@ -//----------------------------------------------------------------------- -// <copyright file="OpenIdAjaxTextBox.cs" company="Andrew Arnott"> -// Copyright (c) Andrew Arnott. All rights reserved. -// </copyright> -//----------------------------------------------------------------------- - -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdAjaxTextBox.EmbeddedScriptResourceName, "text/javascript")] -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdAjaxTextBox.EmbeddedStylesheetResourceName, "text/css")] -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdAjaxTextBox.EmbeddedSpinnerResourceName, "image/gif")] -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdAjaxTextBox.EmbeddedLoginSuccessResourceName, "image/png")] -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdAjaxTextBox.EmbeddedLoginFailureResourceName, "image/png")] - -#pragma warning disable 0809 // marking inherited, unsupported properties as obsolete to discourage their use - -namespace DotNetOpenAuth.OpenId.RelyingParty { - using System; - using System.Collections.Generic; - using System.Collections.Specialized; - using System.ComponentModel; - using System.Diagnostics; - using System.Diagnostics.CodeAnalysis; - using System.Diagnostics.Contracts; - using System.Drawing.Design; - using System.Globalization; - using System.Text; - using System.Web.UI; - using System.Web.UI.HtmlControls; - using DotNetOpenAuth.Messaging; - - /// <summary> - /// An ASP.NET control that provides a minimal text box that is OpenID-aware and uses AJAX for - /// a premium login experience. - /// </summary> - [DefaultProperty("Text"), ValidationProperty("Text")] - [ToolboxData("<{0}:OpenIdAjaxTextBox runat=\"server\" />")] - public class OpenIdAjaxTextBox : OpenIdRelyingPartyAjaxControlBase, IEditableTextControl, ITextControl, IPostBackDataHandler { - /// <summary> - /// The name of the manifest stream containing the OpenIdAjaxTextBox.js file. - /// </summary> - internal const string EmbeddedScriptResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.OpenIdAjaxTextBox.js"; - - /// <summary> - /// The name of the manifest stream containing the OpenIdAjaxTextBox.css file. - /// </summary> - internal const string EmbeddedStylesheetResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.OpenIdAjaxTextBox.css"; - - /// <summary> - /// The name of the manifest stream containing the spinner.gif file. - /// </summary> - internal const string EmbeddedSpinnerResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.spinner.gif"; - - /// <summary> - /// The name of the manifest stream containing the login_success.png file. - /// </summary> - internal const string EmbeddedLoginSuccessResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.login_success.png"; - - /// <summary> - /// The name of the manifest stream containing the login_failure.png file. - /// </summary> - internal const string EmbeddedLoginFailureResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.login_failure.png"; - - /// <summary> - /// The default value for the <see cref="DownloadYahooUILibrary"/> property. - /// </summary> - internal const bool DownloadYahooUILibraryDefault = true; - - /// <summary> - /// The default value for the <see cref="Throttle"/> property. - /// </summary> - internal const int ThrottleDefault = 3; - - #region Property viewstate keys - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="AutoPostBack"/> property. - /// </summary> - private const string AutoPostBackViewStateKey = "AutoPostback"; - - /// <summary> - /// The viewstate key to use for the <see cref="Text"/> property. - /// </summary> - private const string TextViewStateKey = "Text"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="Columns"/> property. - /// </summary> - private const string ColumnsViewStateKey = "Columns"; - - /// <summary> - /// The viewstate key to use for the <see cref="CssClass"/> property. - /// </summary> - private const string CssClassViewStateKey = "CssClass"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="OnClientAssertionReceived"/> property. - /// </summary> - private const string OnClientAssertionReceivedViewStateKey = "OnClientAssertionReceived"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="AuthenticatedAsToolTip"/> property. - /// </summary> - private const string AuthenticatedAsToolTipViewStateKey = "AuthenticatedAsToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="AuthenticationSucceededToolTip"/> property. - /// </summary> - private const string AuthenticationSucceededToolTipViewStateKey = "AuthenticationSucceededToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="LogOnInProgressMessage"/> property. - /// </summary> - private const string LogOnInProgressMessageViewStateKey = "BusyToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="AuthenticationFailedToolTip"/> property. - /// </summary> - private const string AuthenticationFailedToolTipViewStateKey = "AuthenticationFailedToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="IdentifierRequiredMessage"/> property. - /// </summary> - private const string IdentifierRequiredMessageViewStateKey = "BusyToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="BusyToolTip"/> property. - /// </summary> - private const string BusyToolTipViewStateKey = "BusyToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="LogOnText"/> property. - /// </summary> - private const string LogOnTextViewStateKey = "LoginText"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="Throttle"/> property. - /// </summary> - private const string ThrottleViewStateKey = "Throttle"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="LogOnToolTip"/> property. - /// </summary> - private const string LogOnToolTipViewStateKey = "LoginToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="LogOnPostBackToolTip"/> property. - /// </summary> - private const string LogOnPostBackToolTipViewStateKey = "LoginPostBackToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="Name"/> property. - /// </summary> - private const string NameViewStateKey = "Name"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="Timeout"/> property. - /// </summary> - private const string TimeoutViewStateKey = "Timeout"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="TabIndex"/> property. - /// </summary> - private const string TabIndexViewStateKey = "TabIndex"; - - /// <summary> - /// The viewstate key to use for the <see cref="Enabled"/> property. - /// </summary> - private const string EnabledViewStateKey = "Enabled"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="RetryToolTip"/> property. - /// </summary> - private const string RetryToolTipViewStateKey = "RetryToolTip"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="RetryText"/> property. - /// </summary> - private const string RetryTextViewStateKey = "RetryText"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="DownloadYahooUILibrary"/> property. - /// </summary> - private const string DownloadYahooUILibraryViewStateKey = "DownloadYahooUILibrary"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="ShowLogOnPostBackButton"/> property. - /// </summary> - private const string ShowLogOnPostBackButtonViewStateKey = "ShowLogOnPostBackButton"; - - #endregion - - #region Property defaults - - /// <summary> - /// The default value for the <see cref="AutoPostBack"/> property. - /// </summary> - private const bool AutoPostBackDefault = false; - - /// <summary> - /// The default value for the <see cref="Columns"/> property. - /// </summary> - private const int ColumnsDefault = 40; - - /// <summary> - /// The default value for the <see cref="CssClass"/> property. - /// </summary> - private const string CssClassDefault = "openid"; - - /// <summary> - /// The default value for the <see cref="LogOnInProgressMessage"/> property. - /// </summary> - private const string LogOnInProgressMessageDefault = "Please wait for login to complete."; - - /// <summary> - /// The default value for the <see cref="AuthenticationSucceededToolTip"/> property. - /// </summary> - private const string AuthenticationSucceededToolTipDefault = "Authenticated by {0}."; - - /// <summary> - /// The default value for the <see cref="AuthenticatedAsToolTip"/> property. - /// </summary> - private const string AuthenticatedAsToolTipDefault = "Authenticated as {0}."; - - /// <summary> - /// The default value for the <see cref="AuthenticationFailedToolTip"/> property. - /// </summary> - private const string AuthenticationFailedToolTipDefault = "Authentication failed."; - - /// <summary> - /// The default value for the <see cref="LogOnText"/> property. - /// </summary> - private const string LogOnTextDefault = "LOG IN"; - - /// <summary> - /// The default value for the <see cref="BusyToolTip"/> property. - /// </summary> - private const string BusyToolTipDefault = "Discovering/authenticating"; - - /// <summary> - /// The default value for the <see cref="IdentifierRequiredMessage"/> property. - /// </summary> - private const string IdentifierRequiredMessageDefault = "Please correct errors in OpenID identifier and allow login to complete before submitting."; - - /// <summary> - /// The default value for the <see cref="Name"/> property. - /// </summary> - private const string NameDefault = "openid_identifier"; - - /// <summary> - /// Default value for <see cref="TabIndex"/> property. - /// </summary> - private const short TabIndexDefault = 0; - - /// <summary> - /// The default value for the <see cref="RetryToolTip"/> property. - /// </summary> - private const string RetryToolTipDefault = "Retry a failed identifier discovery."; - - /// <summary> - /// The default value for the <see cref="LogOnToolTip"/> property. - /// </summary> - private const string LogOnToolTipDefault = "Click here to log in using a pop-up window."; - - /// <summary> - /// The default value for the <see cref="LogOnPostBackToolTip"/> property. - /// </summary> - private const string LogOnPostBackToolTipDefault = "Click here to log in immediately."; - - /// <summary> - /// The default value for the <see cref="RetryText"/> property. - /// </summary> - private const string RetryTextDefault = "RETRY"; - - /// <summary> - /// The default value for the <see cref="ShowLogOnPostBackButton"/> property. - /// </summary> - private const bool ShowLogOnPostBackButtonDefault = false; - - #endregion - - /// <summary> - /// The path where the YUI control library should be downloaded from for HTTP pages. - /// </summary> - private const string YuiLoaderHttp = "http://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/yuiloader/yuiloader-min.js"; - - /// <summary> - /// The path where the YUI control library should be downloaded from for HTTPS pages. - /// </summary> - private const string YuiLoaderHttps = "https://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/yuiloader/yuiloader-min.js"; - - /// <summary> - /// Initializes a new instance of the <see cref="OpenIdAjaxTextBox"/> class. - /// </summary> - public OpenIdAjaxTextBox() { - this.HookFormSubmit = true; - } - - #region Events - - /// <summary> - /// Fired when the content of the text changes between posts to the server. - /// </summary> - [Description("Occurs when the content of the text changes between posts to the server."), Category(BehaviorCategory)] - public event EventHandler TextChanged; - - /// <summary> - /// Gets or sets the client-side script that executes when an authentication - /// assertion is received (but before it is verified). - /// </summary> - /// <remarks> - /// <para>In the context of the executing javascript set in this property, the - /// local variable <i>sender</i> is set to the openid_identifier input box - /// that is executing this code. - /// This variable has a getClaimedIdentifier() method that may be used to - /// identify the user who is being authenticated.</para> - /// <para>It is <b>very</b> important to note that when this code executes, - /// the authentication has not been verified and may have been spoofed. - /// No security-sensitive operations should take place in this javascript code. - /// The authentication is verified on the server by the time the - /// <see cref="OpenIdRelyingPartyControlBase.LoggedIn"/> server-side event fires.</para> - /// </remarks> - [Description("Gets or sets the client-side script that executes when an authentication assertion is received (but before it is verified).")] - [Bindable(true), DefaultValue(""), Category(BehaviorCategory)] - public string OnClientAssertionReceived { - get { return this.ViewState[OnClientAssertionReceivedViewStateKey] as string; } - set { this.ViewState[OnClientAssertionReceivedViewStateKey] = value; } - } - - #endregion - - #region Properties - - /// <summary> - /// Gets or sets the value in the text field, completely unprocessed or normalized. - /// </summary> - [Bindable(true), DefaultValue(""), Category(AppearanceCategory)] - [Description("The content of the text box.")] - public string Text { - get { - return this.Identifier != null ? this.Identifier.OriginalString : (this.ViewState[TextViewStateKey] as string ?? string.Empty); - } - - set { - // Try to store it as a validated identifier, - // but failing that at least store the text. - Identifier id; - if (Identifier.TryParse(value, out id)) { - this.Identifier = id; - } else { - // Be sure to set the viewstate AFTER setting the Identifier, - // since setting the Identifier clears the viewstate in OnIdentifierChanged. - this.Identifier = null; - this.ViewState[TextViewStateKey] = value; - } - } - } - - /// <summary> - /// Gets or sets a value indicating whether a postback is made to fire the - /// <see cref="OpenIdRelyingPartyControlBase.LoggedIn"/> event as soon as authentication has completed - /// successfully. - /// </summary> - /// <value> - /// <c>true</c> if a postback should be made automatically upon authentication; - /// otherwise, <c>false</c> to delay the <see cref="OpenIdRelyingPartyControlBase.LoggedIn"/> - /// event from firing at the server until a postback is made by some other control. - /// </value> - [Bindable(true), Category(BehaviorCategory), DefaultValue(AutoPostBackDefault)] - [Description("Whether the LoggedIn event fires on the server as soon as authentication completes successfully.")] - public bool AutoPostBack { - get { return (bool)(this.ViewState[AutoPostBackViewStateKey] ?? AutoPostBackDefault); } - set { this.ViewState[AutoPostBackViewStateKey] = value; } - } - - /// <summary> - /// Gets or sets the width of the text box in characters. - /// </summary> - [Bindable(true), Category(AppearanceCategory), DefaultValue(ColumnsDefault)] - [Description("The width of the text box in characters.")] - public int Columns { - get { - return (int)(this.ViewState[ColumnsViewStateKey] ?? ColumnsDefault); - } - - set { - Contract.Requires<ArgumentOutOfRangeException>(value >= 0); - this.ViewState[ColumnsViewStateKey] = value; - } - } - - /// <summary> - /// Gets or sets the CSS class assigned to the text box. - /// </summary> - [Bindable(true), DefaultValue(CssClassDefault), Category(AppearanceCategory)] - [Description("The CSS class assigned to the text box.")] - public string CssClass { - get { return (string)this.ViewState[CssClassViewStateKey]; } - set { this.ViewState[CssClassViewStateKey] = value; } - } - - /// <summary> - /// Gets or sets the tab index of the text box control. Use 0 to omit an explicit tabindex. - /// </summary> - [Bindable(true), Category(BehaviorCategory), DefaultValue(TabIndexDefault)] - [Description("The tab index of the text box control. Use 0 to omit an explicit tabindex.")] - public virtual short TabIndex { - get { return (short)(this.ViewState[TabIndexViewStateKey] ?? TabIndexDefault); } - set { this.ViewState[TabIndexViewStateKey] = value; } - } - - /// <summary> - /// Gets or sets a value indicating whether this <see cref="OpenIdTextBox"/> is enabled - /// in the browser for editing and will respond to incoming OpenID messages. - /// </summary> - /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value> - [Bindable(true), DefaultValue(true), Category(BehaviorCategory)] - [Description("Whether the control is editable in the browser and will respond to OpenID messages.")] - public bool Enabled { - get { return (bool)(this.ViewState[EnabledViewStateKey] ?? true); } - set { this.ViewState[EnabledViewStateKey] = value; } - } - - /// <summary> - /// Gets or sets the HTML name to assign to the text field. - /// </summary> - [Bindable(true), DefaultValue(NameDefault), Category("Misc")] - [Description("The HTML name to assign to the text field.")] - public string Name { - get { - return (string)(this.ViewState[NameViewStateKey] ?? NameDefault); - } - - set { - Contract.Requires<ArgumentException>(!String.IsNullOrEmpty(value)); - this.ViewState[NameViewStateKey] = value ?? string.Empty; - } - } - - /// <summary> - /// Gets or sets the time duration for the AJAX control to wait for an OP to respond before reporting failure to the user. - /// </summary> - [Browsable(true), DefaultValue(typeof(TimeSpan), "00:00:08"), Category(BehaviorCategory)] - [Description("The time duration for the AJAX control to wait for an OP to respond before reporting failure to the user.")] - public TimeSpan Timeout { - get { - return (TimeSpan)(this.ViewState[TimeoutViewStateKey] ?? TimeoutDefault); - } - - set { - Contract.Requires<ArgumentOutOfRangeException>(value.TotalMilliseconds > 0); - this.ViewState[TimeoutViewStateKey] = value; - } - } - - /// <summary> - /// Gets or sets the maximum number of OpenID Providers to simultaneously try to authenticate with. - /// </summary> - [Browsable(true), DefaultValue(ThrottleDefault), Category(BehaviorCategory)] - [Description("The maximum number of OpenID Providers to simultaneously try to authenticate with.")] - public int Throttle { - get { - return (int)(this.ViewState[ThrottleViewStateKey] ?? ThrottleDefault); - } - - set { - Contract.Requires<ArgumentOutOfRangeException>(value > 0); - this.ViewState[ThrottleViewStateKey] = value; - } - } - - /// <summary> - /// Gets or sets the text that appears on the LOG IN button in cases where immediate (invisible) authentication fails. - /// </summary> - [Bindable(true), DefaultValue(LogOnTextDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The text that appears on the LOG IN button in cases where immediate (invisible) authentication fails.")] - public string LogOnText { - get { - return (string)(this.ViewState[LogOnTextViewStateKey] ?? LogOnTextDefault); - } - - set { - Contract.Requires<ArgumentException>(!String.IsNullOrEmpty(value)); - this.ViewState[LogOnTextViewStateKey] = value ?? string.Empty; - } - } - - /// <summary> - /// Gets or sets the rool tip text that appears on the LOG IN button in cases where immediate (invisible) authentication fails. - /// </summary> - [Bindable(true), DefaultValue(LogOnToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears on the LOG IN button in cases where immediate (invisible) authentication fails.")] - public string LogOnToolTip { - get { return (string)(this.ViewState[LogOnToolTipViewStateKey] ?? LogOnToolTipDefault); } - set { this.ViewState[LogOnToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the rool tip text that appears on the LOG IN button when clicking the button will result in an immediate postback. - /// </summary> - [Bindable(true), DefaultValue(LogOnPostBackToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears on the LOG IN button when clicking the button will result in an immediate postback.")] - public string LogOnPostBackToolTip { - get { return (string)(this.ViewState[LogOnPostBackToolTipViewStateKey] ?? LogOnPostBackToolTipDefault); } - set { this.ViewState[LogOnPostBackToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the text that appears on the RETRY button in cases where authentication times out. - /// </summary> - [Bindable(true), DefaultValue(RetryTextDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The text that appears on the RETRY button in cases where authentication times out.")] - public string RetryText { - get { - return (string)(this.ViewState[RetryTextViewStateKey] ?? RetryTextDefault); - } - - set { - Contract.Requires<ArgumentException>(!String.IsNullOrEmpty(value)); - this.ViewState[RetryTextViewStateKey] = value ?? string.Empty; - } - } - - /// <summary> - /// Gets or sets the tool tip text that appears on the RETRY button in cases where authentication times out. - /// </summary> - [Bindable(true), DefaultValue(RetryToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears on the RETRY button in cases where authentication times out.")] - public string RetryToolTip { - get { return (string)(this.ViewState[RetryToolTipViewStateKey] ?? RetryToolTipDefault); } - set { this.ViewState[RetryToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the tool tip text that appears when authentication succeeds. - /// </summary> - [Bindable(true), DefaultValue(AuthenticationSucceededToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears when authentication succeeds.")] - public string AuthenticationSucceededToolTip { - get { return (string)(this.ViewState[AuthenticationSucceededToolTipViewStateKey] ?? AuthenticationSucceededToolTipDefault); } - set { this.ViewState[AuthenticationSucceededToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the tool tip text that appears on the green checkmark when authentication succeeds. - /// </summary> - [Bindable(true), DefaultValue(AuthenticatedAsToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears on the green checkmark when authentication succeeds.")] - public string AuthenticatedAsToolTip { - get { return (string)(this.ViewState[AuthenticatedAsToolTipViewStateKey] ?? AuthenticatedAsToolTipDefault); } - set { this.ViewState[AuthenticatedAsToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the tool tip text that appears when authentication fails. - /// </summary> - [Bindable(true), DefaultValue(AuthenticationFailedToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears when authentication fails.")] - public string AuthenticationFailedToolTip { - get { return (string)(this.ViewState[AuthenticationFailedToolTipViewStateKey] ?? AuthenticationFailedToolTipDefault); } - set { this.ViewState[AuthenticationFailedToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the tool tip text that appears over the text box when it is discovering and authenticating. - /// </summary> - [Bindable(true), DefaultValue(BusyToolTipDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The tool tip text that appears over the text box when it is discovering and authenticating.")] - public string BusyToolTip { - get { return (string)(this.ViewState[BusyToolTipViewStateKey] ?? BusyToolTipDefault); } - set { this.ViewState[BusyToolTipViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the message that is displayed if a postback is about to occur before the identifier has been supplied. - /// </summary> - [Bindable(true), DefaultValue(IdentifierRequiredMessageDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The message that is displayed if a postback is about to occur before the identifier has been supplied.")] - public string IdentifierRequiredMessage { - get { return (string)(this.ViewState[IdentifierRequiredMessageViewStateKey] ?? IdentifierRequiredMessageDefault); } - set { this.ViewState[IdentifierRequiredMessageViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets the message that is displayed if a postback is attempted while login is in process. - /// </summary> - [Bindable(true), DefaultValue(LogOnInProgressMessageDefault), Localizable(true), Category(AppearanceCategory)] - [Description("The message that is displayed if a postback is attempted while login is in process.")] - public string LogOnInProgressMessage { - get { return (string)(this.ViewState[LogOnInProgressMessageViewStateKey] ?? LogOnInProgressMessageDefault); } - set { this.ViewState[LogOnInProgressMessageViewStateKey] = value ?? string.Empty; } - } - - /// <summary> - /// Gets or sets a value indicating whether the Yahoo! User Interface Library (YUI) - /// will be downloaded in order to provide a login split button. - /// </summary> - /// <value> - /// <c>true</c> to use a split button; otherwise, <c>false</c> to use a standard HTML button - /// or a split button by downloading the YUI library yourself on the hosting web page. - /// </value> - /// <remarks> - /// The split button brings in about 180KB of YUI javascript dependencies. - /// </remarks> - [Bindable(true), DefaultValue(DownloadYahooUILibraryDefault), Category(BehaviorCategory)] - [Description("Whether a split button will be used for the \"log in\" when the user provides an identifier that delegates to more than one Provider.")] - public bool DownloadYahooUILibrary { - get { return (bool)(this.ViewState[DownloadYahooUILibraryViewStateKey] ?? DownloadYahooUILibraryDefault); } - set { this.ViewState[DownloadYahooUILibraryViewStateKey] = value; } - } - - /// <summary> - /// Gets or sets a value indicating whether the "Log in" button will be shown - /// to initiate a postback containing the positive assertion. - /// </summary> - [Bindable(true), DefaultValue(ShowLogOnPostBackButtonDefault), Category(AppearanceCategory)] - [Description("Whether the log in button will be shown to initiate a postback containing the positive assertion.")] - public bool ShowLogOnPostBackButton { - get { return (bool)(this.ViewState[ShowLogOnPostBackButtonViewStateKey] ?? ShowLogOnPostBackButtonDefault); } - set { this.ViewState[ShowLogOnPostBackButtonViewStateKey] = value; } - } - - #endregion - - /// <summary> - /// Gets or sets a value indicating whether the ajax text box should hook the form's submit event for special behavior. - /// </summary> - internal bool HookFormSubmit { get; set; } - - /// <summary> - /// Gets the name of the open id auth data form key. - /// </summary> - /// <value> - /// A concatenation of <see cref="Name"/> and <c>"_openidAuthData"</c>. - /// </value> - protected override string OpenIdAuthDataFormKey { - get { return this.Name + "_openidAuthData"; } - } - - /// <summary> - /// Gets the default value for the <see cref="Timeout"/> property. - /// </summary> - /// <value>8 seconds; or eternity if the debugger is attached.</value> - private static TimeSpan TimeoutDefault { - get { - if (Debugger.IsAttached) { - Logger.OpenId.Warn("Debugger is attached. Inflating default OpenIdAjaxTextbox.Timeout value to infinity."); - return TimeSpan.MaxValue; - } else { - return TimeSpan.FromSeconds(8); - } - } - } - - #region IPostBackDataHandler Members - - /// <summary> - /// When implemented by a class, processes postback data for an ASP.NET server control. - /// </summary> - /// <param name="postDataKey">The key identifier for the control.</param> - /// <param name="postCollection">The collection of all incoming name values.</param> - /// <returns> - /// true if the server control's state changes as a result of the postback; otherwise, false. - /// </returns> - bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection) { - return this.LoadPostData(postDataKey, postCollection); - } - - /// <summary> - /// When implemented by a class, signals the server control to notify the ASP.NET application that the state of the control has changed. - /// </summary> - void IPostBackDataHandler.RaisePostDataChangedEvent() { - this.RaisePostDataChangedEvent(); - } - - #endregion - - /// <summary> - /// Raises the <see cref="E:Load"/> event. - /// </summary> - /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> - protected override void OnLoad(EventArgs e) { - base.OnLoad(e); - - this.Page.RegisterRequiresPostBack(this); - } - - /// <summary> - /// Called when the <see cref="Identifier"/> property is changed. - /// </summary> - protected override void OnIdentifierChanged() { - this.ViewState.Remove(TextViewStateKey); - base.OnIdentifierChanged(); - } - - /// <summary> - /// Prepares to render the control. - /// </summary> - /// <param name="e">An <see cref="T:System.EventArgs"/> object that contains the event data.</param> - protected override void OnPreRender(EventArgs e) { - base.OnPreRender(e); - - if (!this.Visible) { - return; - } - - if (this.DownloadYahooUILibrary) { - // Although we'll add the <script> tag to download the YAHOO component, - // a download failure may have occurred, so protect ourselves from a - // script error using an if (YAHOO) block. But apparently at least in IE - // that's not even enough, so we use a try/catch. - string yuiLoadScript = @"try { if (YAHOO) { - var loader = new YAHOO.util.YUILoader({ - require: ['button', 'menu'], - loadOptional: false, - combine: true - }); - - loader.insert(); -} } catch (e) { }"; - this.Page.ClientScript.RegisterClientScriptInclude("yuiloader", this.Page.Request.Url.IsTransportSecure() ? YuiLoaderHttps : YuiLoaderHttp); - this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "requiredYuiComponents", yuiLoadScript, true); - } - - var css = new HtmlLink(); - try { - css.Href = this.Page.ClientScript.GetWebResourceUrl(this.GetType(), EmbeddedStylesheetResourceName); - css.Attributes["rel"] = "stylesheet"; - css.Attributes["type"] = "text/css"; - ErrorUtilities.VerifyHost(this.Page.Header != null, OpenIdStrings.HeadTagMustIncludeRunatServer); - this.Page.Header.Controls.AddAt(0, css); // insert at top so host page can override - } catch { - css.Dispose(); - throw; - } - - this.PrepareClientJavascript(); - - // If an Identifier is preset on this control, preload discovery on that identifier, - // but only if we're not already persisting an authentication result since that would - // be redundant. - if (this.Identifier != null && this.AuthenticationResponse == null) { - this.PreloadDiscovery(this.Identifier); - } - } - - /// <summary> - /// Renders the control. - /// </summary> - /// <param name="writer">The <see cref="T:System.Web.UI.HtmlTextWriter"/> object that receives the control content.</param> - protected override void Render(HtmlTextWriter writer) { - base.Render(writer); - - // We surround the textbox with a span so that the .js file can inject a - // login button within the text box with easy placement. - string css = this.CssClass ?? string.Empty; - css += " OpenIdAjaxTextBox"; - writer.AddAttribute(HtmlTextWriterAttribute.Class, css); - - writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "inline-block"); - writer.AddStyleAttribute(HtmlTextWriterStyle.Position, "relative"); - writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "16px"); - writer.RenderBeginTag(HtmlTextWriterTag.Span); - - writer.AddAttribute(HtmlTextWriterAttribute.Name, this.Name); - writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID); - writer.AddAttribute(HtmlTextWriterAttribute.Size, this.Columns.ToString(CultureInfo.InvariantCulture)); - if (!string.IsNullOrEmpty(this.Text)) { - writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Text, true); - } - - if (this.TabIndex > 0) { - writer.AddAttribute(HtmlTextWriterAttribute.Tabindex, this.TabIndex.ToString(CultureInfo.InvariantCulture)); - } - if (!this.Enabled) { - writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "true"); - } - if (!string.IsNullOrEmpty(this.CssClass)) { - writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass); - } - writer.AddStyleAttribute(HtmlTextWriterStyle.PaddingLeft, "18px"); - writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, "solid"); - writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "1px"); - writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, "lightgray"); - writer.RenderBeginTag(HtmlTextWriterTag.Input); - writer.RenderEndTag(); // </input> - writer.RenderEndTag(); // </span> - } - - /// <summary> - /// When implemented by a class, processes postback data for an ASP.NET server control. - /// </summary> - /// <param name="postDataKey">The key identifier for the control.</param> - /// <param name="postCollection">The collection of all incoming name values.</param> - /// <returns> - /// true if the server control's state changes as a result of the postback; otherwise, false. - /// </returns> - protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) { - // If the control was temporarily hidden, it won't be in the Form data, - // and we'll just implicitly keep the last Text setting. - if (postCollection[this.Name] != null) { - Identifier identifier = postCollection[this.Name].Length == 0 ? null : postCollection[this.Name]; - if (identifier != this.Identifier) { - this.Identifier = identifier; - return true; - } - } - - return false; - } - - /// <summary> - /// When implemented by a class, signals the server control to notify the ASP.NET application that the state of the control has changed. - /// </summary> - [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate", Justification = "Predefined signature.")] - protected virtual void RaisePostDataChangedEvent() { - this.OnTextChanged(); - } - - /// <summary> - /// Called on a postback when the Text property has changed. - /// </summary> - protected virtual void OnTextChanged() { - EventHandler textChanged = this.TextChanged; - if (textChanged != null) { - textChanged(this, EventArgs.Empty); - } - } - - /// <summary> - /// Assembles the javascript to send to the client and registers it with ASP.NET for transmission. - /// </summary> - private void PrepareClientJavascript() { - // Import the .js file where most of the code is. - this.Page.ClientScript.RegisterClientScriptResource(typeof(OpenIdAjaxTextBox), EmbeddedScriptResourceName); - - // Call into the .js file with initialization information. - StringBuilder startupScript = new StringBuilder(); - startupScript.AppendFormat("var box = document.getElementsByName('{0}')[0];{1}", this.Name, Environment.NewLine); - startupScript.AppendFormat( - CultureInfo.InvariantCulture, - "initAjaxOpenId(box, {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, function() {{{20};}});{21}", - MessagingUtilities.GetSafeJavascriptValue(this.Page.ClientScript.GetWebResourceUrl(this.GetType(), OpenIdTextBox.EmbeddedLogoResourceName)), - MessagingUtilities.GetSafeJavascriptValue(this.Page.ClientScript.GetWebResourceUrl(this.GetType(), EmbeddedSpinnerResourceName)), - MessagingUtilities.GetSafeJavascriptValue(this.Page.ClientScript.GetWebResourceUrl(this.GetType(), EmbeddedLoginSuccessResourceName)), - MessagingUtilities.GetSafeJavascriptValue(this.Page.ClientScript.GetWebResourceUrl(this.GetType(), EmbeddedLoginFailureResourceName)), - this.Throttle, - this.Timeout.TotalMilliseconds, - string.IsNullOrEmpty(this.OnClientAssertionReceived) ? "null" : "'" + this.OnClientAssertionReceived.Replace(@"\", @"\\").Replace("'", @"\'") + "'", - MessagingUtilities.GetSafeJavascriptValue(this.LogOnText), - MessagingUtilities.GetSafeJavascriptValue(this.LogOnToolTip), - this.ShowLogOnPostBackButton ? "true" : "false", - MessagingUtilities.GetSafeJavascriptValue(this.LogOnPostBackToolTip), - MessagingUtilities.GetSafeJavascriptValue(this.RetryText), - MessagingUtilities.GetSafeJavascriptValue(this.RetryToolTip), - MessagingUtilities.GetSafeJavascriptValue(this.BusyToolTip), - MessagingUtilities.GetSafeJavascriptValue(this.IdentifierRequiredMessage), - MessagingUtilities.GetSafeJavascriptValue(this.LogOnInProgressMessage), - MessagingUtilities.GetSafeJavascriptValue(this.AuthenticationSucceededToolTip), - MessagingUtilities.GetSafeJavascriptValue(this.AuthenticatedAsToolTip), - MessagingUtilities.GetSafeJavascriptValue(this.AuthenticationFailedToolTip), - this.AutoPostBack ? "true" : "false", - Page.ClientScript.GetPostBackEventReference(this, null), - Environment.NewLine); - - ScriptManager.RegisterStartupScript(this, this.GetType(), "ajaxstartup", startupScript.ToString(), true); - if (this.HookFormSubmit) { - string htmlFormat = @" -var openidbox = document.getElementsByName('{0}')[0]; -if (!openidbox.dnoi_internal.onSubmit()) {{ return false; }} -"; - Page.ClientScript.RegisterOnSubmitStatement( - this.GetType(), - "loginvalidation", - string.Format(CultureInfo.InvariantCulture, htmlFormat, this.Name)); - } - } - } -} |