Browse Source

add public link share key to file if it was shared as public link

tags/v8.1.0alpha1
Bjoern Schiessle 9 years ago
parent
commit
24c6604388

+ 6
- 0
apps/encryption/lib/crypto/encryption.php View File

@@ -220,9 +220,15 @@ class Encryption implements IEncryptionModule {
*/
public function update($path, $uid, $accessList) {
$fileKey = $this->keymanager->getFileKey($path, $uid);
$publicKeys = array();
foreach ($accessList['users'] as $user) {
$publicKeys[$user] = $this->keymanager->getPublicKey($user);
}

if (!empty($accessList['public'])) {
$publicKeys[$this->keymanager->getPublicShareKeyId()] = $this->keymanager->getPublicShareKey();
}

$encryptedFileKey = $this->crypt->multiKeyEncrypt($fileKey, $publicKeys);

$this->keymanager->deleteAllFileKeys($path);

+ 43
- 2
apps/encryption/lib/keymanager.php View File

@@ -95,7 +95,13 @@ class KeyManager {
* @param \OCP\ISession $session
* @param ILogger $log
*/
public function __construct(IStorage $keyStorage, Crypt $crypt, IConfig $config, IUserSession $userSession, ISession $session, ILogger $log) {
public function __construct(
IStorage $keyStorage,
Crypt $crypt,
IConfig $config,
IUserSession $userSession,
ISession $session,
ILogger $log) {

self::$session = $session;
$this->keyStorage = $keyStorage;
@@ -105,6 +111,28 @@ class KeyManager {
'recoveryKeyId');
$this->publicShareKeyId = $this->config->getAppValue('encryption',
'publicShareKeyId');

if (empty($this->publicShareKeyId)) {
$this->publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
$this->config->setAppValue('encryption', 'publicShareKeyId', $this->publicShareKeyId);

$keypair = $this->crypt->createKeyPair();

// Save public key
$this->keyStorage->setSystemUserKey(
$this->publicShareKeyId . '.publicKey',
$keypair['publicKey']);

// Encrypt private key empty passphrase
$encryptedKey = $this->crypt->symmetricEncryptFileContent($keypair['privateKey'], '');
if ($encryptedKey) {
$this->keyStorage->setSystemUserKey($this->publicShareKeyId . '.privateKey', $encryptedKey);
} else {
$this->log->error('Could not create public share keys');
}

}

$this->keyId = $userSession && $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : false;
$this->log = $log;
}
@@ -259,7 +287,7 @@ class KeyManager {
$encryptedFileKey = $this->keyStorage->getFileKey($path,
$this->fileKeyId);
$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->session->get('privateKey');
$privateKey = self::$session->get('privateKey');

if ($encryptedFileKey && $shareKey && $privateKey) {
$key = $this->crypt->multiKeyDecrypt($encryptedFileKey,
@@ -384,6 +412,19 @@ class KeyManager {
throw new PublicKeyMissingException();
}

public function getPublicShareKeyId() {
return $this->publicShareKeyId;
}

/**
* get public key for public link shares
*
* @return string
*/
public function getPublicShareKey() {
return $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.publicKey');
}

/**
* @param $purpose
* @param bool $timestamp

+ 1
- 1
apps/encryption/lib/users/setup.php View File

@@ -36,7 +36,7 @@ class Setup extends \OCA\Encryption\Setup {
parent::__construct($logger, $userSession);
$this->crypt = $crypt;
$this->keyManager = $keyManager;
}
}

/**
* @param $uid userid

+ 24
- 2
apps/encryption/settings/settings-personal.php View File

@@ -10,13 +10,35 @@
\OC_Util::addStyle('encryption', 'settings-personal');

$tmpl = new OCP\Template('encryption', 'settings-personal');
$crypt = new \OCA\Encryption\Crypto\Crypt(
\OC::$server->getLogger(),
\OC::$server->getUserSession(),
\OC::$server->getConfig());
$keymanager = new \OCA\Encryption\KeyManager(
\OC::$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
$crypt,
\OC::$server->getConfig(),
\OC::$server->getUserSession(),
\OC::$server->getSession(),
\OC::$server->getLogger());

$user = \OCP\User::getUser();

$view = new \OC\Files\View('/');
$util = new \OCA\Files_Encryption\Util($view, $user);

$util = new \OCA\Encryption\Util(
new \OC\Files\View(),
new \OC\Files\Filesystem(),
$crypt,
$keymanager,
\OC::$server->getLogger(),
\OC::$server->getUserSession(),
\OC::$server->getConfig());

$session = new \OCA\Files_Encryption\Session($view);
$session = \OC::$server->getSession();

$privateKeySet = $session->getPrivateKey() !== false;
$privateKeySet = $session->get('privateKey') !== false;
// did we tried to initialize the keys for this session?
$initialized = $session->getInitialized();


Loading…
Cancel
Save