//////////////////////////////////////////////////////////////////////////////// /// DISCLAIMER /// /// Copyright 2018 ArangoDB GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is ArangoDB GmbH, Cologne, Germany /// /// @author Frank Celler //////////////////////////////////////////////////////////////////////////////// #include "AttributeMasking.h" #include "Basics/StringUtils.h" #include "Logger/Logger.h" #include "Maskings/RandomStringMask.h" using namespace arangodb; using namespace arangodb::maskings; void arangodb::maskings::InstallMaskings() { AttributeMasking::installMasking("randomString", RandomStringMask::create); } std::unordered_map (*)(Path, Maskings*, VPackSlice const&)> AttributeMasking::_maskings; ParseResult AttributeMasking::parse(Maskings* maskings, VPackSlice const& def) { if (!def.isObject()) { return ParseResult( ParseResult::PARSE_FAILED, "expecting an object for collection definition"); } std::string path = ""; std::string type = ""; for (auto const& entry : VPackObjectIterator(def, false)) { std::string key = entry.key.copyString(); if (key == "type") { if (!entry.value.isString()) { return ParseResult(ParseResult::ILLEGAL_PARAMETER, "type must be a string"); } type = entry.value.copyString(); } else if (key == "path") { if (!entry.value.isString()) { return ParseResult(ParseResult::ILLEGAL_PARAMETER, "path must be a string"); } path = entry.value.copyString(); } } if (path.empty()) { return ParseResult(ParseResult::ILLEGAL_PARAMETER, "path must not be empty"); } ParseResult ap = Path::parse(path); if (ap.status != ParseResult::VALID) { return ParseResult( (ParseResult::StatusCode)(int)ap.status, ap.message); } auto const& it = _maskings.find(type); if (it == _maskings.end()) { return ParseResult( ParseResult::UNKNOWN_TYPE, "unknown attribute masking type '" + type + "'"); } return it->second(ap.result, maskings, def); } bool AttributeMasking::match(std::vector const& path) const { return _path.match(path); }