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"
13e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch#include "extensions/browser/app_window/app_window_registry.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace screenlock = extensions::api::screenlock_private;
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)screenlock::AuthType FromLockHandlerAuthType(
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::LockHandler::AuthType auth_type) {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (auth_type) {
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::OFFLINE_PASSWORD:
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::NUMERIC_PIN:
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_NUMERICPIN;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::USER_CLICK:
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_USERCLICK;
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case ScreenlockBridge::LockHandler::ONLINE_SIGN_IN:
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Apps should treat forced online sign in same as system password.
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case ScreenlockBridge::LockHandler::EXPAND_THEN_USER_CLICK:
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // This type is used for public sessions, which do not support screen
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // locking.
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return screenlock::AUTH_TYPE_NONE;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD:
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTREACHED();
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return screenlock::AUTH_TYPE_OFFLINEPASSWORD;
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateGetLockedFunction::ScreenlockPrivateGetLockedFunction() {}
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateGetLockedFunction::~ScreenlockPrivateGetLockedFunction() {}
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ScreenlockPrivateGetLockedFunction::RunAsync() {
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetResult(new base::FundamentalValue(ScreenlockBridge::Get()->IsLocked()));
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendResponse(error_.empty());
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateSetLockedFunction::ScreenlockPrivateSetLockedFunction() {}
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateSetLockedFunction::~ScreenlockPrivateSetLockedFunction() {}
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ScreenlockPrivateSetLockedFunction::RunAsync() {
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<screenlock::SetLocked::Params> params(
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      screenlock::SetLocked::Params::Create(*args_));
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
665b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  if (params->locked) {
67e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch    if (extension()->id() == extension_misc::kEasyUnlockAppId &&
68e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch        AppWindowRegistry::Get(browser_context())
69e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch            ->GetAppWindowForAppAndKey(extension()->id(),
70e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch                                       "easy_unlock_pairing")) {
715b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      // Mark the Easy Unlock behaviour on the lock screen as the one initiated
725b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      // by the Easy Unlock setup app as a trial one.
735b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      // TODO(tbarzic): Move this logic to a new easyUnlockPrivate function.
745b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      EasyUnlockService* service = EasyUnlockService::Get(GetProfile());
755b892326406927b709cdaf6c384d4ababf456332Ben Murdoch      if (service)
765b892326406927b709cdaf6c384d4ababf456332Ben Murdoch        service->SetTrialRun();
775b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    }
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::Get()->Lock(GetProfile());
795b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  } else {
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::Get()->Unlock(GetProfile());
815b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  }
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendResponse(error_.empty());
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenlockPrivateAcceptAuthAttemptFunction::
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ScreenlockPrivateAcceptAuthAttemptFunction() {}
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenlockPrivateAcceptAuthAttemptFunction::
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ~ScreenlockPrivateAcceptAuthAttemptFunction() {}
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ScreenlockPrivateAcceptAuthAttemptFunction::RunSync() {
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<screenlock::AcceptAuthAttempt::Params> params(
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      screenlock::AcceptAuthAttempt::Params::Create(*args_));
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = Profile::FromBrowserContext(browser_context());
985b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  EasyUnlockService* service = EasyUnlockService::Get(profile);
995b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  if (service)
1005b892326406927b709cdaf6c384d4ababf456332Ben Murdoch    service->FinalizeUnlock(params->accept);
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ScreenlockPrivateEventRouter::ScreenlockPrivateEventRouter(
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::BrowserContext* context)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : browser_context_(context) {
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScreenlockBridge::Get()->AddObserver(this);
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateEventRouter::~ScreenlockPrivateEventRouter() {}
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockPrivateEventRouter::OnScreenDidLock() {
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DispatchEvent(screenlock::OnChanged::kEventName,
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new base::FundamentalValue(true));
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ScreenlockPrivateEventRouter::OnScreenDidUnlock() {
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DispatchEvent(screenlock::OnChanged::kEventName,
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new base::FundamentalValue(false));
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenlockPrivateEventRouter::OnFocusedUserChanged(
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& user_id) {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScreenlockPrivateEventRouter::DispatchEvent(
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& event_name,
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::Value* arg) {
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (arg)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    args->Append(arg);
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<extensions::Event> event(new extensions::Event(
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      event_name, args.Pass()));
1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  extensions::EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass());
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<extensions::BrowserContextKeyedAPIFactory<
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ScreenlockPrivateEventRouter> > g_factory = LAZY_INSTANCE_INITIALIZER;
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)extensions::BrowserContextKeyedAPIFactory<ScreenlockPrivateEventRouter>*
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ScreenlockPrivateEventRouter::GetFactoryInstance() {
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_factory.Pointer();
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScreenlockPrivateEventRouter::Shutdown() {
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScreenlockBridge::Get()->RemoveObserver(this);
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ScreenlockPrivateEventRouter::OnAuthAttempted(
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::LockHandler::AuthType auth_type,
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& value) {
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extensions::EventRouter* router =
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::EventRouter::Get(browser_context_);
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!router->HasEventListener(screenlock::OnAuthAttempted::kEventName))
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  args->AppendString(screenlock::ToString(FromLockHandlerAuthType(auth_type)));
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  args->AppendString(value);
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<extensions::Event> event(new extensions::Event(
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      screenlock::OnAuthAttempted::kEventName, args.Pass()));
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  router->BroadcastEvent(event.Pass());
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace extensions
169