2008-11-06 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Security / MembershipProvider.cs
index 8cccd9a214de182bb12cd14bee30e3bd66e2db7a..812890ab3adc6668ed9a4d8beaeaeb48deb78b66 100644 (file)
@@ -29,6 +29,7 @@
 //
 
 #if NET_2_0
+using System.ComponentModel;
 using System.Configuration.Provider;
 using System.Web.Configuration;
 using System.Security.Cryptography;
@@ -38,6 +39,14 @@ namespace System.Web.Security
 {
        public abstract class MembershipProvider : ProviderBase
        {
+               static readonly object validatingPasswordEvent = new object ();
+
+               EventHandlerList events = new EventHandlerList ();
+               public event MembershipValidatePasswordEventHandler ValidatingPassword {
+                       add { events.AddHandler (validatingPasswordEvent, value); }
+                       remove { events.RemoveHandler (validatingPasswordEvent, value); }
+               }
+               
                protected MembershipProvider ()
                {
                }
@@ -73,8 +82,9 @@ namespace System.Web.Security
                
                protected virtual void OnValidatingPassword (ValidatePasswordEventArgs args)
                {
-                       if (ValidatingPassword != null)
-                               ValidatingPassword (this, args);
+                       MembershipValidatePasswordEventHandler eh = events [validatingPasswordEvent] as MembershipValidatePasswordEventHandler;
+                       if (eh != null)
+                               eh (this, args);
                }
 
                SymmetricAlgorithm GetAlg (out byte [] decryptionKey)
@@ -96,7 +106,7 @@ namespace System.Web.Security
                        else
                                throw new ProviderException (String.Format ("Unsupported decryption attribute '{0}' in <machineKey> configuration section", alg_type));
 
-                       decryptionKey = section.DecryptionKey192Bits;
+                       decryptionKey = MachineKeySectionUtils.DecryptionKey192Bits (section);
                        return alg;
                }
 
@@ -124,8 +134,7 @@ namespace System.Web.Security
                        byte [] decryptionKey;
                        byte [] iv = new byte [SALT_BYTES];
 
-                       Array.Copy (password, 0, iv, 0, SALT_BYTES);
-                       Array.Clear (password, 0, SALT_BYTES);
+                       Array.Copy (password, 0, iv, 0, Math.Min(password.Length, SALT_BYTES));
 
                        using (SymmetricAlgorithm alg = GetAlg (out decryptionKey)) {
                                using (ICryptoTransform encryptor = alg.CreateEncryptor (decryptionKey, iv)) {
@@ -133,9 +142,8 @@ namespace System.Web.Security
                                }
                        }
                }
-
-               public event MembershipValidatePasswordEventHandler ValidatingPassword;
        }
 }
 #endif
 
+