168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes/*
268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * Copyright 2016 The Android Open Source Project
368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes *
468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * Licensed under the Apache License, Version 2.0 (the "License");
568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * you may not use this file except in compliance with the License.
668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * You may obtain a copy of the License at
768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes *
868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes *      http://www.apache.org/licenses/LICENSE-2.0
968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes *
1068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * Unless required by applicable law or agreed to in writing, software
1168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * distributed under the License is distributed on an "AS IS" BASIS,
1268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * See the License for the specific language governing permissions and
1468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes * limitations under the License.
1568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes */
1668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
1768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <base/at_exit.h>
1868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <base/logging.h>
1968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <base/message_loop/message_loop.h>
2068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <binder/IServiceManager.h>
2168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <binder/Status.h>
2268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <brillo/binder_watcher.h>
2368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <brillo/message_loops/base_message_loop.h>
2468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <brillo/syslog_logging.h>
2568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include <utils/String16.h>
2668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
2768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes#include "android/os/BnPermissionController.h"
2868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
2968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obesnamespace {
3068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obesstatic android::String16 serviceName("permission");
3168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes}
3268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
3368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obesnamespace android {
3468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
3568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obesclass PermissionService : public android::os::BnPermissionController {
3668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes   public:
3768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    ::android::binder::Status checkPermission(
3868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes            const ::android::String16& permission, int32_t pid, int32_t uid,
3968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes            bool* _aidl_return) {
4068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        (void)permission;
4168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        (void)pid;
4268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        (void)uid;
4368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        *_aidl_return = true;
4468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        return binder::Status::ok();
4568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    }
4668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
4768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    ::android::binder::Status getPackagesForUid(
4868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes            int32_t uid, ::std::vector<::android::String16>* _aidl_return) {
4968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        (void)uid;
5068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        // Brillo doesn't currently have installable packages.
5168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        if (_aidl_return) {
5268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes            _aidl_return->clear();
5368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        }
5468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        return binder::Status::ok();
5568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    }
5668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
5768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    ::android::binder::Status isRuntimePermission(
5868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes            const ::android::String16& permission, bool* _aidl_return) {
5968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        (void)permission;
6068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        // Brillo doesn't currently have runtime permissions.
6168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        *_aidl_return = false;
6268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes        return binder::Status::ok();
6368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    }
6468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes};
6568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
6668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes}  // namespace android
6768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
6868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obesint main() {
6968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    base::AtExitManager atExitManager;
7068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    brillo::InitLog(brillo::kLogToSyslog);
7168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    // Register the service with servicemanager.
7268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    android::status_t status = android::defaultServiceManager()->addService(
7368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes            serviceName, new android::PermissionService());
7468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    CHECK(status == android::OK) << "Failed to get IPermissionController "
7568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes                                    "binder from servicemanager.";
7668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
7768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    // Create a message loop.
7868aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    base::MessageLoopForIO messageLoopForIo;
7968aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    brillo::BaseMessageLoop messageLoop{&messageLoopForIo};
8068aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
8168aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    // Initialize a binder watcher.
8268aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    brillo::BinderWatcher watcher(&messageLoop);
8368aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    watcher.Init();
8468aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes
8568aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    // Run the message loop.
8668aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes    messageLoop.Run();
8768aac7f5ba92ebfe409714c611e488cf81c2bca7Jorge Lucangeli Obes}
88