screenlock_private_api.cc revision 5b892326406927b709cdaf6c384d4ababf456332
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/lazy_instance.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/values.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/signin/easy_unlock_service.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/extensions/api/screenlock_private.h"
125b892326406927b709cdaf6c384d4ababf456332Ben Murdoch#include "chrome/common/extensions/extension_constants.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace screenlock = extensions::api::screenlock_private;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)screenlock::AuthType FromLockHandlerAuthType(
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::LockHandler::AuthType auth_type) {
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (auth_type) {
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::OFFLINE_PASSWORD:
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::NUMERIC_PIN:
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_NUMERICPIN;
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::USER_CLICK:
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_USERCLICK;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::ONLINE_SIGN_IN:
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Apps should treat forced online sign in same as system password.
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case ScreenlockBridge::LockHandler::EXPAND_THEN_USER_CLICK:
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // This type is used for public sessions, which do not support screen
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // locking.
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return screenlock::AUTH_TYPE_NONE;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD:
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTREACHED();
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateGetLockedFunction::ScreenlockPrivateGetLockedFunction() {}
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateGetLockedFunction::~ScreenlockPrivateGetLockedFunction() {}
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ScreenlockPrivateGetLockedFunction::RunAsync() {
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetResult(new base::FundamentalValue(ScreenlockBridge::Get()->IsLocked()));
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendResponse(error_.empty());
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateSetLockedFunction::ScreenlockPrivateSetLockedFunction() {}
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateSetLockedFunction::~ScreenlockPrivateSetLockedFunction() {}
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ScreenlockPrivateSetLockedFunction::RunAsync() {
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<screenlock::SetLocked::Params> params(
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      screenlock::SetLocked::Params::Create(*args_));
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
655b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  if (params->locked) {
665b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    if (extension()->id() == extension_misc::kEasyUnlockAppId) {
675b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      // Mark the Easy Unlock behaviour on the lock screen as the one initiated
685b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      // by the Easy Unlock setup app as a trial one.
695b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      // TODO(tbarzic): Move this logic to a new easyUnlockPrivate function.
705b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      EasyUnlockService* service = EasyUnlockService::Get(GetProfile());
715b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      if (service)
725b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        service->SetTrialRun();
735b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    }
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::Get()->Lock(GetProfile());
755b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  } else {
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::Get()->Unlock(GetProfile());
775b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendResponse(error_.empty());
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenlockPrivateAcceptAuthAttemptFunction::
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ScreenlockPrivateAcceptAuthAttemptFunction() {}
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenlockPrivateAcceptAuthAttemptFunction::
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ~ScreenlockPrivateAcceptAuthAttemptFunction() {}
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ScreenlockPrivateAcceptAuthAttemptFunction::RunSync() {
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<screenlock::AcceptAuthAttempt::Params> params(
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      screenlock::AcceptAuthAttempt::Params::Create(*args_));
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = Profile::FromBrowserContext(browser_context());
945b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  EasyUnlockService* service = EasyUnlockService::Get(profile);
955b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  if (service)
965b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    service->FinalizeUnlock(params->accept);
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenlockPrivateEventRouter::ScreenlockPrivateEventRouter(
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::BrowserContext* context)
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : browser_context_(context) {
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScreenlockBridge::Get()->AddObserver(this);
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateEventRouter::~ScreenlockPrivateEventRouter() {}
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockPrivateEventRouter::OnScreenDidLock() {
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DispatchEvent(screenlock::OnChanged::kEventName,
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new base::FundamentalValue(true));
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockPrivateEventRouter::OnScreenDidUnlock() {
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DispatchEvent(screenlock::OnChanged::kEventName,
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new base::FundamentalValue(false));
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenlockPrivateEventRouter::OnFocusedUserChanged(
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& user_id) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScreenlockPrivateEventRouter::DispatchEvent(
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& event_name,
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::Value* arg) {
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (arg)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    args->Append(arg);
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<extensions::Event> event(new extensions::Event(
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      event_name, args.Pass()));
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  extensions::EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass());
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<extensions::BrowserContextKeyedAPIFactory<
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ScreenlockPrivateEventRouter> > g_factory = LAZY_INSTANCE_INITIALIZER;
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)extensions::BrowserContextKeyedAPIFactory<ScreenlockPrivateEventRouter>*
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateEventRouter::GetFactoryInstance() {
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_factory.Pointer();
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScreenlockPrivateEventRouter::Shutdown() {
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScreenlockBridge::Get()->RemoveObserver(this);
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ScreenlockPrivateEventRouter::OnAuthAttempted(
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::LockHandler::AuthType auth_type,
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& value) {
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extensions::EventRouter* router =
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::EventRouter::Get(browser_context_);
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!router->HasEventListener(screenlock::OnAuthAttempted::kEventName))
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  args->AppendString(screenlock::ToString(FromLockHandlerAuthType(auth_type)));
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  args->AppendString(value);
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<extensions::Event> event(new extensions::Event(
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      screenlock::OnAuthAttempted::kEventName, args.Pass()));
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  router->BroadcastEvent(event.Pass());
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace extensions
165