signin_manager_android.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/android/signin/signin_manager_android.h"
6
7#include "base/android/jni_android.h"
8#include "base/android/jni_string.h"
9#include "base/android/scoped_java_ref.h"
10#include "base/bind.h"
11#include "base/bind_helpers.h"
12#include "chrome/browser/browser_process.h"
13#include "chrome/browser/profiles/profile_manager.h"
14#include "chrome/browser/signin/signin_manager.h"
15#include "chrome/browser/signin/signin_manager_factory.h"
16#include "chrome/common/pref_names.h"
17#include "jni/SigninManager_jni.h"
18
19#if defined(ENABLE_CONFIGURATION_POLICY)
20#include "chrome/browser/policy/browser_policy_connector.h"
21#include "chrome/browser/policy/cloud/cloud_policy_client.h"
22#include "chrome/browser/policy/cloud/user_policy_signin_service_android.h"
23#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
24#include "google_apis/gaia/gaia_auth_util.h"
25#endif
26
27SigninManagerAndroid::SigninManagerAndroid(JNIEnv* env, jobject obj)
28    : profile_(NULL) {
29  java_signin_manager_.Reset(env, obj);
30  DCHECK(g_browser_process);
31  DCHECK(g_browser_process->profile_manager());
32  profile_ = g_browser_process->profile_manager()->GetDefaultProfile();
33  DCHECK(profile_);
34}
35
36SigninManagerAndroid::~SigninManagerAndroid() {}
37
38void SigninManagerAndroid::CheckPolicyBeforeSignIn(JNIEnv* env,
39                                                   jobject obj,
40                                                   jstring username) {
41#if defined(ENABLE_CONFIGURATION_POLICY)
42  username_ = base::android::ConvertJavaStringToUTF8(env, username);
43  policy::UserPolicySigninService* service =
44      policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
45  service->RegisterPolicyClient(
46      base::android::ConvertJavaStringToUTF8(env, username),
47      base::Bind(&SigninManagerAndroid::OnPolicyRegisterDone,
48                 base::Unretained(this)));
49#else
50  // This shouldn't be called when ShouldLoadPolicyForUser() is false.
51  NOTREACHED();
52  ScopedJavaLocalRef<jstring> domain;
53  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
54                                                 java_signin_manager_.obj(),
55                                                 domain.obj());
56#endif
57}
58
59void SigninManagerAndroid::FetchPolicyBeforeSignIn(JNIEnv* env, jobject obj) {
60#if defined(ENABLE_CONFIGURATION_POLICY)
61  if (cloud_policy_client_) {
62    policy::UserPolicySigninService* service =
63        policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
64    service->FetchPolicyForSignedInUser(
65        cloud_policy_client_.Pass(),
66        base::Bind(&SigninManagerAndroid::OnPolicyFetchDone,
67                   base::Unretained(this)));
68    return;
69  }
70#endif
71  // This shouldn't be called when ShouldLoadPolicyForUser() is false, or when
72  // CheckPolicyBeforeSignIn() failed.
73  NOTREACHED();
74  Java_SigninManager_onPolicyFetchedBeforeSignIn(env,
75                                                 java_signin_manager_.obj());
76}
77
78void SigninManagerAndroid::OnSignInCompleted(JNIEnv* env,
79                                             jobject obj,
80                                             jstring username) {
81  SigninManagerFactory::GetForProfile(profile_)->OnExternalSigninCompleted(
82      base::android::ConvertJavaStringToUTF8(env, username));
83}
84
85void SigninManagerAndroid::SignOut(JNIEnv* env, jobject obj) {
86  SigninManagerFactory::GetForProfile(profile_)->SignOut();
87}
88
89#if defined(ENABLE_CONFIGURATION_POLICY)
90
91void SigninManagerAndroid::OnPolicyRegisterDone(
92    scoped_ptr<policy::CloudPolicyClient> client) {
93  cloud_policy_client_ = client.Pass();
94
95  JNIEnv* env = base::android::AttachCurrentThread();
96  ScopedJavaLocalRef<jstring> domain;
97  if (cloud_policy_client_) {
98    DCHECK(!username_.empty());
99    domain.Reset(
100        base::android::ConvertUTF8ToJavaString(
101            env, gaia::ExtractDomainName(username_)));
102  } else {
103    username_.clear();
104  }
105
106  Java_SigninManager_onPolicyCheckedBeforeSignIn(env,
107                                                 java_signin_manager_.obj(),
108                                                 domain.obj());
109}
110
111void SigninManagerAndroid::OnPolicyFetchDone(bool success) {
112  Java_SigninManager_onPolicyFetchedBeforeSignIn(
113      base::android::AttachCurrentThread(),
114      java_signin_manager_.obj());
115}
116
117#endif
118
119static int Init(JNIEnv* env, jobject obj) {
120  SigninManagerAndroid* signin_manager_android =
121      new SigninManagerAndroid(env, obj);
122  return reinterpret_cast<jint>(signin_manager_android);
123}
124
125static jboolean ShouldLoadPolicyForUser(JNIEnv* env,
126                                        jobject obj,
127                                        jstring j_username) {
128#if defined(ENABLE_CONFIGURATION_POLICY)
129  std::string username =
130      base::android::ConvertJavaStringToUTF8(env, j_username);
131  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
132#else
133  return false;
134#endif
135}
136
137// static
138bool SigninManagerAndroid::Register(JNIEnv* env) {
139  return RegisterNativesImpl(env);
140}
141