xref: /aosp_15_r20/external/libchrome/dbus/string_util.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "dbus/string_util.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker namespace dbus {
12*635a8641SAndroid Build Coastguard Worker 
13*635a8641SAndroid Build Coastguard Worker // This implementation is based upon D-Bus Specification Version 0.19.
IsValidObjectPath(const std::string & value)14*635a8641SAndroid Build Coastguard Worker bool IsValidObjectPath(const std::string& value) {
15*635a8641SAndroid Build Coastguard Worker   // A valid object path begins with '/'.
16*635a8641SAndroid Build Coastguard Worker   if (!base::StartsWith(value, "/", base::CompareCase::SENSITIVE))
17*635a8641SAndroid Build Coastguard Worker     return false;
18*635a8641SAndroid Build Coastguard Worker 
19*635a8641SAndroid Build Coastguard Worker   // Elements are pieces delimited by '/'. For instance, "org", "chromium",
20*635a8641SAndroid Build Coastguard Worker   // "Foo" are elements of "/org/chromium/Foo".
21*635a8641SAndroid Build Coastguard Worker   int element_length = 0;
22*635a8641SAndroid Build Coastguard Worker   for (size_t i = 1; i < value.size(); ++i) {
23*635a8641SAndroid Build Coastguard Worker     const char c = value[i];
24*635a8641SAndroid Build Coastguard Worker     if (c == '/') {
25*635a8641SAndroid Build Coastguard Worker       // No element may be the empty string.
26*635a8641SAndroid Build Coastguard Worker       if (element_length == 0)
27*635a8641SAndroid Build Coastguard Worker         return false;
28*635a8641SAndroid Build Coastguard Worker       element_length = 0;
29*635a8641SAndroid Build Coastguard Worker     } else {
30*635a8641SAndroid Build Coastguard Worker       // Each element must only contain "[A-Z][a-z][0-9]_".
31*635a8641SAndroid Build Coastguard Worker       const bool is_valid_character =
32*635a8641SAndroid Build Coastguard Worker           ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') ||
33*635a8641SAndroid Build Coastguard Worker           ('0' <= c && c <= '9') || c == '_';
34*635a8641SAndroid Build Coastguard Worker       if (!is_valid_character)
35*635a8641SAndroid Build Coastguard Worker         return false;
36*635a8641SAndroid Build Coastguard Worker       element_length++;
37*635a8641SAndroid Build Coastguard Worker     }
38*635a8641SAndroid Build Coastguard Worker   }
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker   // A trailing '/' character is not allowed unless the path is the root path.
41*635a8641SAndroid Build Coastguard Worker   if (value.size() > 1 &&
42*635a8641SAndroid Build Coastguard Worker       base::EndsWith(value, "/", base::CompareCase::SENSITIVE))
43*635a8641SAndroid Build Coastguard Worker     return false;
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker   return true;
46*635a8641SAndroid Build Coastguard Worker }
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker }  // namespace dbus
49