diff options
Diffstat (limited to 'src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdSelector.cs')
-rw-r--r-- | src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdSelector.cs | 455 |
1 files changed, 0 insertions, 455 deletions
diff --git a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdSelector.cs b/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdSelector.cs deleted file mode 100644 index ae1037b..0000000 --- a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdSelector.cs +++ /dev/null @@ -1,455 +0,0 @@ -//----------------------------------------------------------------------- -// <copyright file="OpenIdSelector.cs" company="Andrew Arnott"> -// Copyright (c) Andrew Arnott. All rights reserved. -// </copyright> -//----------------------------------------------------------------------- - -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdSelector.EmbeddedScriptResourceName, "text/javascript")] -[assembly: System.Web.UI.WebResource(DotNetOpenAuth.OpenId.RelyingParty.OpenIdSelector.EmbeddedStylesheetResourceName, "text/css")] - -namespace DotNetOpenAuth.OpenId.RelyingParty { - using System; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.ComponentModel; - using System.Diagnostics.Contracts; - using System.Globalization; - using System.IdentityModel.Claims; - using System.Linq; - using System.Text; - using System.Web; - using System.Web.UI; - using System.Web.UI.HtmlControls; - using System.Web.UI.WebControls; - using DotNetOpenAuth.ComponentModel; - ////using DotNetOpenAuth.InfoCard; - using DotNetOpenAuth.Messaging; - - /// <summary> - /// An ASP.NET control that provides a user-friendly way of logging into a web site using OpenID. - /// </summary> - [ToolboxData("<{0}:OpenIdSelector runat=\"server\"></{0}:OpenIdSelector>")] - public class OpenIdSelector : OpenIdRelyingPartyAjaxControlBase { - /// <summary> - /// The name of the manifest stream containing the OpenIdButtonPanel.js file. - /// </summary> - internal const string EmbeddedScriptResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.OpenIdSelector.js"; - - /// <summary> - /// The name of the manifest stream containing the OpenIdButtonPanel.css file. - /// </summary> - internal const string EmbeddedStylesheetResourceName = Util.DefaultNamespace + ".OpenId.RelyingParty.OpenIdSelector.css"; - - /// <summary> - /// The substring to append to the end of the id or name of this control to form the - /// unique name of the hidden field that will carry the positive assertion on postback. - /// </summary> - private const string AuthDataFormKeySuffix = "_openidAuthData"; - - #region ViewState keys - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="Buttons"/> property. - /// </summary> - private const string ButtonsViewStateKey = "Buttons"; - - /// <summary> - /// The viewstate key to use for storing the value of the <see cref="AuthenticatedAsToolTip"/> property. - /// </summary> - private const string AuthenticatedAsToolTipViewStateKey = "AuthenticatedAsToolTip"; - - #endregion - - #region Property defaults - - /// <summary> - /// The default value for the <see cref="AuthenticatedAsToolTip"/> property. - /// </summary> - private const string AuthenticatedAsToolTipDefault = "We recognize you!"; - - #endregion - - /// <summary> - /// The OpenIdAjaxTextBox that remains hidden until the user clicks the OpenID button. - /// </summary> - private OpenIdAjaxTextBox textBox; - - /// <summary> - /// The hidden field that will transmit the positive assertion to the RP. - /// </summary> - private HiddenField positiveAssertionField; - - /// <summary> - /// Initializes a new instance of the <see cref="OpenIdSelector"/> class. - /// </summary> - public OpenIdSelector() { - } - - /////// <summary> - /////// Occurs when an InfoCard has been submitted and decoded. - /////// </summary> - ////public event EventHandler<ReceivedTokenEventArgs> ReceivedToken; - - /////// <summary> - /////// Occurs when [token processing error]. - /////// </summary> - ////public event EventHandler<TokenProcessingErrorEventArgs> TokenProcessingError; - - /// <summary> - /// Gets the text box where applicable. - /// </summary> - public OpenIdAjaxTextBox TextBox { - get { - this.EnsureChildControlsAreCreatedSafe(); - return this.textBox; - } - } - - /// <summary> - /// Gets or sets the maximum number of OpenID Providers to simultaneously try to authenticate with. - /// </summary> - [Browsable(true), DefaultValue(OpenIdAjaxTextBox.ThrottleDefault), Category(BehaviorCategory)] - [Description("The maximum number of OpenID Providers to simultaneously try to authenticate with.")] - public int Throttle { - get { - this.EnsureChildControlsAreCreatedSafe(); - return this.textBox.Throttle; - } - - set { - this.EnsureChildControlsAreCreatedSafe(); - this.textBox.Throttle = value; - } - } - - /// <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 { - this.EnsureChildControlsAreCreatedSafe(); - return this.textBox.Timeout; - } - - set { - this.EnsureChildControlsAreCreatedSafe(); - this.textBox.Timeout = value; - } - } - - /// <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 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(OpenIdAjaxTextBox.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 { - this.EnsureChildControlsAreCreatedSafe(); - return this.textBox.DownloadYahooUILibrary; - } - - set { - this.EnsureChildControlsAreCreatedSafe(); - this.textBox.DownloadYahooUILibrary = value; - } - } - - /// <summary> - /// Gets the collection of buttons this selector should render to the browser. - /// </summary> - [PersistenceMode(PersistenceMode.InnerProperty)] - public Collection<SelectorButton> Buttons { - get { - if (this.ViewState[ButtonsViewStateKey] == null) { - var providers = new Collection<SelectorButton>(); - this.ViewState[ButtonsViewStateKey] = providers; - return providers; - } else { - return (Collection<SelectorButton>)this.ViewState[ButtonsViewStateKey]; - } - } - } - - /// <summary> - /// Gets a <see cref="T:System.Web.UI.ControlCollection"/> object that represents the child controls for a specified server control in the UI hierarchy. - /// </summary> - /// <returns> - /// The collection of child controls for the specified server control. - /// </returns> - public override ControlCollection Controls { - get { - this.EnsureChildControls(); - return base.Controls; - } - } - - /// <summary> - /// Gets the name of the open id auth data form key (for the value as stored at the user agent as a FORM field). - /// </summary> - /// <value> - /// Usually a concatenation of the control's name and <c>"_openidAuthData"</c>. - /// </value> - protected override string OpenIdAuthDataFormKey { - get { return this.UniqueID + AuthDataFormKeySuffix; } - } - - /// <summary> - /// Gets a value indicating whether some button in the selector will want - /// to display the <see cref="OpenIdAjaxTextBox"/> control. - /// </summary> - protected virtual bool OpenIdTextBoxVisible { - get { return this.Buttons.OfType<SelectorOpenIdButton>().Any(); } - } - - /// <summary> - /// Releases unmanaged and - optionally - managed resources - /// </summary> - /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected override void Dispose(bool disposing) { - if (disposing) { - foreach (var button in this.Buttons.OfType<IDisposable>()) { - button.Dispose(); - } - } - - base.Dispose(disposing); - } - - /// <summary> - /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. - /// </summary> - protected override void CreateChildControls() { - this.EnsureChildControlsAreCreatedSafe(); - - base.CreateChildControls(); - - // Now do the ID specific work. - this.EnsureID(); - ErrorUtilities.VerifyInternal(!string.IsNullOrEmpty(this.UniqueID), "Control.EnsureID() failed to give us a unique ID. Try setting an ID on the OpenIdSelector control. But please also file this bug with the project owners."); - - this.Controls.Add(this.textBox); - - this.positiveAssertionField.ID = this.ID + AuthDataFormKeySuffix; - this.Controls.Add(this.positiveAssertionField); - } - - /// <summary> - /// Ensures that the child controls have been built, but doesn't set control - /// properties that require executing <see cref="Control.EnsureID"/> in order to avoid - /// certain initialization order problems. - /// </summary> - /// <remarks> - /// We don't just call EnsureChildControls() and then set the property on - /// this.textBox itself because (apparently) setting this property in the ASPX - /// page and thus calling this EnsureID() via EnsureChildControls() this early - /// results in no ID. - /// </remarks> - protected virtual void EnsureChildControlsAreCreatedSafe() { - // If we've already created the child controls, this method is a no-op. - if (this.textBox != null) { - return; - } - - ////var selectorButton = this.Buttons.OfType<SelectorInfoCardButton>().FirstOrDefault(); - ////if (selectorButton != null) { - //// var selector = selectorButton.InfoCardSelector; - //// selector.ClaimsRequested.Add(new ClaimType { Name = ClaimTypes.PPID }); - //// selector.ImageSize = InfoCardImageSize.Size60x42; - //// selector.ReceivedToken += this.InfoCardSelector_ReceivedToken; - //// selector.TokenProcessingError += this.InfoCardSelector_TokenProcessingError; - //// this.Controls.Add(selector); - ////} - - this.textBox = new OpenIdAjaxTextBox(); - this.textBox.ID = "openid_identifier"; - this.textBox.HookFormSubmit = false; - this.textBox.ShowLogOnPostBackButton = true; - - this.positiveAssertionField = new HiddenField(); - } - - /// <summary> - /// Raises the <see cref="E:System.Web.UI.Control.Init"/> event. - /// </summary> - /// <param name="e">An <see cref="T:System.EventArgs"/> object that contains the event data.</param> - protected override void OnInit(EventArgs e) { - base.OnInit(e); - - // We force child control creation here so that they can get postback events. - EnsureChildControls(); - } - - /// <summary> - /// Raises the <see cref="E:System.Web.UI.Control.PreRender"/> event. - /// </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); - - this.EnsureValidButtons(); - - 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; - } - - // Import the .js file where most of the code is. - this.Page.ClientScript.RegisterClientScriptResource(typeof(OpenIdSelector), EmbeddedScriptResourceName); - - // Provide javascript with a way to post the login assertion. - const string PostLoginAssertionMethodName = "postLoginAssertion"; - const string PositiveAssertionParameterName = "positiveAssertion"; - const string ScriptFormat = @"window.{2} = function({0}) {{ - $('#{3}')[0].setAttribute('value', {0}); - {1}; -}};"; - string script = string.Format( - CultureInfo.InvariantCulture, - ScriptFormat, - PositiveAssertionParameterName, - this.Page.ClientScript.GetPostBackEventReference(this, null, false), - PostLoginAssertionMethodName, - this.positiveAssertionField.ClientID); - this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Postback", script, true); - - this.PreloadDiscovery(this.Buttons.OfType<SelectorProviderButton>().Select(op => op.OPIdentifier).Where(id => id != null)); - this.textBox.Visible = this.OpenIdTextBoxVisible; - } - - /// <summary> - /// Sends server control content to a provided <see cref="T:System.Web.UI.HtmlTextWriter"/> object, which writes the content to be rendered on the client. - /// </summary> - /// <param name="writer">The <see cref="T:System.Web.UI.HtmlTextWriter"/> object that receives the server control content.</param> - protected override void Render(HtmlTextWriter writer) { - Contract.Assume(writer != null, "Missing contract"); - writer.AddAttribute(HtmlTextWriterAttribute.Class, "OpenIdProviders"); - writer.RenderBeginTag(HtmlTextWriterTag.Ul); - - foreach (var button in this.Buttons) { - button.RenderLeadingAttributes(writer); - - writer.RenderBeginTag(HtmlTextWriterTag.Li); - - writer.AddAttribute(HtmlTextWriterAttribute.Href, "#"); - writer.RenderBeginTag(HtmlTextWriterTag.A); - - writer.RenderBeginTag(HtmlTextWriterTag.Div); - writer.RenderBeginTag(HtmlTextWriterTag.Div); - - button.RenderButtonContent(writer, this); - - writer.RenderEndTag(); // </div> - - writer.AddAttribute(HtmlTextWriterAttribute.Class, "ui-widget-overlay"); - writer.RenderBeginTag(HtmlTextWriterTag.Div); - writer.RenderEndTag(); - - writer.RenderEndTag(); // </div> - writer.RenderEndTag(); // </a> - writer.RenderEndTag(); // </li> - } - - writer.RenderEndTag(); // </ul> - - if (this.textBox.Visible) { - writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none"); - writer.AddAttribute(HtmlTextWriterAttribute.Id, "OpenIDForm"); - writer.RenderBeginTag(HtmlTextWriterTag.Div); - - this.textBox.RenderControl(writer); - - writer.RenderEndTag(); // </div> - } - - this.positiveAssertionField.RenderControl(writer); - } - - /////// <summary> - /////// Fires the <see cref="ReceivedToken"/> event. - /////// </summary> - /////// <param name="e">The token, if it was decrypted.</param> - ////protected virtual void OnReceivedToken(ReceivedTokenEventArgs e) { - //// Contract.Requires(e != null); - //// ErrorUtilities.VerifyArgumentNotNull(e, "e"); - - //// var receivedInfoCard = this.ReceivedToken; - //// if (receivedInfoCard != null) { - //// receivedInfoCard(this, e); - //// } - ////} - - /////// <summary> - /////// Raises the <see cref="E:TokenProcessingError"/> event. - /////// </summary> - /////// <param name="e">The <see cref="DotNetOpenAuth.InfoCard.TokenProcessingErrorEventArgs"/> instance containing the event data.</param> - ////protected virtual void OnTokenProcessingError(TokenProcessingErrorEventArgs e) { - //// Contract.Requires(e != null); - //// ErrorUtilities.VerifyArgumentNotNull(e, "e"); - - //// var tokenProcessingError = this.TokenProcessingError; - //// if (tokenProcessingError != null) { - //// tokenProcessingError(this, e); - //// } - ////} - - /////// <summary> - /////// Handles the ReceivedToken event of the infoCardSelector control. - /////// </summary> - /////// <param name="sender">The source of the event.</param> - /////// <param name="e">The <see cref="DotNetOpenAuth.InfoCard.ReceivedTokenEventArgs"/> instance containing the event data.</param> - ////private void InfoCardSelector_ReceivedToken(object sender, ReceivedTokenEventArgs e) { - //// this.Page.Response.SetCookie(new HttpCookie("openid_identifier", "infocard") { - //// Path = this.Page.Request.ApplicationPath, - //// }); - //// this.OnReceivedToken(e); - ////} - - /////// <summary> - /////// Handles the TokenProcessingError event of the infoCardSelector control. - /////// </summary> - /////// <param name="sender">The source of the event.</param> - /////// <param name="e">The <see cref="DotNetOpenAuth.InfoCard.TokenProcessingErrorEventArgs"/> instance containing the event data.</param> - ////private void InfoCardSelector_TokenProcessingError(object sender, TokenProcessingErrorEventArgs e) { - //// this.OnTokenProcessingError(e); - ////} - - /// <summary> - /// Ensures the <see cref="Buttons"/> collection has a valid set of buttons. - /// </summary> - private void EnsureValidButtons() { - foreach (var button in this.Buttons) { - button.EnsureValid(); - } - - // Also make sure that there are appropriate numbers of each type of button. - // TODO: code here - } - } -} |