16235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski/*
26235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * Copyright (C) 2016 The Android Open Source Project
36235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski *
46235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * Licensed under the Apache License, Version 2.0 (the "License");
56235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * you may not use this file except in compliance with the License.
66235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * You may obtain a copy of the License at
76235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski *
86235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski *      http://www.apache.org/licenses/LICENSE-2.0
96235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski *
106235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * Unless required by applicable law or agreed to in writing, software
116235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * distributed under the License is distributed on an "AS IS" BASIS,
126235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * See the License for the specific language governing permissions and
146235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * limitations under the License.
156235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski */
166235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
17c1211c47ae4707ed07a1fda7fd8cf9a66235fe0bAndreas Gampe#include <log/log_id.h>
18c1211c47ae4707ed07a1fda7fd8cf9a66235fe0bAndreas Gampe#include <private/android_logger.h>
19c1211c47ae4707ed07a1fda7fd8cf9a66235fe0bAndreas Gampe
202279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h>
216235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski#include "jni.h"
226235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
232e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe#include "core_jni_helpers.h"
242e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe#include "eventlog_helper.h"
256235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
262e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampenamespace android {
276235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
282e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampeconstexpr char kSecurityLogEventClass[] = "android/app/admin/SecurityLog$SecurityEvent";
292e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampetemplate class EventLogHelper<log_id_t::LOG_ID_SECURITY, kSecurityLogEventClass>;
302e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampeusing SLog = EventLogHelper<log_id_t::LOG_ID_SECURITY, kSecurityLogEventClass>;
316235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
326235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskistatic jboolean android_app_admin_SecurityLog_isLoggingEnabled(JNIEnv* env,
336235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                                    jobject /* clazz */) {
346235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    return (bool)__android_log_security();
356235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}
366235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
376235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskistatic void android_app_admin_SecurityLog_readEvents(JNIEnv* env, jobject /* clazz */,
386235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                             jobject out) {
396235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
406235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    if (out == NULL) {
416235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        jniThrowNullPointerException(env, NULL);
426235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        return;
436235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    }
442e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe    SLog::readEvents(env, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 0, out);
456235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}
466235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
476235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskistatic void android_app_admin_SecurityLog_readEventsSince(JNIEnv* env, jobject /* clazz */,
486235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                             jlong timestamp,
496235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                             jobject out) {
506235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
516235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    if (out == NULL) {
526235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        jniThrowNullPointerException(env, NULL);
536235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        return;
546235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    }
552e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe    SLog::readEvents(env, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, timestamp, out);
566235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}
576235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
586235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskistatic void android_app_admin_SecurityLog_readPreviousEvents(JNIEnv* env, jobject /* clazz */,
596235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                             jobject out) {
606235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
616235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    if (out == NULL) {
626235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        jniThrowNullPointerException(env, NULL);
636235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        return;
646235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    }
652e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe    SLog::readEvents(env, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK | ANDROID_LOG_PSTORE, 0, out);
666235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}
676235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
686235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskistatic void android_app_admin_SecurityLog_readEventsOnWrapping(JNIEnv* env, jobject /* clazz */,
696235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                             jlong timestamp,
706235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski                                             jobject out) {
716235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    if (out == NULL) {
726235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        jniThrowNullPointerException(env, NULL);
736235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski        return;
746235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    }
752e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe    SLog::readEvents(env, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK | ANDROID_LOG_WRAP, timestamp,
762e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe            out);
776235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}
786235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
796235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski/*
806235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski * JNI registration.
816235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski */
826235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskistatic const JNINativeMethod gRegisterMethods[] = {
836235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    /* name, signature, funcPtr */
846235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "isLoggingEnabled",
856235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "()Z",
866235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      (void*) android_app_admin_SecurityLog_isLoggingEnabled
876235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
886235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "writeEvent",
896235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "(ILjava/lang/String;)I",
902e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe      (void*) SLog::writeEventString
916235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
926235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "writeEvent",
936235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "(I[Ljava/lang/Object;)I",
942e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe      (void*) SLog::writeEventArray
956235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
966235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "readEvents",
976235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "(Ljava/util/Collection;)V",
986235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      (void*) android_app_admin_SecurityLog_readEvents
996235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
1006235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "readEventsSince",
1016235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "(JLjava/util/Collection;)V",
1026235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      (void*) android_app_admin_SecurityLog_readEventsSince
1036235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
1046235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "readPreviousEvents",
1056235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "(Ljava/util/Collection;)V",
1066235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      (void*) android_app_admin_SecurityLog_readPreviousEvents
1076235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
1086235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    { "readEventsOnWrapping",
1096235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      "(JLjava/util/Collection;)V",
1106235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski      (void*) android_app_admin_SecurityLog_readEventsOnWrapping
1116235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    },
1126235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski};
1136235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
1146235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinskiint register_android_app_admin_SecurityLog(JNIEnv* env) {
1152e220ef36c680a3615502dfa1051515dd4f095acAndreas Gampe    SLog::Init(env);
1166235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
1176235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski    return RegisterMethodsOrDie(
1186235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski            env,
1196235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski            "android/app/admin/SecurityLog",
1206235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski            gRegisterMethods, NELEM(gRegisterMethods));
1216235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}
1226235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski
1236235a94ffaed1d82cee2317481c18776f601da1bMichal Karpinski}; // namespace android
124