e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
175 lines
5.6 KiB
C#
175 lines
5.6 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="UrlPath.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Configuration {
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.Configuration;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security.Permissions;
|
|
using System.Security;
|
|
using System.Text;
|
|
using System.Xml;
|
|
using Microsoft.Win32;
|
|
|
|
static internal class UrlPath {
|
|
|
|
internal static string GetDirectoryOrRootName(string path) {
|
|
string dir;
|
|
|
|
dir = Path.GetDirectoryName(path);
|
|
if (dir == null) {
|
|
// dir == null if path = "c:\"
|
|
dir = Path.GetPathRoot(path);
|
|
}
|
|
|
|
return dir;
|
|
}
|
|
|
|
//
|
|
// Determine if subdir is equal to or a subdirectory of dir.
|
|
// For example, c:\mydir\subdir is a subdirectory of c:\mydir
|
|
// Account for optional trailing backslashes.
|
|
//
|
|
internal static bool IsEqualOrSubdirectory(string dir, string subdir) {
|
|
if (String.IsNullOrEmpty(dir))
|
|
return true;
|
|
|
|
if (String.IsNullOrEmpty(subdir))
|
|
return false;
|
|
|
|
//
|
|
// Compare up to but not including trailing backslash
|
|
//
|
|
int lDir = dir.Length;
|
|
if (dir[lDir - 1] == '\\') {
|
|
lDir -= 1;
|
|
}
|
|
|
|
int lSubdir = subdir.Length;
|
|
if (subdir[lSubdir - 1] == '\\') {
|
|
lSubdir -= 1;
|
|
}
|
|
|
|
if (lSubdir < lDir)
|
|
return false;
|
|
|
|
if (String.Compare(dir, 0, subdir, 0, lDir, StringComparison.OrdinalIgnoreCase) != 0)
|
|
return false;
|
|
|
|
// Check subdir that character following length of dir is a backslash
|
|
if (lSubdir > lDir && subdir[lDir] != '\\')
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
//
|
|
// NOTE: This function is also present in fx\src\xsp\system\web\util\urlpath.cs
|
|
// Please propagate any changes to that file.
|
|
//
|
|
// Determine if subpath is equal to or a subpath of path.
|
|
// For example, /myapp/foo.aspx is a subpath of /myapp
|
|
// Account for optional trailing slashes.
|
|
//
|
|
internal static bool IsEqualOrSubpath(string path, string subpath) {
|
|
return IsEqualOrSubpathImpl(path, subpath, false);
|
|
}
|
|
|
|
|
|
//
|
|
// Determine if subpath is a subpath of path, but return
|
|
// false if subpath & path are the same.
|
|
// For example, /myapp/foo.aspx is a subpath of /myapp
|
|
// Account for optional trailing slashes.
|
|
//
|
|
internal static bool IsSubpath(string path, string subpath) {
|
|
return IsEqualOrSubpathImpl(path, subpath, true);
|
|
}
|
|
|
|
private static bool IsEqualOrSubpathImpl(string path, string subpath, bool excludeEqual) {
|
|
if (String.IsNullOrEmpty(path))
|
|
return true;
|
|
|
|
if (String.IsNullOrEmpty(subpath))
|
|
return false;
|
|
|
|
//
|
|
// Compare up to but not including trailing slash
|
|
//
|
|
int lPath = path.Length;
|
|
if (path[lPath - 1] == '/') {
|
|
lPath -= 1;
|
|
}
|
|
|
|
int lSubpath = subpath.Length;
|
|
if (subpath[lSubpath - 1] == '/') {
|
|
lSubpath -= 1;
|
|
}
|
|
|
|
if (lSubpath < lPath)
|
|
return false;
|
|
|
|
if (excludeEqual && lSubpath == lPath)
|
|
return false;
|
|
|
|
if (String.Compare(path, 0, subpath, 0, lPath, StringComparison.OrdinalIgnoreCase) != 0)
|
|
return false;
|
|
|
|
// Check subpath that character following length of path is a slash
|
|
if (lSubpath > lPath && subpath[lPath] != '/')
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
private static bool IsDirectorySeparatorChar(char ch) {
|
|
return (ch == '\\' || ch == '/');
|
|
}
|
|
|
|
private static bool IsAbsoluteLocalPhysicalPath(string path) {
|
|
if (path == null || path.Length < 3)
|
|
return false;
|
|
|
|
// e.g c:\foo
|
|
return (path[1] == ':' && IsDirectorySeparatorChar(path[2]));
|
|
}
|
|
|
|
private static bool IsAbsoluteUNCPhysicalPath(string path) {
|
|
if (path == null || path.Length < 3)
|
|
return false;
|
|
|
|
// e.g \\server\share\foo or //server/share/foo
|
|
return (IsDirectorySeparatorChar(path[0]) && IsDirectorySeparatorChar(path[1]));
|
|
}
|
|
|
|
const string FILE_URL_LOCAL = "file:///";
|
|
const string FILE_URL_UNC = "file:";
|
|
|
|
internal static string ConvertFileNameToUrl(string fileName) {
|
|
string prefix;
|
|
|
|
if (IsAbsoluteLocalPhysicalPath(fileName)) {
|
|
prefix = FILE_URL_LOCAL;
|
|
}
|
|
else if (IsAbsoluteUNCPhysicalPath(fileName)) {
|
|
prefix = FILE_URL_UNC;
|
|
}
|
|
else {
|
|
// We should never get here, but if we do we are likely to have
|
|
// serious security problems, so throw an exception rather than simply
|
|
// asserting.
|
|
throw ExceptionUtil.ParameterInvalid("filename");
|
|
}
|
|
|
|
string newFileName = prefix + fileName.Replace('\\', '/');
|
|
return newFileName;
|
|
}
|
|
}
|
|
}
|