Blame view

sources/apps/files_encryption/tests/stream.php 6.17 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  <?php
  /**
   * ownCloud
   *
   * @author Florin Peter
   * @copyright 2013 Florin Peter <owncloud@florin-peter.de>
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
   * License as published by the Free Software Foundation; either
   * version 3 of the License, or any later version.
   *
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
   *
   * You should have received a copy of the GNU Affero General Public
   * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
   *
   */
31b7f2792   Kload   Upgrade to ownclo...
22
23
24
25
26
27
28
29
  require_once __DIR__ . '/../../../lib/base.php';
  require_once __DIR__ . '/../lib/crypt.php';
  require_once __DIR__ . '/../lib/keymanager.php';
  require_once __DIR__ . '/../lib/proxy.php';
  require_once __DIR__ . '/../lib/stream.php';
  require_once __DIR__ . '/../lib/util.php';
  require_once __DIR__ . '/../appinfo/app.php';
  require_once __DIR__ . '/util.php';
03e52840d   Kload   Init
30
31
32
33
34
  
  use OCA\Encryption;
  
  /**
   * Class Test_Encryption_Stream
6d9380f96   Cédric Dupont   Update sources OC...
35
   * this class provide basic stream tests
03e52840d   Kload   Init
36
37
38
39
40
41
42
43
   */
  class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase {
  
  	const TEST_ENCRYPTION_STREAM_USER1 = "test-stream-user1";
  
  	public $userId;
  	public $pass;
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
44
  	 * @var \OC\Files\View
03e52840d   Kload   Init
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  	 */
  	public $view;
  	public $dataShort;
  	public $stateFilesTrashbin;
  
  	public static function setUpBeforeClass() {
  		// reset backend
  		\OC_User::clearBackends();
  		\OC_User::useBackend('database');
  
  		// Filesystem related hooks
  		\OCA\Encryption\Helper::registerFilesystemHooks();
  
  		// clear and register hooks
  		\OC_FileProxy::clearProxies();
  		\OC_FileProxy::register(new OCA\Encryption\Proxy());
  
  		// create test user
  		\Test_Encryption_Util::loginHelper(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1, true);
  	}
  
  	function setUp() {
  		// set user id
  		\OC_User::setUserId(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1);
  		$this->userId = \Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1;
  		$this->pass = \Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1;
  
  		// init filesystem view
6d9380f96   Cédric Dupont   Update sources OC...
73
  		$this->view = new \OC\Files\View('/');
03e52840d   Kload   Init
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  
  		// init short data
  		$this->dataShort = 'hats';
  
  		// remember files_trashbin state
  		$this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
  
  		// we don't want to tests with app files_trashbin enabled
  		\OC_App::disable('files_trashbin');
  	}
  
  	function tearDown() {
  		// reset app files_trashbin
  		if ($this->stateFilesTrashbin) {
  			OC_App::enable('files_trashbin');
  		}
  		else {
  			OC_App::disable('files_trashbin');
  		}
  	}
  
  	public static function tearDownAfterClass() {
  		// cleanup test user
  		\OC_User::deleteUser(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1);
  	}
  
  	function testStreamOptions() {
a293d369c   Kload   Update sources to...
101
  		$filename = '/tmp-' . uniqid();
03e52840d   Kload   Init
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  		$view = new \OC\Files\View('/' . $this->userId . '/files');
  
  		// Save short data as encrypted file using stream wrapper
  		$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
  
  		// Test that data was successfully written
  		$this->assertTrue(is_int($cryptedFile));
  
  		$handle = $view->fopen($filename, 'r');
  
  		// check if stream is at position zero
  		$this->assertEquals(0, ftell($handle));
  
  		// set stream options
  		$this->assertTrue(flock($handle, LOCK_SH));
  		$this->assertTrue(flock($handle, LOCK_UN));
  
  		// tear down
  		$view->unlink($filename);
  	}
  
  	function testStreamSetBlocking() {
a293d369c   Kload   Update sources to...
124
  		$filename = '/tmp-' . uniqid();
03e52840d   Kload   Init
125
126
127
128
129
130
131
132
133
134
135
136
  		$view = new \OC\Files\View('/' . $this->userId . '/files');
  
  		// Save short data as encrypted file using stream wrapper
  		$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
  
  		// Test that data was successfully written
  		$this->assertTrue(is_int($cryptedFile));
  
  		$handle = $view->fopen($filename, 'r');
  
  		// set stream options
  		$this->assertTrue(stream_set_blocking($handle, 1));
6d9380f96   Cédric Dupont   Update sources OC...
137
  		fclose($handle);
03e52840d   Kload   Init
138
139
140
  		// tear down
  		$view->unlink($filename);
  	}
31b7f2792   Kload   Upgrade to ownclo...
141
142
143
  	/**
  	 * @medium
  	 */
03e52840d   Kload   Init
144
  	function testStreamSetTimeout() {
a293d369c   Kload   Update sources to...
145
  		$filename = '/tmp-' . uniqid();
03e52840d   Kload   Init
146
147
148
149
150
151
152
153
154
155
156
157
  		$view = new \OC\Files\View('/' . $this->userId . '/files');
  
  		// Save short data as encrypted file using stream wrapper
  		$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
  
  		// Test that data was successfully written
  		$this->assertTrue(is_int($cryptedFile));
  
  		$handle = $view->fopen($filename, 'r');
  
  		// set stream options
  		$this->assertFalse(stream_set_timeout($handle, 1));
6d9380f96   Cédric Dupont   Update sources OC...
158
  		fclose($handle);
03e52840d   Kload   Init
159
160
161
162
163
  		// tear down
  		$view->unlink($filename);
  	}
  
  	function testStreamSetWriteBuffer() {
a293d369c   Kload   Update sources to...
164
  		$filename = '/tmp-' . uniqid();
03e52840d   Kload   Init
165
166
167
168
169
170
171
172
173
174
175
176
  		$view = new \OC\Files\View('/' . $this->userId . '/files');
  
  		// Save short data as encrypted file using stream wrapper
  		$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
  
  		// Test that data was successfully written
  		$this->assertTrue(is_int($cryptedFile));
  
  		$handle = $view->fopen($filename, 'r');
  
  		// set stream options
  		$this->assertEquals(0, stream_set_write_buffer($handle, 1024));
6d9380f96   Cédric Dupont   Update sources OC...
177
  		fclose($handle);
03e52840d   Kload   Init
178
179
180
  		// tear down
  		$view->unlink($filename);
  	}
837968727   Kload   [enh] Upgrade to ...
181
182
183
  
  	/**
  	 * @medium
6d9380f96   Cédric Dupont   Update sources OC...
184
  	 * test if stream wrapper can read files outside from the data folder
837968727   Kload   [enh] Upgrade to ...
185
186
  	 */
  	function testStreamFromLocalFile() {
6d9380f96   Cédric Dupont   Update sources OC...
187
  		$filename = '/' . $this->userId . '/files/' . 'tmp-' . uniqid().'.txt';
837968727   Kload   [enh] Upgrade to ...
188

6d9380f96   Cédric Dupont   Update sources OC...
189
  		$tmpFilename = "/tmp/" . uniqid() . ".txt";
837968727   Kload   [enh] Upgrade to ...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
  
  		// write an encrypted file
  		$cryptedFile = $this->view->file_put_contents($filename, $this->dataShort);
  
  		// Test that data was successfully written
  		$this->assertTrue(is_int($cryptedFile));
  
  		// create a copy outside of the data folder in /tmp
  		$proxyStatus = \OC_FileProxy::$enabled;
  		\OC_FileProxy::$enabled = false;
  		$encryptedContent = $this->view->file_get_contents($filename);
  		\OC_FileProxy::$enabled = $proxyStatus;
  
  		file_put_contents($tmpFilename, $encryptedContent);
  
  		\OCA\Encryption\Helper::addTmpFileToMapper($tmpFilename, $filename);
  
  		// try to read the file from /tmp
  		$handle = fopen("crypt://".$tmpFilename, "r");
  		$contentFromTmpFile = stream_get_contents($handle);
  
  		// check if it was successful
  		$this->assertEquals($this->dataShort, $contentFromTmpFile);
  
  		// clean up
  		unlink($tmpFilename);
  		$this->view->unlink($filename);
  
  	}
31b7f2792   Kload   Upgrade to ownclo...
219
  }