*
* This file is part of the ElggPG plugin for Elgg.
*
* ElggPG is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* ElggPG 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 program. If not, see
* .
*/
putenv("GNUPGHOME=" . elggpg_get_gpg_home());
function elggpg_get_gpg_home() {
// try to find location of settings from environment file,
// which means the gpg directory goes at the same level.
$elgg_config = getenv("elgg_config");
if ($elgg_config && is_dir(dirname($elgg_config)."/gpg")) {
return dirname($elgg_config)."/gpg";
}
// otherwise create a gpg folder at the data folder
// and store the keys there
$gpg_path = elgg_get_data_path() . "gpg/";
if (!file_exists($gpg_path)) {
mkdir($gpg_path);
}
return $gpg_path;
}
function elggpg_import_key($public_key, $user) {
$gpg = new gnupg();
$info = $gpg->import($public_key);
$new_fp = $info['fingerprint'];
$user_fp = current(elgg_get_metadata(array(
'guid' => $user->guid,
'metadata_name' => 'openpgp_publickey',
)));
$access_id = ACCESS_LOGGED_IN;
if ($user_fp && $user_fp->value != $new_fp) {
update_metadata($user_fp->id, $user_fp->name, $new_fp, 'text', $user->guid, $access_id);
$info['imported'] = 1;
} elseif (!$user_fp) {
create_metadata($user->guid, "openpgp_publickey", $new_fp, 'text', $user->guid, $access_id);
$info['imported'] = 1;
}
$info['key_id'] = elggpg_fp2keyid($new_fp);
return $info;
}
function elggpg_fp2keyid($fp) {
return substr($fp, count($fp)-17, 16);
}
function elggpg_import_report($info) {
$yes = elgg_echo('option:yes');
$no = elgg_echo('option:no');
$search = "\\n";
$replace = "
";
return str_replace($search, $replace, elgg_echo("elggpg:import:report", array(
$info['imported'] ? $yes : $no,
$info['unchanged'] ? $yes : $no,
$info['newuserids'] ? $yes : $no,
$info['newsubkeys'] ? $yes : $no,
$info['secretimported'] ? $yes : $no,
$info['secretunchanged'] ? $yes : $no,
$info['newsignatures'] ? $yes : $no,
$info['skippedkeys'] ? $yes : $no,
)));
}
function elggpg_export_key($user) {
$gpg = new gnupg();
return $gpg->export($user->openpgp_publickey);
}
function elggpg_haskey($user) {
return $user->openpgp_publickey;
}
function elggpg_keyinfo($user) {
$gnupg = new gnupg();
$fingerprint = $user->openpgp_publickey;
if (!$fingerprint) {
return false;
}
try {
$info = $gnupg->keyinfo($fingerprint);
} catch (Exception $e) {
return false;
}
$simple_info = array(
'name' => $info[0]['uids'][0]['name'],
'comment' => $info[0]['uids'][0]['comment'],
'email' => $info[0]['uids'][0]['email'],
'fingerprint' => $info[0]['subkeys'][0]['fingerprint'],
'subkeys' => array(),
);
if (strlen($simple_info['fingerprint']) < 1) {
return false;
}
foreach ($info[0]['subkeys'] as $subkey) {
if ($subkey['can_encrypt']) {
$type = 'encrypt';
}
if ($subkey['can_sign']) {
$type .= 'sign';
}
$simple_info['subkeys'][] = array(
'keyid' => $subkey['keyid'],
'type' => $type,
'created' => $subkey['timestamp'],
'expires' => $subkey['expires'],
);
}
return $simple_info;
}
function elggpg_delete_key($user) {
if (!$user->openpgp_publickey) {
return false;
}
$count = elgg_get_entities_from_metadata(array(
'type' => 'user',
'metadata_name' => 'openpgp_publickey',
'metadata_value' => $user->openpgp_publickey,
'count' => true,
));
if ($count > 1) {
$user->openpgp_publickey = NULL;
return true;
}
$gpg = new gnupg();
$info = $gpg->deletekey($user->openpgp_publickey);
$user->openpgp_publickey = NULL;
return $info;
}
function elggpg_encrypt($body, $user, $force = true) {
$already_encrypted = strpos($body, "-----BEGIN PGP MESSAGE-----") !== false;
try {
if (!$already_encrypted) {
$gpg = new gnupg();
$gpg->addencryptkey($user->openpgp_publickey);
if ($encrbody = $gpg->encrypt($body)) {
$body = $encrbody;
} elseif ($force) {
return false;
}
}
} catch (Exception $e) {
if ($force) {
return false;
}
}
return $body;
}