#pragma once
#include "ExceptionOr.h"
#include "RegistrableDomain.h"
#include <wtf/EnumTraits.h>
#include <wtf/IsoMalloc.h>
#include <wtf/UniqueRef.h>
#include <wtf/WallTime.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class LoggedInStatus {
WTF_MAKE_ISO_ALLOCATED_EXPORT(LoggedInStatus, WEBCORE_EXPORT);
public:
static constexpr uint32_t UsernameMaxLength = 64;
static constexpr Seconds TimeToLiveShort { 24_h * 7 };
static constexpr Seconds TimeToLiveLong { 24_h * 90 };
enum class CredentialTokenType : bool { LegacyCookie, HTTPStateToken };
enum class AuthenticationType : uint8_t { WebAuthn, PasswordManager, Unmanaged };
WEBCORE_EXPORT static ExceptionOr<UniqueRef<LoggedInStatus>> create(const RegistrableDomain&, const String& username, CredentialTokenType, AuthenticationType);
WEBCORE_EXPORT static ExceptionOr<UniqueRef<LoggedInStatus>> create(const RegistrableDomain&, const String& username, CredentialTokenType, AuthenticationType, Seconds timeToLive);
WEBCORE_EXPORT void setTimeToLive(Seconds);
WEBCORE_EXPORT bool hasExpired() const;
WEBCORE_EXPORT WallTime expiry() const;
const RegistrableDomain& registrableDomain() const { return m_domain; }
const String& username() const { return m_username; }
CredentialTokenType credentialTokenType() const { return m_tokenType; }
AuthenticationType authenticationType() const { return m_authType; }
WallTime loggedInTime() const { return m_loggedInTime; }
private:
LoggedInStatus(const RegistrableDomain&, const String& username, CredentialTokenType, AuthenticationType, Seconds timeToLive);
RegistrableDomain m_domain;
String m_username;
CredentialTokenType m_tokenType;
AuthenticationType m_authType;
WallTime m_loggedInTime;
Seconds m_timeToLive;
};
}
namespace WTF {
template<> struct EnumTraits<WebCore::LoggedInStatus::AuthenticationType> {
using values = EnumValues<
WebCore::LoggedInStatus::AuthenticationType,
WebCore::LoggedInStatus::AuthenticationType::WebAuthn,
WebCore::LoggedInStatus::AuthenticationType::PasswordManager,
WebCore::LoggedInStatus::AuthenticationType::Unmanaged
>;
};
}