1*33f37583SAndroid Build Coastguard Worker /* 2*33f37583SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*33f37583SAndroid Build Coastguard Worker * 4*33f37583SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*33f37583SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*33f37583SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*33f37583SAndroid Build Coastguard Worker * 8*33f37583SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*33f37583SAndroid Build Coastguard Worker * 10*33f37583SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*33f37583SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*33f37583SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*33f37583SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*33f37583SAndroid Build Coastguard Worker * limitations under the License. 15*33f37583SAndroid Build Coastguard Worker */ 16*33f37583SAndroid Build Coastguard Worker 17*33f37583SAndroid Build Coastguard Worker #include "apex_blocklist.h" 18*33f37583SAndroid Build Coastguard Worker 19*33f37583SAndroid Build Coastguard Worker #include <android-base/file.h> 20*33f37583SAndroid Build Coastguard Worker #include <google/protobuf/util/json_util.h> 21*33f37583SAndroid Build Coastguard Worker 22*33f37583SAndroid Build Coastguard Worker #include <memory> 23*33f37583SAndroid Build Coastguard Worker #include <string> 24*33f37583SAndroid Build Coastguard Worker 25*33f37583SAndroid Build Coastguard Worker using android::base::Error; 26*33f37583SAndroid Build Coastguard Worker using android::base::Result; 27*33f37583SAndroid Build Coastguard Worker using ::apex::proto::ApexBlocklist; 28*33f37583SAndroid Build Coastguard Worker 29*33f37583SAndroid Build Coastguard Worker namespace android::apex { 30*33f37583SAndroid Build Coastguard Worker ParseBlocklist(const std::string & content)31*33f37583SAndroid Build Coastguard WorkerResult<ApexBlocklist> ParseBlocklist(const std::string& content) { 32*33f37583SAndroid Build Coastguard Worker ApexBlocklist apex_blocklist; 33*33f37583SAndroid Build Coastguard Worker google::protobuf::util::JsonParseOptions options; 34*33f37583SAndroid Build Coastguard Worker options.ignore_unknown_fields = true; 35*33f37583SAndroid Build Coastguard Worker auto parse_result = google::protobuf::util::JsonStringToMessage( 36*33f37583SAndroid Build Coastguard Worker content, &apex_blocklist, options); 37*33f37583SAndroid Build Coastguard Worker if (!parse_result.ok()) { 38*33f37583SAndroid Build Coastguard Worker return Error() << "Can't parse APEX blocklist: " << parse_result.message(); 39*33f37583SAndroid Build Coastguard Worker } 40*33f37583SAndroid Build Coastguard Worker 41*33f37583SAndroid Build Coastguard Worker for (const auto& apex : apex_blocklist.blocked_apex()) { 42*33f37583SAndroid Build Coastguard Worker // Verifying required fields. 43*33f37583SAndroid Build Coastguard Worker // name 44*33f37583SAndroid Build Coastguard Worker if (apex.name().empty()) { 45*33f37583SAndroid Build Coastguard Worker return Error() << "Missing required field \"name\" from APEX blocklist."; 46*33f37583SAndroid Build Coastguard Worker } 47*33f37583SAndroid Build Coastguard Worker 48*33f37583SAndroid Build Coastguard Worker // version 49*33f37583SAndroid Build Coastguard Worker if (apex.version() <= 0) { 50*33f37583SAndroid Build Coastguard Worker return Error() << "Missing positive value for field \"version\" " 51*33f37583SAndroid Build Coastguard Worker "from APEX blocklist."; 52*33f37583SAndroid Build Coastguard Worker } 53*33f37583SAndroid Build Coastguard Worker } 54*33f37583SAndroid Build Coastguard Worker 55*33f37583SAndroid Build Coastguard Worker return apex_blocklist; 56*33f37583SAndroid Build Coastguard Worker } 57*33f37583SAndroid Build Coastguard Worker ReadBlocklist(const std::string & path)58*33f37583SAndroid Build Coastguard WorkerResult<ApexBlocklist> ReadBlocklist(const std::string& path) { 59*33f37583SAndroid Build Coastguard Worker std::string content; 60*33f37583SAndroid Build Coastguard Worker if (!android::base::ReadFileToString(path, &content)) { 61*33f37583SAndroid Build Coastguard Worker return Error() << "Failed to read blocklist file: " << path; 62*33f37583SAndroid Build Coastguard Worker } 63*33f37583SAndroid Build Coastguard Worker return ParseBlocklist(content); 64*33f37583SAndroid Build Coastguard Worker } 65*33f37583SAndroid Build Coastguard Worker 66*33f37583SAndroid Build Coastguard Worker } // namespace android::apex 67