-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Extensions] Add chrome.loginScreenStorage API
This CL introduces new extensions API that allows white-listed login screen extensions to store persistent data accessible from login screen and inject short-lived data into the user session (using ChromeOS session manager daemon). See API proposal for more details. Bug: 980171 Change-Id: I5b07311dbcba0e7be711457553cf85ded7443fd8 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1611994 Commit-Queue: Zakhar Voit <voit@google.com> Reviewed-by: Devlin <rdevlin.cronin@chromium.org> Reviewed-by: Xiyuan Xia <xiyuan@chromium.org> Reviewed-by: Alexander Hendrich <hendrich@chromium.org> Reviewed-by: Steven Bennetts <stevenjb@chromium.org> Cr-Commit-Position: refs/heads/master@{#685130}
- Loading branch information
1 parent
e46dd10
commit 61a11d2
Showing
18 changed files
with
501 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
144 changes: 144 additions & 0 deletions
144
...browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_api.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
// Copyright 2019 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "chrome/browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_api.h" | ||
|
||
#include "base/values.h" | ||
#include "chrome/common/extensions/api/login_screen_storage.h" | ||
#include "chromeos/dbus/session_manager/session_manager_client.h" | ||
#include "components/user_manager/user_manager.h" | ||
|
||
namespace login_screen_storage = extensions::api::login_screen_storage; | ||
|
||
namespace extensions { | ||
|
||
namespace { | ||
|
||
const char kPersistentDataKeyPrefix[] = "persistent_data_"; | ||
const char kCredentialsKeyPrefix[] = "credentials_"; | ||
|
||
} // namespace | ||
|
||
LoginScreenStorageExtensionFunction::LoginScreenStorageExtensionFunction() = | ||
default; | ||
LoginScreenStorageExtensionFunction::~LoginScreenStorageExtensionFunction() = | ||
default; | ||
|
||
void LoginScreenStorageExtensionFunction::OnDataStored( | ||
base::Optional<std::string> error) { | ||
Respond(error ? Error(*error) : NoArguments()); | ||
} | ||
|
||
void LoginScreenStorageExtensionFunction::OnDataRetrieved( | ||
base::Optional<std::string> data, | ||
base::Optional<std::string> error) { | ||
if (error) { | ||
Respond(Error(*error)); | ||
return; | ||
} | ||
Respond(OneArgument(data ? std::make_unique<base::Value>(*data) : nullptr)); | ||
} | ||
|
||
LoginScreenStorageStorePersistentDataFunction:: | ||
LoginScreenStorageStorePersistentDataFunction() = default; | ||
LoginScreenStorageStorePersistentDataFunction:: | ||
~LoginScreenStorageStorePersistentDataFunction() = default; | ||
|
||
ExtensionFunction::ResponseAction | ||
LoginScreenStorageStorePersistentDataFunction::Run() { | ||
std::unique_ptr<login_screen_storage::StorePersistentData::Params> params = | ||
login_screen_storage::StorePersistentData::Params::Create(*args_); | ||
EXTENSION_FUNCTION_VALIDATE(params); | ||
login_manager::LoginScreenStorageMetadata metadata; | ||
metadata.set_clear_on_session_exit(false); | ||
StoreDataForExtensions(std::move(params->extension_ids), metadata, | ||
params->data); | ||
return RespondLater(); | ||
} | ||
|
||
void LoginScreenStorageStorePersistentDataFunction::OnDataStored( | ||
std::vector<std::string> extension_ids, | ||
const login_manager::LoginScreenStorageMetadata& metadata, | ||
const std::string& data, | ||
base::Optional<std::string> error) { | ||
if (error) { | ||
Respond(Error(*error)); | ||
return; | ||
} | ||
|
||
if (extension_ids.empty()) { | ||
Respond(NoArguments()); | ||
return; | ||
} | ||
|
||
StoreDataForExtensions(std::move(extension_ids), metadata, data); | ||
} | ||
|
||
void LoginScreenStorageStorePersistentDataFunction::StoreDataForExtensions( | ||
std::vector<std::string> extension_ids, | ||
const login_manager::LoginScreenStorageMetadata& metadata, | ||
const std::string& data) { | ||
if (extension_ids.empty()) | ||
return; | ||
|
||
std::string extension_id = extension_ids.back(); | ||
extension_ids.pop_back(); | ||
chromeos::SessionManagerClient::Get()->LoginScreenStorageStore( | ||
kPersistentDataKeyPrefix + extension_id, metadata, data, | ||
base::BindOnce( | ||
&LoginScreenStorageStorePersistentDataFunction::OnDataStored, this, | ||
std::move(extension_ids), metadata, data)); | ||
} | ||
|
||
LoginScreenStorageRetrievePersistentDataFunction:: | ||
LoginScreenStorageRetrievePersistentDataFunction() = default; | ||
LoginScreenStorageRetrievePersistentDataFunction:: | ||
~LoginScreenStorageRetrievePersistentDataFunction() = default; | ||
|
||
ExtensionFunction::ResponseAction | ||
LoginScreenStorageRetrievePersistentDataFunction::Run() { | ||
chromeos::SessionManagerClient::Get()->LoginScreenStorageRetrieve( | ||
kPersistentDataKeyPrefix + extension_id(), | ||
base::BindOnce( | ||
&LoginScreenStorageRetrievePersistentDataFunction::OnDataRetrieved, | ||
this)); | ||
return RespondLater(); | ||
} | ||
|
||
LoginScreenStorageStoreCredentialsFunction:: | ||
LoginScreenStorageStoreCredentialsFunction() = default; | ||
LoginScreenStorageStoreCredentialsFunction:: | ||
~LoginScreenStorageStoreCredentialsFunction() = default; | ||
|
||
ExtensionFunction::ResponseAction | ||
LoginScreenStorageStoreCredentialsFunction::Run() { | ||
std::unique_ptr<login_screen_storage::StoreCredentials::Params> params = | ||
login_screen_storage::StoreCredentials::Params::Create(*args_); | ||
EXTENSION_FUNCTION_VALIDATE(params); | ||
login_manager::LoginScreenStorageMetadata metadata; | ||
metadata.set_clear_on_session_exit(true); | ||
chromeos::SessionManagerClient::Get()->LoginScreenStorageStore( | ||
kCredentialsKeyPrefix + params->extension_id, metadata, | ||
params->credentials, | ||
base::BindOnce(&LoginScreenStorageStoreCredentialsFunction::OnDataStored, | ||
this)); | ||
return RespondLater(); | ||
} | ||
|
||
LoginScreenStorageRetrieveCredentialsFunction:: | ||
LoginScreenStorageRetrieveCredentialsFunction() = default; | ||
LoginScreenStorageRetrieveCredentialsFunction:: | ||
~LoginScreenStorageRetrieveCredentialsFunction() = default; | ||
|
||
ExtensionFunction::ResponseAction | ||
LoginScreenStorageRetrieveCredentialsFunction::Run() { | ||
chromeos::SessionManagerClient::Get()->LoginScreenStorageRetrieve( | ||
kCredentialsKeyPrefix + extension_id(), | ||
base::BindOnce( | ||
&LoginScreenStorageRetrieveCredentialsFunction::OnDataRetrieved, | ||
this)); | ||
return RespondLater(); | ||
} | ||
|
||
} // namespace extensions |
115 changes: 115 additions & 0 deletions
115
.../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_api.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
// Copyright 2019 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_SCREEN_STORAGE_LOGIN_SCREEN_STORAGE_API_H_ | ||
#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_SCREEN_STORAGE_LOGIN_SCREEN_STORAGE_API_H_ | ||
|
||
#include "chromeos/dbus/login_manager/login_screen_storage.pb.h" | ||
#include "extensions/browser/extension_function.h" | ||
|
||
namespace extensions { | ||
|
||
// Provides common callback functions to return results from | ||
// 'LoginScreenStorageStore' and 'LoginScreenStorageRetrieve' D-Bus methods. | ||
class LoginScreenStorageExtensionFunction : public ExtensionFunction { | ||
protected: | ||
LoginScreenStorageExtensionFunction(); | ||
~LoginScreenStorageExtensionFunction() override; | ||
|
||
// When passed as a callback to the 'LoginScreenStorageStore' D-Bus method, | ||
// returns its result to the calling extension. | ||
void OnDataStored(base::Optional<std::string> error); | ||
|
||
// When passed as a callback to the 'LoginScreenStorageRetrieve' D-Bus method, | ||
// returns its result to the calling extension. | ||
void OnDataRetrieved(base::Optional<std::string> data, | ||
base::Optional<std::string> error); | ||
|
||
private: | ||
DISALLOW_COPY_AND_ASSIGN(LoginScreenStorageExtensionFunction); | ||
}; | ||
|
||
class LoginScreenStorageStorePersistentDataFunction : public ExtensionFunction { | ||
public: | ||
LoginScreenStorageStorePersistentDataFunction(); | ||
DECLARE_EXTENSION_FUNCTION("loginScreenStorage.storePersistentData", | ||
LOGINSCREENSTORAGE_STOREPERSISTENTDATA) | ||
|
||
protected: | ||
~LoginScreenStorageStorePersistentDataFunction() override; | ||
|
||
// ExtensionFunction: | ||
ResponseAction Run() override; | ||
|
||
private: | ||
// Called when data for one of the extension was stored, |extension_ids| is a | ||
// list of the extensions that the data wasn't yet stored for. | ||
void OnDataStored(std::vector<std::string> extension_ids, | ||
const login_manager::LoginScreenStorageMetadata& metadata, | ||
const std::string& data, | ||
base::Optional<std::string> error); | ||
|
||
// Asynchronously stores data for every extension from |extension_ids|. | ||
void StoreDataForExtensions( | ||
std::vector<std::string> extension_ids, | ||
const login_manager::LoginScreenStorageMetadata& metadata, | ||
const std::string& data); | ||
|
||
DISALLOW_COPY_AND_ASSIGN(LoginScreenStorageStorePersistentDataFunction); | ||
}; | ||
|
||
class LoginScreenStorageRetrievePersistentDataFunction | ||
: public LoginScreenStorageExtensionFunction { | ||
public: | ||
LoginScreenStorageRetrievePersistentDataFunction(); | ||
DECLARE_EXTENSION_FUNCTION("loginScreenStorage.retrievePersistentData", | ||
LOGINSCREENSTORAGE_RETRIEVEPERSISTENTDATA) | ||
|
||
protected: | ||
~LoginScreenStorageRetrievePersistentDataFunction() override; | ||
|
||
// ExtensionFunction: | ||
ResponseAction Run() override; | ||
|
||
private: | ||
DISALLOW_COPY_AND_ASSIGN(LoginScreenStorageRetrievePersistentDataFunction); | ||
}; | ||
|
||
class LoginScreenStorageStoreCredentialsFunction | ||
: public LoginScreenStorageExtensionFunction { | ||
public: | ||
LoginScreenStorageStoreCredentialsFunction(); | ||
DECLARE_EXTENSION_FUNCTION("loginScreenStorage.storeCredentials", | ||
LOGINSCREENSTORAGE_STORECREDENTIALS) | ||
|
||
protected: | ||
~LoginScreenStorageStoreCredentialsFunction() override; | ||
|
||
// ExtensionFunction: | ||
ResponseAction Run() override; | ||
|
||
private: | ||
DISALLOW_COPY_AND_ASSIGN(LoginScreenStorageStoreCredentialsFunction); | ||
}; | ||
|
||
class LoginScreenStorageRetrieveCredentialsFunction | ||
: public LoginScreenStorageExtensionFunction { | ||
public: | ||
LoginScreenStorageRetrieveCredentialsFunction(); | ||
DECLARE_EXTENSION_FUNCTION("loginScreenStorage.retrieveCredentials", | ||
LOGINSCREENSTORAGE_RETRIEVECREDENTIALS) | ||
|
||
protected: | ||
~LoginScreenStorageRetrieveCredentialsFunction() override; | ||
|
||
// ExtensionFunction: | ||
ResponseAction Run() override; | ||
|
||
private: | ||
DISALLOW_COPY_AND_ASSIGN(LoginScreenStorageRetrieveCredentialsFunction); | ||
}; | ||
|
||
} // namespace extensions | ||
|
||
#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_LOGIN_SCREEN_LOGIN_SCREEN_STORAGE_LOGIN_SCREEN_STORAGE_API_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// Copyright 2019 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
// Use the <code>chrome.loginScreenStorage</code> API to store persistent data | ||
// from the login screen or inject data into the session. | ||
[platforms=("chromeos"), | ||
implemented_in="chrome/browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_api.h"] | ||
namespace loginScreenStorage { | ||
callback StoreCallback = void (); | ||
callback RetrieveCallback = void (DOMString data); | ||
|
||
interface Functions { | ||
// Stores persistent data from the login screen. This data can be accessed | ||
// later using $(ref:retrievePersistentData) by any extension from the | ||
// specified extension ids. This method will fail if called while a user | ||
// session is active. | ||
// |extensionIds|: IDs of the extensions that should have access to the | ||
// stored data. | ||
// |data|: The data to store. | ||
static void storePersistentData(DOMString[] extensionIds, | ||
DOMString data, | ||
StoreCallback callback); | ||
|
||
// Retrieves persistent data that was previously stored using | ||
// $(ref:storePersistentData) for the caller's extension ID. | ||
static void retrievePersistentData(RetrieveCallback callback); | ||
|
||
// Stores credentials for later access from the user session. This method | ||
// will fail if called while a user session is active. | ||
// |extensionId|: ID of the in-session extension that should have access to | ||
// these credentials. Credentials stored using this method are deleted on | ||
// session exit. | ||
// |credentials|: The credentials to store. | ||
static void storeCredentials(DOMString extensionId, | ||
DOMString credentials, | ||
StoreCallback callback); | ||
|
||
// Retrieves credentials that were previosly stored using | ||
// $(ref:storeCredentials). The caller's extension ID should be the same as | ||
// the extension id passed to the $(ref:storeCredentials). | ||
static void retrieveCredentials(RetrieveCallback callback); | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.