| // 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 |