blob: d8eb6c962da5058c33160213ac8e6af64ade58b8 [file] [log] [blame]
// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// 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.
#include "starboard/android/shared/cobalt/android_user_authorizer.h"
#include "base/time/time.h"
#include "starboard/android/shared/jni_env_ext.h"
#include "starboard/android/shared/jni_utils.h"
#include "starboard/common/log.h"
// We're in starboard source, but compiled with Cobalt.
#define STARBOARD_IMPLEMENTATION
#include "starboard/shared/nouser/user_internal.h"
#undef STARBOARD_IMPLEMENTATION
namespace starboard {
namespace android {
namespace shared {
namespace cobalt {
AndroidUserAuthorizer::AndroidUserAuthorizer() : shutdown_(false) {
JniEnvExt* env = JniEnvExt::Get();
jobject local_ref = env->CallStarboardObjectMethodOrAbort(
"getUserAuthorizer", "()Ldev/cobalt/account/UserAuthorizer;");
j_user_authorizer_ = env->ConvertLocalRefToGlobalRef(local_ref);
}
AndroidUserAuthorizer::~AndroidUserAuthorizer() {
JniEnvExt* env = JniEnvExt::Get();
env->DeleteGlobalRef(j_user_authorizer_);
}
void AndroidUserAuthorizer::Shutdown() {
shutdown_ = true;
JniEnvExt* env = JniEnvExt::Get();
env->CallVoidMethodOrAbort(j_user_authorizer_, "interrupt", "()V");
}
std::unique_ptr<AccessToken> AndroidUserAuthorizer::AuthorizeUser(SbUser user) {
SB_DCHECK(user == &::starboard::shared::nouser::g_user);
if (shutdown_) {
DLOG(WARNING) << "No-op AuthorizeUser after shutdown";
return std::unique_ptr<AccessToken>();
}
JniEnvExt* env = JniEnvExt::Get();
ScopedLocalJavaRef<jobject> j_token(
env->CallObjectMethodOrAbort(j_user_authorizer_, "authorizeUser",
"()Ldev/cobalt/account/AccessToken;"));
return CreateAccessToken(j_token.Get());
}
bool AndroidUserAuthorizer::DeauthorizeUser(SbUser user) {
SB_DCHECK(user == &::starboard::shared::nouser::g_user);
if (shutdown_) {
DLOG(WARNING) << "No-op DeauthorizeUser after shutdown";
return false;
}
JniEnvExt* env = JniEnvExt::Get();
return env->CallBooleanMethodOrAbort(j_user_authorizer_, "deauthorizeUser",
"()Z");
}
std::unique_ptr<AccessToken>
AndroidUserAuthorizer::RefreshAuthorization(SbUser user) {
SB_DCHECK(user == &::starboard::shared::nouser::g_user);
if (shutdown_) {
DLOG(WARNING) << "No-op RefreshAuthorization after shutdown";
return std::unique_ptr<AccessToken>();
}
JniEnvExt* env = JniEnvExt::Get();
ScopedLocalJavaRef<jobject> j_token(
env->CallObjectMethodOrAbort(j_user_authorizer_, "refreshAuthorization",
"()Ldev/cobalt/account/AccessToken;"));
return CreateAccessToken(j_token.Get());
}
std::unique_ptr<AccessToken>
AndroidUserAuthorizer::CreateAccessToken(jobject j_token) {
if (!j_token) {
return std::unique_ptr<AccessToken>();
}
JniEnvExt* env = JniEnvExt::Get();
std::unique_ptr<AccessToken> access_token(new AccessToken());
ScopedLocalJavaRef<jstring> j_token_string(env->CallObjectMethodOrAbort(
j_token, "getTokenValue", "()Ljava/lang/String;"));
if (j_token_string) {
access_token->token_value =
env->GetStringStandardUTFOrAbort(j_token_string.Get());
}
jlong j_expiry = env->CallLongMethodOrAbort(
j_token, "getExpirySeconds", "()J");
if (j_expiry > 0) {
access_token->expiry =
base::Time::UnixEpoch() + base::TimeDelta::FromSeconds(j_expiry);
}
return access_token;
}
} // namespace cobalt
} // namespace shared
} // namespace android
} // namespace starboard
namespace cobalt {
namespace account {
UserAuthorizer* UserAuthorizer::Create() {
return new ::starboard::android::shared::cobalt::AndroidUserAuthorizer();
}
} // namespace account
} // namespace cobalt