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