Blame view

sources/apps/files_encryption/lib/session.php 5.53 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
36
37
38
39
40
41
42
43
44
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  	/**
  	 * @brief if session is started, check if ownCloud key pair is set up, if not create it
  	 * @param \OC_FilesystemView $view
  	 *
  	 * @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');
  
  		}
  
  		$publicShareKeyId = \OC_Appconfig::getValue('files_encryption', 'publicShareKeyId');
  
  		if ($publicShareKeyId === null) {
  			$publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
  			\OC_Appconfig::setValue('files_encryption', 'publicShareKeyId', $publicShareKeyId);
  		}
  
  		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
95
  			$privateKey = Crypt::decryptPrivateKey($encryptedKey, '');
03e52840d   Kload   Init
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  			$this->setPublicSharePrivateKey($privateKey);
  
  			\OC_FileProxy::$enabled = $proxyStatus;
  		}
  	}
  
  	/**
  	 * @brief Sets user private key to session
  	 * @param string $privateKey
  	 * @return bool
  	 *
  	 * @note this should only be set on login
  	 */
  	public function setPrivateKey($privateKey) {
31b7f2792   Kload   Upgrade to ownclo...
110
  		\OC::$session->set('privateKey', $privateKey);
03e52840d   Kload   Init
111
112
113
114
115
116
  
  		return true;
  
  	}
  
  	/**
31b7f2792   Kload   Upgrade to ownclo...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
  	 * @brief Sets status of encryption app
  	 * @param string $init  INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED
  	 * @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;
  
  	}
  
  
  	/**
  	 * @brief Gets status if we already tried to initialize the encryption app
  	 * @returns init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED
  	 *
  	 * @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;
  		}
  	}
  
  	/**
03e52840d   Kload   Init
147
148
149
150
151
  	 * @brief Gets user or public share private key from session
  	 * @returns string $privateKey The user's plaintext private key
  	 *
  	 */
  	public function getPrivateKey() {
03e52840d   Kload   Init
152
153
154
155
  		// 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...
156
157
  			if (!is_null(\OC::$session->get('privateKey'))) {
  				return \OC::$session->get('privateKey');
03e52840d   Kload   Init
158
159
160
161
162
163
164
165
166
167
168
169
  			} else {
  				return false;
  			}
  		}
  	}
  
  	/**
  	 * @brief Sets public user private key to session
  	 * @param string $privateKey
  	 * @return bool
  	 */
  	public function setPublicSharePrivateKey($privateKey) {
31b7f2792   Kload   Upgrade to ownclo...
170
  		\OC::$session->set('publicSharePrivateKey', $privateKey);
03e52840d   Kload   Init
171
172
173
174
175
176
177
178
179
180
181
  
  		return true;
  
  	}
  
  	/**
  	 * @brief Gets public share private key from session
  	 * @returns string $privateKey
  	 *
  	 */
  	public function getPublicSharePrivateKey() {
31b7f2792   Kload   Upgrade to ownclo...
182
183
  		if (!is_null(\OC::$session->get('publicSharePrivateKey'))) {
  			return \OC::$session->get('publicSharePrivateKey');
03e52840d   Kload   Init
184
185
186
  		} else {
  			return false;
  		}
03e52840d   Kload   Init
187
188
189
190
191
192
193
194
195
  	}
  
  
  	/**
  	 * @brief Sets user legacy key to session
  	 * @param $legacyKey
  	 * @return bool
  	 */
  	public function setLegacyKey($legacyKey) {
31b7f2792   Kload   Upgrade to ownclo...
196
  		\OC::$session->set('legacyKey', $legacyKey);
03e52840d   Kload   Init
197
198
199
200
201
202
203
204
205
206
  
  		return true;
  	}
  
  	/**
  	 * @brief Gets user legacy key from session
  	 * @returns string $legacyKey The user's plaintext legacy key
  	 *
  	 */
  	public function getLegacyKey() {
31b7f2792   Kload   Upgrade to ownclo...
207
  		if (!is_null(\OC::$session->get('legacyKey'))) {
03e52840d   Kload   Init
208

31b7f2792   Kload   Upgrade to ownclo...
209
  			return \OC::$session->get('legacyKey');
03e52840d   Kload   Init
210
211
212
213
214
215
216
217
218
219
  
  		} else {
  
  			return false;
  
  		}
  
  	}
  
  }