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