Home | History | Annotate | Download | only in dbus
      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.
     14 bool 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