2008-11-06 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Security / AnonymousIdentificationModule.cs
index 16645fb906fb3b1cce69f20d7f1246c1ddc65a5b..b8e7bfa11a4c4284930441cb4f82ff7e5ba63055 100644 (file)
@@ -3,10 +3,10 @@
 //
 // Authors:
 //     Ben Maurer (bmaurer@users.sourceforge.net)
+//     Chris Toshok (toshok@ximian.com)
 //
 // (C) 2003 Ben Maurer
-//
-
+// Copyright (c) 2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 //
 
 #if NET_2_0
-using System.Collections;
-using System.Collections.Specialized;
+
+using System;
+using System.ComponentModel;
+using System.Web;
+using System.Web.Configuration;
 using System.Text;
 
 namespace System.Web.Security {
+
        public sealed class AnonymousIdentificationModule : IHttpModule {
-               public event AnonymousIdentificationEventHandler OnCreate;
-               public event EventHandler OnRemove;
+               static readonly object creatingEvent = new object ();
                
+               HttpApplication app;
+               EventHandlerList events = new EventHandlerList ();
                
-               [MonoTODO]
+               public event AnonymousIdentificationEventHandler Creating  {
+                       add { events.AddHandler (creatingEvent, value); }
+                       remove { events.RemoveHandler (creatingEvent, value); }
+               }
+
+               public static void ClearAnonymousIdentifier ()
+               {
+                       if (Config == null || !Config.Enabled)
+                               /* XXX The user for the current request is anonymous */
+                               throw new NotSupportedException ();
+               }
+
                public void Dispose ()
                {
-                       throw new NotImplementedException ();
+                       app.PostAuthenticateRequest -= OnEnter;
+                       app = null;
                }
                
-               [MonoTODO]
                public void Init (HttpApplication app)
                {
-                       throw new NotImplementedException ();
+                       this.app = app;
+                       app.PostAuthenticateRequest += OnEnter;
                }
-               
-               [MonoTODO]
+
+               [MonoTODO ("cookieless userid")]
+               void OnEnter (object source, EventArgs eventArgs)
+               {
+                       if (!Enabled)
+                               return;
+
+                       string anonymousID = null;
+
+                       HttpCookie cookie = app.Request.Cookies [Config.CookieName];
+                       if (cookie != null && (cookie.Expires == DateTime.MinValue || cookie.Expires > DateTime.Now)) {
+                               try {
+                                       anonymousID = Encoding.Unicode.GetString (Convert.FromBase64String (cookie.Value));
+                               }
+                               catch { }
+                       }
+
+                       if (anonymousID == null) {
+                               AnonymousIdentificationEventHandler eh = events [creatingEvent] as AnonymousIdentificationEventHandler;
+                               if (eh != null) {
+                                       AnonymousIdentificationEventArgs e = new AnonymousIdentificationEventArgs (HttpContext.Current);
+                                       eh (this, e);
+
+                                       anonymousID = e.AnonymousID;
+                               }
+
+                               if (anonymousID == null)
+                                       anonymousID = Guid.NewGuid ().ToString ();
+
+                               HttpCookie newCookie = new HttpCookie (Config.CookieName);
+                               newCookie.Path = app.Request.ApplicationPath;
+                               newCookie.Expires = DateTime.Now + Config.CookieTimeout;
+                               newCookie.Value = Convert.ToBase64String (Encoding.Unicode.GetBytes (anonymousID));
+                               app.Response.AppendCookie (newCookie);
+                       }
+                       app.Request.AnonymousID = anonymousID;
+               }
+
                public static bool Enabled {
-                       get { throw new NotImplementedException (); }
+                       get {
+                               if (Config == null)
+                                       return false;
+
+                               return Config.Enabled;
+                       }
+               }
+
+#if TARGET_JVM
+               static AnonymousIdentificationSection Config
+               {
+                       get
+                       {
+                               AnonymousIdentificationSection config = (AnonymousIdentificationSection) AppDomain.CurrentDomain.GetData ("Anonymous.Config");
+                               if (config == null) {
+                                       lock (typeof (AnonymousIdentificationModule)) {
+                                               config = (AnonymousIdentificationSection) AppDomain.CurrentDomain.GetData ("Anonymous.Config");
+                                               if (config == null)
+                                                       config = (AnonymousIdentificationSection) WebConfigurationManager.GetSection ("system.web/anonymousIdentification");
+                                               AppDomain.CurrentDomain.SetData ("Anonymous.Config", config);
+                                       }
+                               }
+                               return config;
+                       }
                }
+#else
+               static AnonymousIdentificationSection Config = (AnonymousIdentificationSection) WebConfigurationManager.GetSection ("system.web/anonymousIdentification");
+#endif
        }
 }
 #endif