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 Workerbool 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