Issues (399)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

tests/DMSDocumentSetTest.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
class DMSDocumentSetTest extends SapphireTest
4
{
5
    protected static $fixture_file = 'dmstest.yml';
6
7
    /**
8
     * Ensure that getDocuments is extensible
9
     */
10 View Code Duplication
    public function testGetDocumentsIsExtensible()
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
11
    {
12
        DMSDocumentSet::add_extension('StubRelatedDocumentExtension');
13
14
        $set = new DMSDocumentSet;
15
        $documents = $set->getDocuments();
16
17
        $this->assertCount(1, $documents);
18
        $this->assertSame('Extended', $documents->first()->Filename);
19
    }
20
21
    /**
22
     * Test that the GridField for documents isn't shown until you've saved the set
23
     */
24
    public function testGridFieldShowsWhenSetIsSaved()
25
    {
26
        $set = DMSDocumentSet::create();
27
28
        // Not in database yet
29
        $fields = $set->getCMSFields();
30
        $this->assertNull($fields->fieldByName('Root.Main.Documents'));
31
        $gridFieldNotice = $fields->fieldByName('Root.Main.GridFieldNotice');
32
        $this->assertNotNull($gridFieldNotice);
33
        $this->assertContains('Managing documents will be available', $gridFieldNotice->getContent());
34
35
        // In the database
36
        $set->Title = 'Testing';
37
        $set->write();
38
        $fields = $set->getCMSFields();
39
        $this->assertNotNull($fields->fieldByName('Root.Main.Documents'));
40
        $this->assertNull($fields->fieldByName('Root.Main.GridFieldNotice'));
41
    }
42
43
    public function testRelations()
44
    {
45
        $s1 = $this->objFromFixture('SiteTree', 's1');
46
        $s2 = $this->objFromFixture('SiteTree', 's2');
47
        $s4 = $this->objFromFixture('SiteTree', 's4');
48
49
        $ds1 = $this->objFromFixture('DMSDocumentSet', 'ds1');
50
        $ds2 = $this->objFromFixture('DMSDocumentSet', 'ds2');
51
        $ds3 = $this->objFromFixture('DMSDocumentSet', 'ds3');
52
53
        $this->assertCount(0, $s4->getDocumentSets(), 'Page 4 has no document sets associated');
54
        $this->assertCount(2, $s1->getDocumentSets(), 'Page 1 has 2 document sets');
55
        $this->assertEquals(array($ds1->ID, $ds2->ID), $s1->getDocumentSets()->column('ID'));
56
    }
57
58
    /**
59
     * Test that various components exist in the GridField config. See {@link DMSDocumentSet::getCMSFields} for context.
60
     */
61
    public function testDocumentGridFieldConfig()
62
    {
63
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
64
        $fields = $set->getCMSFields();
65
        $gridField = $fields->fieldByName('Root.Main.Documents');
66
        $this->assertTrue((bool) $gridField->hasClass('documents'));
67
68
        /** @var GridFieldConfig $config */
69
        $config = $gridField->getConfig();
70
71
        $this->assertNotNull($addNew = $config->getComponentByType('DMSGridFieldAddNewButton'));
72
        $this->assertSame($set->ID, $addNew->getDocumentSetId());
73
74
        if (class_exists('GridFieldPaginatorWithShowAll')) {
75
            $this->assertNotNull($config->getComponentByType('GridFieldPaginatorWithShowAll'));
76
        } else {
77
            $paginator = $config->getComponentByType('GridFieldPaginator');
78
            $this->assertNotNull($paginator);
79
            $this->assertSame(15, $paginator->getItemsPerPage());
80
        }
81
82
        $sortableAssertion = class_exists('GridFieldSortableRows') ? 'assertNotNull' : 'assertNull';
83
        $this->$sortableAssertion($config->getComponentByType('GridFieldSortableRows'));
84
    }
85
86
    /**
87
     * Ensure that the display fields for the documents GridField can be returned
88
     */
89
    public function testGetDocumentDisplayFields()
90
    {
91
        $document = $this->objFromFixture('DMSDocumentSet', 'ds1');
92
        $this->assertInternalType('array', $document->getDocumentDisplayFields());
93
94
        Config::inst()->update('DMSDocument', 'display_fields', array('apple' => 'Apple', 'orange' => 'Orange'));
95
        $displayFields = $document->getDocumentDisplayFields();
96
        $this->assertContains('Apple', $displayFields);
97
        $this->assertContains('Orange', $displayFields);
98
        $this->assertArrayHasKey('ManuallyAdded', $displayFields);
99
        $this->assertContains('Added', $displayFields);
100
    }
101
102
    /**
103
     * Tests to ensure that the callback for formatting ManuallyAdded will return a nice label for the user
104
     */
105
    public function testNiceFormattingForManuallyAddedInGridField()
106
    {
107
        $fieldFormatting = $this->objFromFixture('DMSDocumentSet', 'ds1')
108
            ->getCMSFields()
109
            ->fieldByName('Root.Main.Documents')
110
            ->getConfig()
111
            ->getComponentByType('GridFieldDataColumns')
112
            ->getFieldFormatting();
113
114
        $this->assertArrayHasKey('ManuallyAdded', $fieldFormatting);
115
        $this->assertTrue(is_callable($fieldFormatting['ManuallyAdded']));
116
117
        $this->assertSame('Manually', $fieldFormatting['ManuallyAdded'](1));
118
        $this->assertSame('Query Builder', $fieldFormatting['ManuallyAdded'](0));
119
    }
120
121
    /**
122
     * Test that query fields can be added to the gridfield
123
     */
124
    public function testAddQueryFields()
125
    {
126
        /** @var DMSDocumentSet $set */
127
        $set = $this->objFromFixture('DMSDocumentSet', 'ds6');
128
        /** @var FieldList $fields */
129
        $fields = new FieldList(new TabSet('Root'));
130
        /** @var FieldList $fields */
131
        $set->addQueryFields($fields);
132
        $keyValuePairs = $fields->dataFieldByName('KeyValuePairs');
133
        $this->assertNotNull(
134
            $keyValuePairs,
135
            'addQueryFields() includes KeyValuePairs composite field'
136
        );
137
        $this->assertNotNull(
138
            $keyValuePairs->fieldByName('KeyValuePairs[Title]'),
139
            'addQueryFields() includes KeyValuePairs composite field'
140
        );
141
142
        // Test that the notification field exists
143
        $this->assertNotNull($fields->fieldByName('Root.QueryBuilder.GridFieldNotice'));
144
145
        // Test that Tags__ID field exists
146
        $this->assertContains(
147
            'Tags can be set in the taxonomy area,',
148
            $keyValuePairs->fieldByName('KeyValuePairs[Tags__ID]')->RightTitle()
149
        );
150
    }
151
152
    /**
153
     * Ensure that the "direction" dropdown field has user friendly field labels
154
     */
155
    public function testQueryBuilderDirectionFieldHasFriendlyLabels()
156
    {
157
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
158
159
        $dropdown = $fields->fieldByName('Root.QueryBuilder')->FieldList()->filterByCallback(function ($field) {
160
            return $field instanceof FieldGroup;
161
        })->first()->fieldByName('SortByDirection');
162
163
        $this->assertInstanceOf('DropdownField', $dropdown);
164
        $source = $dropdown->getSource();
165
        $this->assertContains('Ascending', $source);
166
        $this->assertContains('Descending', $source);
167
    }
168
169
    /**
170
     * Ensure that the configurable shortcode handler key is a hidden field in the CMS
171
     */
172
    public function testShortcodeHandlerKeyFieldExists()
173
    {
174
        Config::inst()->update('DMS', 'shortcode_handler_key', 'unit-test');
175
176
        $set = DMSDocumentSet::create(array('Title' => 'TestSet'));
177
        $set->write();
178
179
        $fields = $set->getCMSFields();
180
        $field = $fields->fieldByName('Root.Main.DMSShortcodeHandlerKey');
181
182
        $this->assertInstanceOf('HiddenField', $field);
183
        $this->assertSame('unit-test', $field->Value());
184
    }
185
186
    /**
187
     * Ensure that if the module is available, the orderable rows GridField component is added
188
     */
189
    public function testDocumentsAreOrderable()
190
    {
191
        if (!class_exists('GridFieldSortableRows')) {
192
            $this->markTestSkipped('Test requires undefinedoffset/sortablegridfield installed.');
193
        }
194
195
        $fields = $this->objFromFixture('DMSDocumentSet', 'ds1')->getCMSFields();
196
197
        $gridField = $fields->fieldByName('Root.Main.Documents');
198
        $this->assertInstanceOf('GridField', $gridField);
199
200
        $this->assertInstanceOf(
201
            'GridFieldSortableRows',
202
            $gridField->getConfig()->getComponentByType('GridFieldSortableRows')
203
        );
204
    }
205
206
    /**
207
     * Test that extra documents are added after write
208
     */
209
    public function testSaveLinkedDocuments()
210
    {
211
        /** @var DMSDocumentSet $set */
212
        $set = $this->objFromFixture('DMSDocumentSet', 'dsSaveLinkedDocuments');
213
        // Assert initially docs
214
        $this->assertEquals(1, $set->getDocuments()->count(), 'Set has 1 document');
215
        // Now apply the query and see if 2 extras were added with CreatedByID filter
216
        $set->KeyValuePairs = '{"Filename":"extradoc3"}';
217
        $set->saveLinkedDocuments();
218
        $this->assertEquals(2, $set->getDocuments()->count(), 'Set has 2 documents');
219
    }
220
221
    /**
222
     * Tests that an exception is thrown if no title entered for a DMSDocumentSet.
223
     * @expectedException ValidationException
224
     */
225
    public function testExceptionOnNoTitleGiven()
226
    {
227
        DMSDocumentSet::create(array('Title' => ''))->write();
228
    }
229
230
    /**
231
     * Ensure that when editing in a page context that the "page" field is removed, or is labelled "Show on page"
232
     * otherwise
233
     */
234
    public function testPageFieldRemovedWhenEditingInPageContext()
235
    {
236
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
237
238
        $fields = $set->getCMSFields();
239
        $this->assertInstanceOf('DropdownField', $fields->fieldByName('Root.Main.PageID'));
240
241
        $pageController = new CMSPageEditController;
242
        $pageController->pushCurrent();
243
244
        $fields = $set->getCMSFields();
245
        $this->assertNull($fields->fieldByName('Root.Main.PageID'));
246
    }
247
248
    /**
249
     * Tests all crud permissions
250
     */
251
    public function testPermissions()
252
    {
253
        if ($member = Member::currentUser()) {
254
            $member->logout();
255
        }
256
257
        $set = $this->objFromFixture('DMSDocumentSet', 'ds1');
258
259
        $this->assertFalse($set->canCreate());
260
        $this->assertFalse($set->canDelete());
261
        $this->assertFalse($set->canEdit());
262
        $this->assertFalse($set->canView());
263
264
        $this->logInWithPermission('CMS_ACCESS_DMSDocumentAdmin');
265
        $this->assertTrue($set->canCreate());
266
        $this->assertTrue($set->canDelete());
267
        $this->assertTrue($set->canEdit());
268
        $this->assertTrue($set->canView());
269
    }
270
}
271