Blame view

sources/apps/files_encryption/lib/session.php 5.77 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
22
23
24
25
26
27
28
29
30
31
  <?php
  /**
   * ownCloud
   *
   * @author Sam Tuke
   * @copyright 2012 Sam Tuke samtuke@owncloud.com
   *
   * 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/>.
   *
   */
  
  namespace OCA\Encryption;
  
  /**
   * Class for handling encryption related session data
   */
  
  class Session {
  
  	private $view;
31b7f2792   Kload   Upgrade to ownclo...
32
33
34
  	const NOT_INITIALIZED = '0';
  	const INIT_EXECUTED = '1';
  	const INIT_SUCCESSFUL = '2';
03e52840d   Kload   Init
35
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
36
37
  	 * if session is started, check if ownCloud key pair is set up, if not create it
  	 * @param \OC\Files\View $view
03e52840d   Kload   Init
38
39
40
41
42
43
44
45
46
47
48
49
  	 *
  	 * @note The ownCloud key pair is used to allow public link sharing even if encryption is enabled
  	 */
  	public function __construct($view) {
  
  		$this->view = $view;
  
  		if (!$this->view->is_dir('owncloud_private_key')) {
  
  			$this->view->mkdir('owncloud_private_key');
  
  		}
6d9380f96   Cédric Dupont   Update sources OC...
50
51
52
  		$appConfig = \OC::$server->getAppConfig();
  
  		$publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId');
03e52840d   Kload   Init
53
54
55
  
  		if ($publicShareKeyId === null) {
  			$publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
6d9380f96   Cédric Dupont   Update sources OC...
56
  			$appConfig->setValue('files_encryption', 'publicShareKeyId', $publicShareKeyId);
03e52840d   Kload   Init
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  		}
  
  		if (
  			!$this->view->file_exists("/public-keys/" . $publicShareKeyId . ".public.key")
  			|| !$this->view->file_exists("/owncloud_private_key/" . $publicShareKeyId . ".private.key")
  		) {
  
  			$keypair = Crypt::createKeypair();
  
  			// Disable encryption proxy to prevent recursive calls
  			$proxyStatus = \OC_FileProxy::$enabled;
  			\OC_FileProxy::$enabled = false;
  
  			// Save public key
  
  			if (!$view->is_dir('/public-keys')) {
  				$view->mkdir('/public-keys');
  			}
  
  			$this->view->file_put_contents('/public-keys/' . $publicShareKeyId . '.public.key', $keypair['publicKey']);
  
  			// Encrypt private key empty passphrase
  			$encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], '');
  
  			// Save private key
  			$this->view->file_put_contents(
  				'/owncloud_private_key/' . $publicShareKeyId . '.private.key', $encryptedPrivateKey);
  
  			\OC_FileProxy::$enabled = $proxyStatus;
  
  		}
  
  		if (\OCA\Encryption\Helper::isPublicAccess()) {
  			// Disable encryption proxy to prevent recursive calls
  			$proxyStatus = \OC_FileProxy::$enabled;
  			\OC_FileProxy::$enabled = false;
  
  			$encryptedKey = $this->view->file_get_contents(
  				'/owncloud_private_key/' . $publicShareKeyId . '.private.key');
03e52840d   Kload   Init
96
  			$privateKey = Crypt::decryptPrivateKey($encryptedKey, '');
03e52840d   Kload   Init
97
  			$this->setPublicSharePrivateKey($privateKey);
6d9380f96   Cédric Dupont   Update sources OC...
98
  			$this->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
03e52840d   Kload   Init
99
100
101
102
103
  			\OC_FileProxy::$enabled = $proxyStatus;
  		}
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
104
  	 * Sets user private key to session
