1 //------------------------------------------------------------------------------
2 // <copyright file="DataConnectionError.cs" company="Microsoft">
3 //     Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 //------------------------------------------------------------------------------
6 
7 using System;
8 using System.Web.UI;
9 [assembly:WebResource("add_permissions_for_users.gif", "image/gif")]
10 [assembly:WebResource("properties_security_tab_w_user.gif", "image/gif")]
11 [assembly:WebResource("properties_security_tab.gif", "image/gif")]
12 
13 namespace System.Web.DataAccess
14 {
15     using System;
16     using System.Web;
17     using System.Globalization;
18     using System.Collections;
19     using System.Collections.Specialized;
20     using System.Data;
21     using System.Data.OleDb;
22     using System.IO;
23     using System.Threading;
24     using System.Configuration;
25     using System.Web.Util;
26     using System.Security.Permissions;
27     using System.Web.Hosting;
28     using System.Security.Principal;
29     using System.Web.UI;
30     using System.Web.Handlers;
31     using System.Web.Configuration;
32     using System.Diagnostics;
33     using System.Text;
34 
35     //////////////////////////////////////////////////////////////////////////////////
36     //////////////////////////////////////////////////////////////////////////////////
37     internal enum DataConnectionErrorEnum
38     {
39         CanNotCreateDataDir,
40         CanNotWriteToDataDir,
41         CanNotWriteToDBFile
42     }
43 
44     internal static class DataConnectionHelper
45     {
GetCurrentName()46         internal static string GetCurrentName()
47         {
48             string userName = "NETWORK SERVICE";
49             string domainName = "NT AUTHORITY";
50 
51             IntPtr pSid = IntPtr.Zero;
52 
53             try
54             {
55                 if( UnsafeNativeMethods.ConvertStringSidToSid( "S-1-5-20", out pSid ) != 0 &&
56                     pSid != IntPtr.Zero )
57                 {
58                     int userNameLen = 256;
59                     int domainNameLen = 256;
60                     int sidNameUse = 0;
61                     StringBuilder bufUserName = new StringBuilder( userNameLen );
62                     StringBuilder bufDomainName = new StringBuilder( domainNameLen );
63                     if( 0 != UnsafeNativeMethods.LookupAccountSid( null,
64                                                                    pSid,
65                                                                    bufUserName,
66                                                                    ref userNameLen,
67                                                                    bufDomainName,
68                                                                    ref domainNameLen,
69                                                                    ref sidNameUse ) )
70                     {
71                         userName = bufUserName.ToString();
72                         domainName = bufDomainName.ToString();
73                     }
74                 }
75 
76                 WindowsIdentity id = WindowsIdentity.GetCurrent();
77                 if( id != null && id.Name != null )
78                 {
79                     if ( string.Compare( id.Name,
80                                          domainName + @"\" + userName,
81                                          StringComparison.OrdinalIgnoreCase ) == 0 )
82                     {
83                         return userName;
84                     }
85 
86                     return id.Name;
87                 }
88             }
89             catch {}
90             finally
91             {
92                 if( pSid != IntPtr.Zero )
93                 {
94                     UnsafeNativeMethods.LocalFree( pSid );
95                 }
96             }
97 
98             return String.Empty;
99         }
100 
101     }
102 
103     internal class DataConnectionErrorFormatter : ErrorFormatter
104     {
105         protected static NameValueCollection s_errMessages = new NameValueCollection();
106         protected static object s_Lock = new object ();
107         protected string _UserName;
108         protected DataConnectionErrorEnum _Error;
109 
110         protected override string ErrorTitle
111         {
112             get { return null; }
113         }
114 
115         protected override string Description
116         {
117             get { return null; }
118         }
119 
120         protected override string MiscSectionTitle
121         {
122             get
123             {
124                 return SR.GetString(SR.DataAccessError_MiscSectionTitle) ;
125             }
126         }
127 
128         protected override string MiscSectionContent
129         {
130             get
131             {
132                 string url;
133                 int currentNumber = 1;
134                 string resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_1);
135                 string miscContent = "<ol>\n<li>" + resourceString + "</li>\n";
136 
137                 switch (_Error)
138                 {
139                     case DataConnectionErrorEnum.CanNotCreateDataDir:
140                         resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_2_CanNotCreateDataDir);
141                         miscContent += "<li>" + resourceString + "</li>\n";
142 
143                         resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_2);
144                         miscContent += "<li>" + resourceString + "</li>\n";
145                         break;
146 
147                     case DataConnectionErrorEnum.CanNotWriteToDataDir:
148                         resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_2);
149                         miscContent += "<li>" + resourceString + "</li>\n";
150                         break;
151 
152                     case DataConnectionErrorEnum.CanNotWriteToDBFile:
153                         resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_2_CanNotWriteToDBFile_a);
154                         miscContent += "<li>" + resourceString + "</li>\n";
155 
156                         resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_2_CanNotWriteToDBFile_b);
157                         miscContent += "<li>" + resourceString + "</li>\n";
158                         break;
159                 }
160                 resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_3);
161                 miscContent += "<li>" + resourceString + "<br></li>\n";
162 
163                 url = AssemblyResourceLoader.GetWebResourceUrl(typeof(Page), "properties_security_tab.gif", true);
164                 miscContent += "<br><br><IMG SRC=\"" + url + "\"><br><br><br>";
165 
166                 resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_ClickAdd);
167                 miscContent += "<li>" + resourceString + "</li>\n";
168 
169                 url = AssemblyResourceLoader.GetWebResourceUrl(typeof(Page), "add_permissions_for_users.gif", true);
170                 miscContent += "<br><br><IMG SRC=\"" + url + "\"><br><br>";
171 
172                 string four;
173                 if (!String.IsNullOrEmpty(_UserName))
174                     four = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_4, _UserName);
175                 else
176                     four = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_4_2);
177                 miscContent += "<li>" + four + "</li>\n";
178 
179                 resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_ClickOK);
180                 miscContent += "<li>" + resourceString + "</li>\n";
181 
182                 resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_5);
183                 miscContent += "<li>" + resourceString + "</li>\n";
184 
185                 url = AssemblyResourceLoader.GetWebResourceUrl(typeof(Page), "properties_security_tab_w_user.gif", true);
186                 miscContent += "<br><br><IMG SRC=\"" + url + "\"><br><br>";
187 
188                 resourceString = GetResourceStringAndSetAdaptiveNumberedText(ref currentNumber, SR.DataAccessError_MiscSection_ClickOK);
189                 miscContent += "<li>" + resourceString + "</li>\n";
190                 return miscContent;
191             }
192         }
193 
194         protected override string ColoredSquareTitle
195         {
196             get { return null; }
197         }
198 
199         protected override string ColoredSquareContent
200         {
201             get { return null; }
202         }
203 
204         protected override bool ShowSourceFileInfo
205         {
206             get { return false; }
207         }
208 
GetResourceStringAndSetAdaptiveNumberedText(ref int currentNumber, string resourceId)209         private string GetResourceStringAndSetAdaptiveNumberedText(ref int currentNumber, string resourceId) {
210             string resourceString = SR.GetString(resourceId);
211             SetAdaptiveNumberedText(ref currentNumber, resourceString);
212             return resourceString;
213         }
214 
GetResourceStringAndSetAdaptiveNumberedText(ref int currentNumber, string resourceId, string parameter1)215         private string GetResourceStringAndSetAdaptiveNumberedText(ref int currentNumber, string resourceId, string parameter1) {
216             string resourceString = SR.GetString(resourceId, parameter1);
217             SetAdaptiveNumberedText(ref currentNumber, resourceString);
218             return resourceString;
219         }
220 
SetAdaptiveNumberedText(ref int currentNumber, string resourceString)221         private void SetAdaptiveNumberedText(ref int currentNumber, string resourceString) {
222             string adaptiveText = currentNumber.ToString(CultureInfo.InvariantCulture) + " " + resourceString;
223             AdaptiveMiscContent.Add(adaptiveText);
224             currentNumber += 1;
225         }
226     }
227 
228     internal sealed class SqlExpressConnectionErrorFormatter : DataConnectionErrorFormatter
229     {
SqlExpressConnectionErrorFormatter(DataConnectionErrorEnum error)230         internal SqlExpressConnectionErrorFormatter(DataConnectionErrorEnum error)
231         {
232             _UserName = (HttpRuntime.HasUnmanagedPermission() ? DataConnectionHelper.GetCurrentName() : String.Empty);
233             _Error = error;
234         }
235 
SqlExpressConnectionErrorFormatter(string userName, DataConnectionErrorEnum error)236         internal SqlExpressConnectionErrorFormatter(string userName, DataConnectionErrorEnum error)
237         {
238             _UserName = userName;
239             _Error = error;
240         }
241 
242         protected override string ErrorTitle
243         {
244             get
245             {
246                 string resourceKey = null;
247 
248                 switch ( _Error )
249                 {
250                     case DataConnectionErrorEnum.CanNotCreateDataDir:
251                         resourceKey = SR.DataAccessError_CanNotCreateDataDir_Title;
252                         break;
253 
254                     case DataConnectionErrorEnum.CanNotWriteToDataDir:
255                         resourceKey = SR.SqlExpressError_CanNotWriteToDataDir_Title;
256                         break;
257 
258                     case DataConnectionErrorEnum.CanNotWriteToDBFile:
259                         resourceKey = SR.SqlExpressError_CanNotWriteToDbfFile_Title;
260                         break;
261                 }
262                 return SR.GetString (resourceKey);
263             }
264         }
265 
266         protected override string Description
267         {
268             get
269             {
270                 string resourceKey1 = null;
271                 string resourceKey2 = null;
272 
273                 switch (_Error)
274                 {
275                     case DataConnectionErrorEnum.CanNotCreateDataDir:
276                         resourceKey1 = SR.DataAccessError_CanNotCreateDataDir_Description;
277                         resourceKey2 = SR.DataAccessError_CanNotCreateDataDir_Description_2;
278                         break;
279 
280                     case DataConnectionErrorEnum.CanNotWriteToDataDir:
281                         resourceKey1 = SR.SqlExpressError_CanNotWriteToDataDir_Description;
282                         resourceKey2 = SR.SqlExpressError_CanNotWriteToDataDir_Description_2;
283                         break;
284 
285                     case DataConnectionErrorEnum.CanNotWriteToDBFile:
286                         resourceKey1 = SR.SqlExpressError_CanNotWriteToDbfFile_Description;
287                         resourceKey2 = SR.SqlExpressError_CanNotWriteToDbfFile_Description_2;
288                         break;
289                 }
290                 string desc;
291                 if (!String.IsNullOrEmpty(_UserName))
292                     desc = SR.GetString (resourceKey1, _UserName);
293                 else
294                     desc = SR.GetString (resourceKey2);
295                 desc += " " + SR.GetString(SR.SqlExpressError_Description_1);
296                 return desc;
297             }
298         }
299     }
300 
301     internal sealed class SqlExpressDBFileAutoCreationErrorFormatter : UnhandledErrorFormatter
302     {
303         static string s_errMessage = null;
304         static object s_Lock = new object();
305 
SqlExpressDBFileAutoCreationErrorFormatter( Exception exception )306         internal SqlExpressDBFileAutoCreationErrorFormatter( Exception exception ) : base( exception )
307         {
308         }
309         protected override string MiscSectionTitle
310         {
311             get
312             {
313                 return SR.GetString(SR.SqlExpress_MDF_File_Auto_Creation_MiscSectionTitle) ;
314             }
315         }
316 
317         protected override string MiscSectionContent
318         {
319             get
320             {
321                 return CustomErrorMessage;
322             }
323         }
324 
325         internal static string CustomErrorMessage
326         {
327             get
328             {
329                 if( s_errMessage == null )
330                 {
331                     lock( s_Lock )
332                     {
333                         if( s_errMessage == null )
334                         {
335                             string resourceString;
336 
337                             resourceString = SR.GetString(SR.SqlExpress_MDF_File_Auto_Creation) ;
338                             s_errMessage += "<br><br><p>" + resourceString + "<br></p>\n";
339 
340                             s_errMessage += "<ol>\n";
341 
342                             resourceString = SR.GetString(SR.SqlExpress_MDF_File_Auto_Creation_1) ;
343                             s_errMessage += "<li>" + resourceString + "</li>\n";
344                             resourceString = SR.GetString(SR.SqlExpress_MDF_File_Auto_Creation_2) ;
345                             s_errMessage += "<li>" + resourceString + "</li>\n";
346                             resourceString = SR.GetString(SR.SqlExpress_MDF_File_Auto_Creation_3) ;
347                             s_errMessage += "<li>" + resourceString + "</li>\n";
348                             resourceString = SR.GetString(SR.SqlExpress_MDF_File_Auto_Creation_4) ;
349                             s_errMessage += "<li>" + resourceString + "</li>\n";
350                             s_errMessage += "</ol>\n";
351                         }
352                     }
353                 }
354 
355                 return s_errMessage;
356             }
357         }
358     }
359 }
360