blob: ce0bb3aa64cd5de33dc8393c9452bb49f3bb163f [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PUSH_MESSAGING_APP_IDENTIFIER_H_
#define COMPONENTS_PUSH_MESSAGING_APP_IDENTIFIER_H_
#include <stddef.h>
#include <stdint.h>
#include <optional>
#include <string>
#include <vector>
#include "base/check.h"
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "url/gurl.h"
namespace push_messaging {
// The prefix used for all push messaging application ids.
extern const char kAppIdentifierPrefix[];
extern const size_t kPrefixLength;
// Ok to use '#' as separator since only the origin of the url is used.
inline constexpr char kPrefValueSeparator = '#';
inline constexpr size_t kGuidLength = 36; // "%08X-%04X-%04X-%04X-%012llX"
// Type used to identify a Service Worker registration from a Push API
// perspective. These can be persisted to prefs, in a 1:1 mapping between
// app_id (which includes origin) and service_worker_registration_id.
// Legacy mapped values saved by old versions of Chrome are also supported;
// these don't contain the origin in the app_id, so instead they map from
// app_id to pair<origin, service_worker_registration_id>.
//
// See //chrome/browser/push_messaging/push_messaging_app_identifier.h for the
// chrome integration, this class itself does not rely on //chrome.
class AppIdentifier final {
public:
// Returns whether the modern InstanceID API should be used with this app_id
// (rather than legacy GCM registration).
static bool UseInstanceID(const std::string& app_id);
// Generates a new app identifier, with partially random app_id.
static AppIdentifier Generate(
const GURL& origin,
int64_t service_worker_registration_id,
const std::optional<base::Time>& expiration_time = std::nullopt);
// Creates an invalid AppIdentifier which will return is_null() and fail on
// DCheckValid(), accessing any fields triggers DCheck failure.
static AppIdentifier GenerateInvalid();
// Creates an AppIdentifier by directly forwarding the parameters to the
// constructor; the returned AppIdentifier instance will be checked by
// DCheckValid().
static AppIdentifier GenerateDirect(
const std::string& app_id,
const GURL& origin,
int64_t service_worker_registration_id,
const std::optional<base::Time>& expiration_time = std::nullopt);
// Returns true if this identifier does not represent an app (i.e. this was
// returned by a failed Find call).
bool is_null() const { return service_worker_registration_id_ < 0; }
// String that should be passed to push services like GCM to identify a
// particular Service Worker (so we can route incoming messages). Example:
// wp:https://foo.example.com:8443/#9CC55CCE-B8F9-4092-A364-3B0F73A3AB5F
// Legacy app_ids have no origin, e.g. wp:9CC55CCE-B8F9-4092-A364-3B0F73A3AB5F
const std::string& app_id() const {
DCHECK(!is_null());
return app_id_;
}
const GURL& origin() const {
DCHECK(!is_null());
return origin_;
}
int64_t service_worker_registration_id() const {
DCHECK(!is_null());
return service_worker_registration_id_;
}
void set_expiration_time(const std::optional<base::Time>& expiration_time) {
expiration_time_ = expiration_time;
}
bool IsExpired() const;
std::optional<base::Time> expiration_time() const {
DCHECK(!is_null());
return expiration_time_;
}
// Validates that all the fields contain valid values.
void DCheckValid() const;
private:
friend class AppIdentifierTestSupport;
static AppIdentifier GenerateInternal(
const GURL& origin,
int64_t service_worker_registration_id,
bool use_instance_id,
const std::optional<base::Time>& expiration_time = std::nullopt);
// Constructs an invalid app identifier.
AppIdentifier();
// Constructs a valid app identifier.
AppIdentifier(
const std::string& app_id,
const GURL& origin,
int64_t service_worker_registration_id,
const std::optional<base::Time>& expiration_time = std::nullopt);
std::string app_id_;
GURL origin_;
int64_t service_worker_registration_id_;
std::optional<base::Time> expiration_time_;
};
} // namespace push_messaging
#endif // COMPONENTS_PUSH_MESSAGING_APP_IDENTIFIER_H_