joomla_test/bin/keychain.php

384 lines
7.6 KiB
PHP
Raw Permalink Normal View History

2020-01-02 22:20:31 +07:00
#!/usr/bin/env php
<?php
/**
* @package Joomla.Platform
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
define('_JEXEC', 1);
define('JPATH_BASE', dirname(__FILE__));
// Load the Joomla! Platform
require_once realpath('../libraries/import.php');
/**
* Keychain Manager
*
* @package Joomla.Platform
* @since 12.3
*/
class KeychainManager extends JApplicationCli
{
/**
* @var boolean A flag if the keychain has been updated to trigger saving the keychain
* @since 12.3
*/
protected $updated = false;
/**
* @var JKeychain The keychain object being manipulated.
* @since 12.3
*/
protected $keychain = null;
/**
* Execute the application
*
* @return void
*
* @since 12.3
*/
public function execute( )
{
if (!count($this->input->args))
{
// Check if they passed --help in otherwise display short usage summary
if ($this->input->get('help', false) === false)
{
$this->out("usage: {$this->input->executable} [options] [command] [<args>]");
exit(1);
}
else
{
$this->displayHelp();
exit(0);
}
}
// For all tasks but help and init we use the keychain
if (!in_array($this->input->args[0], array('help', 'init')))
{
$this->loadKeychain();
}
switch ($this->input->args[0])
{
case 'init':
$this->initPassphraseFile();
break;
case 'list':
$this->listEntries();
break;
case 'create':
$this->create();
break;
case 'change':
$this->change();
case 'delete':
$this->delete();
break;
case 'read':
$this->read();
break;
case 'help':
$this->displayHelp();
break;
default:
$this->out('Invalid command.');
break;
}
if ($this->updated)
{
$this->saveKeychain();
}
exit(0);
}
/**
* Load the keychain from a file.
*
* @return void
*
* @since 12.3
*/
protected function loadKeychain()
{
$keychain = $this->input->get('keychain', '', 'raw');
$publicKeyFile = $this->input->get('public-key', '', 'raw');
$passphraseFile = $this->input->get('passphrase', '', 'raw');
$this->keychain = new JKeychain;
if (file_exists($keychain))
{
if (file_exists($publicKeyFile))
{
$this->keychain->loadKeychain($keychain, $passphraseFile, $publicKeyFile);
}
else
{
$this->out('Public key not specified or missing!');
exit(1);
}
}
}
/**
* Save this keychain to a file.
*
* @return void
*
* @since 12.3
*/
protected function saveKeychain()
{
$keychain = $this->input->get('keychain', '', 'raw');
$publicKeyFile = $this->input->get('public-key', '', 'raw');
$passphraseFile = $this->input->get('passphrase', '', 'raw');
if (!file_exists($publicKeyFile))
{
$this->out("Public key file specified doesn't exist: $publicKeyFile");
exit(1);
}
$this->keychain->saveKeychain($keychain, $passphraseFile, $publicKeyFile);
}
/**
* Initialise a new passphrase file.
*
* @return void
*
* @since 12.3
*/
protected function initPassphraseFile()
{
$keychain = new JKeychain;
$passphraseFile = $this->input->get('passphrase', '', 'raw');
$privateKeyFile = $this->input->get('private-key', '', 'raw');
if (!strlen($passphraseFile))
{
$this->out('A passphrase file must be specified with --passphrase');
exit(1);
}
if (!file_exists($privateKeyFile))
{
$this->out("protected key file specified doesn't exist: $privateKeyFile");
exit(1);
}
$this->out('Please enter the new passphrase:');
$passphrase = $this->in();
$this->out('Please enter the passphrase for the protected key:');
$privateKeyPassphrase = $this->in();
$keychain->createPassphraseFile($passphrase, $passphraseFile, $privateKeyFile, $privateKeyPassphrase);
}
/**
* Create a new entry
*
* @return void
*
* @since 12.3
*/
protected function create()
{
if (count($this->input->args) != 3)
{
$this->out("usage: {$this->input->executable} [options] create entry_name entry_value");
exit(1);
}
if ($this->keychain->exists($this->input->args[1]))
{
$this->out('error: entry already exists. To change this entry, use "change"');
exit(1);
}
$this->change();
}
/**
* Change an existing entry to a new value or create an entry if missing.
*
* @return void
*
* @since 12.3
*/
protected function change()
{
if (count($this->input->args) != 3)
{
$this->out("usage: {$this->input->executable} [options] change entry_name entry_value");
exit(1);
}
$this->updated = true;
$this->keychain->setValue($this->input->args[1], $this->input->args[2]);
}
/**
* Read an entry from the keychain
*
* @return void
*
* @since 12.3
*/
protected function read()
{
if (count($this->input->args) != 2)
{
$this->out("usage: {$this->input->executable} [options] read entry_name");
exit(1);
}
$key = $this->input->args[1];
$this->out($key . ': ' . $this->dumpVar($this->keychain->get($key)));
}
/**
* Get the string from var_dump
*
* @param mixed $var The variable you want to have dumped.
*
* @return string The result of var_dump
*
* @since 12.3
*/
private function dumpVar($var)
{
ob_start();
var_dump($var);
$result = trim(ob_get_contents());
ob_end_clean();
return $result;
}
/**
* Delete an entry from the keychain
*
* @return void
*
* @since 12.3
*/
protected function delete()
{
if (count($this->input->args) != 2)
{
$this->out("usage: {$this->input->executable} [options] delete entry_name");
exit(1);
}
$this->updated = true;
$this->keychain->deleteValue($this->input->args[1], null);
}
/**
* List entries in the keychain
*
* @return void
*
* @since 12.3
*/
protected function listEntries()
{
foreach ($this->keychain->toArray() as $key => $value)
{
$line = $key;
if ($this->input->get('print-values'))
{
$line .= ': ' . $this->dumpVar($value);
}
$this->out($line);
}
}
/**
* Display the help information
*
* @return void
*
* @since 12.3
*/
protected function displayHelp()
{
/*
COMMANDS
- list
- create entry_name entry_value
- change entry_name entry_value
- delete entry_name
- read entry_name
*/
$help = <<<HELP
Keychain Management Utility
usage: {$this->input->executable} [--keychain=/path/to/keychain]
[--passphrase=/path/to/passphrase.dat] [--public-key=/path/to/public.pem]
[command] [<args>]
OPTIONS
--keychain=/path/to/keychain
Path to a keychain file to manipulate.
--passphrase=/path/to/passphrase.dat
Path to a passphrase file containing the encryption/decryption key.
--public-key=/path/to/public.pem
Path to a public key file to decrypt the passphrase file.
COMMANDS
list:
Usage: list [--print-values]
Lists all entries in the keychain. Optionally pass --print-values to print the values as well.
create:
Usage: create entry_name entry_value
Creates a new entry in the keychain called "entry_name" with the plaintext value "entry_value".
NOTE: This is an alias for change.
change:
Usage: change entry_name entry_value
Updates the keychain entry called "entry_name" with the value "entry_value".
delete:
Usage: delete entry_name
Removes an entry called "entry_name" from the keychain.
read:
Usage: read entry_name
Outputs the plaintext value of "entry_name" from the keychain.
init:
Usage: init
Creates a new passphrase file and prompts for a new passphrase.
HELP;
$this->out($help);
}
}
try
{
JApplicationCli::getInstance('KeychainManager')->execute();
}
catch (Exception $e)
{
echo $e->getMessage() . "\n";
exit(1);
}