merge -r 58784:58785
[mono.git] / mcs / class / System.Web / System.Web.UI / TemplateParser.cs
old mode 100755 (executable)
new mode 100644 (file)
index 55d98c7..8a82aca
@@ -6,8 +6,7 @@
 //     Gonzalo Paniagua Javier (gonzalo@ximian.com)
 //
 // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
-//
-
+// 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
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;
+
 using System.CodeDom.Compiler;
 using System.Collections;
 using System.IO;
 using System.Reflection;
-using System.Web;
+using System.Security.Permissions;
 using System.Web.Compilation;
 using System.Web.Configuration;
 using System.Web.Util;
 
-namespace System.Web.UI
-{
+namespace System.Web.UI {
+
+       // CAS
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        public abstract class TemplateParser : BaseParser
        {
                string inputFile;
@@ -58,6 +60,8 @@ namespace System.Web.UI
                bool debug;
                string compilerOptions;
                string language;
+               bool strictOn = false;
+               bool explicitOn = false;
                bool output_cache;
                int oc_duration;
                string oc_header, oc_custom, oc_param, oc_controls;
@@ -84,7 +88,8 @@ namespace System.Web.UI
                        imports.Add ("System.Web.UI.HtmlControls");
 
                        assemblies = new ArrayList ();
-                       assemblies.AddRange (CompilationConfig.Assemblies);
+                       foreach (string a in CompilationConfig.Assemblies)
+                               AddAssemblyByName (a);
                        if (CompilationConfig.AssembliesInBin)
                                AddAssembliesInBin ();
 
@@ -263,7 +268,7 @@ namespace System.Web.UI
                                        continue;
 
                                if (Path.GetDirectoryName (ass.Location) != PrivateBinPath) {
-                                       AddAssembly (ass, false);
+                                       AddAssembly (ass, true);
                                } else {
                                        seenBin = true;
                                }
@@ -276,6 +281,9 @@ namespace System.Web.UI
                                return null;
 
                        // Load from bin
+                       if (!Directory.Exists (PrivateBinPath))
+                               return null;
+
                        string [] binDlls = Directory.GetFiles (PrivateBinPath, "*.dll");
                        foreach (string s in binDlls) {
                                Assembly binA = Assembly.LoadFrom (s);
@@ -318,9 +326,21 @@ namespace System.Web.UI
                        if (!imports.Contains (namesp))
                                imports.Add (namesp);
                }
-               
+
+               internal virtual void AddSourceDependency (string filename)
+               {
+                       if (dependencies != null && dependencies.Contains (filename)) {
+                               ThrowParseException ("Circular file references are not allowed. File: " + filename);
+                       }
+
+                       AddDependency (filename);
+               }
+
                internal virtual void AddDependency (string filename)
                {
+                       if (filename == "")
+                               return;
+
                        if (dependencies == null)
                                dependencies = new ArrayList ();
 
@@ -330,6 +350,9 @@ namespace System.Web.UI
                
                internal virtual void AddAssembly (Assembly assembly, bool fullPath)
                {
+                       if (assembly.Location == "")
+                               return;
+
                        if (anames == null)
                                anames = new Hashtable ();
 
@@ -364,40 +387,62 @@ namespace System.Web.UI
                                return (Assembly) o;
                        }
 
-                       bool fullpath = false;
                        Assembly assembly = null;
-                       try {
-                               assembly = Assembly.LoadWithPartialName (name);
-                               string loc = assembly.Location;
-                               fullpath = (Path.GetDirectoryName (loc) == PrivateBinPath);
-                       } catch (Exception e) {
-                               ThrowParseException ("Assembly " + name + " not found", e);
+                       Exception error = null;
+                       if (name.IndexOf (',') != -1) {
+                               try {
+                                       assembly = Assembly.Load (name);
+                               } catch (Exception e) { error = e; }
+                       }
+
+                       if (assembly == null) {
+                               try {
+                                       assembly = Assembly.LoadWithPartialName (name);
+                               } catch (Exception e) { error = e; }
                        }
 
-                       AddAssembly (assembly, fullpath);
+                       if (assembly == null)
+                               ThrowParseException ("Assembly " + name + " not found", error);
+
+                       AddAssembly (assembly, true);
                        return assembly;
                }
 
                internal virtual void ProcessMainAttributes (Hashtable atts)
                {
                        atts.Remove ("Description"); // ignored
+#if NET_1_1
                        atts.Remove ("CodeBehind");  // ignored
+#endif
                        atts.Remove ("AspCompat"); // ignored
 
                        debug = GetBool (atts, "Debug", true);
                        compilerOptions = GetString (atts, "CompilerOptions", "");
                        language = GetString (atts, "Language", CompilationConfig.DefaultLanguage);
+                       strictOn = GetBool (atts, "Strict", CompilationConfig.Strict);
+                       explicitOn = GetBool (atts, "Explicit", CompilationConfig.Explicit);
+#if NET_2_0
+                       string src = GetString (atts, "CodeFile", null);
+#else
                        string src = GetString (atts, "Src", null);
+#endif
                        if (src != null)
                                srcAssembly = GetAssemblyFromSource (src);
 
                        string inherits = GetString (atts, "Inherits", null);
+#if NET_2_0
+                       if (srcAssembly == null)
+                               className = inherits;
+                       else
+                               SetBaseType (inherits);
+#else
                        if (inherits != null)
                                SetBaseType (inherits);
 
                        className = GetString (atts, "ClassName", null);
                        if (className != null && !CodeGenerator.IsValidLanguageIndependentIdentifier (className))
                                ThrowParseException (String.Format ("'{0}' is not valid for 'className'", className));
+#endif
 
                        if (atts.Count > 0)
                                ThrowParseException ("Unknown attribute: " + GetOneKey (atts));
@@ -431,7 +476,7 @@ namespace System.Web.UI
                        if (!File.Exists (realPath))
                                ThrowParseException ("File " + vpath + " not found");
 
-                       AddDependency (realPath);
+                       AddSourceDependency (realPath);
 
                        CompilerResults result = CachingCompiler.Compile (language, realPath, realPath, assemblies);
                        if (result.NativeCompilerReturnValue != 0) {
@@ -535,6 +580,7 @@ namespace System.Web.UI
 
                internal ArrayList Dependencies {
                        get { return dependencies; }
+                       set { dependencies = value; }
                }
 
                internal string CompilerOptions {
@@ -545,6 +591,14 @@ namespace System.Web.UI
                        get { return language; }
                }
 
+               internal bool StrictOn {
+                       get { return strictOn; }
+               }
+
+               internal bool ExplicitOn {
+                       get { return explicitOn; }
+               }
+               
                internal bool Debug {
                        get { return debug; }
                }