%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/ViscosityVisz.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 ViscosityVisz extends PlainOpenVPN
{
/**
* @var string file extension
*/
protected $fileExtension = "visz";
/**
* @return string plugin name
*/
public function getName()
{
return gettext("Viscosity (visz)");
}
/**
* @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/gzip";
}
/**
* Create archive
* @param string $tempdir used temp directory
* @param string $content_dir full path to viscosity output files
* @return string full (temp)path to
*/
protected function archive($tempdir, $content_dir)
{
$outputFilename = "{$content_dir}.zip";
$command = "cd " . escapeshellarg($tempdir)
. " && /usr/bin/tar cfz "
. escapeshellarg($outputFilename)
. " Viscosity.visc";
exec($command);
return $outputFilename;
}
/**
* @return array
*/
protected function openvpnConfParts()
{
$conf = array();
$conf[] = "#-- Config Auto Generated for Viscosity --#";
$conf[] = "#viscosity startonopen false";
$conf[] = "#viscosity dhcp true";
$conf[] = "#viscosity dnssupport true";
if (!empty($this->config['description'])) {
$conf[] = "#viscosity name " . $this->config['description'];
}
return array_merge($conf, parent::openvpnConfParts());
}
/**
* generate a zip archive for OpenVPN
* @return string content
*/
public function getContent()
{
$conf = $this->openvpnConfParts();
$tempdir = tempnam(sys_get_temp_dir(), '_ovpn');
$content_dir = $tempdir . "/Viscosity.visc";
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}/pkcs.p12", $p12);
$conf[] = "pkcs12 pkcs.p12";
}
} else {
// use internal Windows store, only flush ca (when available)
if (!empty($this->config['server_ca_chain'])) {
file_put_contents("{$content_dir}/ca.crt", $this->config['server_ca_chain']);
$conf[] = "ca ca.crt";
}
}
if (!empty($this->config['tls'])) {
if ($this->config['tlsmode'] === 'crypt') {
$conf[] = "tls-crypt ta.key";
} else {
$conf[] = "tls-auth ta.key 1";
}
file_put_contents("{$content_dir}/ta.key", trim(base64_decode($this->config['tls'])));
}
file_put_contents("{$content_dir}/config.conf", implode("\n", $conf));
$outputFilename = $this->archive($tempdir, $content_dir);
$result = file_get_contents($outputFilename);
// cleanup
unlink($outputFilename);
foreach (glob($content_dir . "/*") as $filename) {
unlink($filename);
}
rmdir($content_dir);
rmdir($tempdir);
return $result;
}
}