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