Merge pull request #1222 from LogosBible/uri-trycreate
[mono.git] / mcs / class / System.Web / System.Web.Profile / ProfileModule.cs
1 //
2 // System.Web.UI.WebControls.ProfileModule.cs
3 //
4 // Authors:
5 //      Chris Toshok (toshok@ximian.com)
6 //
7 // (C) 2005 Novell, Inc (http://www.novell.com)
8 //
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:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
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.
27 //
28
29 using System;
30 using System.ComponentModel;
31 using System.Web;
32 using System.Web.Configuration;
33 using System.Text;
34
35 namespace System.Web.Profile
36 {
37         public sealed class ProfileModule : IHttpModule
38         {
39                 static readonly object migrateAnonymousEvent = new object ();
40                 static readonly object personalizeEvent = new object ();
41                 static readonly object profileAutoSavingEvent = new object ();
42                 
43                 HttpApplication app;
44                 ProfileBase profile;
45                 string anonymousCookieName = null;
46
47                 EventHandlerList events = new EventHandlerList ();
48                 
49                 public event ProfileMigrateEventHandler MigrateAnonymous {
50                         add { events.AddHandler (migrateAnonymousEvent, value); }
51                         remove { events.RemoveHandler (migrateAnonymousEvent, value); }
52                 }
53                 
54                 [MonoTODO ("implement event rising")]
55                 public event ProfileEventHandler Personalize {
56                         add { events.AddHandler (personalizeEvent, value); }
57                         remove { events.RemoveHandler (personalizeEvent, value); }
58                 }
59                 
60                 public event ProfileAutoSaveEventHandler ProfileAutoSaving {
61                         add { events.AddHandler (profileAutoSavingEvent, value); }
62                         remove { events.RemoveHandler (profileAutoSavingEvent, value); }
63                 }
64
65                 public ProfileModule ()
66                 {
67                 }
68
69                 public void Dispose ()
70                 {
71                         app.EndRequest -= OnLeave;
72                         app.PostMapRequestHandler -= OnEnter;
73                 }
74
75                 public void Init (HttpApplication app)
76                 {
77                         this.app = app;
78                         app.PostMapRequestHandler += OnEnter;
79                         app.EndRequest += OnLeave;
80                         
81                         AnonymousIdentificationSection anonymousConfig =
82                                 (AnonymousIdentificationSection) WebConfigurationManager.GetSection ("system.web/anonymousIdentification");
83                         
84                         if (anonymousConfig == null)
85                                 return;
86                         
87                         anonymousCookieName = anonymousConfig.CookieName;
88                 }
89                 
90                 void OnEnter (object o, EventArgs eventArgs)
91                 {
92                         if (!ProfileManager.Enabled)
93                                 return;
94                         
95                         if (HttpContext.Current.Request.IsAuthenticated) {
96                                 HttpCookie cookie = app.Request.Cookies [anonymousCookieName];
97                                 if (cookie != null && (cookie.Expires != DateTime.MinValue && cookie.Expires > DateTime.Now)) {
98                                         ProfileMigrateEventHandler eh = events [migrateAnonymousEvent] as ProfileMigrateEventHandler;
99                                         if (eh != null) {
100                                                 ProfileMigrateEventArgs e = new ProfileMigrateEventArgs (HttpContext.Current,
101                                                         Encoding.Unicode.GetString (Convert.FromBase64String (cookie.Value)));
102                                                 eh (this, e);
103                                         }
104                                         
105                                         HttpCookie newCookie = new HttpCookie (anonymousCookieName);
106                                         newCookie.Path = app.Request.ApplicationPath;
107                                         newCookie.Expires = new DateTime (1970, 1, 1);
108                                         newCookie.Value = "";
109                                         app.Response.AppendCookie (newCookie);
110                                 }
111                         }
112                 }
113
114                 void OnLeave (object o, EventArgs eventArgs)
115                 {
116                         if (!ProfileManager.Enabled)
117                                 return;
118                         
119                         if (!app.Context.ProfileInitialized)
120                                 return;
121
122                         if (ProfileManager.AutomaticSaveEnabled) {
123                                 profile = app.Context.Profile;
124                                 
125                                 if (profile == null)
126                                         return;
127
128                                 ProfileAutoSaveEventHandler eh = events [profileAutoSavingEvent] as ProfileAutoSaveEventHandler;
129                                 if (eh != null) {
130                                         ProfileAutoSaveEventArgs args = new ProfileAutoSaveEventArgs (app.Context);
131                                         eh (this, args);
132                                         if (!args.ContinueWithProfileAutoSave)
133                                                 return;
134                                 }
135                                 profile.Save ();
136                         }
137                 }
138         }
139 }