signin_manager_android.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/android/signin/signin_manager_android.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/android/jni_android.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/android/jni_string.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/android/scoped_java_ref.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind_helpers.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/browser_process.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/profiles/profile_manager.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/signin/signin_manager.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/signin/signin_manager_factory.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/pref_names.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "jni/SigninManager_jni.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/browser_policy_connector.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/cloud/cloud_policy_client.h"
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/cloud/user_policy_signin_service_android.h"
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "google_apis/gaia/gaia_auth_util.h"
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSigninManagerAndroid::SigninManagerAndroid(JNIEnv* env, jobject obj)
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : profile_(NULL) {
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  java_signin_manager_.Reset(env, obj);
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(g_browser_process);
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(g_browser_process->profile_manager());
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  profile_ = g_browser_process->profile_manager()->GetDefaultProfile();
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(profile_);
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSigninManagerAndroid::~SigninManagerAndroid() {}
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::CheckPolicyBeforeSignIn(JNIEnv* env,
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   jobject obj,
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                   jstring username) {
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  username_ = base::android::ConvertJavaStringToUTF8(env, username);
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  policy::UserPolicySigninService* service =
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  service->RegisterPolicyClient(
469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, username),
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&SigninManagerAndroid::OnPolicyRegisterDone,
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 base::Unretained(this)));
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This shouldn't be called when ShouldLoadPolicyForUser() is false.
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  ScopedJavaLocalRef<jstring> domain;
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj(),
559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                                 domain.obj());
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::FetchPolicyBeforeSignIn(JNIEnv* env, jobject obj) {
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (cloud_policy_client_) {
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    policy::UserPolicySigninService* service =
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    service->FetchPolicyForSignedInUser(
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        cloud_policy_client_.Pass(),
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&SigninManagerAndroid::OnPolicyFetchDone,
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   base::Unretained(this)));
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // This shouldn't be called when ShouldLoadPolicyForUser() is false, or when
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // CheckPolicyBeforeSignIn() failed.
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  NOTREACHED();
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyFetchedBeforeSignIn(env,
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj());
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnSignInCompleted(JNIEnv* env,
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             jobject obj,
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             jstring username) {
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerFactory::GetForProfile(profile_)->OnExternalSigninCompleted(
829ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, username));
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::SignOut(JNIEnv* env, jobject obj) {
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerFactory::GetForProfile(profile_)->SignOut();
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnPolicyRegisterDone(
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scoped_ptr<policy::CloudPolicyClient> client) {
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cloud_policy_client_ = client.Pass();
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  ScopedJavaLocalRef<jstring> domain;
979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (cloud_policy_client_) {
989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    DCHECK(!username_.empty());
999ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    domain.Reset(
1009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        base::android::ConvertUTF8ToJavaString(
1019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            env, gaia::ExtractDomainName(username_)));
1029ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  } else {
1039ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    username_.clear();
1049ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
1059ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                 java_signin_manager_.obj(),
1089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                                                 domain.obj());
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SigninManagerAndroid::OnPolicyFetchDone(bool success) {
1129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  Java_SigninManager_onPolicyFetchedBeforeSignIn(
1139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::AttachCurrentThread(),
1149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      java_signin_manager_.obj());
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic int Init(JNIEnv* env, jobject obj) {
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SigninManagerAndroid* signin_manager_android =
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new SigninManagerAndroid(env, obj);
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return reinterpret_cast<jint>(signin_manager_android);
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic jboolean ShouldLoadPolicyForUser(JNIEnv* env,
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        jobject obj,
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                        jstring j_username) {
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_CONFIGURATION_POLICY)
1299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  std::string username =
1309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, j_username);
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return false;
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool SigninManagerAndroid::Register(JNIEnv* env) {
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return RegisterNativesImpl(env);
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
141