%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/PlainOpenVPN.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 PlainOpenVPN extends BaseExporter implements IExportProvider
{
/**
* @var string file extension
*/
protected $fileExtension = "ovpn";
/**
* @return string plugin name
*/
public function getName()
{
return gettext("File Only");
}
/**
* @return array supported options
*/
public function supportedOptions()
{
return array("plain_config", "random_local_port", "auth_nocache", "cryptoapi");
}
/**
* @return string base filename without extension
*/
protected function getBaseFilename()
{
$result = array();
if (!empty($this->config['description'])) {
$result[] = $this->config['description'];
} else {
$result[] = "openvpn";
}
if (!empty($this->config['client_cn'])) {
$result[] = $this->config['client_cn'];
}
return preg_replace("/[^a-zA-Z0-9]/", "_", implode("_", $result));
}
/**
* @return string filename
*/
public function getFilename()
{
return $this->getBaseFilename() . "." . $this->fileExtension;
}
/**
* @return string file type
*/
public function getFileType()
{
return "text/ovpn";
}
/**
* @return array
*/
protected function openvpnConfParts()
{
$conf = [];
if (!empty($this->config['dev_mode']) && $this->config['dev_mode'] == 'tap') {
$conf[] = "dev tap";
} else {
$conf[] = "dev tun";
}
$conf[] = "persist-tun";
$conf[] = "persist-key";
if (strncasecmp($this->config['protocol'], "tcp", 3) === 0) {
$conf[] = "proto " . strtolower("{$this->config['protocol']}-client");
}
if (!empty($this->config['crypto']) && $this->config['crypto'] != 'none') {
$conf[] = "data-ciphers-fallback {$this->config['crypto']}";
}
if (!empty($this->config['digest'])) {
$conf[] = "auth {$this->config['digest']}";
}
$conf[] = "client";
$conf[] = "resolv-retry infinite";
if (isset($this->config['reneg-sec']) && $this->config['reneg-sec'] != "") {
$conf[] = "reneg-sec {$this->config['reneg-sec']}";
}
foreach (explode(",", $this->config['hostname']) as $hostname) {
$conf[] = "remote {$hostname} {$this->config['local_port']} " . strtolower($this->config['protocol']);
}
if (!empty($this->config['random_local_port'])) {
$conf[] = "lport 0";
}
if (!empty($this->config['server_subject']) && !empty($this->config['validate_server_cn'])) {
$tmp_subject = "";
foreach ($this->config['server_subject'] as $key => $value) {
if (!empty($tmp_subject)) {
$tmp_subject .= ", ";
}
$tmp_subject .= "{$key}={$value}";
}
$conf[] = "verify-x509-name \"{$tmp_subject}\" subject";
if (!empty($this->config['server_cert_is_srv'])) {
$conf[] = "remote-cert-tls server";
}
}
if (!empty($this->config['cryptoapi']) && !empty($this->config['client_cn'])) {
$conf[] = "cryptoapicert \"SUBJ:{$this->config['client_cn']}\"";
}
if (in_array($this->config['mode'], array('server_user', 'server_tls_user'))) {
$conf[] = "auth-user-pass";
if (!empty($this->config['auth_nocache'])) {
$conf[] = "auth-nocache";
}
}
if (!empty($this->config['compression'])) {
switch ($this->config['compression']) {
case 'no':
case 'adaptive':
case 'yes':
$conf[] = "comp-lzo " . $this->config['compression'];
break;
case 'pfc':
$conf[] = "compress";
break;
default:
$conf[] = "compress " . $this->config['compression'];
break;
}
}
if (!empty($this->config['plain_config'])) {
foreach (preg_split('/\r\n|\r|\n/', $this->config['plain_config']) as $line) {
if (!empty($line)) {
$conf[] = $line;
}
}
}
return $conf;
}
/**
* @return array inline OpenVPN files
*/
protected function openvpnInlineFiles()
{
$conf = array();
if (!empty($this->config['server_ca_chain'])) {
$conf[] = "<ca>";
$conf[] = $this->config['server_ca_chain'];
$conf[] = "</ca>";
}
if (!empty($this->config['client_crt']) && empty($this->config['cryptoapi'])) {
$conf[] = "<cert>";
$conf = array_merge($conf, explode("\n", trim($this->config['client_crt'])));
$conf[] = "</cert>";
$conf[] = "<key>";
$conf = array_merge($conf, explode("\n", trim($this->config['client_prv'])));
$conf[] = "</key>";
}
if (!empty($this->config['tls'])) {
if ($this->config['tlsmode'] === 'crypt') {
$conf[] = "<tls-crypt>";
$conf = array_merge($conf, explode("\n", trim(base64_decode($this->config['tls']))));
$conf[] = "</tls-crypt>";
} else {
$conf[] = "<tls-auth>";
$conf = array_merge($conf, explode("\n", trim(base64_decode($this->config['tls']))));
$conf[] = "</tls-auth>";
$conf[] = "key-direction 1";
}
}
return $conf;
}
/**
* @return string content
*/
public function getContent()
{
return implode("\n", array_merge($this->openvpnConfParts(), $this->openvpnInlineFiles()));
}
}