You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // <copyright file="ConfigPathUtility.cs" company="Microsoft">
 | |
| //     Copyright (c) Microsoft Corporation.  All rights reserved.
 | |
| // </copyright>
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| namespace System.Configuration {
 | |
| 
 | |
| #if CONFIGPATHUTILITY_SYSTEMWEB
 | |
|     using Debug=System.Web.Util.Debug;
 | |
| #endif
 | |
| 
 | |
|     internal static class ConfigPathUtility {
 | |
|         private const char SeparatorChar = '/';
 | |
| 
 | |
|         //
 | |
|         // A configPath is valid if
 | |
|         //  * It does not start or end with a '/'
 | |
|         //  * It is not null or empty, except in the case of the root configuration record
 | |
|         //  * It does not contain '\'
 | |
|         //  * It does not contain a path component equal to "." or ".."
 | |
|         //
 | |
|         // The checks for '\', ".", and ".." are not strictly necessary, but their presence
 | |
|         // could lead to problems for configuration hosts.
 | |
|         // 
 | |
|         static internal bool IsValid(string configPath) {
 | |
|             if (String.IsNullOrEmpty(configPath)) {
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             int start = -1;
 | |
|             for (int examine = 0; examine <= configPath.Length; examine++) {
 | |
|                 char ch;
 | |
| 
 | |
|                 if (examine < configPath.Length) {
 | |
|                     ch = configPath[examine];
 | |
|                 }
 | |
|                 else {
 | |
|                     ch = SeparatorChar;
 | |
|                 }
 | |
| 
 | |
|                 // backslash disallowed
 | |
|                 if (ch == '\\') {
 | |
|                     return false;
 | |
|                 }
 | |
| 
 | |
|                 if (ch == SeparatorChar) {
 | |
|                     // double slash disallowed
 | |
|                     // note this check also purposefully catches starting and ending slash
 | |
|                     if (examine == start + 1) {
 | |
|                         return false;
 | |
|                     }
 | |
| 
 | |
|                     // "." disallowed
 | |
|                     if (examine == start + 2 && configPath[start + 1] == '.') {
 | |
|                         return false;
 | |
|                     }
 | |
| 
 | |
|                     // ".." disallowed
 | |
|                     if (examine == start + 3 && configPath[start + 1] == '.' && configPath[start + 2] == '.') {
 | |
|                         return false;
 | |
|                     }
 | |
| 
 | |
|                     start = examine;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
| #if !CONFIGPATHUTILITY_SYSTEMWEB
 | |
|         static internal string Combine(string parentConfigPath, string childConfigPath) {
 | |
|             Debug.Assert(String.IsNullOrEmpty(parentConfigPath) || IsValid(parentConfigPath), "String.IsNullOrEmpty(parentConfigPath) || IsValid(parentConfigPath)");
 | |
|             Debug.Assert(String.IsNullOrEmpty(childConfigPath) || IsValid(childConfigPath), "String.IsNullOrEmpty(childConfigPath) || IsValid(childConfigPath)");
 | |
| 
 | |
|             if (String.IsNullOrEmpty(parentConfigPath)) {
 | |
|                 return childConfigPath;
 | |
|             }
 | |
| 
 | |
|             if (String.IsNullOrEmpty(childConfigPath)) {
 | |
|                 return parentConfigPath;
 | |
|             }
 | |
| 
 | |
|             return parentConfigPath + "/" + childConfigPath;
 | |
|         }
 | |
| 
 | |
|         static internal string[] GetParts(string configPath) {
 | |
|             Debug.Assert(IsValid(configPath), "IsValid(configPath)");
 | |
| 
 | |
|             string[] parts = configPath.Split(SeparatorChar);
 | |
|             return parts;
 | |
|         }
 | |
| 
 | |
|         //
 | |
|         // Return the last part of a config path, e.g.
 | |
|         //   GetName("MACHINE/WEBROOT/Default Web Site/app") == "app"
 | |
|         //
 | |
|         static internal string GetName(string configPath) {
 | |
|             Debug.Assert(String.IsNullOrEmpty(configPath) || IsValid(configPath), "String.IsNullOrEmpty(configPath) || IsValid(configPath)");
 | |
| 
 | |
|             if (String.IsNullOrEmpty(configPath)) {
 | |
|                 return configPath;
 | |
|             }
 | |
| 
 | |
|             int index = configPath.LastIndexOf('/');
 | |
|             if (index == -1) {
 | |
|                 return configPath;
 | |
|             }
 | |
| 
 | |
|             Debug.Assert(index != configPath.Length - 1);
 | |
|             return configPath.Substring(index + 1);
 | |
|         }
 | |
| #endif
 | |
| 
 | |
| // Avoid unused code warning in System.Configuration by including functions in assembly-specific #defines
 | |
| #if CONFIGPATHUTILITY_SYSTEMWEB
 | |
|         static internal string GetParent(string configPath) {
 | |
|             Debug.Assert(String.IsNullOrEmpty(configPath) || IsValid(configPath), "String.IsNullOrEmpty(configPath) || IsValid(configPath)");
 | |
| 
 | |
|             if (String.IsNullOrEmpty(configPath)) {
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             string parentConfigPath;
 | |
|             int lastSlash = configPath.LastIndexOf(SeparatorChar);
 | |
|             if (lastSlash == -1) {
 | |
|                 parentConfigPath = null;
 | |
|             }
 | |
|             else {
 | |
|                 parentConfigPath = configPath.Substring(0, lastSlash);
 | |
|             }
 | |
| 
 | |
|             return parentConfigPath;
 | |
|         }
 | |
| #endif
 | |
|     }
 | |
| }
 |