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