2 // System.Web.UI.WebControls.PasswordRecovery.cs
5 // Vladimir Krasnov (vladimirk@mainsoft.com)
7 // (C) 2006 Mainsoft, Inc (http://www.mainsoft.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Net.Mail;
32 using System.Collections;
33 using System.Collections.Specialized;
34 using System.ComponentModel;
35 using System.Drawing.Design;
38 using System.Web.Security;
40 namespace System.Web.UI.WebControls
43 [DefaultEvent ("SendingMail")]
44 [Designer ("System.Web.UI.Design.WebControls.PasswordRecoveryDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
45 public class PasswordRecovery : CompositeControl
48 static readonly object answerLookupErrorEvent = new object ();
49 static readonly object sendingMailEvent = new object ();
50 static readonly object sendMailErrorEvent = new object ();
51 static readonly object userLookupErrorEvent = new object ();
52 static readonly object verifyingAnswerEvent = new object ();
53 static readonly object verifyingUserEvent = new object ();
55 public static readonly string SubmitButtonCommandName = "Submit";
56 bool renderOuterTable = true;
57 TableItemStyle _failureTextStyle;
58 TableItemStyle _hyperLinkStyle;
59 TableItemStyle _instructionTextStyle;
60 TableItemStyle _labelStyle;
61 Style _submitButtonStyle;
62 TableItemStyle _successTextStyle;
64 TableItemStyle _titleTextStyle;
65 Style _validatorTextStyle;
67 MailDefinition _mailDefinition;
68 MembershipProvider _provider = null;
70 ITemplate _questionTemplate = null;
71 ITemplate _successTemplate = null;
72 ITemplate _userNameTemplate = null;
74 QuestionContainer _questionTemplateContainer = null;
75 SuccessContainer _successTemplateContainer = null;
76 UserNameContainer _userNameTemplateContainer = null;
78 PasswordReciveryStep _currentStep = PasswordReciveryStep.StepUserName;
80 string _username = null;
81 string _answer = null;
83 EventHandlerList events = new EventHandlerList ();
86 public event EventHandler AnswerLookupError {
87 add { events.AddHandler (answerLookupErrorEvent, value); }
88 remove { events.RemoveHandler (answerLookupErrorEvent, value); }
91 public event MailMessageEventHandler SendingMail {
92 add { events.AddHandler (sendingMailEvent, value); }
93 remove { events.RemoveHandler (sendingMailEvent, value); }
96 public event SendMailErrorEventHandler SendMailError {
97 add { events.AddHandler (sendMailErrorEvent, value); }
98 remove { events.RemoveHandler (sendMailErrorEvent, value); }
101 public event EventHandler UserLookupError {
102 add { events.AddHandler (userLookupErrorEvent, value); }
103 remove { events.RemoveHandler (userLookupErrorEvent, value); }
106 public event LoginCancelEventHandler VerifyingAnswer {
107 add { events.AddHandler (verifyingAnswerEvent, value); }
108 remove { events.RemoveHandler (verifyingAnswerEvent, value); }
111 public event LoginCancelEventHandler VerifyingUser {
112 add { events.AddHandler (verifyingUserEvent, value); }
113 remove { events.RemoveHandler (verifyingUserEvent, value); }
117 public PasswordRecovery ()
123 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
125 public virtual string Answer {
126 get { return _answer != null ? _answer : string.Empty; }
130 public virtual string AnswerLabelText
132 get { return ViewState.GetString ("AnswerLabelText", "Answer:"); }
133 set { ViewState ["AnswerLabelText"] = value; }
137 public virtual string AnswerRequiredErrorMessage
139 get { return ViewState.GetString ("AnswerRequiredErrorMessage", "Answer is required."); }
140 set { ViewState ["AnswerRequiredErrorMessage"] = value; }
144 public virtual int BorderPadding
146 get { return ViewState.GetInt ("BorderPadding", 1); }
150 throw new ArgumentOutOfRangeException ();
151 ViewState ["BorderPadding"] = value;
156 public virtual string GeneralFailureText
158 get { return ViewState.GetString ("GeneralFailureText", "Your attempt to retrieve your password was not successful. Please try again."); }
159 set { ViewState ["GeneralFailureText"] = value; }
164 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
165 public virtual string HelpPageIconUrl
167 get { return ViewState.GetString ("HelpPageIconUrl", String.Empty); }
168 set { ViewState ["HelpPageIconUrl"] = value; }
173 public virtual string HelpPageText
175 get { return ViewState.GetString ("HelpPageText", String.Empty); }
176 set { ViewState ["HelpPageText"] = value; }
181 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
182 public virtual string HelpPageUrl
184 get { return ViewState.GetString ("HelpPageUrl", String.Empty); }
185 set { ViewState ["HelpPageUrl"] = value; }
188 [NotifyParentProperty (true)]
189 [PersistenceMode (PersistenceMode.InnerProperty)]
190 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
192 public MailDefinition MailDefinition {
194 if (_mailDefinition == null) {
195 _mailDefinition = new MailDefinition ();
196 if (IsTrackingViewState)
197 ((IStateManager) _mailDefinition).TrackViewState ();
199 return _mailDefinition;
205 public virtual string MembershipProvider
207 get { return ViewState.GetString ("MembershipProvider", String.Empty); }
208 set { ViewState ["MembershipProvider"] = value; }
213 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
215 public virtual string Question {
216 get { return ViewState.GetString ("Question", ""); }
217 private set { ViewState ["Question"] = value; }
221 public virtual string QuestionFailureText
223 get { return ViewState.GetString ("QuestionFailureText", "Your answer could not be verified. Please try again."); }
224 set { ViewState ["QuestionFailureText"] = value; }
228 public virtual string QuestionInstructionText
230 get { return ViewState.GetString ("QuestionInstructionText", "Answer the following question to receive your password."); }
231 set { ViewState ["QuestionInstructionText"] = value; }
235 public virtual string QuestionLabelText
237 get { return ViewState.GetString ("QuestionLabelText", "Question:"); }
238 set { ViewState ["QuestionLabelText"] = value; }
242 public virtual string QuestionTitleText
244 get { return ViewState.GetString ("QuestionTitleText", "Identity Confirmation"); }
245 set { ViewState ["QuestionTitleText"] = value; }
247 [DefaultValue (true)]
248 public virtual bool RenderOuterTable {
249 get { return renderOuterTable; }
250 set { renderOuterTable = value; }
254 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
255 public virtual string SubmitButtonImageUrl
257 get { return ViewState.GetString ("SubmitButtonImageUrl", String.Empty); }
258 set { ViewState ["SubmitButtonImageUrl"] = value; }
262 public virtual string SubmitButtonText
264 get { return ViewState.GetString ("SubmitButtonText", "Submit"); }
265 set { ViewState ["SubmitButtonText"] = value; }
268 [DefaultValue (ButtonType.Button)]
269 public virtual ButtonType SubmitButtonType
273 object o = ViewState ["SubmitButtonType"];
274 return (o == null) ? ButtonType.Button : (ButtonType) o;
278 if ((value < ButtonType.Button) || (value > ButtonType.Link))
279 throw new ArgumentOutOfRangeException ("SubmitButtonType");
280 ViewState ["SubmitButtonType"] = (int) value;
286 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
288 public virtual string SuccessPageUrl
290 get { return ViewState.GetString ("SuccessPageUrl", String.Empty); }
291 set { ViewState ["SuccessPageUrl"] = value; }
295 public virtual string SuccessText
297 get { return ViewState.GetString ("SuccessText", "Your password has been sent to you."); }
298 set { ViewState ["SuccessText"] = value; }
301 [DefaultValue (LoginTextLayout.TextOnLeft)]
302 public virtual LoginTextLayout TextLayout {
305 object o = ViewState ["TextLayout"];
306 return (o == null) ? LoginTextLayout.TextOnLeft : (LoginTextLayout) o;
310 if ((value < LoginTextLayout.TextOnLeft) || (value > LoginTextLayout.TextOnTop))
311 throw new ArgumentOutOfRangeException ("TextLayout");
312 ViewState ["TextLayout"] = (int) value;
318 public virtual string UserName {
319 get { return _username != null ? _username : String.Empty; }
320 set { _username = value; }
324 public virtual string UserNameFailureText
326 get { return ViewState.GetString ("UserNameFailureText", "We were unable to access your information. Please try again."); }
327 set { ViewState ["UserNameFailureText"] = value; }
331 public virtual string UserNameInstructionText
333 get { return ViewState.GetString ("UserNameInstructionText", "Enter your User Name to receive your password."); }
334 set { ViewState ["UserNameInstructionText"] = value; }
338 public virtual string UserNameLabelText
340 get { return ViewState.GetString ("UserNameLabelText", "User Name:"); }
341 set { ViewState ["UserNameLabelText"] = value; }
345 public virtual string UserNameRequiredErrorMessage
347 get { return ViewState.GetString ("UserNameRequiredErrorMessage", "User Name is required."); }
348 set { ViewState ["UserNameRequiredErrorMessage"] = value; }
352 public virtual string UserNameTitleText
354 get { return ViewState.GetString ("UserNameTitleText", "Forgot Your Password?"); }
355 set { ViewState ["UserNameTitleText"] = value; }
359 [PersistenceMode (PersistenceMode.InnerProperty)]
360 [TemplateContainer (typeof (PasswordRecovery))]
361 public virtual ITemplate QuestionTemplate
363 get { return _questionTemplate; }
364 set { _questionTemplate = value; }
368 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
369 public Control QuestionTemplateContainer
372 if (_questionTemplateContainer == null) {
373 _questionTemplateContainer = new QuestionContainer (this);
374 ITemplate template = QuestionTemplate;
375 if (template != null)
376 _questionTemplateContainer.InstantiateTemplate (template);
379 return _questionTemplateContainer;
384 [PersistenceMode (PersistenceMode.InnerProperty)]
385 [TemplateContainer (typeof (PasswordRecovery))]
386 public virtual ITemplate SuccessTemplate
388 get { return _successTemplate; }
389 set { _successTemplate = value; }
393 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
394 public Control SuccessTemplateContainer
397 if (_successTemplateContainer == null) {
398 _successTemplateContainer = new SuccessContainer (this);
399 ITemplate template = SuccessTemplate;
400 if (template != null)
401 _successTemplateContainer.InstantiateTemplate (template);
404 return _successTemplateContainer;
409 [PersistenceMode (PersistenceMode.InnerProperty)]
410 [TemplateContainer (typeof (PasswordRecovery))]
411 public virtual ITemplate UserNameTemplate {
412 get { return _userNameTemplate; }
413 set { _userNameTemplate = value; }
417 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
418 public Control UserNameTemplateContainer {
420 if (_userNameTemplateContainer == null) {
421 _userNameTemplateContainer = new UserNameContainer (this);
422 ITemplate template = UserNameTemplate;
423 if (template != null)
424 _userNameTemplateContainer.InstantiateTemplate (template);
427 return _userNameTemplateContainer;
431 [DefaultValue (null)]
432 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
433 [PersistenceMode (PersistenceMode.InnerProperty)]
434 [NotifyParentProperty (true)]
435 public TableItemStyle FailureTextStyle {
437 if (_failureTextStyle == null) {
438 _failureTextStyle = new TableItemStyle ();
439 if (IsTrackingViewState)
440 _failureTextStyle.TrackViewState ();
442 return _failureTextStyle;
446 [DefaultValue (null)]
447 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
448 [PersistenceMode (PersistenceMode.InnerProperty)]
449 [NotifyParentProperty (true)]
450 public TableItemStyle HyperLinkStyle {
452 if (_hyperLinkStyle == null) {
453 _hyperLinkStyle = new TableItemStyle ();
454 if (IsTrackingViewState)
455 _hyperLinkStyle.TrackViewState ();
457 return _hyperLinkStyle;
461 [DefaultValue (null)]
462 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
463 [PersistenceMode (PersistenceMode.InnerProperty)]
464 [NotifyParentProperty (true)]
465 public TableItemStyle InstructionTextStyle {
467 if (_instructionTextStyle == null) {
468 _instructionTextStyle = new TableItemStyle ();
469 if (IsTrackingViewState)
470 _instructionTextStyle.TrackViewState ();
472 return _instructionTextStyle;
476 [DefaultValue (null)]
477 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
478 [PersistenceMode (PersistenceMode.InnerProperty)]
479 [NotifyParentProperty (true)]
480 public TableItemStyle LabelStyle {
482 if (_labelStyle == null) {
483 _labelStyle = new TableItemStyle ();
484 if (IsTrackingViewState)
485 _labelStyle.TrackViewState ();
491 [DefaultValue (null)]
492 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
493 [PersistenceMode (PersistenceMode.InnerProperty)]
494 [NotifyParentProperty (true)]
495 public Style SubmitButtonStyle {
497 if (_submitButtonStyle == null) {
498 _submitButtonStyle = new TableItemStyle ();
499 if (IsTrackingViewState)
500 _submitButtonStyle.TrackViewState ();
502 return _submitButtonStyle;
506 [DefaultValue (null)]
507 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
508 [PersistenceMode (PersistenceMode.InnerProperty)]
509 [NotifyParentProperty (true)]
510 public TableItemStyle SuccessTextStyle {
512 if (_successTextStyle == null) {
513 _successTextStyle = new TableItemStyle ();
514 if (IsTrackingViewState)
515 _successTextStyle.TrackViewState ();
517 return _successTextStyle;
521 [DefaultValue (null)]
522 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
523 [PersistenceMode (PersistenceMode.InnerProperty)]
524 [NotifyParentProperty (true)]
525 public Style TextBoxStyle {
527 if (_textBoxStyle == null) {
528 _textBoxStyle = new TableItemStyle ();
529 if (IsTrackingViewState)
530 _textBoxStyle.TrackViewState ();
532 return _textBoxStyle;
536 [DefaultValue (null)]
537 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
538 [PersistenceMode (PersistenceMode.InnerProperty)]
539 [NotifyParentProperty (true)]
540 public TableItemStyle TitleTextStyle {
542 if (_titleTextStyle == null) {
543 _titleTextStyle = new TableItemStyle ();
544 if (IsTrackingViewState)
545 _titleTextStyle.TrackViewState ();
547 return _titleTextStyle;
551 [DefaultValue (null)]
552 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
553 [PersistenceMode (PersistenceMode.InnerProperty)]
554 [NotifyParentProperty (true)]
555 public Style ValidatorTextStyle {
557 if (_validatorTextStyle == null) {
558 _validatorTextStyle = new TableItemStyle ();
559 if (IsTrackingViewState)
560 _validatorTextStyle.TrackViewState ();
562 return _validatorTextStyle;
566 #region Protected Properties
568 protected override HtmlTextWriterTag TagKey {
569 get { return HtmlTextWriterTag.Table; }
572 internal virtual MembershipProvider MembershipProviderInternal
576 if (_provider == null)
577 InitMemberShipProvider ();
585 protected internal override void CreateChildControls ()
587 ITemplate userNameTemplate = UserNameTemplate;
588 if (userNameTemplate == null) {
589 userNameTemplate = new UserNameDefaultTemplate (this);
590 ((UserNameContainer) UserNameTemplateContainer).InstantiateTemplate (userNameTemplate);
593 ITemplate questionTemplate = QuestionTemplate;
594 if (questionTemplate == null) {
595 questionTemplate = new QuestionDefaultTemplate (this);
596 ((QuestionContainer) QuestionTemplateContainer).InstantiateTemplate (questionTemplate);
599 ITemplate successTemplate = SuccessTemplate;
600 if (successTemplate == null) {
601 successTemplate = new SuccessDefaultTemplate (this);
602 ((SuccessContainer) SuccessTemplateContainer).InstantiateTemplate (successTemplate);
605 Controls.AddAt (0, UserNameTemplateContainer);
606 Controls.AddAt (1, QuestionTemplateContainer);
607 Controls.AddAt (2, SuccessTemplateContainer);
609 IEditableTextControl editable;
611 editable = ((UserNameContainer) UserNameTemplateContainer).UserNameTextBox;
612 if (editable != null)
613 editable.TextChanged += new EventHandler (UserName_TextChanged);
615 editable = ((QuestionContainer) QuestionTemplateContainer).AnswerTextBox;
616 if (editable != null)
617 editable.TextChanged += new EventHandler (Answer_TextChanged);
620 #region Protected methods
622 protected internal override void Render (HtmlTextWriter writer)
624 ((QuestionContainer) QuestionTemplateContainer).UpdateChildControls ();
626 for (int i = 0; i < Controls.Count; i++)
627 if (Controls [i].Visible)
628 Controls [i].Render (writer);
631 protected internal override void LoadControlState (object savedState)
633 if (savedState == null) return;
634 object [] state = (object []) savedState;
635 base.LoadControlState (state [0]);
637 _currentStep = (PasswordReciveryStep) state [1];
638 _username = (string) state [2];
641 protected internal override object SaveControlState ()
643 object state = base.SaveControlState ();
644 return new object [] { state, _currentStep, _username };
647 protected override void TrackViewState ()
649 base.TrackViewState ();
651 if (_failureTextStyle != null)
652 _failureTextStyle.TrackViewState ();
654 if (_hyperLinkStyle != null)
655 _hyperLinkStyle.TrackViewState ();
657 if (_instructionTextStyle != null)
658 _instructionTextStyle.TrackViewState ();
660 if (_labelStyle != null)
661 _labelStyle.TrackViewState ();
663 if (_submitButtonStyle != null)
664 _submitButtonStyle.TrackViewState ();
666 if (_successTextStyle != null)
667 _successTextStyle.TrackViewState ();
669 if (_textBoxStyle != null)
670 _textBoxStyle.TrackViewState ();
672 if (_titleTextStyle != null)
673 _titleTextStyle.TrackViewState ();
675 if (_validatorTextStyle != null)
676 _validatorTextStyle.TrackViewState ();
678 if (_mailDefinition != null)
679 ((IStateManager) _mailDefinition).TrackViewState ();
682 protected override void LoadViewState (object savedState)
684 if (savedState == null)
687 object [] states = (object []) savedState;
688 base.LoadViewState (states [0]);
690 if (states [1] != null)
691 FailureTextStyle.LoadViewState (states [1]);
693 if (states [2] != null)
694 HyperLinkStyle.LoadViewState (states [2]);
696 if (states [3] != null)
697 InstructionTextStyle.LoadViewState (states [3]);
699 if (states [4] != null)
700 LabelStyle.LoadViewState (states [4]);
702 if (states [5] != null)
703 SubmitButtonStyle.LoadViewState (states [5]);
705 if (states [6] != null)
706 SuccessTextStyle.LoadViewState (states [6]);
708 if (states [7] != null)
709 TextBoxStyle.LoadViewState (states [7]);
711 if (states [8] != null)
712 TitleTextStyle.LoadViewState (states [8]);
714 if (states [9] != null)
715 ValidatorTextStyle.LoadViewState (states [9]);
717 if (states [10] != null)
718 ((IStateManager) MailDefinition).LoadViewState (states [10]);
721 protected override object SaveViewState ()
723 object [] states = new object [11];
724 states [0] = base.SaveViewState ();
726 if (_failureTextStyle != null)
727 states [1] = _failureTextStyle.SaveViewState ();
729 if (_hyperLinkStyle != null)
730 states [2] = _hyperLinkStyle.SaveViewState ();
732 if (_instructionTextStyle != null)
733 states [3] = _instructionTextStyle.SaveViewState ();
735 if (_labelStyle != null)
736 states [4] = _labelStyle.SaveViewState ();
738 if (_submitButtonStyle != null)
739 states [5] = _submitButtonStyle.SaveViewState ();
741 if (_successTextStyle != null)
742 states [6] = _successTextStyle.SaveViewState ();
744 if (_textBoxStyle != null)
745 states [7] = _textBoxStyle.SaveViewState ();
747 if (_titleTextStyle != null)
748 states [8] = _titleTextStyle.SaveViewState ();
750 if (_validatorTextStyle != null)
751 states [9] = _validatorTextStyle.SaveViewState ();
753 if (_mailDefinition != null)
754 states [10] = ((IStateManager) _mailDefinition).SaveViewState ();
756 for (int i = 0; i < states.Length; i++) {
757 if (states [i] != null)
766 void ProcessCommand (CommandEventArgs args)
771 switch (_currentStep) {
772 case PasswordReciveryStep.StepUserName:
775 case PasswordReciveryStep.StepAnswer:
776 ProcessUserAnswer ();
782 void ProcessUserName ()
784 LoginCancelEventArgs args = new LoginCancelEventArgs ();
785 OnVerifyingUser (args);
789 MembershipUser user = MembershipProviderInternal.GetUser (UserName, false);
791 OnUserLookupError (EventArgs.Empty);
792 ((UserNameContainer) UserNameTemplateContainer).FailureTextLiteral.Text = UserNameFailureText;
796 if (!MembershipProviderInternal.RequiresQuestionAndAnswer) {
797 GenerateAndSendEmail ();
799 _currentStep = PasswordReciveryStep.StepSuccess;
803 Question = user.PasswordQuestion;
804 _currentStep = PasswordReciveryStep.StepAnswer;
808 void ProcessUserAnswer ()
810 LoginCancelEventArgs args = new LoginCancelEventArgs ();
811 OnVerifyingAnswer (args);
815 MembershipUser user = MembershipProviderInternal.GetUser (UserName, false);
816 if (user == null || string.IsNullOrEmpty (user.Email)) {
817 ((QuestionContainer) QuestionTemplateContainer).FailureTextLiteral.Text = GeneralFailureText;
821 GenerateAndSendEmail ();
823 _currentStep = PasswordReciveryStep.StepSuccess;
827 void GenerateAndSendEmail ()
829 string newPassword = "";
831 if (MembershipProviderInternal.EnablePasswordRetrieval) {
832 newPassword = MembershipProviderInternal.GetPassword (UserName, Answer);
834 else if (MembershipProviderInternal.EnablePasswordReset) {
835 newPassword = MembershipProviderInternal.ResetPassword (UserName, Answer);
838 throw new HttpException ("Membership provider does not support password retrieval or reset.");
840 catch (MembershipPasswordException) {
841 OnAnswerLookupError (EventArgs.Empty);
842 ((QuestionContainer) QuestionTemplateContainer).FailureTextLiteral.Text = QuestionFailureText;
846 SendPasswordByMail (UserName, newPassword);
849 void InitMemberShipProvider ()
851 string mp = MembershipProvider;
852 _provider = (mp.Length == 0) ? _provider = Membership.Provider : Membership.Providers [mp];
853 if (_provider == null)
854 throw new HttpException (Locale.GetText ("No provider named '{0}' could be found.", mp));
857 void SendPasswordByMail (string username, string password)
859 MembershipUser user = MembershipProviderInternal.GetUser (UserName, false);
863 // DO NOT change format of the message - it has to be exactly the same as in
864 // .NET as some software (e.g. YetAnotherForum) depends on it.
865 string messageText = "Please return to the site and log in using the following information.\n" +
866 "User Name: <%USERNAME%>\nPassword: <%PASSWORD%>\n";
868 ListDictionary dictionary = new ListDictionary (StringComparer.OrdinalIgnoreCase);
869 dictionary.Add ("<%USERNAME%>", username);
870 dictionary.Add ("<% UserName %>", username);
871 dictionary.Add ("<%PASSWORD%>", password);
872 dictionary.Add ("<% Password %>", password);
874 MailMessage message = null;
876 if (MailDefinition.BodyFileName.Length == 0)
877 message = MailDefinition.CreateMailMessage (user.Email, dictionary, messageText, this);
879 message = MailDefinition.CreateMailMessage (user.Email, dictionary, this);
881 if (string.IsNullOrEmpty (message.Subject))
882 message.Subject = "Password";
884 MailMessageEventArgs args = new MailMessageEventArgs (message);
885 OnSendingMail (args);
887 SmtpClient smtpClient = new SmtpClient ();
889 smtpClient.Send (message);
891 catch (Exception e) {
892 SendMailErrorEventArgs mailArgs = new SendMailErrorEventArgs (e);
893 OnSendMailError (mailArgs);
894 if (!mailArgs.Handled)
899 #region Event handlers
901 protected virtual void OnAnswerLookupError (EventArgs e)
905 protected override bool OnBubbleEvent (object source, EventArgs e)
907 CommandEventArgs args = e as CommandEventArgs;
908 if (e != null && args.CommandName == SubmitButtonCommandName) {
909 ProcessCommand (args);
912 return base.OnBubbleEvent (source, e);
915 protected internal override void OnInit (EventArgs e)
917 Page.RegisterRequiresControlState (this);
921 protected internal override void OnPreRender (EventArgs e)
923 UserNameTemplateContainer.Visible = false;
924 QuestionTemplateContainer.Visible = false;
925 SuccessTemplateContainer.Visible = false;
927 switch (_currentStep) {
928 case PasswordReciveryStep.StepUserName:
929 UserNameTemplateContainer.Visible = true;
931 case PasswordReciveryStep.StepAnswer:
932 QuestionTemplateContainer.Visible = true;
934 case PasswordReciveryStep.StepSuccess:
935 SuccessTemplateContainer.Visible = true;
939 base.OnPreRender (e);
942 protected virtual void OnSendingMail (MailMessageEventArgs e)
944 MailMessageEventHandler eh = events [sendingMailEvent] as MailMessageEventHandler;
949 protected virtual void OnSendMailError (SendMailErrorEventArgs e)
951 SendMailErrorEventHandler eh = events [sendingMailEvent] as SendMailErrorEventHandler;
956 protected virtual void OnUserLookupError (EventArgs e)
958 EventHandler eh = events [userLookupErrorEvent] as EventHandler;
963 protected virtual void OnVerifyingAnswer (LoginCancelEventArgs e)
965 LoginCancelEventHandler eh = events [verifyingAnswerEvent] as LoginCancelEventHandler;
970 protected virtual void OnVerifyingUser (LoginCancelEventArgs e)
972 LoginCancelEventHandler eh = events [verifyingUserEvent] as LoginCancelEventHandler;
979 #region Private Event Handlers
981 void UserName_TextChanged (object sender, EventArgs e)
983 UserName = ((ITextControl) sender).Text;
986 void Answer_TextChanged (object sender, EventArgs e)
988 _answer = ((ITextControl) sender).Text;
993 [MonoTODO ("Not implemented")]
994 protected override void SetDesignModeState (IDictionary data)
996 throw new NotImplementedException ();
999 // TODO: merge with BaseCheckPasswordContainer
1000 abstract class BasePasswordRecoveryContainer : Control, INamingContainer
1002 protected readonly PasswordRecovery _owner = null;
1003 bool renderOuterTable;
1005 TableCell _containerCell = null;
1007 public BasePasswordRecoveryContainer (PasswordRecovery owner)
1010 renderOuterTable = _owner.RenderOuterTable;
1011 if (renderOuterTable)
1015 public void InstantiateTemplate (ITemplate template)
1017 if (!renderOuterTable)
1018 template.InstantiateIn (this);
1020 template.InstantiateIn (_containerCell);
1025 _table = new Table ();
1026 string id = _owner.ID;
1027 if (!String.IsNullOrEmpty (id))
1028 _table.Attributes.Add ("id", id);
1030 _table.CellSpacing = 0;
1031 _table.CellPadding = _owner.BorderPadding;
1033 _containerCell = new TableCell ();
1035 TableRow row = new TableRow ();
1036 row.Cells.Add (_containerCell);
1037 _table.Rows.Add (row);
1039 Controls.AddAt (0, _table);
1042 protected internal override void OnPreRender (EventArgs e)
1045 _table.ApplyStyle (_owner.ControlStyle);
1046 base.OnPreRender (e);
1049 public abstract void UpdateChildControls();
1053 sealed class QuestionContainer : BasePasswordRecoveryContainer
1055 public QuestionContainer (PasswordRecovery owner)
1059 // Requried controls
1060 public IEditableTextControl AnswerTextBox
1064 Control c = FindControl ("Answer");
1066 throw new HttpException ("QuestionTemplate does not contain an IEditableTextControl with ID Answer for the username.");
1067 return c as IEditableTextControl;
1070 // Optional controls
1071 public Literal UserNameLiteral
1073 get { return FindControl ("UserName") as Literal; }
1075 public Literal QuestionLiteral
1077 get { return FindControl ("Question") as Literal; }
1079 public Literal FailureTextLiteral
1081 get { return FindControl ("FailureText") as Literal; }
1084 public override void UpdateChildControls ()
1086 if (UserNameLiteral != null)
1087 UserNameLiteral.Text = _owner.UserName;
1089 if (QuestionLiteral != null)
1090 QuestionLiteral.Text = _owner.Question;
1094 sealed class SuccessContainer : BasePasswordRecoveryContainer
1096 public SuccessContainer (PasswordRecovery owner)
1101 public override void UpdateChildControls ()
1106 sealed class UserNameContainer : BasePasswordRecoveryContainer
1108 public UserNameContainer (PasswordRecovery owner)
1112 // Requried controls
1113 public IEditableTextControl UserNameTextBox
1117 Control c = FindControl ("UserName");
1119 throw new HttpException ("UserNameTemplate does not contain an IEditableTextControl with ID UserName for the username.");
1120 return c as IEditableTextControl;
1123 // Optional controls
1124 public ITextControl FailureTextLiteral
1126 get { return FindControl ("FailureText") as ITextControl; }
1129 public override void UpdateChildControls ()
1136 public static TableRow CreateRow(Control c1, Control c2, Style s1, Style s2, bool twoCells)
1138 TableRow row = new TableRow ();
1139 TableCell cell1 = new TableCell ();
1141 cell1.Controls.Add (c1);
1143 cell1.ApplyStyle (s1);
1145 row.Cells.Add (cell1);
1148 TableCell cell2 = new TableCell ();
1149 cell2.Controls.Add (c2);
1152 cell2.ApplyStyle (s2);
1154 row.Cells.Add (cell2);
1156 cell1.HorizontalAlign = HorizontalAlign.Right;
1157 cell2.HorizontalAlign = HorizontalAlign.Left;
1160 cell1.HorizontalAlign = HorizontalAlign.Center;
1162 cell1.ColumnSpan = 2;
1168 public static TableRow CreateHelpRow (string pageUrl, string linkText, string linkIcon, Style linkStyle, bool twoCells)
1170 TableRow row = new TableRow ();
1171 TableCell cell1 = new TableCell ();
1173 if (linkIcon.Length > 0) {
1174 Image img = new Image ();
1175 img.ImageUrl = linkIcon;
1176 cell1.Controls.Add (img);
1178 if (linkText.Length > 0) {
1179 HyperLink link = new HyperLink ();
1180 link.NavigateUrl = pageUrl;
1181 link.Text = linkText;
1182 link.ControlStyle.CopyTextStylesFrom (linkStyle);
1183 cell1.Controls.Add (link);
1187 cell1.ColumnSpan = 2;
1189 row.ControlStyle.CopyFrom (linkStyle);
1190 row.Cells.Add (cell1);
1195 sealed class UserNameDefaultTemplate : ITemplate
1197 readonly PasswordRecovery _owner = null;
1199 public UserNameDefaultTemplate (PasswordRecovery _owner)
1201 this._owner = _owner;
1204 public void InstantiateIn (Control container)
1206 Table table = new Table ();
1207 table.CellPadding = 0;
1209 bool twoCells = _owner.TextLayout == LoginTextLayout.TextOnLeft;
1213 TemplateUtils.CreateRow (new LiteralControl (_owner.UserNameTitleText), null, _owner.TitleTextStyle, null, twoCells));
1217 TemplateUtils.CreateRow (new LiteralControl (_owner.UserNameInstructionText), null, _owner.InstructionTextStyle, null, twoCells));
1220 TextBox UserNameTextBox = new TextBox ();
1221 UserNameTextBox.ID = "UserName";
1222 UserNameTextBox.Text = _owner.UserName;
1223 UserNameTextBox.ApplyStyle (_owner.TextBoxStyle);
1225 Label UserNameLabel = new Label ();
1226 UserNameLabel.ID = "UserNameLabel";
1227 UserNameLabel.AssociatedControlID = "UserName";
1228 UserNameLabel.Text = _owner.UserNameLabelText;
1229 UserNameLabel.ApplyStyle (_owner.LabelStyle);
1231 RequiredFieldValidator UserNameRequired = new RequiredFieldValidator ();
1232 UserNameRequired.ID = "UserNameRequired";
1233 UserNameRequired.ControlToValidate = "UserName";
1234 UserNameRequired.ErrorMessage = _owner.UserNameRequiredErrorMessage;
1235 UserNameRequired.ToolTip = _owner.UserNameRequiredErrorMessage;
1236 UserNameRequired.Text = "*";
1237 UserNameRequired.ValidationGroup = _owner.ID;
1238 UserNameRequired.ApplyStyle (_owner.ValidatorTextStyle);
1241 TableRow row = TemplateUtils.CreateRow (UserNameLabel, UserNameTextBox, null, null, twoCells);
1242 row.Cells [1].Controls.Add (UserNameRequired);
1243 table.Rows.Add (row);
1246 table.Rows.Add (TemplateUtils.CreateRow (UserNameLabel, null, null, null, twoCells));
1247 TableRow row = TemplateUtils.CreateRow (UserNameTextBox, null, null, null, twoCells);
1248 row.Cells [0].Controls.Add (UserNameRequired);
1249 table.Rows.Add (row);
1253 Literal FailureText = new Literal ();
1254 FailureText.ID = "FailureText";
1255 if (_owner.FailureTextStyle.ForeColor.IsEmpty)
1256 _owner.FailureTextStyle.ForeColor = System.Drawing.Color.Red;
1257 table.Rows.Add (TemplateUtils.CreateRow (FailureText, null, _owner.FailureTextStyle, null, twoCells));
1260 WebControl SubmitButton = null;
1261 switch (_owner.SubmitButtonType) {
1262 case ButtonType.Button:
1263 SubmitButton = new Button ();
1265 case ButtonType.Image:
1266 SubmitButton = new ImageButton ();
1268 case ButtonType.Link:
1269 SubmitButton = new LinkButton ();
1273 SubmitButton.ID = "SubmitButton";
1274 SubmitButton.ApplyStyle (_owner.SubmitButtonStyle);
1275 ((IButtonControl) SubmitButton).CommandName = PasswordRecovery.SubmitButtonCommandName;
1276 ((IButtonControl) SubmitButton).Text = _owner.SubmitButtonText;
1277 ((IButtonControl) SubmitButton).ValidationGroup = _owner.ID;
1279 TableRow buttonRow = TemplateUtils.CreateRow (SubmitButton, null, null, null, twoCells);
1280 buttonRow.Cells [0].HorizontalAlign = HorizontalAlign.Right;
1281 table.Rows.Add (buttonRow);
1285 TemplateUtils.CreateHelpRow (
1286 _owner.HelpPageUrl, _owner.HelpPageText, _owner.HelpPageIconUrl, _owner.HyperLinkStyle, twoCells));
1288 container.Controls.Add (table);
1292 sealed class QuestionDefaultTemplate : ITemplate
1294 readonly PasswordRecovery _owner = null;
1296 public QuestionDefaultTemplate (PasswordRecovery _owner)
1298 this._owner = _owner;
1301 public void InstantiateIn (Control container)
1303 Table table = new Table ();
1304 table.CellPadding = 0;
1306 bool twoCells = _owner.TextLayout == LoginTextLayout.TextOnLeft;
1310 TemplateUtils.CreateRow (new LiteralControl (_owner.QuestionTitleText), null, _owner.TitleTextStyle, null, twoCells));
1314 TemplateUtils.CreateRow (new LiteralControl (_owner.QuestionInstructionText), null, _owner.InstructionTextStyle, null, twoCells));
1317 Literal UserNameLiteral = new Literal ();
1318 UserNameLiteral.ID = "UserName";
1321 TemplateUtils.CreateRow (new LiteralControl (_owner.UserNameLabelText), UserNameLiteral, _owner.LabelStyle, _owner.LabelStyle, twoCells));
1324 Literal QuestionLiteral = new Literal ();
1325 QuestionLiteral.ID = "Question";
1328 TemplateUtils.CreateRow (new LiteralControl (_owner.QuestionLabelText), QuestionLiteral, _owner.LabelStyle, _owner.LabelStyle, twoCells));
1331 TextBox AnswerTextBox = new TextBox ();
1332 AnswerTextBox.ID = "Answer";
1333 AnswerTextBox.ApplyStyle (_owner.TextBoxStyle);
1335 Label AnswerLabel = new Label ();
1336 AnswerLabel.ID = "AnswerLabel";
1337 AnswerLabel.AssociatedControlID = "Answer";
1338 AnswerLabel.Text = _owner.AnswerLabelText;
1339 AnswerLabel.ApplyStyle (_owner.LabelStyle);
1341 RequiredFieldValidator AnswerRequired = new RequiredFieldValidator ();
1342 AnswerRequired.ID = "AnswerRequired";
1343 AnswerRequired.ControlToValidate = "Answer";
1344 AnswerRequired.ErrorMessage = _owner.AnswerRequiredErrorMessage;
1345 AnswerRequired.ToolTip = _owner.AnswerRequiredErrorMessage;
1346 AnswerRequired.Text = "*";
1347 AnswerRequired.ValidationGroup = _owner.ID;
1348 AnswerRequired.ApplyStyle (_owner.ValidatorTextStyle);
1351 TableRow row = TemplateUtils.CreateRow (AnswerLabel, AnswerTextBox, null, null, twoCells);
1352 row.Cells [1].Controls.Add (AnswerRequired);
1353 table.Rows.Add (row);
1356 table.Rows.Add (TemplateUtils.CreateRow (AnswerLabel, null, null, null, twoCells));
1357 TableRow row = TemplateUtils.CreateRow (AnswerTextBox, null, null, null, twoCells);
1358 row.Cells [0].Controls.Add (AnswerRequired);
1359 table.Rows.Add (row);
1363 Literal FailureText = new Literal ();
1364 FailureText.ID = "FailureText";
1365 if (_owner.FailureTextStyle.ForeColor.IsEmpty)
1366 _owner.FailureTextStyle.ForeColor = System.Drawing.Color.Red;
1367 table.Rows.Add (TemplateUtils.CreateRow (FailureText, null, _owner.FailureTextStyle, null, twoCells));
1370 WebControl SubmitButton = null;
1371 switch (_owner.SubmitButtonType) {
1372 case ButtonType.Button:
1373 SubmitButton = new Button ();
1375 case ButtonType.Image:
1376 SubmitButton = new ImageButton ();
1378 case ButtonType.Link:
1379 SubmitButton = new LinkButton ();
1383 SubmitButton.ID = "SubmitButton";
1384 SubmitButton.ApplyStyle (_owner.SubmitButtonStyle);
1385 ((IButtonControl) SubmitButton).CommandName = PasswordRecovery.SubmitButtonCommandName;
1386 ((IButtonControl) SubmitButton).Text = _owner.SubmitButtonText;
1387 ((IButtonControl) SubmitButton).ValidationGroup = _owner.ID;
1389 TableRow buttonRow = TemplateUtils.CreateRow (SubmitButton, null, null, null, twoCells);
1390 buttonRow.Cells [0].HorizontalAlign = HorizontalAlign.Right;
1391 table.Rows.Add (buttonRow);
1395 TemplateUtils.CreateHelpRow (
1396 _owner.HelpPageUrl, _owner.HelpPageText, _owner.HelpPageIconUrl, _owner.HyperLinkStyle, twoCells));
1398 container.Controls.Add (table);
1402 sealed class SuccessDefaultTemplate : ITemplate
1404 readonly PasswordRecovery _owner = null;
1406 public SuccessDefaultTemplate (PasswordRecovery _owner)
1408 this._owner = _owner;
1411 public void InstantiateIn (Control container)
1413 Table table = new Table ();
1414 table.CellPadding = 0;
1416 bool twoCells = _owner.TextLayout == LoginTextLayout.TextOnLeft;
1420 TemplateUtils.CreateRow (new LiteralControl (_owner.SuccessText), null, _owner.SuccessTextStyle, null, twoCells));
1422 container.Controls.Add (table);
1426 enum PasswordReciveryStep