03e52840d   Kload   Init
105
106
107
108
109
110
  	 * @param string $privateKey
  	 * @return bool
  	 *
  	 * @note this should only be set on login
  	 */
  	public function setPrivateKey($privateKey) {
31b7f2792   Kload   Upgrade to ownclo...
111
  		\OC::$session->set('privateKey', $privateKey);
03e52840d   Kload   Init
112
113
114
115
116
117
  
  		return true;
  
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
118
119
  	 * Sets status of encryption app
  	 * @param string $init INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
31b7f2792   Kload   Upgrade to ownclo...
120
121
122
123
124
125
126
127
128
129
130
  	 * @return bool
  	 *
  	 * @note this doesn not indicate of the init was successful, we just remeber the try!
  	 */
  	public function setInitialized($init) {
  
  		\OC::$session->set('encryptionInitialized', $init);
  
  		return true;
  
  	}
a293d369c   Kload   Update sources to...
131
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
132
  	 * remove encryption keys and init status from session
a293d369c   Kload   Update sources to...
133
134
135
136
137
  	 */
  	public function closeSession() {
  		\OC::$session->remove('encryptionInitialized');
  		\OC::$session->remove('privateKey');
  	}
31b7f2792   Kload   Upgrade to ownclo...
138
139
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
140
141
  	 * Gets status if we already tried to initialize the encryption app
  	 * @return string init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
31b7f2792   Kload   Upgrade to ownclo...
142
143
144
145
146
147
148
149
150
151
152
153
  	 *
  	 * @note this doesn not indicate of the init was successful, we just remeber the try!
  	 */
  	public function getInitialized() {
  		if (!is_null(\OC::$session->get('encryptionInitialized'))) {
  			return \OC::$session->get('encryptionInitialized');
  		} else {
  			return self::NOT_INITIALIZED;
  		}
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
154
155
  	 * Gets user or public share private key from session
  	 * @return string $privateKey The user's plaintext private key
03e52840d   Kload   Init
156
157
158
  	 *
  	 */
  	public function getPrivateKey() {
03e52840d   Kload   Init
159
160
161
162
  		// return the public share private key if this is a public access
  		if (\OCA\Encryption\Helper::isPublicAccess()) {
  			return $this->getPublicSharePrivateKey();
  		} else {
31b7f2792   Kload   Upgrade to ownclo...
163
164
  			if (!is_null(\OC::$session->get('privateKey'))) {
  				return \OC::$session->get('privateKey');
03e52840d   Kload   Init
165
166
167
168
169
170
171
  			} else {
  				return false;
  			}
  		}
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
172
  	 * Sets public user private key to session
03e52840d   Kload   Init
173
174
175
176
  	 * @param string $privateKey
  	 * @return bool
  	 */
  	public function setPublicSharePrivateKey($privateKey) {
31b7f2792   Kload   Upgrade to ownclo...
177
  		\OC::$session->set('publicSharePrivateKey', $privateKey);
03e52840d   Kload   Init
178
179
180
181
182
183
  
  		return true;
  
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
184
185
  	 * Gets public share private key from session
  	 * @return string $privateKey
03e52840d   Kload   Init
186
187
188
  	 *
  	 */
  	public function getPublicSharePrivateKey() {
31b7f2792   Kload   Upgrade to ownclo...
189
190
  		if (!is_null(\OC::$session->get('publicSharePrivateKey'))) {
  			return \OC::$session->get('publicSharePrivateKey');
03e52840d   Kload   Init
191
192
193
  		} else {
  			return false;
  		}
03e52840d   Kload   Init
194
195
196
197
  	}
  
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
198
199
  	 * Sets user legacy key to session
  	 * @param string $legacyKey
03e52840d   Kload   Init
200
201
202
  	 * @return bool
  	 */
  	public function setLegacyKey($legacyKey) {
31b7f2792   Kload   Upgrade to ownclo...
203
  		\OC::$session->set('legacyKey', $legacyKey);
03e52840d   Kload   Init
204
205
206
207
208
  
  		return true;
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
209
210
  	 * Gets user legacy key from session
  	 * @return string $legacyKey The user's plaintext legacy key
03e52840d   Kload   Init
211
212
213
  	 *
  	 */
  	public function getLegacyKey() {
31b7f2792   Kload   Upgrade to ownclo...
214
  		if (!is_null(\OC::$session->get('legacyKey'))) {
03e52840d   Kload   Init
215

31b7f2792   Kload   Upgrade to ownclo...
216
  			return \OC::$session->get('legacyKey');
03e52840d   Kload   Init
217
218
219
220
221
222
223
224
225
226
  
  		} else {
  
  			return false;
  
  		}
  
  	}
  
  }