PaymentSession.cpp [plain text]
#include "config.h"
#include "PaymentSession.h"
#if ENABLE(APPLE_PAY)
#include "Document.h"
#include "DocumentLoader.h"
#include "SecurityOrigin.h"
namespace WebCore {
static bool isSecure(DocumentLoader& documentLoader)
{
if (!documentLoader.response().url().protocolIs("https"))
return false;
if (!documentLoader.response().certificateInfo() || documentLoader.response().certificateInfo()->containsNonRootSHA1SignedCertificate())
return false;
return true;
}
ExceptionOr<void> PaymentSession::canCreateSession(Document& document)
{
if (!document.frame())
return Exception { InvalidAccessError, "Trying to start an Apple Pay session from an inactive document." };
if (!isSecure(*document.loader()))
return Exception { InvalidAccessError, "Trying to start an Apple Pay session from an insecure document." };
auto& topDocument = document.topDocument();
if (&document != &topDocument) {
auto& topOrigin = topDocument.topOrigin();
if (!document.securityOrigin().isSameSchemeHostPort(topOrigin))
return Exception { InvalidAccessError, "Trying to start an Apple Pay session from a document with an different security origin than its top-level frame." };
for (auto* ancestorDocument = document.parentDocument(); ancestorDocument != &topDocument; ancestorDocument = ancestorDocument->parentDocument()) {
if (!isSecure(*ancestorDocument->loader()))
return Exception { InvalidAccessError, "Trying to start an Apple Pay session from a document with an insecure parent frame." };
if (!ancestorDocument->securityOrigin().isSameSchemeHostPort(topOrigin))
return Exception { InvalidAccessError, "Trying to start an Apple Pay session from a document with an different security origin than its top-level frame." };
}
}
return { };
}
}
#endif // ENABLE(APPLE_PAY)