14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <string> 6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_system.h" 8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "public/fpdf_edit.h" 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "public/fpdf_save.h" 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "public/fpdfview.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "testing/embedder_test.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "testing/gtest/include/gtest/gtest.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDFSecurityHandlerEmbeddertest : public EmbedderTest {}; 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, Unencrypted) { 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(OpenDocument("about_blank.pdf")); 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document())); 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, UnencryptedWithPassword) { 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(OpenDocumentWithPassword("about_blank.pdf", "foobar")); 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document())); 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, NoPassword) { 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(OpenDocument("encrypted.pdf")); 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, BadPassword) { 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_FALSE(OpenDocumentWithPassword("encrypted.pdf", "tiger")); 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, UserPassword) { 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(OpenDocumentWithPassword("encrypted.pdf", "1234")); 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0xFFFFF2C0, FPDF_GetDocPermissions(document())); 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, OwnerPassword) { 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(OpenDocumentWithPassword("encrypted.pdf", "5678")); 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, PasswordAfterGenerateSave) { 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#if _FX_PLATFORM_ == _FX_PLATFORM_LINUX_ 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char md5[] = "7048dca58e2ed8f93339008b91e4eb4e"; 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#elif _FX_PLATFORM_ == _FX_PLATFORM_APPLE_ 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char md5[] = "6951b6c9891dfe0332a5b1983e484400"; 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#else 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char md5[] = "a5dde3c6c37b8716b9b369a03752a728"; 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#endif // _FX_PLATFORM_ == _FX_PLATFORM_LINUX_ 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(OpenDocumentWithOptions("encrypted.pdf", "5678", true)); 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDF_PAGE page = LoadPage(0); 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(page); 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(10, 10, 20, 20); 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(red_rect); 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_TRUE(FPDFPath_SetFillColor(red_rect, 255, 0, 0, 255)); 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDFPage_InsertObject(page, red_rect); 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDF_BITMAP page_bitmap = RenderPage(page); 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CompareBitmap(page_bitmap, 612, 792, md5); 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDFBitmap_Destroy(page_bitmap); 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_TRUE(FPDFPage_GenerateContent(page)); 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann SetWholeFileAvailable(); 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann UnloadPage(page); 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::string new_file = GetString(); 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDF_FILEACCESS file_access; 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann memset(&file_access, 0, sizeof(file_access)); 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann file_access.m_FileLen = new_file.size(); 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann file_access.m_GetBlock = GetBlockFromString; 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann file_access.m_Param = &new_file; 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_FALSE(FPDF_LoadCustomDocument(&file_access, nullptr)); 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann struct { 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* password; 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const unsigned long permissions; 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } tests[] = {{"1234", 0xFFFFF2C0}, {"5678", 0xFFFFFFFC}}; 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (const auto& test : tests) { 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann OpenSavedDocument(test.password); 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FPDF_PAGE page = LoadSavedPage(0); 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann VerifySavedRendering(page, 612, 792, md5); 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(test.permissions, FPDF_GetDocPermissions(m_SavedDocument)); 87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CloseSavedPage(page); 89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CloseSavedDocument(); 90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, NoPasswordVersion5) { 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_FALSE(OpenDocument("bug_644.pdf")); 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, BadPasswordVersion5) { 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_FALSE(OpenDocumentWithPassword("bug_644.pdf", "tiger")); 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, OwnerPasswordVersion5) { 102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(OpenDocumentWithPassword("bug_644.pdf", "a")); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(CPDFSecurityHandlerEmbeddertest, UserPasswordVersion5) { 107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_TRUE(OpenDocumentWithPassword("bug_644.pdf", "b")); 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 110