File: ConfigPathUtility.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (137 lines) | stat: -rw-r--r-- 4,882 bytes parent folder | download | duplicates (14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//------------------------------------------------------------------------------
// <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
    }
}