123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- // Copyright 2015 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 COMPONENTS_GCM_DRIVER_INSTANCE_ID_INSTANCE_ID_H_
- #define COMPONENTS_GCM_DRIVER_INSTANCE_ID_INSTANCE_ID_H_
- #include <memory>
- #include <set>
- #include <string>
- #include "base/callback.h"
- #include "base/memory/raw_ptr.h"
- #include "base/memory/weak_ptr.h"
- #include "base/time/time.h"
- namespace gcm {
- class GCMDriver;
- } // namespace gcm
- namespace instance_id {
- extern const char kGCMScope[];
- // Encapsulates Instance ID functionalities that need to be implemented for
- // different platforms. One instance is created per application. Life of
- // Instance ID is managed by the InstanceIDDriver.
- //
- // Create instances of this class by calling |InstanceIDDriver::GetInstanceID|.
- class InstanceID {
- public:
- // Used in UMA. Can add enum values, but never renumber or delete and reuse.
- enum Result : uint8_t {
- // Successful operation.
- SUCCESS = 0,
- // Invalid parameter.
- INVALID_PARAMETER = 1,
- // Instance ID is disabled.
- DISABLED = 2,
- // Previous asynchronous operation is still pending to finish.
- ASYNC_OPERATION_PENDING = 3,
- // Network socket error.
- NETWORK_ERROR = 4,
- // Problem at the server.
- SERVER_ERROR = 5,
- // 6 is omitted, in case we ever merge this enum with GCMClient::Result.
- // Other errors.
- UNKNOWN_ERROR = 7,
- // Used for UMA. Keep kMaxValue up to date and sync with histograms.xml.
- kMaxValue = UNKNOWN_ERROR
- };
- // Flags to be used to create a token. These might be platform specific.
- // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.gcm_driver
- // GENERATED_JAVA_CLASS_NAME_OVERRIDE: InstanceIDFlags
- enum class Flags {
- // Whether delivery of received messages should be deferred until there is a
- // visible activity. Only applicable for Android.
- kIsLazy = 1 << 0,
- // Whether delivery of received messages should bypass the background task
- // scheduler. Only applicable for high priority messages on Android.
- kBypassScheduler = 1 << 1,
- };
- // Asynchronous callbacks. Must not synchronously delete |this| (using
- // InstanceIDDriver::RemoveInstanceID).
- using GetIDCallback = base::OnceCallback<void(const std::string& id)>;
- using GetCreationTimeCallback =
- base::OnceCallback<void(const base::Time& creation_time)>;
- using GetTokenCallback =
- base::OnceCallback<void(const std::string& token, Result result)>;
- using ValidateTokenCallback = base::OnceCallback<void(bool is_valid)>;
- using GetEncryptionInfoCallback =
- base::OnceCallback<void(std::string p256dh, std::string auth_secret)>;
- using DeleteTokenCallback = base::OnceCallback<void(Result result)>;
- using DeleteIDCallback = base::OnceCallback<void(Result result)>;
- static const int kInstanceIDByteLength = 8;
- // Creator. Should only be used by InstanceIDDriver::GetInstanceID.
- // |app_id|: identifies the application that uses the Instance ID.
- // |handler|: provides the GCM functionality needed to support Instance ID.
- // Must outlive this class. On Android, this can be null instead.
- static std::unique_ptr<InstanceID> CreateInternal(const std::string& app_id,
- gcm::GCMDriver* gcm_driver);
- InstanceID(const InstanceID&) = delete;
- InstanceID& operator=(const InstanceID&) = delete;
- virtual ~InstanceID();
- // Returns the Instance ID.
- virtual void GetID(GetIDCallback callback) = 0;
- // Returns the time when the Instance ID has been generated.
- virtual void GetCreationTime(GetCreationTimeCallback callback) = 0;
- // Retrieves a token that allows the authorized entity to access the service
- // defined as "scope". This may cause network requests but the result is
- // cached on disk for up to a week. Token validity will be checked
- // automatically. Thus you should not store tokens for long periods yourself,
- // instead call this function each time it's needed.
- //
- // To receive messages, register an |AppIdHandler| on |gcm_driver()|.
- //
- // |authorized_entity|: identifies the entity that is authorized to access
- // resources associated with this Instance ID. It can be
- // another Instance ID or a numeric project ID.
- // |scope|: identifies authorized actions that the authorized entity can take.
- // E.g. for sending GCM messages, "GCM" scope should be used.
- // |time_to_live|: TTL of retrieved token, unlimited if zero value passed.
- // |flags|: Flags used to create this token.
- // |callback|: to be called once the asynchronous operation is done.
- virtual void GetToken(const std::string& authorized_entity,
- const std::string& scope,
- base::TimeDelta time_to_live,
- std::set<Flags> flags,
- GetTokenCallback callback) = 0;
- // Checks that the provided |token| matches the stored token for (|app_id()|,
- // |authorized_entity|, |scope|). If you follow the guidance for |GetToken|,
- // and call that function each time you need the token, then you will not
- // need to use this function.
- virtual void ValidateToken(const std::string& authorized_entity,
- const std::string& scope,
- const std::string& token,
- ValidateTokenCallback callback) = 0;
- // Get the public encryption key and authentication secret associated with a
- // GCM-scoped token. If encryption info is not yet associated, it will be
- // created.
- // |authorized_entity|: the authorized entity passed when obtaining the token.
- // |callback|: to be called once the asynchronous operation is done.
- virtual void GetEncryptionInfo(const std::string& authorized_entity,
- GetEncryptionInfoCallback callback);
- // Revokes a granted token.
- // |authorized_entity|: the authorized entity passed when obtaining the token.
- // |scope|: the scope that was passed when obtaining the token.
- // |callback|: to be called once the asynchronous operation is done.
- virtual void DeleteToken(const std::string& authorized_entity,
- const std::string& scope,
- DeleteTokenCallback callback);
- // Resets the app instance identifier and revokes all tokens associated with
- // it.
- // |callback|: to be called once the asynchronous operation is done.
- void DeleteID(DeleteIDCallback callback);
- std::string app_id() const { return app_id_; }
- gcm::GCMDriver* gcm_driver() { return gcm_driver_; }
- protected:
- InstanceID(const std::string& app_id, gcm::GCMDriver* gcm_driver);
- // Platform-specific implementations.
- virtual void DeleteTokenImpl(const std::string& authorized_entity,
- const std::string& scope,
- DeleteTokenCallback callback) = 0;
- virtual void DeleteIDImpl(DeleteIDCallback callback) = 0;
- void NotifyTokenRefresh(bool update_id);
- private:
- void DidDelete(const std::string& authorized_entity,
- base::OnceCallback<void(Result result)> callback,
- Result result);
- // Owned by GCMProfileServiceFactory, which is a dependency of
- // InstanceIDProfileServiceFactory, which owns this.
- raw_ptr<gcm::GCMDriver> gcm_driver_;
- std::string app_id_;
- base::WeakPtrFactory<InstanceID> weak_ptr_factory_{this};
- };
- } // namespace instance_id
- #endif // COMPONENTS_GCM_DRIVER_INSTANCE_ID_INSTANCE_ID_H_
|