%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/library/OPNsense/OpenVPN/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/library/OPNsense/OpenVPN/ArchiveOpenVPN.php |
<?php
/*
* Copyright (C) 2018 Deciso B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
namespace OPNsense\OpenVPN;
class ArchiveOpenVPN extends PlainOpenVPN
{
/**
* @var string file extension
*/
protected $fileExtension = "zip";
/**
* @return string plugin name
*/
public function getName()
{
return gettext("Archive");
}
/**
* @return array custom options
*/
public function supportedOptions()
{
return array("plain_config", "p12_password", "random_local_port", "auth_nocache", "cryptoapi");
}
/**
* @return string file type
*/
public function getFileType()
{
return "application/zip";
}
/**
* generate a zip archive for OpenVPN
* @return string content
*/
public function getContent()
{
$conf = $this->openvpnConfParts();
$base_filename = $this->getBaseFilename();
$tempdir = tempnam(sys_get_temp_dir(), '_ovpn');
$content_dir = $tempdir . "/" . $base_filename;
if (file_exists($tempdir)) {
unlink($tempdir);
}
mkdir($content_dir, 0700, true);
if (empty($this->config['cryptoapi'])) {
if (!empty($this->config['client_crt'])) {
// export keypair
$p12 = $this->export_pkcs12(
$this->config['client_crt'],
$this->config['client_prv'],
$this->config['p12_password'] ?? '',
$this->config['server_ca_chain'] ?? ''
);
file_put_contents("{$content_dir}/{$base_filename}.p12", $p12);
$conf[] = "pkcs12 {$base_filename}.p12";
}
} else {
// use internal Windows store, only flush ca (when available)
if (!empty($this->config['server_ca_chain'])) {
$cafilename = "{$base_filename}.crt";
file_put_contents("{$content_dir}/$cafilename", $this->config['server_ca_chain']);
$conf[] = "ca {$cafilename}";
}
}
if (!empty($this->config['tls'])) {
if ($this->config['tlsmode'] === 'crypt') {
$conf[] = "tls-crypt {$base_filename}-tls.key";
} else {
$conf[] = "tls-auth {$base_filename}-tls.key 1";
}
file_put_contents("{$content_dir}/{$base_filename}-tls.key", trim(base64_decode($this->config['tls'])));
}
file_put_contents("{$content_dir}/{$base_filename}.ovpn", implode("\n", $conf));
$command = "cd " . escapeshellarg("{$tempdir}")
. " && /usr/local/bin/zip -r "
. escapeshellarg("{$content_dir}.zip")
. " " . escapeshellarg($base_filename);
exec($command);
$result = file_get_contents($content_dir . ".zip");
// cleanup
unlink($content_dir . ".zip");
foreach (glob($content_dir . "/*") as $filename) {
unlink($filename);
}
rmdir($content_dir);
rmdir($tempdir);
return $result;
}
}