diff --git a/LICENSE b/LICENSE index f3f0d44d1f..d2cb290674 100644 --- a/LICENSE +++ b/LICENSE @@ -1,10 +1,9 @@ -Copyright (c) 2023-2025 A. Kulikov +Copyright (c) 2023 A. Kulikov Copyright (c) 2015-2025 Ad Schellevis Copyright (c) 2022 agh1467 Copyright (c) 2024 Alex Smith Copyright (c) 2021 Alexander Noack Copyright (c) 2021 Andreas Stuerz -Copyright (c) 2025 Anton Avramov Copyright (c) 2021 Axelrtgs Copyright (c) 2023 Bernhard Frenking Copyright (c) 2023 Cannon Matthews @@ -25,7 +24,6 @@ Copyright (c) 2008-2014 Ermal Luçi Copyright (c) 2016-2019 EURO-LOG AG Copyright (c) 2017-2020 Fabian Franz Copyright (c) 2019 Felix Matouschek -Copyright (c) 2025 Florian Latifi Copyright (c) 2024 Francisco Dimattia Copyright (c) 2014-2025 Franco Fichtner Copyright (c) 2016-2025 Frank Wall @@ -51,9 +49,8 @@ Copyright (c) 2021 Markus Peter Copyright (c) 2022 Markus Reiter Copyright (c) 2020 Martin Wasley Copyright (c) 2022 Marvo2011 -Copyright (c) 2025 Matthias Valvekens Copyright (c) 2025 Maxime Thiebaut -Copyright (c) 2017-2025 Michael Muenz +Copyright (c) 2017-2024 Michael Muenz Copyright (c) 2024 Michał Brzeziński Copyright (c) 2024 Mike Shuey Copyright (c) 2023-2024 Mikhail Kharisov @@ -66,13 +63,10 @@ Copyright (c) 2021-2024 Nicola Pellegrini Copyright (c) 2022 Nikolaj Brinch Jørgensen Copyright (c) 2021 Nim G Copyright (c) 2023 Oliver Hartl -Copyright (c) 2025 Oliver Traber Copyright (c) 2024 Olly Baker Copyright (c) 2019 Pascal Mathis -Copyright (c) 2025 Peter Vos Copyright (c) 2025 Ralph Moser, PJ Monitoring GmbH Copyright (c) 2024 realizelol -Copyright (c) 2025 Renat Gorbushin Copyright (c) 2022 Robbert Rijkse Copyright (c) 2023 sattamjh Copyright (c) 2004-2012 Scott Ullrich diff --git a/Makefile b/Makefile index abd83c36f1..839ba7cce1 100644 --- a/Makefile +++ b/Makefile @@ -43,23 +43,19 @@ all: list: .for PLUGIN_DIR in ${PLUGIN_DIRS} @echo ${PLUGIN_DIR} -- $$(${MAKE} -C ${PLUGIN_DIR} -v PLUGIN_COMMENT) \ - $$(if [ "$$(${MAKE} -C ${PLUGIN_DIR} -v PLUGIN_MAINTAINER)" = "N/A" ]; then echo "(not maintained)"; fi) \ $$(if [ -n "$$(${MAKE} -C ${PLUGIN_DIR} -v PLUGIN_DEVEL _PLUGIN_DEVEL=)" ]; then echo "(development only)"; fi) \ $$(if [ -n "$$(${MAKE} -C ${PLUGIN_DIR} -v PLUGIN_OBSOLETE)" ]; then echo "(pending removal)"; fi) .endfor -# known good targets (expanded below) +# shared targets that are sane to run from the root directory TARGETS= clean glint lint revision style sweep test -.for _TARGET in ${.TARGETS} -__TARGET= ${TARGETS:M${_TARGET:C/-.*//}} -. if "${__TARGET}" != "" -${_TARGET}: -. for PLUGIN_DIR in ${PLUGIN_DIRS} - @echo ">>> Entering ${PLUGIN_DIR} with target '${_TARGET}'" - @${MAKE} -C ${PLUGIN_DIR} ${_TARGET} -. endfor -. endif +.for TARGET in ${TARGETS} +${TARGET}: +. for PLUGIN_DIR in ${PLUGIN_DIRS} + @echo ">>> Entering ${PLUGIN_DIR}" + @${MAKE} -C ${PLUGIN_DIR} ${TARGET} +. endfor .endfor license: diff --git a/Mk/defaults.mk b/Mk/defaults.mk index 77a93b13a9..5142592ea2 100644 --- a/Mk/defaults.mk +++ b/Mk/defaults.mk @@ -46,13 +46,11 @@ VERSIONBIN= ${LOCALBASE}/sbin/opnsense-version .if exists(${VERSIONBIN}) _PLUGIN_ABI!= ${VERSIONBIN} -a -PLUGIN_ABIS?= ${_PLUGIN_ABI} +PLUGIN_ABI?= ${_PLUGIN_ABI} .else -PLUGIN_ABIS?= 25.7 +PLUGIN_ABI?= 25.7 .endif -PLUGIN_ABI?= ${PLUGIN_ABIS:[1]} - PLUGIN_MAINS= master main PLUGIN_MAIN?= ${PLUGIN_MAINS:[1]} PLUGIN_STABLE?= stable/${PLUGIN_ABI} diff --git a/Mk/git.mk b/Mk/git.mk index 4aded1e189..5ef0bcd1f2 100644 --- a/Mk/git.mk +++ b/Mk/git.mk @@ -23,8 +23,6 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. -CORE_ABI= ${PLUGIN_ABI} -CORE_ABIS= ${PLUGIN_ABIS} CORE_MAIN= ${PLUGIN_MAIN} CORE_MAINS= ${PLUGIN_MAINS} CORE_STABLE= ${PLUGIN_STABLE} diff --git a/Mk/plugins.mk b/Mk/plugins.mk index 2c89efc64e..3144a72851 100644 --- a/Mk/plugins.mk +++ b/Mk/plugins.mk @@ -43,12 +43,12 @@ PLUGIN_SCRIPTS= +PRE_INSTALL +POST_INSTALL \ +PRE_DEINSTALL +POST_DEINSTALL PLUGIN_WWW?= https://opnsense.org/ -PLUGIN_MAINTAINER?= N/A PLUGIN_LICENSE?= BSD2CLAUSE PLUGIN_TIER?= 3 PLUGIN_REVISION?= 0 -PLUGIN_REQUIRES= PLUGIN_NAME PLUGIN_VERSION PLUGIN_COMMENT +PLUGIN_REQUIRES= PLUGIN_NAME PLUGIN_VERSION PLUGIN_COMMENT \ + PLUGIN_MAINTAINER .include "common.mk" .include "git.mk" diff --git a/README.md b/README.md index d27df73964..9c86888599 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,8 @@ emulators/qemu-guest-agent -- QEMU Guest Agent for OPNsense ftp/tftp -- TFTP server mail/postfix -- SMTP mail relay mail/rspamd -- Protect your network from spam -misc/theme-advanced -- Theme based on AdvancedTomato GUI +misc/theme-advanced -- OPNsense theme based on AdvancedTomato GUI misc/theme-cicada -- The cicada theme - dark grey onyx -misc/theme-flexcolor -- Theme with 3 different color schemes: black as default, light and dark-light misc/theme-rebellion -- A suitably dark theme misc/theme-tukan -- The tukan theme - blue/white misc/theme-vicuna -- The vicuna theme - blue sapphire @@ -54,9 +53,8 @@ net/frr -- The FRRouting Protocol Suite net/ftp-proxy -- Control ftp-proxy processes net/google-cloud-sdk -- Google Cloud SDK net/haproxy -- Reliable, high performance TCP/HTTP load balancer -net/igmp-proxy -- IGMP-Proxy Service (not maintained) +net/igmp-proxy -- IGMP-Proxy Service net/mdns-repeater -- Proxy multicast DNS between networks -net/ndp-proxy-go -- IPv6 Neighbor Discovery Protocol (NDP) Proxy net/ndproxy -- Neighbor Discovery Proxy net/ntopng -- Traffic Analysis and Flow Collection net/radsecproxy -- RADIUS proxy provides both RADIUS UDP and TCP/TLS (RadSec) transport @@ -68,10 +66,10 @@ net/sslh -- sslh configuration front-end net/tayga -- Tayga NAT64 net/turnserver -- The coturn STUN/TURN Server net/udpbroadcastrelay -- Control udpbroadcastrelay processes -net/upnp -- UPnP IGD & PCP/NAT-PMP Service +net/upnp -- Universal Plug and Play (UPnP IGD & PCP/NAT-PMP) Service net/vnstat -- Network traffic monitor -net/wol -- Wake on LAN Service (not maintained) -net/zerotier -- Virtual Networks That Just Work (not maintained) +net/wol -- Wake on LAN Service +net/zerotier -- Virtual Networks That Just Work net-mgmt/collectd -- Collect system and application performance metrics periodically net-mgmt/lldpd -- LLDP allows you to know exactly on which port is a server net-mgmt/net-snmp -- Net-SNMP is a daemon for the SNMP protocol @@ -89,10 +87,9 @@ security/intrusion-detection-content-et-pro -- IDS Proofpoint ET Pro ruleset (ne security/intrusion-detection-content-pt-open -- IDS Positive Technologies ESC ruleset security/intrusion-detection-content-snort-vrt -- IDS Snort VRT ruleset (needs registration or subscription) security/maltrail -- Malicious traffic detection system -security/netbird -- Peer-to-peer VPN that seamlessly connects your devices +security/netbird -- Peer-to-peer VPN that seamlessly connects your devices (development only) security/openconnect -- OpenConnect Client security/openvpn-legacy -- OpenVPN legacy support -security/q-feeds-connector -- Connector for Q-Feeds threat intel security/strongswan-legacy -- IPsec legacy support security/stunnel -- Stunnel TLS proxy security/tailscale -- VPN mesh securely connecting clients using WireGuard @@ -104,11 +101,11 @@ sysutils/apuled -- PC Engine APU LED control (development only) sysutils/beats -- Send logs, network, metrics and heartbeat to Elasticsearch sysutils/cpu-microcode -- CPU microcode updates sysutils/dec-hw -- Deciso hardware specific information -sysutils/dmidecode -- Display hardware information on the dashboard (not maintained) +sysutils/dmidecode -- Display hardware information on the dashboard sysutils/gdrive-backup -- Backup configurations using Google Drive sysutils/git-backup -- Track config changes using git sysutils/hw-probe -- Collect hardware diagnostics -sysutils/lcdproc-sdeclcd -- LCDProc for SDEC LCD devices (not maintained) +sysutils/lcdproc-sdeclcd -- LCDProc for SDEC LCD devices sysutils/mail-backup -- Send configuration file backup by e-mail sysutils/munin-node -- Munin monitoring agent sysutils/nextcloud-backup -- Track config changes using NextCloud @@ -116,18 +113,18 @@ sysutils/node_exporter -- Prometheus exporter for machine metrics sysutils/nut -- Network UPS Tools sysutils/puppet-agent -- Manage Puppet Agent sysutils/sftp-backup -- Backup configurations using SFTP -sysutils/smart -- SMART tools (not maintained) +sysutils/smart -- SMART tools sysutils/virtualbox -- VirtualBox guest additions sysutils/vmware -- VMware tools sysutils/xen -- Xen guest utilities vendor/sunnyvalley -- Vendor Repository for Zenarmor (Enterprise Security Modules - NGFW, SSE, SASE, f.k.a Sensei) -www/OPNProxy -- OPNsense proxy additions (not maintained) +www/OPNProxy -- OPNsense proxy additions www/c-icap -- c-icap connects the web proxy with a virus scanner www/cache -- Webserver cache www/caddy -- Modern Reverse Proxy with Automatic HTTPS, Dynamic DNS and Layer4 Routing www/nginx -- Nginx HTTP server and reverse proxy -www/squid -- Squid is a caching proxy for the web (not maintained) -www/web-proxy-sso -- Kerberos authentication module (not maintained) +www/squid -- Squid is a caching proxy for the web +www/web-proxy-sso -- Kerberos authentication module ``` A brief description of how to use the plugins repository diff --git a/Scripts/license b/Scripts/license index 38d61f2602..6580d40b22 100755 --- a/Scripts/license +++ b/Scripts/license @@ -67,7 +67,6 @@ sub process_file my $filename = $File::Find::name; return if not -f "$cwd/$filename"; - return if $filename =~ /\/Private\//; my @lines = read_file( "$cwd/$filename" ); my $possibly_bsd; diff --git a/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml b/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml index f3254be98e..1ca2f112ed 100644 --- a/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml +++ b/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml @@ -1,11 +1,11 @@ - //OPNsense/Iperf3 - Fake model for the API - will be never stored to config (only used for defaults, validation etc.). - - - lan - Y - N - - + //OPNsense/Iperf3 + Fake model for the API - will be never stored to config (only used for defaults, validation etc.). + + + lan + Y + N + + diff --git a/databases/redis/Makefile b/databases/redis/Makefile index c6639e95e5..129de8ac7d 100644 --- a/databases/redis/Makefile +++ b/databases/redis/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= redis PLUGIN_VERSION= 1.1 -PLUGIN_REVISION= 3 +PLUGIN_REVISION= 2 PLUGIN_COMMENT= Redis DB PLUGIN_DEPENDS= redis72 PLUGIN_MAINTAINER= franz.fabian.94@gmail.com diff --git a/databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis/Redis.xml b/databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis/Redis.xml index df895e9862..2a2f05d315 100644 --- a/databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis/Redis.xml +++ b/databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis/Redis.xml @@ -1,108 +1,108 @@ - //OPNsense/redis - Redis DB - - - - 0 - Y - - - N - Y - - - 1 - Y - - - 1 - 65536 - N - 6379 - This must be a valid port number. - - - Y - warning - - Debug - Verbose - Notice - Warning - - - - 0 - Y - - - Y - LOCAL0 - - USER - LOCAL0 - LOCAL1 - LOCAL2 - LOCAL3 - LOCAL4 - LOCAL5 - LOCAL6 - LOCAL7 - - - - 0 - Y - 16 - - - - - N - - + //OPNsense/redis + Redis DB + + + + 0 + Y + + + N + Y + + + 1 + Y + + + 1 + 65536 + N + 6379 + This must be a valid port number. + + + Y + warning + + Debug + Verbose + Notice + Warning + + + + 0 + Y + + + Y + LOCAL0 + + USER + LOCAL0 + LOCAL1 + LOCAL2 + LOCAL3 + LOCAL4 + LOCAL5 + LOCAL6 + LOCAL7 + + + + 0 + Y + 16 + + + + + N + + - - - - 0 - N - 10000 - - - 0 - N - - - Y - noeviction - - noeviction - volatile-ttl - allkeys-random - volatile-random - allkeys-lru - volatile-lru - - - - 0 - N - 5 - - - - - 0 - N - 10000 - - - 0 - N - 128 - - - + + + + 0 + N + 10000 + + + 0 + N + + + Y + noeviction + + noeviction + volatile-ttl + allkeys-random + volatile-random + allkeys-lru + volatile-lru + + + + 0 + N + 5 + + + + + 0 + N + 10000 + + + 0 + N + 128 + + + diff --git a/databases/redis/src/opnsense/service/templates/OPNsense/Redis/redis.conf b/databases/redis/src/opnsense/service/templates/OPNsense/Redis/redis.conf index 8882751ea7..a42284da49 100644 --- a/databases/redis/src/opnsense/service/templates/OPNsense/Redis/redis.conf +++ b/databases/redis/src/opnsense/service/templates/OPNsense/Redis/redis.conf @@ -55,7 +55,11 @@ {% if helpers.exists('virtualip') %} {% for intf_item in helpers.toList('virtualip.vip') %} {% if intf_item.interface == listen_interface and intf_item.mode in ['carp', 'ipalias'] %} -{% do listen_ip.append(intf_item.subnet) %} +{% if intf_item.subnet.find(':') > -1 %} +{% do listen_ip.append(interface_ip) %} +{% else %} +{% do listen_ip.append(interface_ip) %} +{% endif %} {% endif %} {% endfor %} {% endif %} diff --git a/dns/bind/Makefile b/dns/bind/Makefile index 4d98f7a4b3..d1c8e3f2d7 100644 --- a/dns/bind/Makefile +++ b/dns/bind/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= bind PLUGIN_VERSION= 1.34 -PLUGIN_REVISION= 2 +PLUGIN_REVISION= 1 PLUGIN_COMMENT= BIND domain name service PLUGIN_DEPENDS= bind920 PLUGIN_MAINTAINER= m.muenz@gmail.com diff --git a/dns/bind/src/opnsense/mvc/app/models/OPNsense/Bind/Acl.xml b/dns/bind/src/opnsense/mvc/app/models/OPNsense/Bind/Acl.xml index efa489b85b..a628f28a5f 100644 --- a/dns/bind/src/opnsense/mvc/app/models/OPNsense/Bind/Acl.xml +++ b/dns/bind/src/opnsense/mvc/app/models/OPNsense/Bind/Acl.xml @@ -13,7 +13,7 @@ Y /^(?!any$|localhost$|localnets$|none$)[0-9a-zA-Z_\-]{1,32}$/u Should be a string between 1 and 32 characters. Allowed characters are 0-9, a-z, A-Z, _ and -. Built-in ACL names must not be used: any, localhost, localnets, none. - + An ACL with this name already exists. UniqueConstraint diff --git a/dns/ddclient/Makefile b/dns/ddclient/Makefile index cd453e19cf..fb4a7b36cc 100644 --- a/dns/ddclient/Makefile +++ b/dns/ddclient/Makefile @@ -1,5 +1,6 @@ PLUGIN_NAME= ddclient -PLUGIN_VERSION= 1.28 +PLUGIN_VERSION= 1.27 +PLUGIN_REVISION= 4 PLUGIN_DEPENDS= ddclient py${PLUGIN_PYTHON}-boto3 PLUGIN_COMMENT= Dynamic DNS client PLUGIN_MAINTAINER= ad@opnsense.org diff --git a/dns/ddclient/pkg-descr b/dns/ddclient/pkg-descr index f5f2d1aceb..f50bc5346b 100644 --- a/dns/ddclient/pkg-descr +++ b/dns/ddclient/pkg-descr @@ -6,10 +6,6 @@ WWW: https://github.com/ddclient/ddclient Plugin Changelog ================ -1.28 - -* Add native backend support for PowerDNS API (contributed by Oliver Traber) - 1.27 * Add support for altering IPv6 addresses in native backend (contributed by SaarLAN-Pissbeutel) diff --git a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml index 0ffcf2040e..eb0fb768e4 100644 --- a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml +++ b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml @@ -31,7 +31,7 @@ When a URI is provided, the tag __MYIP__ will be replaced with the current detected address for this service and __HOSTNAME__ will contain the (comma separated) list of hostnames provided. - + account.resourceId @@ -62,7 +62,7 @@ account.zone text - + Zone containing the host entry. diff --git a/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.php b/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.php index a3cbb5a866..31682aae0b 100644 --- a/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.php +++ b/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.php @@ -52,16 +52,6 @@ public function performValidation($validateFullModel = false) } } foreach ($validate_servers as $key => $node) { - if ((string)$node->service == 'powerdns') { - if (empty($srv) || filter_var($srv, FILTER_VALIDATE_URL) === false) { - $messages->appendMessage( - new Message( - gettext("A valid URI is required."), - $key . ".server" - ) - ); - } - } if ((string)$node->service != 'custom') { continue; } diff --git a/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml b/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml index 75c390ce1e..d1a19de7c7 100644 --- a/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml +++ b/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml @@ -53,7 +53,6 @@ DNSExit DynDNS.com DnsPark - dnspodcn DSLReports DonDominio Duck DNS @@ -146,7 +145,6 @@ cloudflare cloudflare-ipv4 cloudflare-ipv6 - cloudflare-dns dynu-ipv4 dynu-ipv6 freedns diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/checkip b/dns/ddclient/src/opnsense/scripts/ddclient/checkip index 08d9edc6fe..0f51265521 100755 --- a/dns/ddclient/src/opnsense/scripts/ddclient/checkip +++ b/dns/ddclient/src/opnsense/scripts/ddclient/checkip @@ -26,13 +26,13 @@ POSSIBILITY OF SUCH DAMAGE. """ import argparse -from lib import registered_services, checkip +from lib import checkip_service_list, checkip if __name__ == '__main__': # handle parameters parser = argparse.ArgumentParser() - parser.add_argument('-s', '--service', help='service name', choices=registered_services(), required=True) + parser.add_argument('-s', '--service', help='service name', choices=checkip_service_list.keys(), required=True) parser.add_argument('-i', '--interface', help='interface', type=str, default='') parser.add_argument('-t', '--tls', help='enforce tls', choices=['0', '1'], default='1') parser.add_argument('--timeout', help='timeout', type=str, default='10') diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/lib/__init__.py b/dns/ddclient/src/opnsense/scripts/ddclient/lib/__init__.py index 762f022d13..025fbe05a3 100755 --- a/dns/ddclient/src/opnsense/scripts/ddclient/lib/__init__.py +++ b/dns/ddclient/src/opnsense/scripts/ddclient/lib/__init__.py @@ -57,5 +57,5 @@ changed (return status of `execute()`) the state is flushed to disk. """ -from .address import registered_services, checkip +from .address import checkip_service_list, checkip from .poller import AccountFactory, Poller diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/dnspod_cn.py b/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/dnspod_cn.py deleted file mode 100644 index e95ffbe5d6..0000000000 --- a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/dnspod_cn.py +++ /dev/null @@ -1,301 +0,0 @@ -""" - Copyright (c) 2024 AnShen - Copyright (c) 2023 Ad Schellevis - 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. -""" -import json -import syslog -import time -import hashlib -import hmac -import requests -from datetime import datetime -from . import BaseAccount - - -# dnspod api 3.0 -# https://cloud.tencent.com/document/api/1427 - -class DNSPod_CN(BaseAccount): - _priority = 65535 - - _services = { - 'dnspodcn': 'dnspod.tencentcloudapi.com' - } - - def __init__(self, account: dict): - super().__init__(account) - self.service = 'dnspod' - - @staticmethod - def known_services(): - return {'dnspodcn': 'dnspodcn'} - - @staticmethod - def match(account): - return account.get('service') in DNSPod_CN._services - - - @staticmethod - def _sign(key, msg): - """ - Generate HMAC-SHA256 signature. - - Args: - key (bytes): Signing key - msg (str): Message to sign - - Returns: - bytes: Signature digest - """ - return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() - - def generate_signature(self, action, payload="{}"): - """ - Generate signature and headers for a Tencent Cloud API request. - - Args: - action (str): API action name - payload (str or dict, optional): Request payload. Defaults to "{}". - - Returns: - tuple: Request headers and canonical request - """ - # Ensure payload is a string - payload = json.dumps(payload) if isinstance(payload, dict) else payload - - # Get current timestamp - timestamp = int(time.time()) - date = datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d") - - # Step 1: Create Canonical Request - http_request_method = "POST" - canonical_uri = "/" - canonical_querystring = "" - ct = "application/json; charset=utf-8" - canonical_headers = f"content-type:{ct}\nhost:{self._services[self.settings.get('service')]}\nx-tc-action:{action.lower()}\n" - signed_headers = "content-type;host;x-tc-action" - hashed_request_payload = hashlib.sha256(payload.encode("utf-8")).hexdigest() - - canonical_request = ( - f"{http_request_method}\n" - f"{canonical_uri}\n" - f"{canonical_querystring}\n" - f"{canonical_headers}\n" - f"{signed_headers}\n" - f"{hashed_request_payload}" - ) - - # Step 2: Create String to Sign - algorithm = "TC3-HMAC-SHA256" - credential_scope = f"{date}/{self.service}/tc3_request" - hashed_canonical_request = hashlib.sha256(canonical_request.encode("utf-8")).hexdigest() - - string_to_sign = ( - f"{algorithm}\n" - f"{timestamp}\n" - f"{credential_scope}\n" - f"{hashed_canonical_request}" - ) - - # Step 3: Calculate Signature - secret_date = self._sign(("TC3" + self.settings.get('password')).encode("utf-8"), date) - secret_service = self._sign(secret_date, self.service) - secret_signing = self._sign(secret_service, "tc3_request") - signature = hmac.new(secret_signing, string_to_sign.encode("utf-8"), hashlib.sha256).hexdigest() - - # Step 4: Create Authorization Header - authorization = ( - f"{algorithm} " - f"Credential={self.settings.get('username', '')}/{credential_scope}, " - f"SignedHeaders={signed_headers}, " - f"Signature={signature}" - ) - - # Prepare headers - headers = { - "Authorization": authorization, - "Content-Type": "application/json; charset=utf-8", - "Host": self._services[self.settings.get('service')], - "X-TC-Action": action, - "X-TC-Timestamp": str(timestamp), - "X-TC-Version": "2021-03-23", - 'User-Agent': 'OPNsense-dyndns', - } - - return headers, payload - - def send_request(self, action, payload="{}", region="", token=""): - """ - Send a request to the Tencent Cloud API. - - Args: - action (str): API action name - payload (str or dict, optional): Request payload. Defaults to "{}". - region (str, optional): Optional region parameter - token (str, optional): Optional token parameter - - Returns: - dict: API response JSON - """ - # Get headers and prepared payload - headers, payload = self.generate_signature(action, payload) - - # Add optional headers - if region: - headers["X-TC-Region"] = region - if token: - headers["X-TC-Token"] = token - - try: - # Send request using requests library - response = requests.post( - url=f"https://{self._services[self.settings.get('service')]}", - headers=headers, - data=payload, - timeout=10 - ) - - # Raise an exception for bad responses - response.raise_for_status() - - # Return JSON response - return response - - except requests.RequestException as err: - print(f"Request error: {err}") - - # If there's a response, print its content for debugging - if hasattr(err, 'response') and err.response is not None: - print(f"Response content: {err.response.text}") - - return None - - - def execute(self): - if super().execute(): - # IPv4/IPv6 - recordType = "AAAA" if str(self.current_address).find(':') > 1 else "A" - - subdomains = [] - hostnames = self.settings.get('hostnames').split(',') - for _subdomain in hostnames: - if _subdomain == self.settings.get('zone') or _subdomain == '@': - subdomains.append('@') - else: - subdomains.append(_subdomain.replace(f".{self.settings.get('zone')}", '')) - - if len(subdomains) < 1: - syslog.syslog( - syslog.LOG_ERR, - "Account %s hostnames format error" % self.description - ) - return False - - # Get record ID - response = self.send_request( - action='DescribeRecordList', - payload={ - 'RecordType': recordType, - 'Domain': self.settings.get('zone') - } - ) - try: - payload = response.json() - except requests.exceptions.JSONDecodeError: - payload = {} - if 'Response' in payload and 'Error' in payload['Response']: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error parsing JSON response [ZoneID] %s" % (self.description, payload['Response']['Error']['Code']) - ) - return False - if not payload['Response'].get('RecordList', False): - syslog.syslog( - syslog.LOG_ERR, - "Account %s error receiving ZoneID [%s]" % (self.description, response.text) - ) - return False - - record_id_list = [x['RecordId'] for x in payload['Response']['RecordList'] if x['Name'] in subdomains] - if len(record_id_list) < 1: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error Not Found Record [%s]" % (self.description, self.settings.get('hostnames')) - ) - return False - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s ZoneID for %s %s" % (self.description, self.settings.get('zone'), record_id_list) - ) - - # Send IP address update - response = self.send_request( - action='ModifyRecordBatch', - payload={ - 'RecordIdList': record_id_list, - 'Change': 'value', - 'ChangeTo': str(self.current_address), - } - ) - try: - payload = response.json() - except requests.exceptions.JSONDecodeError: - payload = {} - if 'Response' in payload and 'Error' in payload['Response']: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error parsing JSON response [UpdateIP] %s" % (self.description, payload['Response']['Error']['Code']) - ) - return False - if len(payload['Response']['DetailList']) < 1: - syslog.syslog( - syslog.LOG_ERR, - "Account %s failed to set new ip %s [%s]" % (self.description, self.current_address, response.text) - ) - return False - - record_list = payload['Response']['DetailList'][0].get('RecordList', False) - if record_list and len(record_list) == len(subdomains): - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s set new ip %s %s" % ( - self.description, - self.current_address, - subdomains - ) - ) - - self.update_state(address=self.current_address) - return True - - syslog.syslog( - syslog.LOG_ERR, - "Account %s failed to set new ip %s %s" % (self.description, self.current_address, subdomains) - ) - - - return False diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetzner.py b/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetzner.py deleted file mode 100644 index 68074597ee..0000000000 --- a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/hetzner.py +++ /dev/null @@ -1,545 +0,0 @@ -""" - Copyright (c) 2025 Arcan Consulting (www.arcan-it.de) - 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. - - Hetzner DNS providers for OPNsense DynDNS - - Supports both APIs: - - Hetzner DNS (api.hetzner.cloud) - new Cloud API for migrated zones - - Hetzner DNS Legacy (dns.hetzner.com) - old API, shutting down May 2026 -""" -import syslog -import requests -from . import BaseAccount - - -class Hetzner(BaseAccount): - """ - Hetzner Cloud DNS API provider - Uses the new Cloud API (api.hetzner.cloud) - API Documentation: https://docs.hetzner.cloud/#dns - """ - _priority = 65535 - - _services = ['hetzner'] - - _api_base = "https://api.hetzner.cloud/v1" - - def __init__(self, account: dict): - super().__init__(account) - - @staticmethod - def known_services(): - return {'hetzner': 'Hetzner DNS'} - - @staticmethod - def match(account): - return account.get('service') in Hetzner._services - - def _get_headers(self): - return { - 'User-Agent': 'OPNsense-dyndns', - 'Authorization': 'Bearer ' + self.settings.get('password', ''), - 'Content-Type': 'application/json' - } - - def _get_zone_name(self): - """Get zone name from settings - try 'zone' field first, then 'username' as fallback""" - zone_name = self.settings.get('zone', '').strip() - if not zone_name: - zone_name = self.settings.get('username', '').strip() - return zone_name - - def _get_zone_id(self, headers): - """Get zone ID by zone name""" - zone_name = self._get_zone_name() - - url = f"{self._api_base}/zones" - params = {'name': zone_name} - - response = requests.get(url, headers=headers, params=params) - - if response.status_code != 200: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error fetching zones: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return None - - try: - payload = response.json() - except requests.exceptions.JSONDecodeError: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error parsing JSON response: %s" % (self.description, response.text) - ) - return None - - zones = payload.get('zones', []) - if not zones: - syslog.syslog( - syslog.LOG_ERR, - "Account %s zone '%s' not found" % (self.description, zone_name) - ) - return None - - zone_id = zones[0].get('id') - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s found zone ID %s for %s" % (self.description, zone_id, zone_name) - ) - - return zone_id - - def _get_record(self, headers, zone_id, record_name, record_type): - """Get existing record by name and type""" - url = f"{self._api_base}/zones/{zone_id}/rrsets/{record_name}/{record_type}" - - response = requests.get(url, headers=headers) - - if response.status_code == 404: - return None - - if response.status_code != 200: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error fetching record: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return None - - try: - payload = response.json() - return payload.get('rrset') - except requests.exceptions.JSONDecodeError: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error parsing JSON response: %s" % (self.description, response.text) - ) - return None - - def _update_record(self, headers, zone_id, record_name, record_type, address): - """Update existing record with new address""" - url = f"{self._api_base}/zones/{zone_id}/rrsets/{record_name}/{record_type}" - - data = { - 'records': [{'value': str(address)}], - 'ttl': int(self.settings.get('ttl', 300)) - } - - response = requests.put(url, headers=headers, json=data) - - if response.status_code != 200: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error updating record: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return False - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s updated %s %s to %s" % ( - self.description, record_name, record_type, address - ) - ) - - return True - - def _create_record(self, headers, zone_id, record_name, record_type, address): - """Create new record""" - url = f"{self._api_base}/zones/{zone_id}/rrsets" - - data = { - 'name': record_name, - 'type': record_type, - 'records': [{'value': str(address)}], - 'ttl': int(self.settings.get('ttl', 300)) - } - - response = requests.post(url, headers=headers, json=data) - - if response.status_code not in [200, 201]: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error creating record: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return False - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s created %s %s with %s" % ( - self.description, record_name, record_type, address - ) - ) - - return True - - def _extract_record_name(self, hostname, zone_name): - """Extract record name from hostname, handling FQDN format""" - hostname = hostname.rstrip('.') - - if hostname.endswith('.' + zone_name): - record_name = hostname[:-len(zone_name) - 1] - elif hostname == zone_name: - record_name = '@' - else: - record_name = hostname - - if not record_name or record_name == '@': - record_name = '@' - - return record_name - - def execute(self): - if super().execute(): - record_type = "AAAA" if ':' in str(self.current_address) else "A" - headers = self._get_headers() - - zone_id = self._get_zone_id(headers) - if not zone_id: - return False - - zone_name = self._get_zone_name() - - hostnames_raw = self.settings.get('hostnames', '') - hostnames = [h.strip() for h in hostnames_raw.split(',') if h.strip()] - - if not hostnames: - syslog.syslog( - syslog.LOG_ERR, - "Account %s no hostnames configured" % self.description - ) - return False - - all_success = True - for hostname in hostnames: - record_name = self._extract_record_name(hostname, zone_name) - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s updating %s (record: %s, type: %s) to %s" % ( - self.description, hostname, record_name, record_type, self.current_address - ) - ) - - existing = self._get_record(headers, zone_id, record_name, record_type) - - if existing: - success = self._update_record( - headers, zone_id, record_name, record_type, self.current_address - ) - else: - success = self._create_record( - headers, zone_id, record_name, record_type, self.current_address - ) - - if success: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s set new IP %s for %s" % ( - self.description, self.current_address, hostname - ) - ) - else: - all_success = False - - if all_success: - self.update_state(address=self.current_address) - return True - - return False - - -class HetznerLegacy(BaseAccount): - """ - Hetzner DNS Console (Legacy) API provider - Uses the old API at dns.hetzner.com - will be shut down May 2026 - For zones not yet migrated to Hetzner Cloud Console - API Documentation: https://dns.hetzner.com/api-docs - """ - _priority = 65535 - - _services = ['hetzner-legacy'] - - _api_base = "https://dns.hetzner.com/api/v1" - - def __init__(self, account: dict): - super().__init__(account) - - @staticmethod - def known_services(): - return {'hetzner-legacy': 'Hetzner DNS Legacy (deprecated)'} - - @staticmethod - def match(account): - return account.get('service') in HetznerLegacy._services - - def _get_headers(self): - return { - 'User-Agent': 'OPNsense-dyndns', - 'Auth-API-Token': self.settings.get('password', ''), - 'Content-Type': 'application/json' - } - - def _get_zone_name(self): - """Get zone name from settings - try 'zone' field first, then 'username' as fallback""" - zone_name = self.settings.get('zone', '').strip() - if not zone_name: - zone_name = self.settings.get('username', '').strip() - return zone_name - - def _get_zone_id(self, headers): - """Get zone ID by zone name""" - zone_name = self._get_zone_name() - - url = f"{self._api_base}/zones" - response = requests.get(url, headers=headers) - - if response.status_code != 200: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error fetching zones: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return None - - try: - payload = response.json() - except requests.exceptions.JSONDecodeError: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error parsing JSON response: %s" % (self.description, response.text) - ) - return None - - zones = payload.get('zones', []) - for zone in zones: - if zone.get('name') == zone_name: - zone_id = zone.get('id') - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s found zone ID %s for %s" % (self.description, zone_id, zone_name) - ) - return zone_id - - syslog.syslog( - syslog.LOG_ERR, - "Account %s zone '%s' not found" % (self.description, zone_name) - ) - return None - - def _get_record_id(self, headers, zone_id, record_name, record_type): - """Get record ID by name and type""" - url = f"{self._api_base}/records" - params = {'zone_id': zone_id} - - response = requests.get(url, headers=headers, params=params) - - if response.status_code != 200: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error fetching records: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return None - - try: - payload = response.json() - except requests.exceptions.JSONDecodeError: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error parsing JSON response: %s" % (self.description, response.text) - ) - return None - - records = payload.get('records', []) - for record in records: - if record.get('name') == record_name and record.get('type') == record_type: - record_id = record.get('id') - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s found record ID %s for %s %s" % ( - self.description, record_id, record_name, record_type - ) - ) - return record_id - - return None - - def _update_record(self, headers, zone_id, record_id, record_name, record_type, address): - """Update existing record with new address""" - url = f"{self._api_base}/records/{record_id}" - - data = { - 'zone_id': zone_id, - 'type': record_type, - 'name': record_name, - 'value': str(address), - 'ttl': int(self.settings.get('ttl', 300)) - } - - response = requests.put(url, headers=headers, json=data) - - if response.status_code != 200: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error updating record: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return False - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s updated %s %s to %s" % ( - self.description, record_name, record_type, address - ) - ) - - return True - - def _create_record(self, headers, zone_id, record_name, record_type, address): - """Create new record""" - url = f"{self._api_base}/records" - - data = { - 'zone_id': zone_id, - 'type': record_type, - 'name': record_name, - 'value': str(address), - 'ttl': int(self.settings.get('ttl', 300)) - } - - response = requests.post(url, headers=headers, json=data) - - if response.status_code not in [200, 201]: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error creating record: HTTP %d - %s" % ( - self.description, response.status_code, response.text - ) - ) - return False - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s created %s %s with %s" % ( - self.description, record_name, record_type, address - ) - ) - - return True - - def _extract_record_name(self, hostname, zone_name): - """Extract record name from hostname, handling FQDN format""" - hostname = hostname.rstrip('.') - - if hostname.endswith('.' + zone_name): - record_name = hostname[:-len(zone_name) - 1] - elif hostname == zone_name: - record_name = '@' - else: - record_name = hostname - - if not record_name or record_name == '@': - record_name = '@' - - return record_name - - def execute(self): - if super().execute(): - record_type = "AAAA" if ':' in str(self.current_address) else "A" - headers = self._get_headers() - - zone_id = self._get_zone_id(headers) - if not zone_id: - return False - - zone_name = self._get_zone_name() - - hostnames_raw = self.settings.get('hostnames', '') - hostnames = [h.strip() for h in hostnames_raw.split(',') if h.strip()] - - if not hostnames: - syslog.syslog( - syslog.LOG_ERR, - "Account %s no hostnames configured" % self.description - ) - return False - - all_success = True - for hostname in hostnames: - record_name = self._extract_record_name(hostname, zone_name) - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s updating %s (record: %s, type: %s) to %s" % ( - self.description, hostname, record_name, record_type, self.current_address - ) - ) - - record_id = self._get_record_id(headers, zone_id, record_name, record_type) - - if record_id: - success = self._update_record( - headers, zone_id, record_id, record_name, record_type, self.current_address - ) - else: - success = self._create_record( - headers, zone_id, record_name, record_type, self.current_address - ) - - if success: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s set new IP %s for %s" % ( - self.description, self.current_address, hostname - ) - ) - else: - all_success = False - - if all_success: - self.update_state(address=self.current_address) - return True - - return False diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/powerdns.py b/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/powerdns.py deleted file mode 100755 index ea931a0cf2..0000000000 --- a/dns/ddclient/src/opnsense/scripts/ddclient/lib/account/powerdns.py +++ /dev/null @@ -1,209 +0,0 @@ -""" - Copyright (c) 2023 Ad Schellevis - Copyright (c) 2024 Olly Baker - Copyright (c) 2025 Oliver Traber - 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. -""" -import syslog -import requests -from . import BaseAccount - - -class PowerDNS(BaseAccount): - - def __init__(self, account: dict): - super().__init__(account) - # min TTL set to 300 - self.settings['ttl'] = max(int(self.settings["ttl"]) if self.settings.get("ttl", "").isdigit() else 0, 300) - - @staticmethod - def known_services(): - return {"powerdns": "PowerDNS API"} - - @staticmethod - def match(account): - return account.get("service") in ['powerdns'] - - - def _send_request(self, method, url, params=None, json=None): - headers = { - "User-Agent": "OPNsense-dyndns", - "X-API-Key": self.settings.get("password"), - } - - base_url = "%s/api/v1/servers/%s" % ( - self.settings.get('server'), - self.settings.get("server_id", "localhost") - ) - - url = base_url + url - return requests.request(method=method, url=url, headers=headers, params=params, json=json) - - - def _find_zone_id(self, hostname): - # Get the zone that a record belongs to - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s trying to get zone ID for hostname %s" - % (self.description, hostname), - ) - - zone = hostname - while (True): - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s checking if zone %s exists" - % (self.description, zone), - ) - - response = self._send_request(method="GET", url="/zones", params={"zone": zone}) - - if response.status_code == 200: - try: - payload = response.json() - # Check if a zone was found - if len(payload) == 0: - # Move one up in hierarchy - zone = '.'.join(zone.split('.')[1:]) - # Fail if root is reached - if zone == "": - syslog.syslog( - syslog.LOG_ERR, - "Account %s error getting zone ID for hostname %s - No matching zone found on server" - % (self.description, hostname), - ) - return None - else: - continue - else: - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s found zone %s for hostname %s" - % (self.description, zone, hostname), - ) - return payload[0].get("id") - except requests.exceptions.JSONDecodeError: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error getting zone ID for hostname %s - Failed to decode response as JSON. Response: %s" - % (self.description, hostname, response.text), - ) - return None - else: - syslog.syslog( - syslog.LOG_ERR, - "Account %s error getting zone ID for hostname %s HTTP %s. Response: %s" - % ( - self.description, - hostname, - response.status_code, - response.text, - ), - ) - return None - - def _replace_rrset(self, hostname, zone_id, record_type, content): - # Replace or create rrset for record - payload = { - "rrsets": [ - { - "name": hostname, - "type": record_type, - "ttl": int(self.settings.get("ttl")), - "changetype": "REPLACE", - "records": [ - {"content": content} - ] - } - ] - } - - response = self._send_request(method="PATCH", url=("/zones/" + zone_id), json=payload) - if response.status_code == 204: - # Success - return True - else: - # Failure - syslog.syslog( - syslog.LOG_ERR, - "Account %s error updating hostname %s in zone %s - HTTP %s Response: %s" - % ( - self.description, - hostname, - zone_id, - response.status_code, - response.text, - ), - ) - return False - - def execute(self): - if super().execute(): - record_type = "AAAA" if str(self.current_address).find(":") > 1 else "A" - - if self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s current IP is %s (%s)" - % (self.description, self.current_address, record_type), - ) - - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s updating hostnames %s" - % (self.description, self.settings.get("hostnames", "")), - ) - - # Update each hostname - for hostname in self.settings.get("hostnames", "").split(","): - - # Make hostname absolute - if not hostname.endswith("."): - hostname = hostname + "." - - # Get id of zone the hostname belongs to - zone_id = self._find_zone_id(hostname) - - # If zone can't be found, skip - if zone_id == None: - continue - - # Update record set - if self._replace_rrset(hostname, zone_id, record_type, content=self.current_address) and self.is_verbose: - syslog.syslog( - syslog.LOG_NOTICE, - "Account %s successfully updated hostname %s (%s) to IP %s" - % ( - self.description, - hostname, - record_type, - self.current_address, - ), - ) - self.update_state(address=self.current_address) - return True - return False diff --git a/dns/ddclient/src/opnsense/scripts/ddclient/lib/address.py b/dns/ddclient/src/opnsense/scripts/ddclient/lib/address.py index 396b4720b1..44ad79299a 100755 --- a/dns/ddclient/src/opnsense/scripts/ddclient/lib/address.py +++ b/dns/ddclient/src/opnsense/scripts/ddclient/lib/address.py @@ -26,8 +26,6 @@ import subprocess import re import ipaddress -import dns.resolver -import dns.rdataclass from urllib.parse import urlparse checkip_service_list = { @@ -53,19 +51,6 @@ 'zoneedit': '%s://dynamic.zoneedit.com/checkip.html' } -checkip_dns_list = { - 'cloudflare-dns': { - 'nameservers': ['1.1.1.1','1.0.0.1'], - 'resolve_params': { - 'qname': 'whoami.cloudflare', - 'rdtype': 'TXT', - 'rdclass': dns.rdataclass.from_text('CH') - } - } -} - -def registered_services(): - return list(checkip_service_list.keys()) + list(checkip_dns_list.keys()) def extract_address(host, txt): """ Extract first IPv4 or IPv6 address from provided string @@ -102,17 +87,17 @@ def transform_ip(ip, ipv6host=None): def checkip(service, proto='https', timeout='10', interface=None, dynipv6host=None): - """ find ip address using external web services defined in checkip_service_list - or dns services defined in checkip_dns_list + """ find ip address using external services defined in checkip_service_list :param proto: protocol :param timeout: timeout in seconds :param interface: bind to interface :param dynipv6host: optional partial ipv6 address :return: str """ - if service.lstrip('web_') in checkip_service_list: + if service.startswith('web_'): # configuration name, strip web_ part - service = service.lstrip('web_') + service = service[4:] + if service in checkip_service_list: params = ['/usr/local/bin/curl', '-m', timeout] if interface is not None: params.append("--interface") @@ -139,15 +124,5 @@ def checkip(service, proto='https', timeout='10', interface=None, dynipv6host=No return str(address) except ValueError: continue - elif service.lstrip('dns_') in checkip_dns_list: - svc_info = checkip_dns_list[service.lstrip('dns_')] - resolve_params = svc_info['resolve_params'] - dns_resolver = dns.resolver.Resolver() - dns_resolver.nameservers = svc_info['nameservers'] - try: - dns_response = dns_resolver.resolve(**resolve_params) - return dns_response[0].to_text().strip('"') - except: - return "" else: return "" diff --git a/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf b/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf index d82eb19d9d..95e37f9c73 100644 --- a/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf +++ b/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf @@ -36,7 +36,7 @@ use=cmd, cmd="/usr/local/opnsense/scripts/ddclient/checkip -t {{account.force_ss {% if account.service == 'custom' %} protocol={{account.protocol}}, \ server={{account.server}}, \ -{% elif account.service in ['cloudflare', 'digitalocean', 'dnspodcn'] %} +{% elif account.service in ['cloudflare', 'digitalocean'] %} protocol={{account.service}}, \ zone={{account.zone}}, \ {% elif account.service == 'cloudns' %} diff --git a/dns/rfc2136/Makefile b/dns/rfc2136/Makefile index d589ee31a2..37d29c8e9d 100644 --- a/dns/rfc2136/Makefile +++ b/dns/rfc2136/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= rfc2136 PLUGIN_VERSION= 1.9 -PLUGIN_REVISION= 5 +PLUGIN_REVISION= 4 PLUGIN_COMMENT= RFC-2136 Support PLUGIN_MAINTAINER= franco@opnsense.org PLUGIN_DEPENDS= bind-tools diff --git a/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc b/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc index 2f36beac2c..bf346cd29b 100644 --- a/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc +++ b/dns/rfc2136/src/etc/inc/plugins.inc.d/rfc2136.inc @@ -198,19 +198,16 @@ function rfc2136_configure_do($verbose = false, $int = null, $updatehost = '', $ $upinst .= "\n"; /* mind that trailing newline! */ if ($need_update) { - file_safe("/var/etc/nsupdatecmds{$i}", $upinst); - - $frmt = ['/usr/local/bin/nsupdate -k %s']; - $args = [$keyfile]; - + @file_put_contents("/var/etc/nsupdatecmds{$i}", $upinst); + unset($upinst); + /* invoke nsupdate */ + $cmd = "/usr/local/bin/nsupdate -k {$keyfile}"; if (isset($dnsupdate['usetcp'])) { - $frmt[] = '-v'; + $cmd .= " -v"; } - - $args[] = "/var/etc/nsupdatecmds{$i}"; - $frmt[] = '%s'; - - mwexecfb($frmt, $args); + $cmd .= " /var/etc/nsupdatecmds{$i}"; + mwexec_bg($cmd); + unset($cmd); } } diff --git a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf index 65be3ea0ff..49419f5d14 100644 --- a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf +++ b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf @@ -80,7 +80,6 @@ smtpd_banner = $myhostname ESMTP Postfix {% endif %} {% if helpers.exists('OPNsense.postfix.general.message_size_limit') and OPNsense.postfix.general.message_size_limit != '' %} message_size_limit = {{ OPNsense.postfix.general.message_size_limit }} -mailbox_size_limit = {{ OPNsense.postfix.general.message_size_limit }} {% endif %} {% if helpers.exists('OPNsense.postfix.general.masquerade_domains') and OPNsense.postfix.general.masquerade_domains != '' %} masquerade_domains = {{ OPNsense.postfix.general.masquerade_domains }} diff --git a/mail/rspamd/src/opnsense/mvc/app/models/OPNsense/Rspamd/RSpamd.xml b/mail/rspamd/src/opnsense/mvc/app/models/OPNsense/Rspamd/RSpamd.xml index b327dff800..5bd77ea2f4 100644 --- a/mail/rspamd/src/opnsense/mvc/app/models/OPNsense/Rspamd/RSpamd.xml +++ b/mail/rspamd/src/opnsense/mvc/app/models/OPNsense/Rspamd/RSpamd.xml @@ -1,497 +1,514 @@ - //OPNsense/Rspamd - rspamd anti spam filter - 1.0.2 - - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - N - 1 - 999 - - - This field must be bigger than the subject score. - ComparedToFieldConstraint - subjectscore - gt - - - This field must be bigger than the reject score. - ComparedToFieldConstraint - headerscore - gt - - - This field must be bigger than the greylist score. - ComparedToFieldConstraint - greylistscore - gt - - - - - N - 1 - 999 - - - This field must be lower than the subject score. - ComparedToFieldConstraint - subjectscore - lt - - - This field must be lower than the reject score. - ComparedToFieldConstraint - rejectscore - lt - - - This field must be bigger than the greylist score. - ComparedToFieldConstraint - greylistscore - gt - - - - - N - 1 - 999 - - - This field must be lower than the header score. - ComparedToFieldConstraint - headerscore - lt - - - This field must be lower than the reject score. - ComparedToFieldConstraint - rejectscore - lt - - - This field must be lower than the subject score. - ComparedToFieldConstraint - subjectscore - lt - - - - - N - 1 - 999 - - - This field must be bigger than the header score. - ComparedToFieldConstraint - headerscore - gt - - - This field must be lower than the reject score. - ComparedToFieldConstraint - rejectscore - lt - - - This field must be bigger than the subject score. - ComparedToFieldConstraint - greylistscore - gt - - - - - N - - - 200 - Y - 1 - 100000 - Choose a value between 1 and 100000. - - - 127.0.0.1 - Y - , - Y - - - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - /[a-z0-9\.\-_@,]+/i - N - - - - - N - 1 - - - N - 1 - - - N - - - 1 - N - 32 - A valid IPv4 mask must be between 1 and 32 bits. - 19 - - - 1 - N - 128 - 64 - A valid IPv6 mask must be between 1 and 128 bits. 64 bits are recommended as this is the recommended subnet size in IPv6. - - - N - /^([a-fA-F0-9\.:\[\]\/]*?,)*([a-fA-F0-9\.:\[\]\/]*)$/ - - - - - 1 - N - A valid cache size must be set. - - - 1 - N - A valid cache expiration must be set. - - - 1 - N - A valid time jitter must be set. - - - 0 - Y - - - 0 - Y - - - - 1 - Y - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - 1 - Y - - - 1 - Y - - - 0 - Y - - - header - Y - -
Header
- Envelope -
-
- - 1 - Y - -
- - - 0 - Y - - - 1 - N - 86400 - A valid cache expiration must be set. - - - - - 0 - Y - - - - 0 - Y - - - 0 - Y - - - - N - - - - - - 1 - N - The count value must be a positive number. - - - - m - Y - - Seconds - Minutes - Hours - - - - - - 1 - N - The count value must be a positive number. - - - - m - Y - - Seconds - Minutes - Hours - - - - - - 1 - N - The count value must be a positive number. - - - - m - Y - - Seconds - Minutes - Hours - - - - - - 1 - N - The count value must be a positive number. - - - - m - Y - - Seconds - Minutes - Hours - - - - - - 1 - N - The count value must be a positive number. - - - - m - Y - - Seconds - Minutes - Hours - - - - - - 1 - N - The count value must be a positive number. - - - - m - Y - - Seconds - Minutes - Hours - - - - - postmaster,mailer-daemon - - - 1 - Y - 20 - - - - - 0 - Y - - - 0 - Y - - - 1 - Y - - - N - - - - - 1 - N - 2 - A valid cache size in kilobytes must be set. - - - 1 - N - A valid expiration time must be set. - - - - - 1 - Y - - - 1 - Y - - - 1 - 20000000 - N - A valid maximum size in bytes must be set. - - - N - - - - - N - - - N - - - - - N - exe,dll,scr,com,cmd,js,bat,vbs,ps1,bat,cpl,lnk,msi,msp,reg - - - N - - -
+ //OPNsense/Rspamd + rspamd anti spam filter + 1.0.2 + + + + 0 + Y + + + 0 + Y + + + 0 + Y + + + N + 1 + 999 + + + This field must be bigger than the subject score. + ComparedToFieldConstraint + subjectscore + gt + + + This field must be bigger than the reject score. + ComparedToFieldConstraint + headerscore + gt + + + This field must be bigger than the greylist score. + ComparedToFieldConstraint + greylistscore + gt + + + + + N + 1 + 999 + + + This field must be lower than the subject score. + ComparedToFieldConstraint + subjectscore + lt + + + This field must be lower than the reject score. + ComparedToFieldConstraint + rejectscore + lt + + + This field must be bigger than the greylist score. + ComparedToFieldConstraint + greylistscore + gt + + + + + N + 1 + 999 + + + This field must be lower than the header score. + ComparedToFieldConstraint + headerscore + lt + + + This field must be lower than the reject score. + ComparedToFieldConstraint + rejectscore + lt + + + This field must be lower than the subject score. + ComparedToFieldConstraint + subjectscore + lt + + + + + N + 1 + 999 + + + This field must be bigger than the header score. + ComparedToFieldConstraint + headerscore + gt + + + This field must be lower than the reject score. + ComparedToFieldConstraint + rejectscore + lt + + + This field must be bigger than the subject score. + ComparedToFieldConstraint + greylistscore + gt + + + + + N + + + 200 + Y + 1 + 100000 + Choose a value between 1 and 100000. + + + 127.0.0.1 + Y + , + Y + + + + + + 0 + Y + + + 0 + Y + + + 0 + Y + + + 0 + Y + + + 0 + Y + + + 0 + Y + + + /[a-z0-9\.\-_@,]+/i + N + + + + + + N + 1 + + + N + 1 + + + N + + + 1 + N + 32 + A valid IPv4 mask must be between 1 and 32 bits. + 19 + + + 1 + N + 128 + 64 + A valid IPv6 mask must be between 1 and 128 bits. 64 bits are recommended as this is the recommended subnet size in IPv6. + + + N + /^([a-fA-F0-9\.:\[\]\/]*?,)*([a-fA-F0-9\.:\[\]\/]*)$/ + + + + + + 1 + N + A valid cache size must be set. + + + 1 + N + A valid cache expiration must be set. + + + 1 + N + A valid time jitter must be set. + + + 0 + Y + + + 0 + Y + + + + 1 + Y + + + 0 + Y + + + 0 + Y + + + 0 + Y + + + 1 + Y + + + 1 + Y + + + 0 + Y + + + header + Y + +
Header
+ Envelope +
+
+ + 1 + Y + +
+ + + + 0 + Y + + + 1 + N + 86400 + A valid cache expiration must be set. + + + + + + 0 + Y + + + + N + + + 0 + Y + + + 0 + Y + + + + N + + + N + + + + + + + 1 + N + The count value must be a positive number. + + + + m + Y + + Seconds + Minutes + Hours + + + + + + 1 + N + The count value must be a positive number. + + + + m + Y + + Seconds + Minutes + Hours + + + + + + 1 + N + The count value must be a positive number. + + + + m + Y + + Seconds + Minutes + Hours + + + + + + 1 + N + The count value must be a positive number. + + + + m + Y + + Seconds + Minutes + Hours + + + + + + 1 + N + The count value must be a positive number. + + + + m + Y + + Seconds + Minutes + Hours + + + + + + 1 + N + The count value must be a positive number. + + + + m + Y + + Seconds + Minutes + Hours + + + + + postmaster,mailer-daemon + + + 1 + Y + 20 + + + + + + 0 + Y + + + 0 + Y + + + 1 + Y + + + N + + + + + + 1 + N + 2 + A valid cache size in kilobytes must be set. + + + 1 + N + A valid expiration time must be set. + + + + + + 1 + Y + + + 1 + Y + + + 1 + 20000000 + N + A valid maximum size in bytes must be set. + + + N + + + + + + N + + + N + + + + + + N + exe,dll,scr,com,cmd,js,bat,vbs,ps1,bat,cpl,lnk,msi,msp,reg + + + N + + +
diff --git a/misc/theme-advanced/Makefile b/misc/theme-advanced/Makefile index 2e92be9e10..2c4c80b3b5 100644 --- a/misc/theme-advanced/Makefile +++ b/misc/theme-advanced/Makefile @@ -1,6 +1,7 @@ PLUGIN_NAME= theme-advanced -PLUGIN_VERSION= 1.1 -PLUGIN_COMMENT= Theme based on AdvancedTomato GUI +PLUGIN_VERSION= 1.0 +PLUGIN_REVISION= 3 +PLUGIN_COMMENT= OPNsense theme based on AdvancedTomato GUI PLUGIN_MAINTAINER= jacky@prahec.com PLUGIN_WWW= https://prahec.com/ PLUGIN_NO_ABI= yes diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_tables.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_tables.scss index 7f87ca4c13..2e5f9a51dc 100644 --- a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_tables.scss +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/bootstrap/_tables.scss @@ -13,6 +13,7 @@ th { // Baseline styles + .table { width: 100%; max-width: 100%; diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/dashboard.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/dashboard.scss index af78a80af8..7a7d96579d 100644 --- a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/dashboard.scss +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/dashboard.scss @@ -128,11 +128,20 @@ td { word-break: break-all; } +.canvas-container-noaspectratio { + position: relative; +} .canvas-container { position: relative; } +.canvas-container > canvas { + /* ChartJS v4 workaround: https://github.com/chartjs/Chart.js/issues/11005 */ + width: 100% !important; + height: 100% !important; +} + .cpu-canvas-container { display: flex; flex-direction: column; diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/opnsense-bootgrid.scss b/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/opnsense-bootgrid.scss deleted file mode 100644 index 13d4509a66..0000000000 --- a/misc/theme-advanced/src/opnsense/www/themes/advanced/assets/stylesheets/opnsense-bootgrid.scss +++ /dev/null @@ -1,488 +0,0 @@ -$colors: ( - default: #536270, - primary: #51aded, - navbg: #263238, - lightgrey: #f7f7f7, - lightergrey: #fbfbfb, - darkgrey: #3c3c3b, - bordergrey: #eaeaea, -); - -@import "bootstrap/variables"; - -/** -* Customized -*/ -@mixin button-variant($color, $background, $border) { - color: $color; - background-color: $background; - border-color: $border; - - &:hover, - &:focus, - &:active, - &.active, - .open > &.dropdown-toggle, - :not(disabled):hover { - color: $color !important; - background-color: darken($background, 10%) !important; - border-color: darken($border, 12%) !important; - } - &:active, - &.active, - .open > &.dropdown-toggle { - background-image: none; - } - &.disabled, - &[disabled], - fieldset[disabled] & { - &, - &:hover, - &:focus, - &:active, - &.active { - background-color: $background; - border-color: $border; - } - } - - .badge { - color: $background; - background-color: $color; - } -} - -// Button sizes -@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) { - padding: $padding-vertical $padding-horizontal; - font-size: $font-size; - line-height: $line-height; - border-radius: $border-radius; -} - - -/** -* Main theming elements -*/ -.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover { - background-color: #FBFBFB; -} - -.tabulator .tabulator-headers { - height: 100% !important; /* make sure the border below appears */ -} - -/*------------*/ -/* theme: body */ -.tabulator .tabulator-tableholder .tabulator-table { - background-color: transparent; -} - -.tabulator-row { - background-color: transparent; - color: #373736; -} - -.tabulator-row.tabulator-row-odd { - background-color: #FBFBFB; -} - -.tabulator-row.tabulator-row-odd.tabulator-selectable:hover:not(.tabulator-selected) { - background-color: $table-bg-hover; -} - -.tabulator-row.tabulator-row-even.tabulator-selectable:hover:not(.tabulator-selected) { - background-color: $table-bg-hover; -} - -.tabulator .tabulator-tableholder { - background-color: transparent; -} - -.tabulator-row.tabulator-selected { - background-color: #e3e8f0; -} - -.tabulator-row.tabulator-selected:hover { - cursor: pointer; - background-color: #e3e8f0; -} - -.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg { - color: #373736; /* spinner icon */ -} - -/* Command column styles */ -.tabulator-col.tabulator-frozen.tabulator-frozen-right { -} - -.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right { -} - -/* Tabulator groupBy row styles */ -.tabulator-row.tabulator-group { - border: none; - pointer-events: none; -} - -.tabulator-row.tabulator-group span { - margin-left: 0; - color: #373736; -} - -.tabulator-row .badge.chip { - background-color: #31708f; - color: #FFF; - font-size: 10px; - padding: 2px 4px; - position: relative; - top: -1px; -} - -.tabulator-row.tabulator-group .tabulator-group-toggle, -.tabulator-row.tabulator-group .tabulator-group-toggle * { - pointer-events: auto; -} - -.tabulator-row.tabulator-group:has(> .tabulator-group-toggle:only-child) { - display: none; /* Trick to hide empty groupBy header rows */ -} - -/*------------*/ -/* theme: cells */ -.tabulator-row .tabulator-cell { - text-overflow: ellipsis; - white-space: nowrap; - line-height: 1.2; - vertical-align: top; -} - -/*-------------*/ -/* theme: footer */ -.tabulator .tabulator-footer { - border-top: none; - background-color: transparent; -} - -.tabulator-page-counter { - color: #373736; -} - -.tabulator .tabulator-footer .tabulator-paginator { - color: #373736; -} - -.tabulator .tabulator-footer .tabulator-page { - -} - -/*----------*/ -/* end of main theming elements */ -.tabulator-paginator { - flex: 0 !important; -} - -.tabulator-page-counter { - flex: 1; - text-align: right; -} - -.tabulator-col-sorter i { - display: flex; - justify-content: center; - align-items: center; -} - -.tabulator .tabulator-header .tabulator-col { - padding: 5px; -} - -.tabulator .tabulator-headers > :first-child { - padding-left: 10px; -} - -.opnsense-bootgrid-responsive { - white-space: wrap !important; - text-overflow: inherit !important; - overflow: visible !important; - word-break: break-word !important; -} - -.opnsense-bootgrid-ellipsis { - overflow: hidden !important; - white-space: nowrap !important; - text-overflow: ellipsis !important; -} - -.tabulator-row > :first-child { - padding-left: 10px; -} - -.tabulator .tabulator-header .tabulator-col .tabulator-col-content { - padding: 0px; -} - -.tabulator-page-counter { - padding-right: 20px; -} - -.bootgrid-footer-commands { - width: 90px; - padding-left: 8px; -} - -.tabulator-tableholder::after { - content: ""; - display: block; - width: 1px; - height: 1px; - min-width: 100%; -} - -.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:first-child { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:last-child { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -/* border line corrections and hover/selection behavior */ -.tabulator-row:first-child > .tabulator-cell { - border-top: none; -} - -.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title { - padding: 0px; -} - -/* Row highlight behavior */ -@keyframes highlight { - 0% { - background: #ffff99; - } - 100% { - background: none; - } -} - -.highlight-bg { - animation: highlight 2s; -} - -/* Tabulator "loading" and "error" overrides */ -.tabulator .tabulator-alert { - background: none; -} - -.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg { - border: none; -} - -.tabulator .tabulator-alert .tabulator-alert-msg { - background: initial; - font-size: 18px; -} - -.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error { - border: none; -} - -.bootgrid-placeholder { - font-size: 15px; - text-align: center; - white-space: normal; - font-weight: 400; - margin: 10px; -} - -.bootgrid-overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(255, 255, 255, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 99; -} - -.overlay > i { - font-size: 20px; - color: black; -} - -/** -* Main theming elements for tabulator -/* Base */ -.tabulator { - width: 100%; - font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; - font-size: 13px; - background: #fff; - border: 1px solid $table-border-color; /* .table-bordered */ - border-radius: 0; -} - -/* Header */ -.tabulator .tabulator-header { - background: #fff; - border-bottom: 1px solid $table-border-color; /* thead bottom border */ - border-top: 0; - border-left: 0; - border-right: 0; -} - -.tabulator .tabulator-header .tabulator-col { - background: transparent; - color: #333; - border-right: 1px solid $table-border-color; /* col separators */ -} - -.tabulator .tabulator-header .tabulator-col:last-child { - border-right: 0; -} - -/* Header cell inner (align/padding like Bootstrap) */ -.tabulator .tabulator-header .tabulator-col .tabulator-col-content { - padding: 10px 0 10px 20px; /* th padding */ - line-height: 1.428571429; -} - -/* Sort hover (subtle) */ -.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover { - background: #f5f5f5; -} - - -/* Body */ -.tabulator .tabulator-tableholder { - background: #fff; -} - -.tabulator-row { - background: #fff; - color: #333; - border-top: 1px solid $table-border-color; /* row top border like Bootstrap */ -} - -/* Cells */ -.tabulator-row .tabulator-cell { - padding: 10px 0 10px 20px; /* td padding */ - line-height: 1.428571429; - vertical-align: top; - border-right: 1px solid $table-border-color; /* col separators */ - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left, -.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left, -.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left, -.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left, -.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right, -.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right { - border-color: $table-border-color; - border-width: 1px; -} - -.tabulator-row .tabulator-cell:last-child { - border-right: 0; -} - -.tabulator-header { - .tabulator-row-header input, - .tabulator-cell input { - margin-left: -24px; - } -} - -.tabulator-table { - .tabulator-row-header input, - .tabulator-cell input { - margin-left: -18px; - } -} - -/* Striped (.table-striped) */ -.tabulator.tabulator-striped .tabulator-row:nth-child(odd) { - background: #fbfbfb; -} - -/* Hover (.table-hover) */ -.tabulator.tabulator-hover .tabulator-row:hover { - background: $table-bg-hover !important; -} - -/* Active state (matches .active bg) */ -.tabulator-row.tabulator-selected { - background: $table-bg-hover !important; -} - -.tabulator-row.tabulator-selected:hover { - background: $table-bg-hover !important; -} - -/* Footer (pagination) */ -.tabulator .tabulator-footer { - background: #fff; - border-top: 1px solid $table-border-color; - color: #555; -} - -.tabulator .tabulator-footer .tabulator-page { - border: 1px solid $table-border-color; - background: #fff; - color: #333; - border-radius: 0; - margin: 0; - padding: 6px 12px; /* Bootstrap-like pager */ - - @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border); -} - -@media (hover: hover) and (pointer: fine) { - .tabulator .tabulator-footer .tabulator-page:not(disabled):hover { - } -} - -.tabulator-row.tabulator-row-even { - background-color: $table-bg -} - -.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title { - overflow: visible; -} - - -.tabulator-row.tabulator-selected { - background-color: #9abcea -} - -.tabulator .tabulator-alert { - align-items: center; - background: rgba(#fff, .5); - display: flex; - height: 100%; - left: 0; - position: absolute; - text-align: center; - top: 0; - width: 100%; - z-index: 100; -} - -/** - * jQuery Bootstrap Grid - */ -.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item.dropdown-item-checkbox, -.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item.dropdown-item-checkbox, -.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item .dropdown-item-checkbox, -.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item .dropdown-item-checkbox { - margin: 0 8px 4px -8px !important; -} diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/dashboard.css b/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/dashboard.css index 6b67121b1f..947ca20757 100644 --- a/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/dashboard.css +++ b/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/dashboard.css @@ -1 +1 @@ -:root{--chart-js-background-color: #f7e2d6;--chart-js-border-color: #f6f6f6;--chart-js-font-color: #4b4b64}.btn-pressed,.btn-pressed:hover{color:#fff;background-color:#0086d9}#save-grid{position:relative;display:inline-flex;align-items:center;justify-content:center;width:50px;height:33px;margin-right:10px;transition:opacity .3s ease}#save-btn-text,#icon-container{position:absolute}#icon-container{display:inline-flex;align-items:center;justify-content:center}#save-spinner,#save-check{transition:opacity .3s ease,transform .3s ease}.transition-spinner,transition-check{transition:opacity .3s ease,transform .3s ease}.grid-stack-item-content{text-align:center;border:none !important;border-radius:.5em .5em .5em .5em;background-color:#fff;box-shadow:0 2px 4px rgba(40,40,50,.15),0 0 1px rgba(40,40,50,.35)}.widget-error{margin:50px;color:#721c24}.widget-content{position:relative;width:100%;height:100%;padding:1px;cursor:grab}.widget-header{font-size:14px;display:flex;align-items:center;justify-content:space-between;margin-top:.5em;margin-right:1em;margin-left:1em}.widget-spinner{margin-top:20px}.fa-stack.small{font-size:.5em}.close-handle,.edit-handle{padding:.2rem .5rem;cursor:pointer;text-align:right;vertical-align:middle}.close-handle>i,.edit-handle>i{font-size:1.2rem !important}.widget-header-left{display:flex;align-items:center;flex:1;justify-content:flex-start}.widget-command-container{display:flex;align-items:center;flex:1;justify-content:flex-end}.widget-title{display:flex;align-items:center;justify-content:center}.panel-divider{width:100%;height:8px;margin-bottom:10px;text-align:center}.panel-divider .line{display:none}td{word-break:break-all}.canvas-container{position:relative}.cpu-canvas-container{display:flex;flex-direction:column}.smoothie-container{width:100%}.smoothie-chart-tooltip{font-size:13px;z-index:1;padding-right:15px;padding-left:15px;pointer-events:none;color:#fff;border-radius:.5em .5em .5em .5em;background:rgba(50,50,50,.9)}.flex-container{display:flex;flex-wrap:nowrap;white-space:nowrap}.gateway-info{font-size:13px;margin:5px;padding:5px}.gateway-detail-container{display:none;margin:5px}.interface-info{display:flex;align-items:center;flex-wrap:wrap;height:100%}.nowrap{flex-wrap:nowrap}.gateway-graph{display:none}.flex-container>.gateway-graph{font-size:13px}.vertical-center-row{display:inline;height:100%}.interfaces-info{font-size:.8rem;margin:5px}.interface-descr{font-size:1em;margin-left:.8em;cursor:pointer;text-decoration:underline}.interfaces-detail-container{display:none;margin:5px}.d-flex{display:flex}.d-flex>.justify-content-start{justify-content:start}.d-flex>.justify-content-end{justify-content:end}#chartjs-toolip{z-index:20}.cpu-type{margin-top:10px;margin-bottom:10px}div{box-sizing:border-box}.flextable-container{display:block;width:95%;max-width:1200px;margin:2em auto}.flextable-header{display:flex;flex-flow:row wrap;padding:.5em .5em;transition:.5s;border-top:solid 1px rgba(0,119,217,.15) !important}.flextable-row{display:flex;align-items:center;flex-flow:row wrap;padding:.5em .5em;transition:.5s;border-top:solid 1px #e8eaef !important}.flextable-header .flex-cell{font-weight:bold}.flextable-row:hover{transition:500ms;background:#f5f5f5}.flex-cell{padding:4px 0;text-align:left;word-break:break-word}.column{display:flex;flex-flow:column wrap;width:50%;padding:0}.column .flex-cell{display:flex;flex-flow:row wrap;width:100%;padding:4px 0;border:0;border-top:#e8eaef}.column .flex-cell:hover{transition:500ms;background:#f5f5f5}.flex-subcell{width:100%;text-align:left}.column .flex-cell:not(:last-child){border-bottom:solid 1px #e8eaef !important}.grid-header-container{display:grid;grid-template-columns:repeat(auto-fit, minmax(100px, 1fr))}.grid-row{display:grid;transition:.5s;opacity:.4;border-top:1px solid #eff3f8;background-color:#d6e5f7;grid-template-columns:repeat(auto-fit, minmax(100px, 1fr))}.grid-row:hover{transition:500ms;background:#f5f5f5 !important}.grid-header{font-weight:bold;border-top:1px solid #eff3f8}.grid-item{padding:4px;text-align:center}.ovpn-common-name{display:flex;align-items:center;justify-content:center}/*# sourceMappingURL=dashboard.css.map */ +:root{--chart-js-background-color: #f7e2d6;--chart-js-border-color: #f6f6f6;--chart-js-font-color: #4b4b64}.btn-pressed,.btn-pressed:hover{color:#fff;background-color:#0086d9}#save-grid{position:relative;display:inline-flex;align-items:center;justify-content:center;width:50px;height:33px;margin-right:10px;transition:opacity .3s ease}#save-btn-text,#icon-container{position:absolute}#icon-container{display:inline-flex;align-items:center;justify-content:center}#save-spinner,#save-check{transition:opacity .3s ease,transform .3s ease}.transition-spinner,transition-check{transition:opacity .3s ease,transform .3s ease}.grid-stack-item-content{text-align:center;border:none !important;border-radius:.5em .5em .5em .5em;background-color:#fff;box-shadow:0 2px 4px rgba(40,40,50,.15),0 0 1px rgba(40,40,50,.35)}.widget-error{margin:50px;color:#721c24}.widget-content{position:relative;width:100%;height:100%;padding:1px;cursor:grab}.widget-header{font-size:14px;display:flex;align-items:center;justify-content:space-between;margin-top:.5em;margin-right:1em;margin-left:1em}.widget-spinner{margin-top:20px}.fa-stack.small{font-size:.5em}.close-handle,.edit-handle{padding:.2rem .5rem;cursor:pointer;text-align:right;vertical-align:middle}.close-handle>i,.edit-handle>i{font-size:1.2rem !important}.widget-header-left{display:flex;align-items:center;flex:1;justify-content:flex-start}.widget-command-container{display:flex;align-items:center;flex:1;justify-content:flex-end}.widget-title{display:flex;align-items:center;justify-content:center}.panel-divider{width:100%;height:8px;margin-bottom:10px;text-align:center}.panel-divider .line{display:none}td{word-break:break-all}.canvas-container-noaspectratio{position:relative}.canvas-container{position:relative}.canvas-container>canvas{width:100% !important;height:100% !important}.cpu-canvas-container{display:flex;flex-direction:column}.smoothie-container{width:100%}.smoothie-chart-tooltip{font-size:13px;z-index:1;padding-right:15px;padding-left:15px;pointer-events:none;color:#fff;border-radius:.5em .5em .5em .5em;background:rgba(50,50,50,.9)}.flex-container{display:flex;flex-wrap:nowrap;white-space:nowrap}.gateway-info{font-size:13px;margin:5px;padding:5px}.gateway-detail-container{display:none;margin:5px}.interface-info{display:flex;align-items:center;flex-wrap:wrap;height:100%}.nowrap{flex-wrap:nowrap}.gateway-graph{display:none}.flex-container>.gateway-graph{font-size:13px}.vertical-center-row{display:inline;height:100%}.interfaces-info{font-size:.8rem;margin:5px}.interface-descr{font-size:1em;margin-left:.8em;cursor:pointer;text-decoration:underline}.interfaces-detail-container{display:none;margin:5px}.d-flex{display:flex}.d-flex>.justify-content-start{justify-content:start}.d-flex>.justify-content-end{justify-content:end}#chartjs-toolip{z-index:20}.cpu-type{margin-top:10px;margin-bottom:10px}div{box-sizing:border-box}.flextable-container{display:block;width:95%;max-width:1200px;margin:2em auto}.flextable-header{display:flex;flex-flow:row wrap;padding:.5em .5em;transition:.5s;border-top:solid 1px rgba(0,119,217,.15) !important}.flextable-row{display:flex;align-items:center;flex-flow:row wrap;padding:.5em .5em;transition:.5s;border-top:solid 1px #e8eaef !important}.flextable-header .flex-cell{font-weight:bold}.flextable-row:hover{transition:500ms;background:#f5f5f5}.flex-cell{padding:4px 0;text-align:left;word-break:break-word}.column{display:flex;flex-flow:column wrap;width:50%;padding:0}.column .flex-cell{display:flex;flex-flow:row wrap;width:100%;padding:4px 0;border:0;border-top:#e8eaef}.column .flex-cell:hover{transition:500ms;background:#f5f5f5}.flex-subcell{width:100%;text-align:left}.column .flex-cell:not(:last-child){border-bottom:solid 1px #e8eaef !important}.grid-header-container{display:grid;grid-template-columns:repeat(auto-fit, minmax(100px, 1fr))}.grid-row{display:grid;transition:.5s;opacity:.4;border-top:1px solid #eff3f8;background-color:#d6e5f7;grid-template-columns:repeat(auto-fit, minmax(100px, 1fr))}.grid-row:hover{transition:500ms;background:#f5f5f5 !important}.grid-header{font-weight:bold;border-top:1px solid #eff3f8}.grid-item{padding:4px;text-align:center}.ovpn-common-name{display:flex;align-items:center;justify-content:center}/*# sourceMappingURL=dashboard.css.map */ diff --git a/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/opnsense-bootgrid.css b/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/opnsense-bootgrid.css deleted file mode 100644 index 4d353b768e..0000000000 --- a/misc/theme-advanced/src/opnsense/www/themes/advanced/build/css/opnsense-bootgrid.css +++ /dev/null @@ -1 +0,0 @@ -.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover{background-color:#fbfbfb}.tabulator .tabulator-headers{height:100% !important}.tabulator .tabulator-tableholder .tabulator-table{background-color:rgba(0,0,0,0)}.tabulator-row{background-color:rgba(0,0,0,0);color:#373736}.tabulator-row.tabulator-row-odd{background-color:#fbfbfb}.tabulator-row.tabulator-row-odd.tabulator-selectable:hover:not(.tabulator-selected){background-color:#f5f5f5}.tabulator-row.tabulator-row-even.tabulator-selectable:hover:not(.tabulator-selected){background-color:#f5f5f5}.tabulator .tabulator-tableholder{background-color:rgba(0,0,0,0)}.tabulator-row.tabulator-selected{background-color:#e3e8f0}.tabulator-row.tabulator-selected:hover{cursor:pointer;background-color:#e3e8f0}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg{color:#373736}.tabulator-row.tabulator-group{border:none;pointer-events:none}.tabulator-row.tabulator-group span{margin-left:0;color:#373736}.tabulator-row .badge.chip{background-color:#31708f;color:#fff;font-size:10px;padding:2px 4px;position:relative;top:-1px}.tabulator-row.tabulator-group .tabulator-group-toggle,.tabulator-row.tabulator-group .tabulator-group-toggle *{pointer-events:auto}.tabulator-row.tabulator-group:has(>.tabulator-group-toggle:only-child){display:none}.tabulator-row .tabulator-cell{text-overflow:ellipsis;white-space:nowrap;line-height:1.2;vertical-align:top}.tabulator .tabulator-footer{border-top:none;background-color:rgba(0,0,0,0)}.tabulator-page-counter{color:#373736}.tabulator .tabulator-footer .tabulator-paginator{color:#373736}.tabulator-paginator{flex:0 !important}.tabulator-page-counter{flex:1;text-align:right}.tabulator-col-sorter i{display:flex;justify-content:center;align-items:center}.tabulator .tabulator-header .tabulator-col{padding:5px}.tabulator .tabulator-headers>:first-child{padding-left:10px}.opnsense-bootgrid-responsive{white-space:wrap !important;text-overflow:inherit !important;overflow:visible !important;word-break:break-word !important}.opnsense-bootgrid-ellipsis{overflow:hidden !important;white-space:nowrap !important;text-overflow:ellipsis !important}.tabulator-row>:first-child{padding-left:10px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{padding:0px}.tabulator-page-counter{padding-right:20px}.bootgrid-footer-commands{width:90px;padding-left:8px}.tabulator-tableholder::after{content:"";display:block;width:1px;height:1px;min-width:100%}.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.tabulator-row:first-child>.tabulator-cell{border-top:none}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding:0px}@keyframes highlight{0%{background:#ff9}100%{background:none}}.highlight-bg{animation:highlight 2s}.tabulator .tabulator-alert{background:none}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg{border:none}.tabulator .tabulator-alert .tabulator-alert-msg{background:initial;font-size:18px}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error{border:none}.bootgrid-placeholder{font-size:15px;text-align:center;white-space:normal;font-weight:400;margin:10px}.bootgrid-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,.5);display:flex;justify-content:center;align-items:center;z-index:99}.overlay>i{font-size:20px;color:#000}.tabulator{width:100%;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;font-size:13px;background:#fff;border:1px solid #eee;border-radius:0}.tabulator .tabulator-header{background:#fff;border-bottom:1px solid #eee;border-top:0;border-left:0;border-right:0}.tabulator .tabulator-header .tabulator-col{background:rgba(0,0,0,0);color:#333;border-right:1px solid #eee}.tabulator .tabulator-header .tabulator-col:last-child{border-right:0}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{padding:10px 0 10px 20px;line-height:1.428571429}.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover{background:#f5f5f5}.tabulator .tabulator-tableholder{background:#fff}.tabulator-row{background:#fff;color:#333;border-top:1px solid #eee}.tabulator-row .tabulator-cell{padding:10px 0 10px 20px;line-height:1.428571429;vertical-align:top;border-right:1px solid #eee;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left,.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left,.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left,.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left,.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right,.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-color:#eee;border-width:1px}.tabulator-row .tabulator-cell:last-child{border-right:0}.tabulator-header .tabulator-row-header input,.tabulator-header .tabulator-cell input{margin-left:-24px}.tabulator-table .tabulator-row-header input,.tabulator-table .tabulator-cell input{margin-left:-18px}.tabulator.tabulator-striped .tabulator-row:nth-child(odd){background:#fbfbfb}.tabulator.tabulator-hover .tabulator-row:hover{background:#f5f5f5 !important}.tabulator-row.tabulator-selected{background:#f5f5f5 !important}.tabulator-row.tabulator-selected:hover{background:#f5f5f5 !important}.tabulator .tabulator-footer{background:#fff;border-top:1px solid #eee;color:#555}.tabulator .tabulator-footer .tabulator-page{border:1px solid #eee;background:#fff;color:#333;border-radius:0;margin:0;padding:6px 12px;color:#fff;background-color:#51aded;border-color:#51aded}.tabulator .tabulator-footer .tabulator-page:hover,.tabulator .tabulator-footer .tabulator-page:focus,.tabulator .tabulator-footer .tabulator-page:active,.tabulator .tabulator-footer .tabulator-page.active,.open>.tabulator .tabulator-footer .tabulator-page.dropdown-toggle,.tabulator .tabulator-footer .tabulator-page :not(disabled):hover{color:#fff !important;background-color:#2397e8 !important;border-color:#1a93e7 !important}.tabulator .tabulator-footer .tabulator-page:active,.tabulator .tabulator-footer .tabulator-page.active,.open>.tabulator .tabulator-footer .tabulator-page.dropdown-toggle{background-image:none}.tabulator .tabulator-footer .tabulator-page.disabled,.tabulator .tabulator-footer .tabulator-page.disabled:hover,.tabulator .tabulator-footer .tabulator-page.disabled:focus,.tabulator .tabulator-footer .tabulator-page.disabled:active,.tabulator .tabulator-footer .tabulator-page.disabled.active,.tabulator .tabulator-footer .tabulator-page[disabled],.tabulator .tabulator-footer .tabulator-page[disabled]:hover,.tabulator .tabulator-footer .tabulator-page[disabled]:focus,.tabulator .tabulator-footer .tabulator-page[disabled]:active,.tabulator .tabulator-footer .tabulator-page[disabled].active,fieldset[disabled] .tabulator .tabulator-footer .tabulator-page,fieldset[disabled] .tabulator .tabulator-footer .tabulator-page:hover,fieldset[disabled] .tabulator .tabulator-footer .tabulator-page:focus,fieldset[disabled] .tabulator .tabulator-footer .tabulator-page:active,fieldset[disabled] .tabulator .tabulator-footer .tabulator-page.active{background-color:#51aded;border-color:#51aded}.tabulator .tabulator-footer .tabulator-page .badge{color:#51aded;background-color:#fff}.tabulator-row.tabulator-row-even{background-color:rgba(0,0,0,0)}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{overflow:visible}.tabulator-row.tabulator-selected{background-color:#9abcea}.tabulator .tabulator-alert{align-items:center;background:rgba(255,255,255,.5);display:flex;height:100%;left:0;position:absolute;text-align:center;top:0;width:100%;z-index:100}.bootgrid-header .actionBar .btn-group>.btn-group .dropdown-menu .dropdown-item.dropdown-item-checkbox,.bootgrid-footer .infoBar .btn-group>.btn-group .dropdown-menu .dropdown-item.dropdown-item-checkbox,.bootgrid-header .actionBar .btn-group>.btn-group .dropdown-menu .dropdown-item .dropdown-item-checkbox,.bootgrid-footer .infoBar .btn-group>.btn-group .dropdown-menu .dropdown-item .dropdown-item-checkbox{margin:0 8px 4px -8px !important}/*# sourceMappingURL=opnsense-bootgrid.css.map */ diff --git a/misc/theme-flexcolor/+POST_INSTALL.post b/misc/theme-flexcolor/+POST_INSTALL.post deleted file mode 100644 index 4b2fb8d68e..0000000000 --- a/misc/theme-flexcolor/+POST_INSTALL.post +++ /dev/null @@ -1 +0,0 @@ -/usr/local/etc/rc.syshook.d/early/50-flexcolor diff --git a/misc/theme-flexcolor/Makefile b/misc/theme-flexcolor/Makefile index 4ff210b34b..041a520b9d 100644 --- a/misc/theme-flexcolor/Makefile +++ b/misc/theme-flexcolor/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= theme-flexcolor -PLUGIN_VERSION= 1.0 -PLUGIN_COMMENT= Theme with 3 different color schemes: black as default, light and dark-light +PLUGIN_VERSION= 1.01 +PLUGIN_COMMENT= OPNsense theme with 3 different color schemes (black as default, light and darklight) PLUGIN_MAINTAINER= iengels@web.de PLUGIN_NO_ABI= yes diff --git a/misc/theme-flexcolor/pkg-descr b/misc/theme-flexcolor/pkg-descr index 1849afb902..484bd86da1 100644 --- a/misc/theme-flexcolor/pkg-descr +++ b/misc/theme-flexcolor/pkg-descr @@ -1,16 +1,5 @@ -Theme with the option to customize colors through color schemes. -To change the scheme, edit /etc/rc.conf to add: - -flexcolor_theme="darklight" - -or - -flexcolor_theme="light" - -and run: - -# service flexcolor start - -The implicit default is: - -flexcolor_theme="black" +Theme with the option to customize colors through color schemes. To change +the scheme, simply replace the corresponding default_scheme.css file in the +theme /build/css-folder with an alternative from the corresponding folders +in the /build/color_schemes/ folder. Feel free to adjust all colors by +changing the color codes in the scheme-file or to create your own schemes. diff --git a/misc/theme-flexcolor/src/etc/rc.d/flexcolor b/misc/theme-flexcolor/src/etc/rc.d/flexcolor deleted file mode 100755 index 8566e8e41a..0000000000 --- a/misc/theme-flexcolor/src/etc/rc.d/flexcolor +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -# -# PROVIDE: flexcolor -# REQUIRE: FILESYSTEMS -# - -. /etc/rc.subr - -name="flexcolor" -start_cmd="flexcolor_start" -stop_cmd=":" - -: ${flexcolor_theme:="black"} - -FLEXCOLORDIR="/usr/local/opnsense/www/themes/flexcolor" -SCHEMESDIR="${FLEXCOLORDIR}/build/color_schemes" -TARGETDIR="${FLEXCOLORDIR}/build/css" -DEFAULTCSS="default_scheme.css" - -CACHEMARKER="/usr/local/opnsense/www/index.php" - -flexcolor_start() -{ - SELECTEDCSS="${SCHEMESDIR}/${flexcolor_theme}/${DEFAULTCSS}" - if [ ! -f "${SELECTEDCSS}" ]; then - warn "The theme '${flexcolor_theme}' was not found." - return - fi - - for FILE in $(find ${TARGETDIR} -name "*.sample"); do - FILE=${FILE%.sample} - cp ${FILE}.sample ${FILE} - sed -i '' -e "/@import url('default_scheme.css');/r ${SELECTEDCSS}" ${FILE} - sed -i '' -e "/@import url('default_scheme.css');/d" ${FILE} - done - - if [ -f "${CACHEMARKER}" ]; then - touch "${CACHEMARKER}" - fi -} - -load_rc_config $name -run_rc_command "$1" diff --git a/misc/theme-flexcolor/src/etc/rc.syshook.d/early/50-flexcolor b/misc/theme-flexcolor/src/etc/rc.syshook.d/early/50-flexcolor deleted file mode 100755 index f705eb6860..0000000000 --- a/misc/theme-flexcolor/src/etc/rc.syshook.d/early/50-flexcolor +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -/usr/local/etc/rc.d/flexcolor start diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/black/default_scheme.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/black/default_scheme.css index 2ee93ae03c..3483bffb98 100644 --- a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/black/default_scheme.css +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/black/default_scheme.css @@ -18,7 +18,7 @@ --stdborderprimary: #336CDF; /* standard border with accent*/ --stdborderinverse: #000000; /* standard border with accent*/ --stdborder50bright: #A1A1A1; /* standard border with accent*/ - --badgeback: #E6E6E6; /* badge background & progress-bar & blockquote*/ + --badgeback: #1F62C1; /* badge background & progress-bar & blockquote*/ --progressbar: #D4D4D4; /* progress-bar*/ --token: #AF3604; /* background token */ --highlighted: #FFFFFF; /* highlighted element */ @@ -57,7 +57,7 @@ --txtboxbackhover: #000000; --txtboxbackactive: #000000; --txtboxbackdisabled: #000000; - --txtboxbacktoken: #E65C00; + --txtboxbacktoken: #1F62C1; --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ /* border */ @@ -87,6 +87,8 @@ /* special characters */ --link: #FA6121; /* OPNsense text login and links */ --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FF3333; /* background color radio button */ /* accents */ --primary: #336CDF; /* primary accent */ --primaryhover: #608DE6; /* primary accent hover */ @@ -97,7 +99,27 @@ --warning: #D66E12; /* warning accent */ --warninghover: #ED862B; /* warning accent hover */ --danger: #FF5252; /* danger accent */ - --dangerhover: #BE2326FF8585; /* danger accent hover */ + --dangerhover: #E64949; /* danger accent hover */ + /* alert messages */ + /* alert*/ + --alertback: #000000; + --alertborder: transparent; + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; /* buttons (complete (independent) */ /* unselected */ --btnfore: #E6E6E6; /* textcolor */ diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/darklight/default_scheme.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/darklight/default_scheme.css index 5522478e3f..39ca35bb0a 100644 --- a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/darklight/default_scheme.css +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/darklight/default_scheme.css @@ -18,7 +18,7 @@ --stdborderprimary: #FA6121; /* standard border with accent*/ --stdborderinverse: #647D9B; /* standard border with accent*/ --stdborder50bright: #A2B1C3; /* standard border with accent*/ - --badgeback: #FFC59E; /* badge background & progress-bar & blockquote*/ + --badgeback: #AD7A7A; /* badge background & progress-bar & blockquote*/ --progressbar: #181E25; /* progress-bar*/ --token: #FA6121; /* background token */ --highlighted: #FFFFFF; /* highlighted element */ @@ -57,7 +57,7 @@ --txtboxbackhover: #F2F7FD; --txtboxbackactive: #F2F7FD; --txtboxbackdisabled: #181E25; - --txtboxbacktoken: #FFC59E; + --txtboxbacktoken: #AD7A7A; --txtboxbackdel: #DB393D; /* only tokenize, pending delete */ --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ /* border */ @@ -87,6 +87,8 @@ /* special characters */ --link: #FA6121; /* OPNsense text login and links */ --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #39E63C; /* background color checkbox */ + --colorradio: #0089D0; /* background color radio button */ /* accents */ --primary: #FA6121; /* primary accent */ --primaryhover: #E04605; /* primary accent hover */ @@ -98,6 +100,26 @@ --warninghover: #B87A00; /* warning accent hover */ --danger: #DB393D; /* danger accent */ --dangerhover: #BE2326; /* danger accent hover */ + /* alert messages */ + /* alert*/ + --alertback: #181E25; + --alertborder: transparent; + /* alert success */ + --alertsuccessfore: #00E604; + --alertsuccessback: #181E25; + --alertsuccessborder: #F2F7FD; + /* alert info */ + --alertinfofore: #0099E6; + --alertinfoback: #181E25; + --alertinfoborder: #F2F7FD; + /* alert warning */ + --alertwarningfore: #E69900; + --alertwarningback: #181E25; + --alertwarningborder: #F2F7FD; + /* alert danger */ + --alertdangerfore: #E60004; + --alertdangerback: #181E25; + --alertdangerborder: #F2F7FD; /* buttons (complete (independent) */ /* unselected */ --btnfore: #181E25; /* textcolor */ diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/light/default_scheme.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/light/default_scheme.css index 8d6de04f7e..9a33434c97 100644 --- a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/light/default_scheme.css +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/color_schemes/light/default_scheme.css @@ -18,7 +18,7 @@ --stdborderprimary: #336CDF; /* standard border with accent*/ --stdborderinverse: #131313; /* standard border with accent*/ --stdborder50bright: #A1A1A1; /* standard border with accent*/ - --badgeback: #FFC59E; /* badge background & progress-bar & blockquote*/ + --badgeback: #8DA6BD; /* badge background & progress-bar & blockquote*/ --progressbar: #131313; /* progress-bar*/ --token: #71ADF4; /* background token */ --highlighted: #131313; /* highlighted element */ @@ -57,7 +57,7 @@ --txtboxbackhover: #F5F5F5; --txtboxbackactive: #F5F5F5; --txtboxbackdisabled: #F5F5F5; - --txtboxbacktoken: #71ADF4; + --txtboxbacktoken: #8DA6BD; --txtboxbackdel: #FC2529; /* only tokenize, pending delete */ --txtboxbackdismiss: #F5F5F5; /* only tokenize, dismiss */ /* border */ @@ -87,6 +87,8 @@ /* special characters */ --link: #FA6121; /* OPNsense text login and links */ --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #28A839; /* background color checkbox */ + --colorradio: #1066CC; /* background color radio button */ /* accents */ --primary: #1066CC; /* primary accent */ --primaryhover: #0C4E9C; /* primary accent hover */ @@ -98,6 +100,26 @@ --warninghover: #D97B03; /* warning accent hover */ --danger: #FC2529; /* danger accent */ --dangerhover: #EC0308; /* danger accent hover */ + /* alert messages */ + /* alert*/ + --alertback: #F5F5F5; + --alertborder: transparent; + /* alert success */ + --alertsuccessfore: #000000; + --alertsuccessback: #D4FAD9; + --alertsuccessborder: #28A839; + /* alert info */ + --alertinfofore: #000000; + --alertinfoback: #D4F1FA; + --alertinfoborder: #10A6D8; + /* alert warning */ + --alertwarningfore: #000000; + --alertwarningback: #F2E3CE; + --alertwarningborder: #FC9510; + /* alert danger */ + --alertdangerfore: #000000; + --alertdangerback: #F2CECE; + --alertdangerborder: #FC2529; /* buttons (complete (independent) */ /* unselected */ --btnfore: #454545; /* textcolor */ diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css new file mode 100644 index 0000000000..358ebe2086 --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css @@ -0,0 +1,517 @@ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +.modal-backdrop { + z-index: -1; +} + +.bootstrap-dialog { + /* dialog types */ + /** + * Icon animation + * Copied from font-awesome: http://fontawesome.io/ + **/ + /** End of icon animation **/ +} +.bootstrap-dialog .modal-header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + background-color: var(--bsheadback); +} +.bootstrap-dialog .bootstrap-dialog-title { + color: var(--bsheadfore); + display: inline-block; + font-size: 15px; +} +.bootstrap-dialog .bootstrap-dialog-button-icon { + margin-right: 3px; +} +.bootstrap-dialog .bootstrap-dialog-close-button { + float: right; + filter: alpha(opacity=90); + -moz-opacity: 0.9; + -khtml-opacity: 0.9; + opacity: 0.9; +} +.bootstrap-dialog .bootstrap-dialog-close-button:hover { + cursor: pointer; + filter: alpha(opacity=100); + -moz-opacity: 1; + -khtml-opacity: 1; + opacity: 1; +} +.bootstrap-dialog.type-default .modal-header { + background-color: var(--bsheadback); +} +.bootstrap-dialog.type-default .bootstrap-dialog-title { + color: var(--bsheadfore); +} +.bootstrap-dialog.type-info .modal-header { + border-bottom: 3px solid var(--info); +} +.bootstrap-dialog.type-primary .modal-header { + border-bottom: 3px solid var(--primary); +} +.bootstrap-dialog.type-success .modal-header { + border-bottom: 3px solid var(--success); +} +.bootstrap-dialog.type-warning .modal-header { + border-bottom: 3px solid var(--warning); +} +.bootstrap-dialog.type-danger .modal-header { + border-bottom: 3px solid var(--danger); +} +.bootstrap-dialog.size-large .bootstrap-dialog-title { + font-size: 24px; +} +.bootstrap-dialog.size-large .bootstrap-dialog-close-button { + font-size: 30px; +} +.bootstrap-dialog.size-large .bootstrap-dialog-message { + font-size: 18px; +} +.bootstrap-dialog .icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} + +/*# sourceMappingURL=bootstrap-dialog.css.map */ diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-dialog.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css new file mode 100644 index 0000000000..52531cb85c --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css @@ -0,0 +1,805 @@ +/*! + * Bootstrap-select v1.13.3 (https://developer.snapappointments.com/bootstrap-select) + * + * Copyright 2012-2018 SnapAppointments, LLC + * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE) + */ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +select.bs-select-hidden, +.bootstrap-select > select.bs-select-hidden, +select.selectpicker { + display: none !important; +} +.bootstrap-select { + width: 348px \0; + /*IE9 and below*/ +} +.bootstrap-select > .dropdown-toggle { + position: relative; + width: 100%; + z-index: 1; + text-align: right; + white-space: nowrap; +} +.bootstrap-select > .dropdown-toggle.bs-placeholder, +.bootstrap-select > .dropdown-toggle.bs-placeholder:hover, +.bootstrap-select > .dropdown-toggle.bs-placeholder:focus, +.bootstrap-select > .dropdown-toggle.bs-placeholder:active { + color: var(--txtboxfore); + background-color: var(--txtboxback); + border-color: var(--txtboxborder); } + + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active, + .bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active + { + color: var(--rgba50); + } +.bootstrap-select > select { + position: absolute !important; + bottom: 0; + left: 50%; + display: block !important; + width: 0.5px !important; + height: 100% !important; + padding: 0 !important; + opacity: 0 !important; + border: none; +} +.bootstrap-select > select.mobile-device { + top: 0; + left: 0; + display: block !important; + width: 100% !important; + z-index: 2; +} +.has-error .bootstrap-select .dropdown-toggle, +.error .bootstrap-select .dropdown-toggle, +.bootstrap-select.is-invalid .dropdown-toggle, +.was-validated .bootstrap-select .selectpicker:invalid + .dropdown-toggle { + border-color: var(--danger); +} +.bootstrap-select.is-valid .dropdown-toggle, +.was-validated .bootstrap-select .selectpicker:valid + .dropdown-toggle { + border-color: var(--success); +} +.bootstrap-select.fit-width { + width: auto !important; +} +.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) { + width: 348px; +} +.bootstrap-select > select.mobile-device:focus + .dropdown-toggle, +.bootstrap-select .dropdown-toggle:focus { + outline: var(--txtboxborderhover) !important; + outline: 5px auto -webkit-focus-ring-color !important; + outline-offset: -2px; +} +.bootstrap-select.form-control { + margin-bottom: 0; + padding: 0; + border: none; +} +:not(.input-group) > .bootstrap-select.form-control:not([class*="col-"]) { + width: 100%; +} +.bootstrap-select.form-control.input-group-btn { + z-index: auto; +} +.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.bootstrap-select:not(.input-group-btn), +.bootstrap-select[class*="col-"] { + float: none; + display: inline-block; + margin-left: 0; +} +.bootstrap-select.dropdown-menu-right, +.bootstrap-select[class*="col-"].dropdown-menu-right, +.row .bootstrap-select[class*="col-"].dropdown-menu-right { + float: right; +} +.form-inline .bootstrap-select, +.form-horizontal .bootstrap-select, +.form-group .bootstrap-select { + margin-bottom: 0; +} +.form-group-lg .bootstrap-select.form-control, +.form-group-sm .bootstrap-select.form-control { + padding: 0; +} +.form-group-lg .bootstrap-select.form-control .dropdown-toggle, +.form-group-sm .bootstrap-select.form-control .dropdown-toggle { + height: 100%; + font-size: inherit; + line-height: inherit; + border-radius: inherit; +} +.bootstrap-select.form-control-sm .dropdown-toggle, +.bootstrap-select.form-control-lg .dropdown-toggle { + font-size: inherit; + line-height: inherit; + border-radius: inherit; +} +.bootstrap-select.form-control-sm .dropdown-toggle { + padding: 0.25rem 0.5rem; +} +.bootstrap-select.form-control-lg .dropdown-toggle { + padding: 0.5rem 1rem; +} +.form-inline .bootstrap-select .form-control { + width: 100%; +} +.bootstrap-select.disabled, +.bootstrap-select > .disabled { + cursor: not-allowed; +} +.bootstrap-select.disabled:focus, +.bootstrap-select > .disabled:focus { + outline: none !important; +} +.bootstrap-select.bs-container { + position: absolute; + top: 0; + left: 0; + height: 0 !important; + padding: 0 !important; +} +.bootstrap-select.bs-container .dropdown-menu { + z-index: 1060; +} +.bootstrap-select .dropdown-toggle:before { + content: ''; + display: inline-block; +} +.bootstrap-select .dropdown-toggle .filter-option { + position: absolute; + top: 0; + left: 0; + padding-top: inherit; + padding-right: inherit; + padding-bottom: inherit; + padding-left: inherit; + height: 100%; + width: 100%; + text-align: left; +} +.bootstrap-select .dropdown-toggle .filter-option-inner { + padding-right: inherit; +} +.bootstrap-select .dropdown-toggle .filter-option-inner-inner { + overflow: hidden; +} +.bootstrap-select .dropdown-toggle .caret { + position: absolute; + top: 50%; + right: 12px; + margin-top: -2px; + vertical-align: middle; +} +.input-group .bootstrap-select.form-control .dropdown-toggle { + border-radius: inherit; +} +.bootstrap-select[class*="col-"] .dropdown-toggle { + width: 100%; +} +.bootstrap-select .dropdown-menu { + min-width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bootstrap-select .dropdown-menu > .inner:focus { + outline: none !important; +} +.bootstrap-select .dropdown-menu.inner { + position: static; + float: none; + border: 0; + padding: 0; + margin: 0; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.bootstrap-select .dropdown-menu li { + position: relative; +} +.bootstrap-select .dropdown-menu li.active small { + color: var(--rgba50) !important; +} +.bootstrap-select .dropdown-menu li.disabled a { + cursor: not-allowed; +} +.bootstrap-select .dropdown-menu li a { + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.bootstrap-select .dropdown-menu li a.opt { + position: relative; + padding-left: 2.25em; +} +.bootstrap-select .dropdown-menu li a span.check-mark { + display: none; +} +.bootstrap-select .dropdown-menu li a span.text { + display: inline-block; +} +.bootstrap-select .dropdown-menu li small { + padding-left: 0.5em; +} + .bootstrap-select .dropdown-menu .notify { + position: absolute; + bottom: 5px; + width: 96%; + margin: 0 2%; + min-height: 26px; + padding: 3px 5px; + background: var(--txtboxback); + border: 1px solid var(--txtboxborder); + -webkit-box-shadow: var(--rgbashadowdark); + box-shadow: var(--rgbashadowdark); + pointer-events: none; + opacity: 0.9; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } +.bootstrap-select .no-results { + padding: 3px; + color: var(--txtboxforedisabled); + background: var(--txtboxbackdisabled); + margin: 0 5px; + white-space: nowrap; +} +.bootstrap-select.fit-width .dropdown-toggle .filter-option { + position: static; + display: inline; + padding: 0; +} +.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner, +.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner { + display: inline; +} +.bootstrap-select.fit-width .dropdown-toggle .caret { + position: static; + top: auto; + margin-top: -1px; +} +.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark { + position: absolute; + display: inline-block; + right: 15px; + top: 5px; +} +.bootstrap-select.show-tick .dropdown-menu li a span.text { + margin-right: 34px; +} +.bootstrap-select .bs-ok-default:after { + content: ''; + display: block; + width: 0.5em; + height: 1em; + border-style: solid; + border-width: 0 0.26em 0.26em 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle, +.bootstrap-select.show-menu-arrow.show > .dropdown-toggle { + z-index: 1061; +} +.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before { + content: ''; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid var(--bsshadow); + position: absolute; + bottom: -4px; + left: 9px; + display: none; +} +.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after { + content: ''; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + position: absolute; + bottom: -4px; + left: 10px; + display: none; +} +.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before +{ + bottom: auto; + top: -4px; + border-top: 7px solid var(--bsshadow); + border-bottom: 0; +} +.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after { + bottom: auto; + top: -4px; + border-top: 6px solid var(--txtboxborder); + border-bottom: 0; +} +.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before { + right: 12px; + left: auto; +} +.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after { + right: 13px; + left: auto; +} +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before, +.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before, +.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after, +.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after { + display: block; +} +.bs-searchbox, +.bs-actionsbox, +.bs-donebutton { + padding: 4px 8px; +} +.bs-actionsbox { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bs-actionsbox .btn-group button { + width: 50%; +} +.bs-donebutton { + float: left; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.bs-donebutton .btn-group button { + width: 100%; +} +.bs-searchbox + .bs-actionsbox { + padding: 0 8px 4px; +} +.bs-searchbox .form-control { + margin-bottom: 0; + width: 100%; + float: none; +} + +/* OPNsense edit to fix https://github.com/opnsense/core/issues/2612 : + * Move checkmarks to left hand side of the dropdown. + */ +.bootstrap-select .dropdown-menu > li > a { + padding: 3px 20px 3px 30px; +} +.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark { + left: 10px; +} +/* End OPNsense edit to fix #2612. */ diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/bootstrap-select.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css new file mode 100644 index 0000000000..25825df214 --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css @@ -0,0 +1,769 @@ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +:root { + --chart-js-border-color: var(--dbchartborder); + --chart-js-font-color: var(--dbchartfore); +} + +.ui-resizable-handle { + opacity: 0 !important; +} + +#save-grid { + width: inherit; + height: inherit; + display: inline-flex; + align-items: center; + justify-content: center; + transition: opacity 0.3s ease; + position: relative; + width: 50px; + height: 30px; + margin-right: 10px; +} + +#save-btn-text, #icon-container { + position: absolute; +} + +#icon-container { + display: inline-flex; + align-items: center; + justify-content: center; +} + +.fa-spinner { + font-size: 2em; +} + +.transition-spinner, transition-check { + transition: opacity 0.3s ease, transform 0.3s ease; +} + +.hide { + opacity: 0; + transform: scale(0); +} + +.show { + opacity: 1; + transform: scale(1); +} + +.grid-stack-item-content { + text-align: center; + border-style: solid; + border-color: var(--dbborder); + border-width: 1px; + background-color: var(--dbback); + border-radius: 0.5em 0.5em 0.5em 0.5em; + color: var(--dbfore); +} + +.widget-error { + margin: 50px; + color: var(--danger); +} + +.widget-content { + position: relative; + width: 100%; + height: 100%; + padding: 1px; + cursor: default; +} + +.widget-header { + margin-top: 0.5em; + margin-left: 1em; + margin-right: 1em; + display: flex; + justify-content: space-between; + align-items: center; +} + +.widget-spinner { + margin-top: 20px; + font-size: 2em; +} + +.fa-stack.small { + font-size: 0.5em; +} + +.link-handle, +.close-handle, +.edit-handle { + margin-left: 0.5em; + vertical-align: middle; + text-align: right; + cursor: pointer; +} + +.link-handle > a, +.close-handle > i, +.edit-handle > i { + font-size: 0.8em; +} + +.widget-header-left { + display: flex; + align-items: center; + justify-content: flex-start; + flex: 1; +} + +.widget-command-container { + display: flex; + justify-content: flex-end; + align-items: center; + flex: 1; +} + +.widget-title { + display: flex; + justify-content: center; + align-items: center; +} +.panel-divider { + width: 100%; + text-align: center; + height: 8px; + margin-bottom: 10px; +} + +table { + table-layout: fixed; +} + +td { + word-break: break-all; +} + +.line { + display: inline-block; + height: 2px; + width: 80%; + background: var(--dbborder); + margin: 5px; +} + +.canvas-container-noaspectratio { + position: relative; +} + +.canvas-container { + position: relative; +} + +.canvas-container > canvas { + /* ChartJS v4 workaround: https://github.com/chartjs/Chart.js/issues/11005 */ + width: 100% !important; + height: 100% !important; +} + +.cpu-canvas-container { + display: flex; + flex-direction: column; +} + +.smoothie-container { + width: 100%; +} + +.smoothie-chart-tooltip { + z-index: 1; /* necessary to force to foreground */ + background: var(--dbtoolback); + padding-left: 15px; + padding-right: 15px; + color: var(--dbtoolfore); + font-size: 13px; + border-radius: 0.5em 0.5em 0.5em 0.5em; + pointer-events: none; +} + +.flex-container { + display: flex; + flex-wrap: nowrap; + white-space: nowrap; +} + +.gateway-info { + margin: 5px; + padding: 5px; + font-size: 13px; +} + +.gateway-detail-container { + display: none; + margin: 5px; +} + +.interface-info { + display: flex; + flex-wrap: wrap; + align-items: center; + height: 100%; +} + +.nowrap { + flex-wrap: nowrap; +} + +.gateway-graph { + display: none; +} + +.flex-container > .gateway-graph { + font-size: 13px; +} + +.vertical-center-row { + height: 100%; + display: inline; +} + +.interfaces-info { + margin: 5px; + font-size: 13px; +} + +.interface-descr { + margin-left: 10px; + font-size: 15px; + cursor: pointer; + text-decoration: underline; +} + +.interfaces-detail-container { + margin: 5px; + display: none; +} + +.d-flex { + display: flex; +} + +.d-flex > .justify-content-start { + justify-content: start; +} + +.d-flex > .justify-content-end { + justify-content: end; +} + +#chartjs-toolip { + z-index: 20; +} + +/* CPU widget */ +.cpu-type { + margin-bottom: 10px; + margin-top: 10px; +} +/* ----- */ + +/* Custom flex table */ +div { + box-sizing: border-box; +} + +.flextable-container { + display: block; + margin: 2em auto; + width: 95%; + max-width: 1200px; +} + +.flextable-header { + display: flex; + flex-flow: row wrap; + transition: 0.5s; + padding: 0.5em 0.5em; + border-top: solid 1px var(--dbborder); +} + +.flextable-row { + display: flex; + flex-flow: row wrap; + transition: 0.5s; + padding: 0.5em 0.5em; + border-top: solid 1px var(--dbborder); + align-items: center; +} + +.flextable-header .flex-cell { + font-weight: bold; +} + +.flextable-row:hover { + background: var(--dbbackhover) !important; +} + +.flex-cell { + text-align: left; + word-break: break-word; +} + +.column { + display: flex; + flex-flow: column wrap; + width: 50%; + padding: 0; +} +.column .flex-cell { + display: flex; + flex-flow: row wrap; + width: 100%; + padding: 0; + border: 0; + border-top: var(--dbborder); +} + +.column .flex-cell:hover { + background: var(--dbbackhover); +} + +.flex-subcell { + width: 100%; + text-align: left; +} + +.column .flex-cell:not(:last-child) { + border-bottom: solid 1px var(--dbborder); + /* border-bottom: none !important; */ +} +/* ----- */ + +/* CSS grid responsive table */ +.grid-header-container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); +} + +.grid-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + background-color: var(--dbback); /* fade-in color, transitions to transparent */ + border-top: 1px solid var(--dbborder); + transition: 0.5s; + opacity: 0.4; +} + +.grid-row:hover { + background: var(--dbbackhover) !important; +} + +.grid-header { + border-top: 1px solid var(--dbborder); + font-weight: bold; +} + +.grid-item { + border: 1 px solid var(--dbborder); + padding: 4px; + text-align: center; +} + +.ovpn-common-name { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dashboard.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css new file mode 100644 index 0000000000..6386eb0a2e --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css @@ -0,0 +1,607 @@ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} + +.tab-content { + padding: 10px; + border-top: 1px solid var(--unbborder); + color: var(--unbfore1); +} + +.banner { + width: 25%; + color: var(--info); +} + +.stats-element { + height: 5em; + background: var(--unbback1); + overflow: hidden; + display: flex; + justify-content: flex-start; + border-radius: .3em; + margin:auto; + border: 1px solid var(--unbborder)); + color: var(--unbfore1); +} + +.stats-icon { + height: auto; + width: 50%; + object-fit:cover; + background: var(--unbiconsback); + border-radius: 0 2em 2em 0 / 0 3em 3em 0; + box-shadow: 3px 5px 1px 3px var(--unbshadow); +} + +.large-icon { + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 2em; +} + +.stats-text { + height: 5em; + width: 15em; + display: flex; + justify-content: center; + text-align: center; + align-items: center; + flex-direction: column; +} + +.stats-counter-text { + margin: 0; + padding: 0; + text-align: center; + font-size: 15px; + color: var(--unbfore1); +} + +.stats-inner-text { + margin: 0; + padding: 0; + text-align: center; + font-size: 15px; + color: var(--unbfore2); +} + +#bannersub { + text-align: center; + margin: 5px; + color: var(--unbfore1); +} + +.list-group-wrapper { + margin: 0px; + padding-top: 10px; + padding-bottom: 10px; + background-color: var(--unbback1); +} + +.list-item-domain { + height: 2.5em; + background-color: var(--unbback2); + color: var(--unbfore2); +} + +.list-group-item-border { + border: 1px solid var(--unbborder)); +} + +.list-group-item-border:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 2px; + border-color: var(--unbborder)); +} + +.list-group-item-border:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-color: var(--unbborder)); +} +.btn.pull-right { + margin-left: 3px; +} + +.odd-bg { + background: var(--unbback2); +} + +.top-item { + display: flex; + white-space: nowrap; + background-color: var(--unbback2); + color: var(--unbfore1); +} + +.group-p { + overflow: hidden; + height: 20px; + margin-right: 5px; + text-overflow: ellipsis; +} + +.counter { + position: relative; + top: -3px; + color: var(--unbfore1); + font-size: 14px; + line-height: 1.4; + flex: 1; + text-align: right; +} + +.vertical-center { + margin: 0; + position: absolute; + top: 50%; + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} + +#maintabs > li > a { + border: 1px solid var(--unbborder); +} + +#maintabs > li.active > a { + border-top: 1px solid var(--unbborderactive); + border-left: 1px solid var(--unbborderactive); + border-right: 1px solid var(--unbborderactive); + border-bottom: transparent; +} + +.query-success { + background-color: var(--unbsuccess); + color: var(--unbsuccessfore); +} + +.query-info { + background-color: var(--unbinfo); + color: var(--unbinfofore); +} + +.query-danger { + background-color: var(--unbdanger); + color: var(--unbdangerfore); +} + +.query-warning { + background-color: var(--unbwarning); + color: var(--unbwarningfore); +} + +.query-error { + background-color: var(--unberror); + color: var(--unberrorfore); +} + +#searchFilter { + display: inline-block; + margin: 0 20px 0 0; + vertical-align: middle; +} + +.tag { + font-size: 14px; + padding: .3em .4em .4em; + margin: 0 .1em; +} + +.tag a { + color: var(--unbfore1); + cursor: pointer; + opacity: 0.9; +} + +.tag a { + margin: 0 0 0 .3em; +} + +.tag a fa-times { + color: var(--unbfore1); + margin-bottom: 2px; +} + +.tooltip-inner { + max-width: 1000px !important; +} diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/dns-overview.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css new file mode 100644 index 0000000000..6d58d1cda8 --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css @@ -0,0 +1,549 @@ +/*! + * jQuery Bootgrid v1.3.1 - 09/11/2015 + * Copyright (c) 2014-2015 Rafael Staib (http://www.jquery-bootgrid.com) + * Licensed under MIT http://www.opensource.org/licenses/MIT + */ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +.bootgrid-header, +.bootgrid-footer { + margin: 15px 0; +} +.bootgrid-header a, +.bootgrid-footer a { + outline: 0; +} +.bootgrid-header .search, +.bootgrid-footer .search { + display: inline-block; + margin: 0 20px 0 0; + vertical-align: middle; + width: 180px; +} +.bootgrid-header .search .fa-solid, +.bootgrid-footer .search .fa-solid { + top: 0; +} +.bootgrid-header .search .fa, +.bootgrid-header .search .fa-solid, +.bootgrid-footer .search .fa, +.bootgrid-footer .search .fa-solid { + display: table-cell; +} +.bootgrid-header .search.search-field::-ms-clear, +.bootgrid-footer .search.search-field::-ms-clear, +.bootgrid-header .search .search-field::-ms-clear, +.bootgrid-footer .search .search-field::-ms-clear { + display: none; +} +.bootgrid-header .pagination, +.bootgrid-footer .pagination { + margin: 0 !important; +} +.bootgrid-header .actionBar, +.bootgrid-footer .infoBar { + text-align: right; +} +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu { + text-align: left; +} +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item { + cursor: pointer; + display: block; + margin: 0; + padding: 3px 20px; + white-space: nowrap; +} +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item:hover, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item:hover, +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item:focus, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item:focus { + color: var(--jquerybarfore); + text-decoration: none; + background-color: var(--jquerybarback); + border: 1px solid var(--jquerybarborder); +} +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item.dropdown-item-checkbox, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item.dropdown-item-checkbox, +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item .dropdown-item-checkbox, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item .dropdown-item-checkbox { + margin: 0 2px 4px 0; + vertical-align: middle; +} +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item.disabled, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item.disabled { + cursor: not-allowed; +} +.bootgrid-table { + table-layout: fixed; +} +.bootgrid-table a { + outline: 0; +} +.bootgrid-table th > .column-header-anchor { + color: var(--jqueryfore); + cursor: not-allowed; + display: block; + position: relative; + text-decoration: none; +} +.bootgrid-table th > .column-header-anchor.sortable { + cursor: pointer; +} +.bootgrid-table th > .column-header-anchor > .text { + display: block; + margin: 0 16px 0 0; + overflow: hidden; + -ms-text-overflow: ellipsis; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.bootgrid-table th > .column-header-anchor > .icon { + display: block; + position: absolute; + right: 0; + top: 2px; +} +.bootgrid-table th:hover, +.bootgrid-table th:active { + background: var(--jqueryback); +} +.bootgrid-table td { + overflow: hidden; + -ms-text-overflow: ellipsis; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.bootgrid-table td.loading, +.bootgrid-table td.no-results { + background: var(--jqueryback); + text-align: center; +} +.bootgrid-table th.select-cell, +.bootgrid-table td.select-cell { + text-align: center; + width: 30px; +} +.bootgrid-table th.select-cell .select-box, +.bootgrid-table td.select-cell .select-box { + margin: 0; + outline: 0; +} +.table-responsive .bootgrid-table { + table-layout: inherit !important; +} +.table-responsive .bootgrid-table th > .column-header-anchor > .text { + overflow: inherit !important; + -ms-text-overflow: inherit !important; + -o-text-overflow: inherit !important; + text-overflow: inherit !important; + white-space: inherit !important; +} +.table-responsive .bootgrid-table td { + overflow: inherit !important; + -ms-text-overflow: inherit !important; + -o-text-overflow: inherit !important; + text-overflow: inherit !important; + white-space: inherit !important; +} diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/jquery.bootgrid.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css new file mode 100644 index 0000000000..4c4f9ab62d --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css @@ -0,0 +1,6347 @@ +@charset "UTF-8"; +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #1F62C1; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #1F62C1; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FF3333; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #E64949; /* danger accent hover */ + /* alert messages */ + /* alert*/ + --alertback: #000000; + --alertborder: transparent; + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +@font-face { + font-family: "SourceSansProBold"; + src: url("/ui/themes/flexcolor/build/fonts/SourceSansPro-Bold/SourceSansPro-Bold.woff") format("woff"), url("/ui/themes/opnsense/build/fonts/SourceSansPro-Bold/SourceSansPro-Bold.ttf") format("truetype"); } +@font-face { + font-family: "SourceSansProSemibold"; + src: url("/ui/themes/flexcolor/build/fonts/SourceSansPro-Semibold/SourceSansPro-Semibold.woff") format("woff"), url("/ui/themes/opnsense/build/fonts/SourceSansPro-Semibold/SourceSansPro-Semibold.ttf") format("truetype"); } +@font-face { + font-family: "SourceSansProRegular"; + src: url("/ui/themes/flexcolor/build/fonts/SourceSansPro-Regular/SourceSansPro-Regular.woff") format("woff"), url("/ui/themes/opnsense/build/fonts/SourceSansPro-Regular/SourceSansPro-Regular.ttf") format("truetype"); } +/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ + + +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } +body { + margin: 0; } +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; } +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; } +audio:not([controls]) { + display: none; + height: 0; } +[hidden], +template { + display: none; } +a { + background: transparent; } +a:link, a:active, a:hover { + outline: 0; } +abbr[title] { + border-bottom: 1px dotted; } +b, +strong { + font-weight: bold; } +dfn { + font-style: italic; } +h1 { + font-size: 2em; + margin: 0.67em 0; } +mark { + background: var(--warning); + color: var(--pfore); } +small { + font-size: 80%; } +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } +sup { + top: -0.5em; } +sub { + bottom: -0.25em; } +img { + border: 0; } +svg:not(:root) { + overflow: hidden; } +figure { + margin: 1em 40px; } +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; } +pre { + overflow: auto; } +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; } +button { + overflow: visible; } +button, +select { + text-transform: none; } +button, +html input[type=button], +input[type=reset], +input[type=submit] { + -webkit-appearance: button; + cursor: pointer; } +button[disabled], +html input[disabled] { + cursor: default; } +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } +input { + line-height: normal; } +input[type=checkbox] { + box-sizing: border-box; + padding: 0; + accent-color: var(--colorcheckbox); } +input[type=radio] { + box-sizing: border-box; + padding: 0; + accent-color: var(--colorradio); } +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + height: auto; } +input[type=search] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; } +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration { + -webkit-appearance: none; } +fieldset { + border: 1px solid var(--stdborder); + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } +legend { + border: 0; + padding: 0; } +textarea { + overflow: auto; } +optgroup { + font-weight: bold; } +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; } +@media print { + * { + text-shadow: none !important; + color: var(--pfore) !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="javascript:"]:after, +a[href^="#"]:after { + content: ""; + } + pre, +blockquote { + border: 1px solid var(--stdborder); + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, +img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: var(--pback) !important; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: var(--pback) !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: var(--stdborder) !important; + } + .label { + border: 1px solid var(--stdborder); + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid var(--stdborder) !important; + } +} +@font-face { + font-family: "Glyphicons Halflings"; + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot"); + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: "Glyphicons Halflings"; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } +.glyphicon-asterisk:before { + content: "*"; } +.glyphicon-plus:before { + content: "+"; } +.glyphicon-euro:before { + content: "€"; } +.glyphicon-minus:before { + content: "−"; } +.glyphicon-cloud:before { + content: "☁"; } +.glyphicon-envelope:before { + content: "✉"; } +.glyphicon-pencil:before { + content: "✏"; } +.glyphicon-glass:before { + content: ""; } +.glyphicon-music:before { + content: ""; } +.glyphicon-search:before { + content: ""; } +.glyphicon-heart:before { + content: ""; } +.glyphicon-star:before { + content: ""; } +.glyphicon-star-empty:before { + content: ""; } +.glyphicon-user:before { + content: ""; } +.glyphicon-film:before { + content: ""; } +.glyphicon-th-large:before { + content: ""; } +.glyphicon-th:before { + content: ""; } +.glyphicon-th-list:before { + content: ""; } +.glyphicon-ok:before { + content: ""; } +.glyphicon-remove:before { + content: ""; } +.glyphicon-zoom-in:before { + content: ""; } +.glyphicon-zoom-out:before { + content: ""; } +.glyphicon-off:before { + content: ""; } +.glyphicon-signal:before { + content: ""; } +.glyphicon-cog:before { + content: ""; } +.glyphicon-trash:before { + content: ""; } +.glyphicon-home:before { + content: ""; } +.glyphicon-file:before { + content: ""; } +.glyphicon-time:before { + content: ""; } +.glyphicon-road:before { + content: ""; } +.glyphicon-download-alt:before { + content: ""; } +.glyphicon-download:before { + content: ""; } +.glyphicon-upload:before { + content: ""; } +.glyphicon-inbox:before { + content: ""; } +.glyphicon-play-circle:before { + content: ""; } +.glyphicon-repeat:before { + content: ""; } +.glyphicon-refresh:before { + content: ""; } +.glyphicon-list-alt:before { + content: ""; } +.glyphicon-lock:before { + content: ""; } +.glyphicon-flag:before { + content: ""; } +.glyphicon-headphones:before { + content: ""; } +.glyphicon-volume-off:before { + content: ""; } +.glyphicon-volume-down:before { + content: ""; } +.glyphicon-volume-up:before { + content: ""; } +.glyphicon-qrcode:before { + content: ""; } +.glyphicon-barcode:before { + content: ""; } +.glyphicon-tag:before { + content: ""; } +.glyphicon-tags:before { + content: ""; } +.glyphicon-book:before { + content: ""; } +.glyphicon-bookmark:before { + content: ""; } +.glyphicon-print:before { + content: ""; } +.glyphicon-camera:before { + content: ""; } +.glyphicon-font:before { + content: ""; } +.glyphicon-bold:before { + content: ""; } +.glyphicon-italic:before { + content: ""; } +.glyphicon-text-height:before { + content: ""; } +.glyphicon-text-width:before { + content: ""; } +.glyphicon-align-left:before { + content: ""; } +.glyphicon-align-center:before { + content: ""; } +.glyphicon-align-right:before { + content: ""; } +.glyphicon-align-justify:before { + content: ""; } +.glyphicon-list:before { + content: ""; } +.glyphicon-indent-left:before { + content: ""; } +.glyphicon-indent-right:before { + content: ""; } +.glyphicon-facetime-video:before { + content: ""; } +.glyphicon-picture:before { + content: ""; } +.glyphicon-map-marker:before { + content: ""; } +.glyphicon-adjust:before { + content: ""; } +.glyphicon-tint:before { + content: ""; } +.glyphicon-edit:before { + content: ""; } +.glyphicon-share:before { + content: ""; } +.glyphicon-check:before { + content: ""; } +.glyphicon-move:before { + content: ""; } +.glyphicon-step-backward:before { + content: ""; } +.glyphicon-fast-backward:before { + content: ""; } +.glyphicon-backward:before { + content: ""; } +.glyphicon-play:before { + content: ""; } +.glyphicon-pause:before { + content: ""; } +.glyphicon-stop:before { + content: ""; } +.glyphicon-forward:before { + content: ""; } +.glyphicon-fast-forward:before { + content: ""; } +.glyphicon-step-forward:before { + content: ""; } +.glyphicon-eject:before { + content: ""; } +.glyphicon-chevron-left:before { + content: ""; } +.glyphicon-chevron-right:before { + content: ""; } +.glyphicon-plus-sign:before { + content: ""; } +.glyphicon-minus-sign:before { + content: ""; } +.glyphicon-remove-sign:before { + content: ""; } +.glyphicon-ok-sign:before { + content: ""; } +.glyphicon-question-sign:before { + content: ""; } +.glyphicon-info-sign:before { + content: ""; } +.glyphicon-screenshot:before { + content: ""; } +.glyphicon-remove-circle:before { + content: ""; } +.glyphicon-ok-circle:before { + content: ""; } +.glyphicon-ban-circle:before { + content: ""; } +.glyphicon-arrow-left:before { + content: ""; } +.glyphicon-arrow-right:before { + content: ""; } +.glyphicon-arrow-up:before { + content: ""; } +.glyphicon-arrow-down:before { + content: ""; } +.glyphicon-share-alt:before { + content: ""; } +.glyphicon-resize-full:before { + content: ""; } +.glyphicon-resize-small:before { + content: ""; } +.glyphicon-exclamation-sign:before { + content: ""; } +.glyphicon-gift:before { + content: ""; } +.glyphicon-leaf:before { + content: ""; } +.glyphicon-fire:before { + content: ""; } +.glyphicon-eye-open:before { + content: ""; } +.glyphicon-eye-close:before { + content: ""; } +.glyphicon-warning-sign:before { + content: ""; } +.glyphicon-plane:before { + content: ""; } +.glyphicon-calendar:before { + content: ""; } +.glyphicon-random:before { + content: ""; } +.glyphicon-comment:before { + content: ""; } +.glyphicon-magnet:before { + content: ""; } +.glyphicon-chevron-up:before { + content: ""; } +.glyphicon-chevron-down:before { + content: ""; } +.glyphicon-retweet:before { + content: ""; } +.glyphicon-shopping-cart:before { + content: ""; } +.glyphicon-folder-close:before { + content: ""; } +.glyphicon-folder-open:before { + content: ""; } +.glyphicon-resize-vertical:before { + content: ""; } +.glyphicon-resize-horizontal:before { + content: ""; } +.glyphicon-hdd:before { + content: ""; } +.glyphicon-bullhorn:before { + content: ""; } +.glyphicon-bell:before { + content: ""; } +.glyphicon-certificate:before { + content: ""; } +.glyphicon-thumbs-up:before { + content: ""; } +.glyphicon-thumbs-down:before { + content: ""; } +.glyphicon-hand-right:before { + content: ""; } +.glyphicon-hand-left:before { + content: ""; } +.glyphicon-hand-up:before { + content: ""; } +.glyphicon-hand-down:before { + content: ""; } +.glyphicon-circle-arrow-right:before { + content: ""; } +.glyphicon-circle-arrow-left:before { + content: ""; } +.glyphicon-circle-arrow-up:before { + content: ""; } +.glyphicon-circle-arrow-down:before { + content: ""; } +.glyphicon-globe:before { + content: ""; } +.glyphicon-wrench:before { + content: ""; } +.glyphicon-tasks:before { + content: ""; } +.glyphicon-filter:before { + content: ""; } +.glyphicon-briefcase:before { + content: ""; } +.glyphicon-fullscreen:before { + content: ""; } +.glyphicon-dashboard:before { + content: ""; } +.glyphicon-paperclip:before { + content: ""; } +.glyphicon-heart-empty:before { + content: ""; } +.glyphicon-link:before { + content: ""; } +.glyphicon-phone:before { + content: ""; } +.glyphicon-pushpin:before { + content: ""; } +.glyphicon-usd:before { + content: ""; } +.glyphicon-gbp:before { + content: ""; } +.glyphicon-sort:before { + content: ""; } +.glyphicon-sort-by-alphabet:before { + content: ""; } +.glyphicon-sort-by-alphabet-alt:before { + content: ""; } +.glyphicon-sort-by-order:before { + content: ""; } +.glyphicon-sort-by-order-alt:before { + content: ""; } +.glyphicon-sort-by-attributes:before { + content: ""; } +.glyphicon-sort-by-attributes-alt:before { + content: ""; } +.glyphicon-unchecked:before { + content: ""; } +.glyphicon-expand:before { + content: ""; } +.glyphicon-collapse-down:before { + content: ""; } +.glyphicon-collapse-up:before { + content: ""; } +.glyphicon-log-in:before { + content: ""; } +.glyphicon-flash:before { + content: ""; } +.glyphicon-log-out:before { + content: ""; } +.glyphicon-new-window:before { + content: ""; } +.glyphicon-record:before { + content: ""; } +.glyphicon-save:before { + content: ""; } +.glyphicon-open:before { + content: ""; } +.glyphicon-saved:before { + content: ""; } +.glyphicon-import:before { + content: ""; } +.glyphicon-export:before { + content: ""; } +.glyphicon-send:before { + content: ""; } +.glyphicon-floppy-disk:before { + content: ""; } +.glyphicon-floppy-saved:before { + content: ""; } +.glyphicon-floppy-remove:before { + content: ""; } +.glyphicon-floppy-save:before { + content: ""; } +.glyphicon-floppy-open:before { + content: ""; } +.glyphicon-credit-card:before { + content: ""; } +.glyphicon-transfer:before { + content: ""; } +.glyphicon-cutlery:before { + content: ""; } +.glyphicon-header:before { + content: ""; } +.glyphicon-compressed:before { + content: ""; } +.glyphicon-earphone:before { + content: ""; } +.glyphicon-phone-alt:before { + content: ""; } +.glyphicon-tower:before { + content: ""; } +.glyphicon-stats:before { + content: ""; } +.glyphicon-sd-video:before { + content: ""; } +.glyphicon-hd-video:before { + content: ""; } +.glyphicon-subtitles:before { + content: ""; } +.glyphicon-sound-stereo:before { + content: ""; } +.glyphicon-sound-dolby:before { + content: ""; } +.glyphicon-sound-5-1:before { + content: ""; } +.glyphicon-sound-6-1:before { + content: ""; } +.glyphicon-sound-7-1:before { + content: ""; } +.glyphicon-copyright-mark:before { + content: ""; } +.glyphicon-registration-mark:before { + content: ""; } +.glyphicon-cloud-download:before { + content: ""; } +.glyphicon-cloud-upload:before { + content: ""; } +.glyphicon-tree-conifer:before { + content: ""; } +.glyphicon-tree-deciduous:before { + content: ""; } +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + text-decoration:none; } +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; } +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: var(--pagefore); +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } +a { + color: var(--link); + text-decoration: none; } +a:hover, a:focus { + color: var(--linkhover); + text-decoration: underline; } +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } +figure { + margin: 0; } +img { + vertical-align: middle; } +.img-responsive { + display: block; + width: 100% \9 ; + max-width: 100%; + height: auto; } +.img-rounded { + border-radius: 6px; } +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: var(--pback); + border: 1px solid var(--stdborderaccent); + border-radius: 3px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + width: 100% \9 ; + max-width: 100%; + height: auto; } +.img-circle { + border-radius: 50%; } +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid var(--stdborder); } +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(255, 255, 255, 0); + border: 0; } +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: "SourceSansProSemiBold"; + font-weight: 100; + line-height: 1.4; + color: var(--foregound); } /* !!! */ +h1 small, +h1 .small, h2 small, +h2 .small, h3 small, +h3 .small, h4 small, +h4 .small, h5 small, +h5 .small, h6 small, +h6 .small, +.h1 small, +.h1 .small, .h2 small, +.h2 .small, .h3 small, +.h3 .small, .h4 small, +.h4 .small, .h5 small, +.h5 .small, .h6 small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: var(--pfore); } +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; } +h1 small, +h1 .small, .h1 small, +.h1 .small, +h2 small, +h2 .small, .h2 small, +.h2 .small, +h3 small, +h3 .small, .h3 small, +.h3 .small { + font-size: 65%; } +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; } +h4 small, +h4 .small, .h4 small, +.h4 .small, +h5 small, +h5 .small, .h5 small, +.h5 .small, +h6 small, +h6 .small, .h6 small, +.h6 .small { + font-size: 75%; } +h1, .h1 { + font-size: 23px; } +h2, .h2 { + font-size: 16px; } +h3, .h3 { + font-size: 14px; } +h4, .h4 { + font-size: 18px; } +h5, .h5 { + font-size: 14px; } +h6, .h6 { + font-size: 12px; } +p { + margin: 0 0 10px; } +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; } +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; } +cite { + font-style: normal; } +mark, +.mark { + background-color: var(--pbackhover); + padding: 0.2em; } +.text-left { + text-align: left; } +.text-right { + text-align: right; } +.text-center { + text-align: center; } +.text-justify { + text-align: justify; } +.text-nowrap { + white-space: nowrap; } +.text-lowercase { + text-transform: lowercase; } +.text-uppercase { + text-transform: uppercase; } +.text-capitalize { + text-transform: capitalize; } +.text-muted { + color: var(--pforemuted); } +.text-primary { + color: var(--pfore); } +a.text-primary:hover { + color: var(--pforehover); } +.text-success { + color: var(--success); } +a.text-success:hover { + color: var(--successhover); } +.text-info { + color: var(--info); } +a.text-info:hover { + color: var(--infohover); } +.text-warning { + color: var(--warning); } +a.text-warning:hover { + color: var(--warninghover); } +.text-danger { + color: var(--danger); } +a.text-danger:hover { + color: var(--dangerhover); } +.bg-primary { + color: var(--pfore); +} +.bg-primary { + background-color: var(--pback); } +a.bg-primary:hover +{ + background-color: var(--pbackhover); +} +.bg-success { + background-color: var(--success); } +a.bg-success:hover { + background-color: var(--successhover); } +.bg-info { + background-color: var(--info); } +a.bg-info:hover { + background-color: var(--infohover); } +.bg-warning { + background-color: var(--warning); } +a.bg-warning:hover { + background-color: var(--warninghover); } +.bg-danger { + background-color: var(--danger); } +a.bg-danger:hover { + background-color: var(--dangerhover); } +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid var(--stdborder); } +ul, +ol { + margin-top: 0; + margin-bottom: 10px; } +ul ul, +ul ol, +ol ul, +ol ol { + margin-bottom: 0; } +.list-unstyled, .list-inline { + padding-left: 0; + list-style: none; } +.list-inline { + margin-left: -5px; } +.list-inline > li { + float: left; + padding-left: 5px; + padding-right: 5px; } +dl { + margin-top: 0; + margin-bottom: 20px; } +dt, +dd { + line-height: 1.428571429; } +dt { + font-weight: bold; } +dd { + margin-left: 0; } +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; } +.dl-horizontal dd:after { + clear: both; } +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted var(--stdborder); } +.initialism { + font-size: 90%; + text-transform: uppercase; } +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid var(--stdborder); } +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; } +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.428571429; + color: var(--pforemuted); } +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: "— "; } +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid var(--stdborder); + border-left: 0; + text-align: right; } +.blockquote-reverse footer:before, +.blockquote-reverse small:before, +.blockquote-reverse .small:before, +blockquote.pull-right footer:before, +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ""; } +.blockquote-reverse footer:after, +.blockquote-reverse small:after, +.blockquote-reverse .small:after, +blockquote.pull-right footer:after, +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: " —"; } +blockquote:before, +blockquote:after { + content: ""; } +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; } +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } +code { + padding: 2px 4px; + font-size: 90%; + color: var(--warning); + background-color: var(--pbackinverse); + border-radius: 3px; } +kbd { + padding: 2px 4px; + font-size: 90%; + color: var(--pfore); + background-color: var(--pback); + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(61, 61, 61, 0.25); } +kbd kbd { + padding: 0; + font-size: 100%; + box-shadow: none; } +pre { + display: block; + padding: 9.5; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + word-break: break-all; + word-wrap: break-word; + color: var(--contentboxfore); + background-color: var(--contentboxback); + border: inherit; + border-radius: 3px; } +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } +.container { + margin-right: auto; + margin-left: auto; + padding-left: 20px; + padding-right: 20px; } +.container:before, .container:after { + content: " "; + display: table; } +.container:after { + clear: both; } +@media (min-width: 768px) { + .container { + width: 760px; + } +} +@media (min-width: 992px) { + .container { + width: 980px; + } +} +@media (min-width: 1200px) { + .container { + width: 1180px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 20px; + padding-right: 20px; } +.container-fluid:before, .container-fluid:after { + content: " "; + display: table; } +.container-fluid:after { + clear: both; } +.row { + margin-left: -20px; + margin-right: -20px; } +.row:before, .row:after { + content: " "; + display: table; } +.row:after { + clear: both; } +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 20px; + padding-right: 20px; } +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; } +.col-xs-1 { + width: 8.3333333333%; } +.col-xs-2 { + width: 16.6666666667%; } +.col-xs-3 { + width: 25%; } +.col-xs-4 { + width: 33.3333333333%; } +.col-xs-5 { + width: 41.6666666667%; } +.col-xs-6 { + width: 50%; } +.col-xs-7 { + width: 58.3333333333%; } +.col-xs-8 { + width: 66.6666666667%; } +.col-xs-9 { + width: 75%; } +.col-xs-10 { + width: 83.3333333333%; } +.col-xs-11 { + width: 91.6666666667%; } +.col-xs-12 { + width: 100%; } +.col-xs-pull-0 { + right: auto; } +.col-xs-pull-1 { + right: 8.3333333333%; } +.col-xs-pull-2 { + right: 16.6666666667%; } +.col-xs-pull-3 { + right: 25%; } +.col-xs-pull-4 { + right: 33.3333333333%; } +.col-xs-pull-5 { + right: 41.6666666667%; } +.col-xs-pull-6 { + right: 50%; } +.col-xs-pull-7 { + right: 58.3333333333%; } +.col-xs-pull-8 { + right: 66.6666666667%; } +.col-xs-pull-9 { + right: 75%; } +.col-xs-pull-10 { + right: 83.3333333333%; } +.col-xs-pull-11 { + right: 91.6666666667%; } +.col-xs-pull-12 { + right: 100%; } +.col-xs-push-0 { + left: auto; } +.col-xs-push-1 { + left: 8.3333333333%; } +.col-xs-push-2 { + left: 16.6666666667%; } +.col-xs-push-3 { + left: 25%; } +.col-xs-push-4 { + left: 33.3333333333%; } +.col-xs-push-5 { + left: 41.6666666667%; } +.col-xs-push-6 { + left: 50%; } +.col-xs-push-7 { + left: 58.3333333333%; } +.col-xs-push-8 { + left: 66.6666666667%; } +.col-xs-push-9 { + left: 75%; } +.col-xs-push-10 { + left: 83.3333333333%; } +.col-xs-push-11 { + left: 91.6666666667%; } +.col-xs-push-12 { + left: 100%; } +.col-xs-offset-0 { + margin-left: 0%; } +.col-xs-offset-1 { + margin-left: 8.3333333333%; } +.col-xs-offset-2 { + margin-left: 16.6666666667%; } +.col-xs-offset-3 { + margin-left: 25%; } +.col-xs-offset-4 { + margin-left: 33.3333333333%; } +.col-xs-offset-5 { + margin-left: 41.6666666667%; } +.col-xs-offset-6 { + margin-left: 50%; } +.col-xs-offset-7 { + margin-left: 58.3333333333%; } +.col-xs-offset-8 { + margin-left: 66.6666666667%; } +.col-xs-offset-9 { + margin-left: 75%; } +.col-xs-offset-10 { + margin-left: 83.3333333333%; } +.col-xs-offset-11 { + margin-left: 91.6666666667%; } +.col-xs-offset-12 { + margin-left: 100%; } +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + + .col-sm-1 { + width: 8.3333333333%; + } + + .col-sm-2 { + width: 16.6666666667%; + } + + .col-sm-3 { + width: 25%; + } + + .col-sm-4 { + width: 33.3333333333%; + } + + .col-sm-5 { + width: 41.6666666667%; + } + + .col-sm-6 { + width: 50%; + } + + .col-sm-7 { + width: 58.3333333333%; + } + + .col-sm-8 { + width: 66.6666666667%; + } + + .col-sm-9 { + width: 75%; + } + + .col-sm-10 { + width: 83.3333333333%; + } + + .col-sm-11 { + width: 91.6666666667%; + } + + .col-sm-12 { + width: 100%; + } + + .col-sm-pull-0 { + right: auto; + } + + .col-sm-pull-1 { + right: 8.3333333333%; + } + + .col-sm-pull-2 { + right: 16.6666666667%; + } + + .col-sm-pull-3 { + right: 25%; + } + + .col-sm-pull-4 { + right: 33.3333333333%; + } + + .col-sm-pull-5 { + right: 41.6666666667%; + } + + .col-sm-pull-6 { + right: 50%; + } + + .col-sm-pull-7 { + right: 58.3333333333%; + } + + .col-sm-pull-8 { + right: 66.6666666667%; + } + + .col-sm-pull-9 { + right: 75%; + } + + .col-sm-pull-10 { + right: 83.3333333333%; + } + + .col-sm-pull-11 { + right: 91.6666666667%; + } + + .col-sm-pull-12 { + right: 100%; + } + + .col-sm-push-0 { + left: auto; + } + + .col-sm-push-1 { + left: 8.3333333333%; + } + + .col-sm-push-2 { + left: 16.6666666667%; + } + + .col-sm-push-3 { + left: 25%; + } + + .col-sm-push-4 { + left: 33.3333333333%; + } + + .col-sm-push-5 { + left: 41.6666666667%; + } + + .col-sm-push-6 { + left: 50%; + } + + .col-sm-push-7 { + left: 58.3333333333%; + } + + .col-sm-push-8 { + left: 66.6666666667%; + } + + .col-sm-push-9 { + left: 75%; + } + + .col-sm-push-10 { + left: 83.3333333333%; + } + + .col-sm-push-11 { + left: 91.6666666667%; + } + + .col-sm-push-12 { + left: 100%; + } + + .col-sm-offset-0 { + margin-left: 0%; + } + + .col-sm-offset-1 { + margin-left: 8.3333333333%; + } + + .col-sm-offset-2 { + margin-left: 16.6666666667%; + } + + .col-sm-offset-3 { + margin-left: 25%; + } + + .col-sm-offset-4 { + margin-left: 33.3333333333%; + } + + .col-sm-offset-5 { + margin-left: 41.6666666667%; + } + + .col-sm-offset-6 { + margin-left: 50%; + } + + .col-sm-offset-7 { + margin-left: 58.3333333333%; + } + + .col-sm-offset-8 { + margin-left: 66.6666666667%; + } + + .col-sm-offset-9 { + margin-left: 75%; + } + + .col-sm-offset-10 { + margin-left: 83.3333333333%; + } + + .col-sm-offset-11 { + margin-left: 91.6666666667%; + } + + .col-sm-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + + .col-md-1 { + width: 8.3333333333%; + } + + .col-md-2 { + width: 16.6666666667%; + } + + .col-md-3 { + width: 25%; + } + + .col-md-4 { + width: 33.3333333333%; + } + + .col-md-5 { + width: 41.6666666667%; + } + + .col-md-6 { + width: 50%; + } + + .col-md-7 { + width: 58.3333333333%; + } + + .col-md-8 { + width: 66.6666666667%; + } + + .col-md-9 { + width: 75%; + } + + .col-md-10 { + width: 83.3333333333%; + } + + .col-md-11 { + width: 91.6666666667%; + } + + .col-md-12 { + width: 100%; + } + + .col-md-pull-0 { + right: auto; + } + + .col-md-pull-1 { + right: 8.3333333333%; + } + + .col-md-pull-2 { + right: 16.6666666667%; + } + + .col-md-pull-3 { + right: 25%; + } + + .col-md-pull-4 { + right: 33.3333333333%; + } + + .col-md-pull-5 { + right: 41.6666666667%; + } + + .col-md-pull-6 { + right: 50%; + } + + .col-md-pull-7 { + right: 58.3333333333%; + } + + .col-md-pull-8 { + right: 66.6666666667%; + } + + .col-md-pull-9 { + right: 75%; + } + + .col-md-pull-10 { + right: 83.3333333333%; + } + + .col-md-pull-11 { + right: 91.6666666667%; + } + + .col-md-pull-12 { + right: 100%; + } + + .col-md-push-0 { + left: auto; + } + + .col-md-push-1 { + left: 8.3333333333%; + } + + .col-md-push-2 { + left: 16.6666666667%; + } + + .col-md-push-3 { + left: 25%; + } + + .col-md-push-4 { + left: 33.3333333333%; + } + + .col-md-push-5 { + left: 41.6666666667%; + } + + .col-md-push-6 { + left: 50%; + } + + .col-md-push-7 { + left: 58.3333333333%; + } + + .col-md-push-8 { + left: 66.6666666667%; + } + + .col-md-push-9 { + left: 75%; + } + + .col-md-push-10 { + left: 83.3333333333%; + } + + .col-md-push-11 { + left: 91.6666666667%; + } + + .col-md-push-12 { + left: 100%; + } + + .col-md-offset-0 { + margin-left: 0%; + } + + .col-md-offset-1 { + margin-left: 8.3333333333%; + } + + .col-md-offset-2 { + margin-left: 16.6666666667%; + } + + .col-md-offset-3 { + margin-left: 25%; + } + + .col-md-offset-4 { + margin-left: 33.3333333333%; + } + + .col-md-offset-5 { + margin-left: 41.6666666667%; + } + + .col-md-offset-6 { + margin-left: 50%; + } + + .col-md-offset-7 { + margin-left: 58.3333333333%; + } + + .col-md-offset-8 { + margin-left: 66.6666666667%; + } + + .col-md-offset-9 { + margin-left: 75%; + } + + .col-md-offset-10 { + margin-left: 83.3333333333%; + } + + .col-md-offset-11 { + margin-left: 91.6666666667%; + } + + .col-md-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + + .col-lg-1 { + width: 8.3333333333%; + } + + .col-lg-2 { + width: 16.6666666667%; + } + + .col-lg-3 { + width: 25%; + } + + .col-lg-4 { + width: 33.3333333333%; + } + + .col-lg-5 { + width: 41.6666666667%; + } + + .col-lg-6 { + width: 50%; + } + + .col-lg-7 { + width: 58.3333333333%; + } + + .col-lg-8 { + width: 66.6666666667%; + } + + .col-lg-9 { + width: 75%; + } + + .col-lg-10 { + width: 83.3333333333%; + } + + .col-lg-11 { + width: 91.6666666667%; + } + + .col-lg-12 { + width: 100%; + } + + .col-lg-pull-0 { + right: auto; + } + + .col-lg-pull-1 { + right: 8.3333333333%; + } + + .col-lg-pull-2 { + right: 16.6666666667%; + } + + .col-lg-pull-3 { + right: 25%; + } + + .col-lg-pull-4 { + right: 33.3333333333%; + } + + .col-lg-pull-5 { + right: 41.6666666667%; + } + + .col-lg-pull-6 { + right: 50%; + } + + .col-lg-pull-7 { + right: 58.3333333333%; + } + + .col-lg-pull-8 { + right: 66.6666666667%; + } + + .col-lg-pull-9 { + right: 75%; + } + + .col-lg-pull-10 { + right: 83.3333333333%; + } + + .col-lg-pull-11 { + right: 91.6666666667%; + } + + .col-lg-pull-12 { + right: 100%; + } + + .col-lg-push-0 { + left: auto; + } + + .col-lg-push-1 { + left: 8.3333333333%; + } + + .col-lg-push-2 { + left: 16.6666666667%; + } + + .col-lg-push-3 { + left: 25%; + } + + .col-lg-push-4 { + left: 33.3333333333%; + } + + .col-lg-push-5 { + left: 41.6666666667%; + } + + .col-lg-push-6 { + left: 50%; + } + + .col-lg-push-7 { + left: 58.3333333333%; + } + + .col-lg-push-8 { + left: 66.6666666667%; + } + + .col-lg-push-9 { + left: 75%; + } + + .col-lg-push-10 { + left: 83.3333333333%; + } + + .col-lg-push-11 { + left: 91.6666666667%; + } + + .col-lg-push-12 { + left: 100%; + } + + .col-lg-offset-0 { + margin-left: 0%; + } + + .col-lg-offset-1 { + margin-left: 8.3333333333%; + } + + .col-lg-offset-2 { + margin-left: 16.6666666667%; + } + + .col-lg-offset-3 { + margin-left: 25%; + } + + .col-lg-offset-4 { + margin-left: 33.3333333333%; + } + + .col-lg-offset-5 { + margin-left: 41.6666666667%; + } + + .col-lg-offset-6 { + margin-left: 50%; + } + + .col-lg-offset-7 { + margin-left: 58.3333333333%; + } + + .col-lg-offset-8 { + margin-left: 66.6666666667%; + } + + .col-lg-offset-9 { + margin-left: 75%; + } + + .col-lg-offset-10 { + margin-left: 83.3333333333%; + } + + .col-lg-offset-11 { + margin-left: 91.6666666667%; + } + + .col-lg-offset-12 { + margin-left: 100%; + } +} +table { + background-color: var(--tableback); + color: var(--tablelegend); +} +th { + text-align: left; } +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; + border: 1px var(--tableborder); + border-radius: 4px; } +.table > thead > tr > th, +.table > thead > tr > td, +.table > tbody > tr > th, +.table > tbody > tr > td, +.table > tfoot > tr > th, +.table > tfoot > tr > td { + padding: 10px 0px 10px 20px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid var(--tableborder); + border-radius: 4px; } +.table > thead > tr > th { + border-bottom: 1px solid var(--tableborder); + vertical-align: bottom; } +.table > caption + thead > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > th, +.table > thead:first-child > tr:first-child > td { + color: var(--tableheadfore); /* textcolor table headline */ + border-top: 0; + font-family: "SourceSansProSemibold"; + font-weight: normal; } +.table > tbody + tbody { + border-top: 2px solid var(--tableborder); +} +.table .table { + background-color: var(--tabletableback); /* background tableheadline */ +} +.table-condensed > thead > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 5px; } +.table-bordered { + border: 1px solid var(--txtboxborder); + border-radius: 4px; } +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > th, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > th, +.table-bordered > tfoot > tr > td { + border: 1px solid var(--tableborder); } +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; } +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: var(--tablestripeback); } +.table-hover > tbody > tr:hover > td, +.table-hover > tbody > tr:hover > th { +} +table col[class*=col-] { + position: static; + float: none; + display: table-column; } +table td[class*=col-], +table th[class*=col-] { + position: static; + float: none; + display: table-cell; } +.table > thead > tr > td.active, +.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.table > tfoot > tr.active > th { + background-color: var(--tableback); } +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { + background-color: var(--tableback); } +.table > thead > tr > td.success, +.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.table > tfoot > tr.success > th { + background-color: var(--success); } +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th +{ + background-color: var(--successhover); +} +.table > thead > tr > td.info, +.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.table > tfoot > tr.info > th { + background-color: var(--info); } +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { + background-color: var(infohover); } +.table > thead > tr > td.warning, +.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.table > tfoot > tr.warning > th { + background-color: var(--warning); } +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { + background-color: var(--warninghover); } +.table > thead > tr > td.danger, +.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.table > tfoot > tr.danger > th { + background-color: var(--danger); } +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th +{ + background-color: var(--dangerhover); +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + overflow-x: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; + /* border: 1px solid $table-border-color; */ + -webkit-overflow-scrolling: touch; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, +.table-responsive > .table > thead > tr > td, +.table-responsive > .table > tbody > tr > th, +.table-responsive > .table > tbody > tr > td, +.table-responsive > .table > tfoot > tr > th, +.table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, +.table-responsive > .table-bordered > thead > tr > td:first-child, +.table-responsive > .table-bordered > tbody > tr > th:first-child, +.table-responsive > .table-bordered > tbody > tr > td:first-child, +.table-responsive > .table-bordered > tfoot > tr > th:first-child, +.table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, +.table-responsive > .table-bordered > thead > tr > td:last-child, +.table-responsive > .table-bordered > tbody > tr > th:last-child, +.table-responsive > .table-bordered > tbody > tr > td:last-child, +.table-responsive > .table-bordered > tfoot > tr > th:last-child, +.table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, +.table-responsive > .table-bordered > tbody > tr:last-child > td, +.table-responsive > .table-bordered > tfoot > tr:last-child > th, +.table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; } +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: var(--pfore); + border: 0; + border-bottom: 1px solid var(--stdborder); } +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: normal; } +input[type=search] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } +input[type=radio], +input[type=checkbox] { + margin: 4px 0 0; + margin-top: 1px \9 ; + line-height: normal; } +input[type=file] { + display: block; } +input[type=range] { + display: block; + width: 100%; } +select[multiple], +select[size] { + height: auto; } +input[type=file]:focus, +input[type=radio]:focus, +input[type=checkbox]:focus { + outline: none; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.428571429; + color: var(--badgeback); } +input:-internal-autofill-previewed, +input:-internal-autofill-selected, +textarea:-internal-autofill-previewed, +textarea:-internal-autofill-selected, +select:-internal-autofill-previewed, +select:-internal-autofill-selected { + background-color: var(--txtboxbackactive) !important; + border: 1px solid var(--txtboxborder) !important; + background-image: none !important; + color: var(--txtboxforeactive) !important; } +select, /* Eingabefeld */ +textarea, +input[type=text], +input[type=password], +input[type=datetime], +input[type=datetime-local], +input[type=date], +input[type=month], +input[type=time], +input[type=week], +input[type=number], +input[type=email], +input[type=url], +input[type=search], +input[type=tel], +input[type=color] { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: var(--txtboxfore); + background-color: var(--txtboxback); + background-image: none; + border: 1px solid var(--txtboxborder); + border-radius: 3px; + text-overflow: ellipsis; + max-width: 348px; + -webkit-transition: border-color ease-in-out 0.1s, box-shadow ease-in-out 0.1s; + -o-transition: border-color ease-in-out 0.1s, box-shadow ease-in-out 0.1s; + transition: border-color ease-in-out 0.1s, box-shadow ease-in-out 0.1s; } + select:hover, /* Eingabefeld drüberstreichen */ + textarea:hover, + input[type="text"]:hover, + input[type="password"]:hover, + input[type="datetime"]:hover, + input[type="datetime-local"]:hover, + input[type="date"]:hover, + input[type="month"]:hover, + input[type="time"]:hover, + input[type="week"]:hover, + input[type="number"]:hover, + input[type="email"]:hover, + input[type="url"]:hover, + input[type="search"]:hover, + input[type="tel"]:hover, + input[type="color"]:hover + { + color: var(--txtboxfore); + background-color: var(--txtboxback); + border: 1px solid var(--txtboxborderhover); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +select:focus, /* Eingabefeld aktiviert */ +textarea:focus, +input[type=text]:focus, +input[type=password]:focus, +input[type=datetime]:focus, +input[type=datetime-local]:focus, +input[type=date]:focus, +input[type=month]:focus, +input[type=time]:focus, +input[type=week]:focus, +input[type=number]:focus, +input[type=email]:focus, +input[type=url]:focus, +input[type=search]:focus, +input[type=tel]:focus, +input[type=color]:focus { + border-color: var(--txtboxborderactive); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +select::-moz-placeholder, +textarea::-moz-placeholder, +input[type=text]::-moz-placeholder, +input[type=password]::-moz-placeholder, +input[type=datetime]::-moz-placeholder, +input[type=datetime-local]::-moz-placeholder, +input[type=date]::-moz-placeholder, +input[type=month]::-moz-placeholder, +input[type=time]::-moz-placeholder, +input[type=week]::-moz-placeholder, +input[type=number]::-moz-placeholder, +input[type=email]::-moz-placeholder, +input[type=url]::-moz-placeholder, +input[type=search]::-moz-placeholder, +input[type=tel]::-moz-placeholder, +input[type=color]::-moz-placeholder { + color: var(--txtboxforeplaceholder); } +select:-ms-input-placeholder, +textarea:-ms-input-placeholder, +input[type=text]:-ms-input-placeholder, +input[type=password]:-ms-input-placeholder, +input[type=datetime]:-ms-input-placeholder, +input[type=datetime-local]:-ms-input-placeholder, +input[type=date]:-ms-input-placeholder, +input[type=month]:-ms-input-placeholder, +input[type=time]:-ms-input-placeholder, +input[type=week]:-ms-input-placeholder, +input[type=number]:-ms-input-placeholder, +input[type=email]:-ms-input-placeholder, +input[type=url]:-ms-input-placeholder, +input[type=search]:-ms-input-placeholder, +input[type=tel]:-ms-input-placeholder, +input[type=color]:-ms-input-placeholder { + color: var(--txtboxforeplaceholder); } +select::-webkit-input-placeholder, +textarea::-webkit-input-placeholder, +input[type=text]::-webkit-input-placeholder, +input[type=password]::-webkit-input-placeholder, +input[type=datetime]::-webkit-input-placeholder, +input[type=datetime-local]::-webkit-input-placeholder, +input[type=date]::-webkit-input-placeholder, +input[type=month]::-webkit-input-placeholder, +input[type=time]::-webkit-input-placeholder, +input[type=week]::-webkit-input-placeholder, +input[type=number]::-webkit-input-placeholder, +input[type=email]::-webkit-input-placeholder, +input[type=url]::-webkit-input-placeholder, +input[type=search]::-webkit-input-placeholder, +input[type=tel]::-webkit-input-placeholder, +input[type=color]::-webkit-input-placeholder { + color: var(--txtboxforeplaceholder); } +select[disabled], select[readonly], fieldset[disabled] select, +textarea[disabled], +textarea[readonly], +fieldset[disabled] textarea, +input[type=text][disabled], +input[type=text][readonly], +fieldset[disabled] input[type=text], +input[type=password][disabled], +input[type=password][readonly], +fieldset[disabled] input[type=password], +input[type=datetime][disabled], +input[type=datetime][readonly], +fieldset[disabled] input[type=datetime], +input[type=datetime-local][disabled], +input[type=datetime-local][readonly], +fieldset[disabled] input[type=datetime-local], +input[type=date][disabled], +input[type=date][readonly], +fieldset[disabled] input[type=date], +input[type=month][disabled], +input[type=month][readonly], +fieldset[disabled] input[type=month], +input[type=time][disabled], +input[type=time][readonly], +fieldset[disabled] input[type=time], +input[type=week][disabled], +input[type=week][readonly], +fieldset[disabled] input[type=week], +input[type=number][disabled], +input[type=number][readonly], +fieldset[disabled] input[type=number], +input[type=email][disabled], +input[type=email][readonly], +fieldset[disabled] input[type=email], +input[type=url][disabled], +input[type=url][readonly], +fieldset[disabled] input[type=url], +input[type=search][disabled], +input[type=search][readonly], +fieldset[disabled] input[type=search], +input[type=tel][disabled], +input[type=tel][readonly], +fieldset[disabled] input[type=tel], +input[type=color][disabled], +input[type=color][readonly], +fieldset[disabled] input[type=color] { + cursor: not-allowed; + color: var(--txtboxforedisabled) !important; + background-color: var(--txtboxbackdisabled) !important; + border-color: var(--txtboxborderdisabled); } +textarea { + height: auto; } +input[type=search] { + -webkit-appearance: none; } +input[type=date], +input[type=time], +input[type=datetime-local], +input[type=month] { + line-height: 34px; + line-height: 1.428571429 \0 ; } +input[type=date].input-sm, .input-group-sm > input[type=date].form-control, +.input-group-sm > input[type=date].input-group-addon, +.input-group-sm > .input-group-btn > input[type=date].btn, .form-horizontal .form-group-sm input[type=date].form-control, +input[type=time].input-sm, +.input-group-sm > input[type=time].form-control, +.input-group-sm > input[type=time].input-group-addon, +.input-group-sm > .input-group-btn > input[type=time].btn, +.form-horizontal .form-group-sm input[type=time].form-control, +input[type=datetime-local].input-sm, +.input-group-sm > input[type=datetime-local].form-control, +.input-group-sm > input[type=datetime-local].input-group-addon, +.input-group-sm > .input-group-btn > input[type=datetime-local].btn, +.form-horizontal .form-group-sm input[type=datetime-local].form-control, +input[type=month].input-sm, +.input-group-sm > input[type=month].form-control, +.input-group-sm > input[type=month].input-group-addon, +.input-group-sm > .input-group-btn > input[type=month].btn, +.form-horizontal .form-group-sm input[type=month].form-control { + line-height: 30px; } +input[type=date].input-lg, .input-group-lg > input[type=date].form-control, +.input-group-lg > input[type=date].input-group-addon, +.input-group-lg > .input-group-btn > input[type=date].btn, .form-horizontal .form-group-lg input[type=date].form-control, +input[type=time].input-lg, +.input-group-lg > input[type=time].form-control, +.input-group-lg > input[type=time].input-group-addon, +.input-group-lg > .input-group-btn > input[type=time].btn, +.form-horizontal .form-group-lg input[type=time].form-control, +input[type=datetime-local].input-lg, +.input-group-lg > input[type=datetime-local].form-control, +.input-group-lg > input[type=datetime-local].input-group-addon, +.input-group-lg > .input-group-btn > input[type=datetime-local].btn, +.form-horizontal .form-group-lg input[type=datetime-local].form-control, +input[type=month].input-lg, +.input-group-lg > input[type=month].form-control, +.input-group-lg > input[type=month].input-group-addon, +.input-group-lg > .input-group-btn > input[type=month].btn, +.form-horizontal .form-group-lg input[type=month].form-control { + line-height: 46px; } +.form-group { + margin-bottom: 15px; } +.radio, +.checkbox { + position: relative; + display: block; + min-height: 20px; + margin-top: 10px; + margin-bottom: 10px; } +.radio label, +.checkbox label { + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; } +.radio input[type=radio], +.radio-inline input[type=radio], +.checkbox input[type=checkbox], +.checkbox-inline input[type=checkbox] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9 ; } +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; } +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } +input[type=radio][disabled], input[type=radio].disabled, fieldset[disabled] input[type=radio], +input[type=checkbox][disabled], +input[type=checkbox].disabled, +fieldset[disabled] input[type=checkbox] { + cursor: not-allowed; } +.radio-inline.disabled, fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } +.radio.disabled label, fieldset[disabled] .radio label, +.checkbox.disabled label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; } +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; } +.form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, +.input-group-lg > .form-control-static.input-group-addon, +.input-group-lg > .input-group-btn > .form-control-static.btn, .form-horizontal .form-group-lg .form-control-static.form-control, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, +.input-group-sm > .form-control-static.input-group-addon, +.input-group-sm > .input-group-btn > .form-control-static.btn, .form-horizontal .form-group-sm .form-control-static.form-control { + padding-left: 0; + padding-right: 0; } +.input-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn, .form-horizontal .form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } +select.input-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn, .form-horizontal .form-group-sm select.form-control { + height: 30px; + line-height: 30px; } +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, .form-horizontal .form-group-sm textarea.form-control, +select[multiple].input-sm, +.input-group-sm > select[multiple].form-control, +.input-group-sm > select[multiple].input-group-addon, +.input-group-sm > .input-group-btn > select[multiple].btn, +.form-horizontal .form-group-sm select[multiple].form-control { + height: auto; } +.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn, .form-horizontal .form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } +select.input-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn, .form-horizontal .form-group-lg select.form-control { + height: 46px; + line-height: 46px; } +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, .form-horizontal .form-group-lg textarea.form-control, +select[multiple].input-lg, +.input-group-lg > select[multiple].form-control, +.input-group-lg > select[multiple].input-group-addon, +.input-group-lg > .input-group-btn > select[multiple].btn, +.form-horizontal .form-group-lg select[multiple].form-control { + height: auto; } +.has-feedback { + position: relative; } +.has-feedback .form-control { + padding-right: 42.5px; } +.form-control-feedback { + position: absolute; + top: 25px; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; } +.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .form-control-feedback, .form-horizontal .form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; } +.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .form-control-feedback, .form-horizontal .form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; } +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: var(--success); } +.has-success .form-control { + border-color: var(--success); + -webkit-box-shadow: var(--boxshadow); + box-shadow: var(--boxshadow); } +.has-success .form-control:focus { + border-color: var(--successhover); + -webkit-box-shadow: var(--boxshadow), 0 0 6px var(--successhover); + box-shadow: var(--boxshadow), 0 0 6px var(--successhover); } +.has-success .input-group-addon { + color: var(--pfore); + border-color: var(--success); + background-color: var(--success); } +.has-success .form-control-feedback { + color: var(--pforehover); } +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: var(--warning); } +.has-warning .form-control { + border-color: var(--warning); + -webkit-box-shadow: var(--boxshadow); + box-shadow: var(--boxshadow); } +.has-warning .form-control:focus { + border-color: var(--warninghover); + -webkit-box-shadow: var(--boxshadow), 0 0 6px var(--warninghover); + box-shadow: var(--boxshadow), 0 0 6px var(--warninghover); } +.has-warning .input-group-addon { + color: var(--pfore); + border-color: var(--warning); + background-color: var(--warning); } +.has-warning .form-control-feedback { + color: var(--pforehover); } +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: var(--danger); } +.has-error .form-control { + border-color: var(--danger); + -webkit-box-shadow: var(--boxshadow); + box-shadow: var(--boxshadow); } +.has-error .form-control:focus { + border-color: var(--dangerhover); + -webkit-box-shadow: var(--boxshadow), 0 0 6px var(--dangerhover); + box-shadow: var(--boxshadow), 0 0 6px var(--dangerhover); } +.has-error .input-group-addon { + color: var(--pfore); + border-color: var(--danger); + background-color: var(--danger); } +.has-error .form-control-feedback { + color: var(--pforehover); } +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; } +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: var(--badgeback); } +@media (min-width: 768px) { + .form-inline .form-group, .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control, .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .input-group, .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, .navbar-form .input-group .input-group-addon, +.form-inline .input-group .input-group-btn, +.navbar-form .input-group .input-group-btn, +.form-inline .input-group .form-control, +.navbar-form .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control, .navbar-form .input-group > .form-control { + width: 100%; + } + .form-inline .control-label, .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, .navbar-form .radio, +.form-inline .checkbox, +.navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, .navbar-form .radio label, +.form-inline .checkbox label, +.navbar-form .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type=radio], .navbar-form .radio input[type=radio], +.form-inline .checkbox input[type=checkbox], +.navbar-form .checkbox input[type=checkbox] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback, .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; } +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; } +.form-horizontal .form-group { + margin-left: -20px; + margin-right: -20px; } +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; } +.form-horizontal .form-group:after { + clear: both; } +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; + } +} +.form-horizontal .has-feedback control-feedback { + top: 0; + right: 20px; } +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.3px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + border-radius: 3px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: var(--btnfore); + background-color: var(--btnback); + border-color: var(--btnborder); +} +.btn:hover, .btn:focus, .btn:active, .btn.active, .open > .btn.dropdown-toggle { + color: var(--btnforehover); + background-color: var(--btnbackhover); + border-color: var(--btnborderhover); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.btn:active, .btn.active, .open > .btn.dropdown-toggle { + color: var(--btnforeactive); + background-color: var(--btnbackactive); + border-color: var(--btnborderactive); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.btn.disabled, .btn.disabled:hover, .btn.disabled:focus, .btn.disabled:active, .btn.disabled.active, .btn[disabled], .btn[disabled]:hover, .btn[disabled]:focus, .btn[disabled]:active, .btn[disabled].active, fieldset[disabled] .btn, fieldset[disabled] .btn:hover, fieldset[disabled] .btn:focus, fieldset[disabled] .btn:active, fieldset[disabled] .btn.active { + color: var(--btnforedisabled); + background-color: var(--btnbackdisabled); } +.btn .badge { + color: var(--btnforebadge); + background-color: var(--btnbackbadge); + border-color: var(--btnborderbadge); } +.btn:focus, .btn:active:focus, .btn.active:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } +.btn:hover, .btn:focus { + color: var(--btnforehover); + background-color: var(--btnbackhover); + border-color: var(--btnborderhover); + text-decoration: none; + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), 0 0 4px var(--btnshadow2); }} +.btn:active, .btn.active { + color: var(--btnforeactive); + background-color: var(--btnbackactive); + border-color: var(--btnborderactive); + outline: 0; + -webkit-box-shadow: inset 0 3px 5px var(--rgb50); + box-shadow: inset 0 3px 5px var(--rgb50); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } } +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + color: var(--btnforedisabled); + background-color: var(--btnbackdisabled); + border-color: var(--btnborderdisabled); + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; } +.btn-default { + color: var(--dfbtnfore); + background-color: var(--dfbtnback); + border-color: var(--dfbtnborder); } +.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + color: var(--dfbtnforehover); + background-color: var(--dfbtnbackhover); + border-color: var(--dfbtnborderhover); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + color: var(--dfbtnforeactive); + background-color: var(--dfbtnbackactive); + border-color: var(--dfbtnborderactive); + background-image: none; + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active { + color: var(--dfbtnforedisabled); + background-color: var(--dfbtnbackdisabled); + border-color: var(--dfbtnborderdisabled); } +.btn-default .badge { + color: var(--dfbtnforebadge); + background-color: var(--dfbtnbackbadge); + border-color: var(--dfbtnborderbadge); } +.btn-primary { + color: var(--pbtnfore); + background-color: var(--pbtnback); + border-color: var(--pbtnborder); } +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: var(--pbtnforehover); + background-color: var(--pbtnbackhover); + border-color: var(--pbtnborderhover); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: var(--pbtnforeactive); + background-color: var(--pbtnbackactive); + border-color: var(--pbtnborderactive); + background-image: none; + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { + color: var(--pbtnforedisabled); + background-color: var(--pbtnbackdisabled); + border-color: var(--pbtnborderdisabled); } +.btn-primary .badge { + color: var(--pbtnforebadge); + background-color: var(--pbtnbackbadge); + border-color: var(--pbtnborderbadge); } +.btn-success { + color: var(--sbtnfore); + background-color: var(--sbtnback); + border-color: var(--sbtnborder); } +.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: var(--sbtnforehover); + background-color: var(--sbtnbackhover); + border-color: var(--sbtnborderhover); } +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: var(--sbtnforeactive); + background-color: var(--sbtnbackactive); + border-color: var(--sbtnborderactive); } + background-image: none; } +.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { + color: var(--sbtnforedisabled); + background-color: var(--sbtnbackdisabled); + border-color: var(--sbtnborderdisabled); } +.btn-success .badge { + color: var(--sbtnforebadge); + background-color: var(--sbtnbackbadge); + border-color: var(--sbtnborderbadge); } +.btn-info { + color: var(--ibtnfore); + background-color: var(--ibtnback); + border-color: var(--ibtnborder); } +.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: var(--ibtnforehover); + background-color: var(--ibtnbackhover); + border-color: var(--ibtnborderhover); } +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: var(--ibtnactive); + background-color: var(--ibtnbackactive); + border-color: var(--ibtnborderactive); } + background-image: none; } +.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { + color: var(--ibtnforedisabled); + background-color: var(--ibtnbackdisabled); + border-color: var(--ibtnborderdisabled); } +.btn-info .badge { + color: var(--ibtnbadge); + background-color: var(--ibtnbackbadge); + border-color: var(--ibtnborderbadge); } +.btn-warning { + color: var(--wbtnfore); + background-color: var(--wbtnback); + border-color: var(--wbtnborder); } +.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: var(--wbtnforehover); + background-color: var(--wbtnbackhover); + border-color: var(--wbtnborderhover); } +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: var(--wbtnactive); + background-color: var(--wbtnbackactive); + border-color: var(--wbtnborderactive); + background-image: none; } +.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { + color: var(--wbtndisabled); + background-color: var(--wbtnbackdisabled); + border-color: var(--wbtnborderdisabled); } +.btn-warning .badge { + color: var(--wbtnbadge); + background-color: var(--wbtnbackbadge); + border-color: var(--wbtnborderbadge); } +.btn-danger { + color: var(--dbtnfore); + background-color: var(--dbtnback); + border-color: var(--dbtnborder); } +.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + color: var(--dbtnforehover); + background-color: var(--dbtnbackhover); + border-color: var(--dbtnborderhover); } +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + color: var(--dbtnactive); + background-color: var(--dbtnbackactive); + border-color: var(--dbtnborderactive); } + background-image: none; } +.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { + color: var(--dbtndisabled); + background-color: var(--dbtnbackdisabled); + border-color: var(--dbtnborderdisabled); } +.btn-danger .badge { + color: var(--dbtnbadge); + background-color: var(--dbtnbackbadge); + border-color: var(--dbtnborderbadge); } +.btn-link { + color: var(--lbtnfore); + background-color: var(--lbtnback); + border-color: var(--lbtnborder); + font-weight: normal; + cursor: pointer; + border-radius: 0; } +.btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { + color: var(--lbtnactive); + background-color: var(--lbtnbackactive); + border-color: var(--lbtnborderactive); + -webkit-box-shadow: none; + box-shadow: none; } +.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; } +.btn-link:hover, .btn-link:focus { + color: var(--lbtnforehover); + background-color: var(--lbtnbackhover); + border-color: var(--lbtnborderhover); + text-decoration: underline; + background-color: transparent; } +.btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: var(--lbtnforedisabled); + background-color: var(--lbtnbackdisabled); + border-color: var(--lbtnborderdisabled); + text-decoration: none; + } +.btn-lg, .btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } +.btn-sm, .btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } +.btn-xs, .btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } +.btn-block { + display: block; + width: 100%; } +.btn-block + .btn-block { + margin-top: 5px; } +input[type=submit].btn-block, +input[type=reset].btn-block, +input[type=button].btn-block { + width: 100%; } +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; } +.fade.in { + opacity: 1; } +.collapse { + display: none; } +.collapse.in { + display: block; } +tr.collapse.in { + display: table-row; } +tbody.collapse.in { + display: table-row-group; } +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; } +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; } +.dropdown { + position: relative; } +.dropdown-toggle:focus { + outline: 0; } +.dropdown-menu { /* Listenfeld Liste*/ + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + color: var(--txtboxfore); + background-color: var(--txtboxback); + border: 1px solid var(--txtboxborder); + background-clip: padding-box; } +.dropdown-menu.pull-right { + right: 0; + left: auto; } +.dropdown-menu .divider { + height: 1px; + margin: 0px 0; + overflow: hidden; + background-color: var(--txtboxactive); } +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: var(--txtboxforeinverse); + white-space: nowrap; } + +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { /* Listenfeld Liste drüberstreichen */ + text-decoration: none; + color: var(--txtboxforehover); + background-color: var(--txtboxbackhover); + border: 1px solid var(--txtboxborderhover); +} + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { /*Listenfeld Liste atkiviert */ + color: var(--txtboxforeactive); + background-color: var(--txtboxbackactive); + border-color: var(--txtboxborderactive); + text-decoration: none; + outline: 0; +} +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: var(--txtboxforedisabled); } +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; } +.open > .dropdown-menu { + display: block; } +.open > a { + outline: 0; } +.dropdown-menu-right { + left: auto; + right: 0; } +.dropdown-menu-left { + left: 0; + right: auto; } +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: var(--badgeback); + white-space: nowrap; } +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; } +.pull-right > .dropdown-menu { + right: 0; + left: auto; } +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; } +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; } +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; } +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; } +.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 2; } +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: 0; } +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; } +.btn-toolbar { + margin-left: -5px; } +.btn-toolbar:before, .btn-toolbar:after { + content: " "; + display: table; } +.btn-toolbar:after { + clear: both; } +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; } +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; } +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; } +.btn-group > .btn:first-child { + margin-left: 0; } +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } +.btn-group > .btn-group { + float: left; } +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; + color: var(--dfbtnfore); + background-color: var(--dfbtnback); } + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; } +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; } +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px var(--rgb50); + box-shadow: inset 0 3px 5px var(--rgb50); } +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; } +.btn .caret { + margin-left: 0; } +.btn-lg .caret, .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { + border-width: 0 5px 5px; } +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; } +.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; } +.btn-group-vertical > .btn-group:after { + clear: both; } +.btn-group-vertical > .btn-group > .btn { + float: none; } +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; } +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; } +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 3px; + border-top-right-radius: 0; + border-top-left-radius: 0; } +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; } +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; } +.btn-group-justified > .btn-group .btn { + width: 100%; } +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; } +[data-toggle=buttons] > .btn > input[type=radio], +[data-toggle=buttons] > .btn > input[type=checkbox] { + position: absolute; + z-index: -1; + opacity: 0; + filter: alpha(opacity=0); } +.input-group { + position: relative; + display: table; + border-collapse: separate; } +.input-group[class*=col-] { + float: none; + padding-left: 0; + padding-right: 0; } +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; } +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; } +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; } +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: var(--pagefore); + text-align: center; + background-color: transparent; + border: 1px solid var(--pageborder); + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } +.input-group-addon.input-sm, .form-horizontal .form-group-sm .input-group-addon.form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } +.input-group-addon.input-lg, .form-horizontal .form-group-lg .input-group-addon.form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; } +.input-group-addon input[type=radio], +.input-group-addon input[type=checkbox] { + margin-top: 0; } +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } +.input-group-addon:first-child { + border-right: 0; } +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } +.input-group-addon:last-child { + border-left: 0; } +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; } +.input-group-btn > .btn { + position: relative; } +.input-group-btn > .btn + .btn { + margin-left: -1px; } +.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { + z-index: 2; } +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; } +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; } +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; } +.nav:before, .nav:after { + content: " "; + display: table; } +.nav:after { + clear: both; } +.nav > li { + position: relative; + display: block; } +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; } +.nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: var(--pbackhover); } +.nav > li.disabled > a { + color: var(--pforemuted); } + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus + { + color: var(--pforemuted); + text-decoration: none; + background-color: transparent; + cursor: not-allowed; + } +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: var(--sback); + border-color: var(--primary); } +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: var(--stdborder); } +.nav > li > a > img { + max-width: none; } +.nav-tabs { + margin-right: 1px; + border-bottom: 1px solid var(--stdborder); } +.nav-tabs > li { + float: left; + margin-bottom: -1px; } +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 3px 3px 0 0; } + .nav-tabs > li > a:hover + { + border-color: var(--stdborderaccent), var(--stdborderaccent), var(--stdborderaccent); + } + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus + { + color: var(--txtboxfore); + background-color: var(--txtboxback); + border: 1px solid var(--txtboxborder); + border-bottom-color: transparent; + cursor: default; + } +.nav-pills > li { + float: left; } +.nav-pills > li > a { + border-radius: 0; } +.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { + color: var(--pfore); + background-color: var(--primary); } +.nav-stacked > li { + float: none; } +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; } +.nav-justified, .nav-tabs.nav-justified { + width: 100%; } +.nav-justified > li, .nav-tabs.nav-justified > li { + float: none; } +.nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: left; + margin-bottom: 5px; } +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } +@media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; } +.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 3px; } +.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid var(--stdborder); } +@media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid var(--stdborder); + border-radius: 3px 3px 0 0; + } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border-bottom-color: var(--stdborderfore); + } +} + +.tab-content > .tab-pane { + display: none; } +.tab-content > .active { + display: block; } +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; } +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 0; + border: 1px solid transparent; } +.navbar:before, .navbar:after { + content: " "; + display: table; } +.navbar:after { + clear: both; } +@media (min-width: 768px) { + .navbar { + border-radius: 0; + } +} + +.navbar-header:before, .navbar-header:after { + content: " "; + display: table; } +.navbar-header:after { + clear: both; } +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 20px; + padding-left: 20px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 var(--boxshadow); + -webkit-overflow-scrolling: touch; } +.navbar-collapse:before, .navbar-collapse:after { + content: " "; + display: table; } +.navbar-collapse:after { + clear: both; } +.navbar-collapse.in { + overflow-y: auto; } +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} + +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; } +@media (max-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} + +.container > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: -20px; + margin-left: -20px; } +@media (min-width: 768px) { + .container > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; } +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + -webkit-transform: translate3d(255, 255, 255); + transform: translate3d(255, 255, 255); } +@media (min-width: 768px) { + .navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; } +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; } +.navbar-brand { + float: left; + padding: 15px 20px; + font-size: 18px; + height: 50px; } +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } +@media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -20px; + } +} + +.navbar-toggle { + position: relative; + float: left; + margin-right: 20px; + padding: 9px 10px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 3px; } +.navbar-toggle:focus { + outline: 0; } +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; + } +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; } +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 7.5px -20px; } +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; } +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, +.navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } + .navbar-nav.navbar-right:last-child { + margin-right: -20px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + + .navbar-right { + float: right !important; +} +} +.navbar-form { + margin-left: -20px; + margin-right: -20px; + padding: 10px 0px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 var(--boxshadow), 0 1px 0 var(--boxshadow); + box-shadow: inset 0 1px 0 var(--boxshadow), 0 1px 0 var(--boxshadow); + margin-top: 8px; + margin-bottom: 8px; } +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-form.navbar-right:last-child { + margin-right: -20px; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; } +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; } +.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { + margin-top: 10px; + margin-bottom: 10px; } +.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { + margin-top: 14px; + margin-bottom: 14px; } +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; } +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 20px; + margin-right: 20px; + } + .navbar-text.navbar-right:last-child { + margin-right: 0; + } +} + +.navbar-default { /* Seite Kopfzeile */ + background-color: var(--pageback); + border-color: var(--pageborder); } +.navbar-default .navbar-brand { /* Seite Kopfzeile Logo Farbe (nicht aktiv bei Bild) */ + color: var(--pagefore); } +.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { /* Seite Kopfzeile drüberstreichen */ + color: var(--pagefore); + background-color: var(--pageback); } +.navbar-default .navbar-text { + color: var(--pagefore); } +.navbar-default .navbar-nav > li > a { + color: var(--pfore); } +.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: var(--primary); + background-color: transparent; } +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: var(--pfore); + background-color: var(--sdbaractback); } +.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: var(--stdborder); + background-color: transparent; } +.navbar-default .navbar-toggle { + border-color: var(--sback); +} +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: var(--sdbaractback); } +.navbar-default .navbar-toggle .icon-bar { + background-color: var(--pagefore); } +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: var(--stdborder); } +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: var(--sback); + color: var(--sdbaractback); } +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: var(--sback); + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: var(--primary); + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: var(--pfore); + background-color: var(--primary); + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: var(--pforemuted); + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: var(--sback); } +.navbar-default .navbar-link:hover { + color: var(--primary); } +.navbar-default .btn-link { + color: var(--sback); } +.navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: var(--primary); } +.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { + color: var(--stdborder); } +.navbar-inverse { + background-color: var(--navbarinverse); + border-color:var(--pfore); } +.navbar-inverse .navbar-brand { + color: var(--pforemuted); } +.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: var(--pforeinverse); + background-color: transparent; } +.navbar-inverse .navbar-text { + color: var(--pforemuted); } +.navbar-inverse .navbar-nav > li > a { + color: var(--pforemuted); } +.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: var(--pforeinverse); + background-color: transparent; } +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: var(--pforeinverse); + background-color:var(--pbackinverse); } +.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: var(--stdborder); + background-color: transparent; } +.navbar-inverse .navbar-toggle { + border-color: var(--stdborder); } +.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: var(--navbarinverse); } +.navbar-inverse .navbar-toggle .icon-bar { + background-color: var(--pbackinverse); +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: var(--stdborderinverse); } +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color:var(--pbackinverse); + color: var(--pforeinverse); +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color:var(--stdborderinverse); + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color:var(--pbackinverse); + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: var(--pforeinverse); + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: var(--pforeinverse); + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: var(--pforeinverse); + background-color:var(--pbackinverse); + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: var(--pforemuted); + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: var(--pforeinverse); } +.navbar-inverse .navbar-link:hover { + color: var(--pforeinversehover); +} +.navbar-inverse .btn-link { + color: var(--pforeinverse); } +.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: var(--pforeinversehover); +} +.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { + color: var(--pforemuted); } +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: var(--pback); + border-radius: 3px; } +.breadcrumb > li { + display: inline-block; } +.breadcrumb > li + li:before { + content: "/ "; + padding: 0 5px; + color: var(--pfore); } +.breadcrumb > .active { + color: var(--pforehover); } +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 3px; } +.pagination > li { + display: inline; } +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.428571429; + text-decoration: none; + color: var(--primary); + background-color: var(--pback); + border: 1px solid var(--sdbaractback); + margin-left: -1px; } +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; } +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; } +.pagination > li > a:hover, .pagination > li > a:focus, +.pagination > li > span:hover, +.pagination > li > span:focus { + color: var(--danger); + background-color: var(--pback); + border-color: var(--sdbaractback); } +.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, +.pagination > .active > span, +.pagination > .active > span:hover, +.pagination > .active > span:focus { + z-index: 2; + color: var(--pforeinverse); + background-color: var(--primary); + border-color: var(--primary); + cursor: default; } +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: var(--pforemuted); + background-color: var(--pback); + border-color: var(--sdbaractback); + cursor: not-allowed; } +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; } +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; } +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; } +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; } +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; } +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; } +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; } +.pager:before, .pager:after { + content: " "; + display: table; } +.pager:after { + clear: both; } +.pager li { + display: inline; } +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: var(--pback); + border: 1px solid var(--sdbaractback); + border-radius: 15px; } +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: var(--pbackhover); } +.pager .next > a, +.pager .next > span { + float: right; } +.pager .previous > a, +.pager .previous > span { + float: left; } +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: var(--pforemuted); + background-color: var(--pbackmuted); + cursor: not-allowed; } +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: var(--pfore); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; } +.label:empty { + display: none; } +.btn .label { + position: relative; + top: -1px; } +a.label:hover, a.label:focus { + color: var(--pforehover); + text-decoration: none; + cursor: pointer; } +.label-default { + background-color: var(--pback); } +.label-default[href]:hover, .label-default[href]:focus { + background-color: var(--pbackhover); } +.label-primary { + background-color: var(--primary); } +.label-primary[href]:hover, .label-primary[href]:focus { + background-color: var(--primaryhover); } +.label-success { + background-color: var(--success); } +.label-success[href]:hover, .label-success[href]:focus { + background-color: var(--successhover); } +.label-info { + background-color: var(--info); } +.label-info[href]:hover, .label-info[href]:focus { + background-color: var(--infohover); } +.label-warning { + background-color: var(--warning); } +.label-warning[href]:hover, .label-warning[href]:focus { + background-color: var(--warninghover); } +.label-danger { + background-color: var(--danger); } +.label-danger[href]:hover, .label-danger[href]:focus { + background-color: var(--dangerhover); } +.badge +{ + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: var(--pfore); + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: var(--badgeback); + border-radius: 10px; +} +.badge:empty { + display: none; } +.btn .badge { + position: relative; + top: -1px; } +.btn-xs .badge, .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; } +a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: var(--primary); + background-color: var(--pback); +} +.nav-pills > li > a > .badge { + margin-left: 3px; } +a.badge:hover, a.badge:focus { + color: var(--pforehover); + text-decoration: none; + cursor: pointer; } +.jumbotron { + padding: 30px; + margin-bottom: 30px; + color: inherit; + background-color: var(--sback); } +.jumbotron h1, +.jumbotron .h1 { + color: inherit; } +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; } +.jumbotron > hr { + border-top-color: var(--stdborder); } +.container .jumbotron { + border-radius: 6px; } +.jumbotron .container { + max-width: 100%; } +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, +.jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: var(--pback); + border: 1px solid var(--sdbaractback); + border-radius: 3px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; } +.thumbnail > img, +.thumbnail a > img { + display: block; + width: 100% \9 ; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; } +.thumbnail .caption { + padding: 9px; + color: var(--pfore); } +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: var(--primary); } +.alert { + padding: 15px; + background-color: var(--alertback); + margin-bottom: 20px; + border: 2px solid var(--alertborder); + border-radius: 3px; } +.alert h4 { + margin-top: 0; + color: inherit; } +.alert .alert-link { + font-weight: bold; } +.alert > p, +.alert > ul { + margin-bottom: 0; } +.alert > p + p { + margin-top: 5px; } +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; } +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } +.alert-success { + color: var(--alertsuccessfore); + background-color: var(--alertsuccessback); + border-color: var(--alertsuccessborder); } +.alert-success hr { + border-top-color: var(--pfore); } +.alert-success .alert-link { + color: var(--primary); } +.alert-info { + color: var(--alertinfofore); + background-color: var(--alertinfoback); + border-color: var(--alertinfoborder); } +.alert-info hr { + border-top-color: var(--pfore); } +.alert-info .alert-link { + color: var(--info); } +.alert-warning { + color: var(--alertwarningfore); + background-color: var(--alertwarningback); + border-color: var(--alertwarningborder); } +.alert-warning hr { + border-top-color: var(--pfore); } +.alert-warning .alert-link { + color: var(--primary); } +.alert-danger { + color: var(--alertdangerfore); + background-color: var(--alertdangerback); + border-color: var(--alertdangerborder); } +.alert-danger hr { + border-top-color: var(--pfore); } +.alert-danger .alert-link { + color: var(--primary); } +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + margin-bottom: 3px; + overflow: hidden; + height: 20px; + background-color: var(--progressbar); + border-radius: 3px; + position: relative; + -webkit-box-shadow: inset 0px 1px 2px 1px var(--progresshadow); + box-shadow: inset 0px 1px 2px 1px var(--progresshadow) } +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: var(--highlighted); + text-align: center; + background-color: var(--warning); + position: relative; + z-index: 2; + -webkit-box-shadow: inset 0 20px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 20px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; + margin: 1px 0 0 0 !important; } +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; } +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; } +.progress-bar[aria-valuenow="1"], .progress-bar[aria-valuenow="2"] { + min-width: 30px; } +.progress-bar[aria-valuenow="0"] { + color: var(--badgeback); + min-width: 30px; + background-color: transparent; + background-image: none; + box-shadow: none; } +.progress-bar-success { + background-color: var(--success); } +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } +.progress-bar-info { + background-color: var(--pfore); } +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } +.progress-bar-warning { + background-color: var(--warning); } +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } +.progress-bar-danger { + background-color: var(--danger); } +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } +.media, +.media-body { + overflow: hidden; + zoom: 1; } +.media, +.media .media { + margin-top: 15px; } +.media:first-child { + margin-top: 0; } +.media-object { + display: block; } +.media-heading { + margin: 0 0 5px; } +.media > .pull-left { + margin-right: 10px; } +.media > .pull-right { + margin-left: 10px; } +.media-list { + padding-left: 0; + list-style: none; } +.list-group { + margin-bottom: 20px; + padding-left: 0; } +.list-group-item { /* Seitenleiste Menü, ListenVordergrund */ + position: relative; + display: block; + padding: 6px 8px; + margin-bottom: -1px; + background-color: var(--sdbarback); /* background navigation sidebar */ +} +.list-group-item:last-child { + margin-bottom: 0; } +.list-group-item > .badge { + float: right; } +.list-group-item > .badge + .badge { + margin-right: 5px; } +a.list-group-item { + color: var(--sdbarfore); /* textcolor navigation sidebar */ + border-radius: 0; } +a.list-group-item .list-group-item-heading { + color: var(--sdbarfore) !important; } +a.list-group-item:hover, a.list-group-item:focus { + color: var(--sdbarhoverfore); + background: var(--sdbarhoverback); + text-decoration: none; } +a.list-group-item:hover:before, a.list-group-item:focus:before { + background: var(--sdbarhoverback); + content: ""; + height: 42px; + left: 0; + position: absolute; + top: 0; + width: 3px; } +.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { + background-color: var(--pback); + color: var(--pforemuted); } +.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; } +.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { + color: var(--pforemuted); } +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; } +.list-group-item.active:before, .list-group-item.active:hover:before, .list-group-item.active:focus:before { + background: var(--navbarinverse); + content: ""; + height: 42px; + left: 0; + position: absolute; + top: 0px; + width: 3px; } +.list-group-item.active .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; } +.list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { + color: var(--warninghover); } +.list-group-item.active + .collapse > .list-group-item:before, .list-group-item.active:hover + .collapse > .list-group-item:before, .list-group-item.active:focus + .collapse > .list-group-item:before { + background: var(--primary); + content: ""; + height: 42px; + left: 0; + position: absolute; + top: 0px; + width: 3px; } +.list-group-item-success { + color: var(--success); + background-color: var(--pback); } +a.list-group-item-success { + color: var(--success); } +a.list-group-item-success .list-group-item-heading { + color: inherit; } +a.list-group-item-success:hover, a.list-group-item-success:focus { + color: var(--successhover); + background-color: var(--pback); } +a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { + color: var(--pfore); + background-color: var(--success); + border-color: var(--pfore); } +.list-group-item-info { + color: var(--info); + background-color: var(--pback); } +a.list-group-item-info { + color: var(--info); } +a.list-group-item-info .list-group-item-heading { + color: inherit; } +a.list-group-item-info:hover, a.list-group-item-info:focus { + color: var(--infohover); + background-color: var(--pback); } +a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { + color: var(--pfore); + background-color: var(--info); + border-color: var(--pfore); } +.list-group-item-warning { + color: var(--warning); + background-color: var(--pback); } +a.list-group-item-warning { + color: var(--warning); } +a.list-group-item-warning .list-group-item-heading { + color: inherit; } +a.list-group-item-warning:hover, a.list-group-item-warning:focus { + color: var(--warninghover); + background-color: var(--pback); } +a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { + color: var(--pfore); + background-color: var(--warning); + border-color: var(--pfore); } +.list-group-item-danger { + color: var(--danger); + background-color: var(--pback); } +a.list-group-item-danger { + color: var(--danger); } +a.list-group-item-danger .list-group-item-heading { + color: inherit; } +a.list-group-item-danger:hover, a.list-group-item-danger:focus { + color: var(--dangerhover); + background-color: var(--pback); } +a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { + color: var(--pfore); + background-color: var(--danger); + border-color: var(--pfore); } +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; } +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; } +.panel { + margin-bottom: 20px; + background-color: var(--panelbody); + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px var(--boxshadow); + box-shadow: 0 1px 1px var(--boxshadow); } +.panel-body { + color: var(--panelinfo); + padding: 15px; + background-color: var(--panelbody); } +.panel-body:before, .panel-body:after { + content: " "; + display: table; } +.panel-body:after { + clear: both; } +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 2px; + border-top-left-radius: 2px; + background-color: var(--panelheading); } +.panel-heading > .dropdown .dropdown-toggle { + color: var(--panelheadingfore); } +.panel-title { + color: var(--panelheadingfore); } + margin-top: 0; + margin-bottom: 0; + font-size: 16px; +.panel-title > a { + color: var(--panelheadingfore); } +.panel-footer { + padding: 10px 15px; + background-color: var(--panelfooter); + border-top: 1px solid var(--stdborder); + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } +.panel > .list-group { + margin-bottom: 0; } +.panel > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; } +.panel > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 2px; + border-top-left-radius: 2px; } +.panel > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; } +.list-group + .panel-footer { + border-top-width: 0; } +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; } +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 2px; + border-top-left-radius: 2px; } +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 2px; } +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 2px; } +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 2px; } +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 2px; } +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive { + border-top: 1px solid var(--stdborder); } +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; } +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; } +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; } +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; } +.panel > .table-responsive { + border: 0; + margin-bottom: 0; } +.panel-group { + margin-bottom: 20px; } +.panel-group .panel { + margin-bottom: 0; + border-radius: 3px; } +.panel-group .panel + .panel { + margin-top: 5px; } +.panel-group .panel-heading { + border-bottom: 0; } +.panel-group .panel-heading + .panel-collapse > .panel-body { + border-top: 1px solid var(--stdborder); } +.panel-group .panel-footer { + border-top: 0; } +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid var(--stdborder); } +.panel-default { + border-color: var(--stdborder); } +.panel-default > .panel-heading { + color: var(--panelheadingfore); + background-color: var(--panelheading); + border-color: var(--stdborder); } +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--pfore); } +.panel-default > .panel-heading .badge { + color: var(--sfore); + background-color: var(--sback); } +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: var(--stdborder); } +.panel-primary { + border-color: var(--stdborder); } +.panel-primary > .panel-heading { + color: var(--panelheadingfore); + background-color: var(--panelheading); + border-color: var(--stdborder); } +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--stdborder); } +.panel-primary > .panel-heading .badge { + color: var(--pfore); + background-color: var(--pback); } +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: var(--pfore); } +.panel-success { + border-color: var(--success); } +.panel-success > .panel-heading { + color: var(--success); + background-color: var(--pback); + border-color: var(--success); } +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--success); } +.panel-success > .panel-heading .badge { + color: var(--pfore); + background-color: var(--success); } +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: var(--success); } +.panel-info { + border-color: var(--info); } +.panel-info > .panel-heading { + color: var(--info); + background-color: var(--pback); + border-color: var(--info); } +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--info); } +.panel-info > .panel-heading .badge { + color: var(--pfore); + background-color: var(--info); } +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: var(--info); } +.panel-warning { + border-color: var(--warning); } +.panel-warning > .panel-heading { + color: var(--warning); + background-color: var(--pback); + border-color: var(--warning); } +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--pfore); } +.panel-warning > .panel-heading .badge { + color: var(--pfore); + background-color: var(--warning); } +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: var(--warning); } +.panel-danger { + border-color: var(--danger); } +.panel-danger > .panel-heading { + color: var(--danger); + background-color: var(--pback); + border-color: var(--danger); } +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--danger); } +.panel-danger > .panel-heading .badge { + color: var(--pfore);: + background-color: var(--danger); } +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: var(--danger); } +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; } +.embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; } +.embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; } +.well { + color: var(--contentboxfore) !important; + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: var(--contentboxback); +/* border: 0px solid var(--pback); + border-radius: 3px; + -webkit-box-shadow: var(--boxshadow); + box-shadow: var(--boxshadow); } + .well blockquote + { + border-color: var(--stdborder); + border-color: var(--rgbshadowdark);*/ + } +.well-lg { + padding: 24px; + border-radius: 6px; } +.well-sm { + padding: 9px; + border-radius: 3px; } +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: var(--bsheadfore); /* Wichtig!!! */ + /* text-shadow: 0 1px 0 var(--link); */ + opacity: 1; + filter: alpha(opacity=100); } +.close:hover, .close:focus { + color: var(--pfore); + text-decoration: none; + cursor: pointer; + opacity: 1; + filter: alpha(opacity=100); } +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; } +.modal-open { + overflow: hidden; } +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; } +.modal.fade .modal-dialog { + -webkit-transform: translate3d(0, -25%, 0); + transform: translate3d(0, -25%, 0); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; } +.modal.in .modal-dialog { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } +.modal-dialog { + position: relative; + width: auto; + margin: 62px 10px 10px 10px; } +.modal-content +{ + position: relative; + background-color: var(--bsbodyback); + border: 0px solid var(--pageborder); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px var(--rgb50); + box-shadow: 0 3px 9px var(--rgb50); + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: var(--highlighted); } +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); } +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); } +.modal-header { + padding: 15px; + border-bottom: 0px solid var(--stdborder); + min-height: 16.428571429px; } +.modal-header .close { + margin-top: -2px; } +.modal-title { + margin: 0; + line-height: 1.428571429; } +.modal-body { + color: var(--bsbodyfore) !important; + position: relative; + padding: 15px; + background-color: var(--bsbodyback); } +.modal-footer { + padding: 15px; + text-align: right; + border-top: 0px solid var(--stdborder); } +.modal-footer:before, .modal-footer:after { + content: " "; + display: table; } +.modal-footer:after { + clear: both; } +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; } +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; } +.modal-footer .btn-block + .btn-block { + margin-left: 0; } +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 82px auto 30px auto; + } + + .modal-content { + -webkit-box-shadow: 0 5px 15px var(--rgb50); + box-shadow: 0 5px 15px var(--rgb50); + } + + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + visibility: visible; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); } +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); } +.tooltip.top { + margin-top: -3px; + padding: 5px 0; } +.tooltip.right { + margin-left: 3px; + padding: 0 5px; } +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; } +.tooltip.left { + margin-left: -3px; + padding: 0 5px; } +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: var(--pbackinverse); + text-align: center; + text-decoration: none; + background-color: var(--pforeinverse); + border-radius: 3px; } +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: var(--stdborder); } +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: var(--stdborder); } +.tooltip.top-right .tooltip-arrow { + bottom: 0; + right: 5px; + border-width: 5px 5px 0; + border-top-color: var(--stdborder); } +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: var(--stdborder); } +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: var(--stdborder); } +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: var(--stdborder); } +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: var(--stdborder); } +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: var(--stdborder); } +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: var(--pback); + background-clip: padding-box; + border: 1px solid var(--stdborder); + border-radius: 6px; + -webkit-box-shadow: var(--progresshadow2); + box-shadow: var(--progresshadow2); + white-space: normal; } +.popover.top { + margin-top: -10px; } +.popover.right { + margin-left: 10px; } +.popover.bottom { + margin-top: 10px; } +.popover.left { + margin-left: -10px; } +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: var(--sback); + border-bottom: 1px solid var(--pback); + border-radius: 5px 5px 0 0; } +.popover-content { + padding: 9px 14px; } +.popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } +.popover > .arrow { + border-width: 11px; } +.popover > .arrow:after { + border-width: 10px; + content: ""; } +.popover.top > .arrow +{ + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: var(--stdborder); + border-top-color: var(--rgbshadowdark); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: var(--pback); +} +.popover.right > .arrow +{ + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: var(--stdborder); + border-right-color: var(--rgbshadowdark); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: var(--stdborder); +} +.popover.bottom > .arrow +{ + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: var(--stdborder); + border-bottom-color: var(--rgbshadowdark); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: var(--stdborder); +} +.popover.left > .arrow +{ + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: var(--stdborder); + border-left-color: var(--rgbshadowdark); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: var(--stdborder); + bottom: -10px; } +.carousel { + position: relative; } +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; } +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; } +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + width: 100% \9 ; + max-width: 100%; + height: auto; + line-height: 1; } +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; } +.carousel-inner > .active { + left: 0; } +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; } +.carousel-inner > .next { + left: 100%; } +.carousel-inner > .prev { + left: -100%; } +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; } +.carousel-inner > .active.left { + left: -100%; } +.carousel-inner > .active.right { + left: 100%; } +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: var(--pfore); + text-align: center; + text-shadow: 0 1px 2px var(--rgb50); } +.carousel-control.left { + background-image: -webkit-linear-gradient(left, var(--rgb50) 0%, rgba(255, 255, 255, 0.0001) 100%); + background-image: -o-linear-gradient(left, var(--rgb50) 0%, rgba(255, 255, 255, 0.0001) 100%); + background-image: linear-gradient(to right, var(--rgb50) 0%, rgba(255, 255, 255, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000", endColorstr="#FFEF8026", GradientType=1); } +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.0001) 0%, var(--rgb50) 100%); + background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.0001) 0%, var(--rgb50) 100%); + background-image: linear-gradient(to right, rgba(255, 255, 255, 0.0001) 0%, var(--rgb50) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEF8026", endColorstr="#80000000", GradientType=1); } +.carousel-control:hover, .carousel-control:focus { + outline: 0; + color: var(--pforehover); + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); } +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; } +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; } +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; } +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; } +.carousel-control .icon-prev:before { + content: "‹"; } +.carousel-control .icon-next:before { + content: "›"; } +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; } +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid var(--stdborder); + border-radius: 10px; + cursor: pointer; + background-color: var(--highlighted) \9 ; + background-color: transparent; } +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: var(--pback); +} + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: var(--pfore); + text-align: center; + text-shadow: 0 1px 2px var(--rgb50); } +.carousel-caption .btn { + text-shadow: none; } +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right, +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, +.carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, +.carousel-control .icon-next { + margin-right: -15px; + } + + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, .content-box:before, .clearfix:after, .content-box:after { + content: " "; + display: table; } +.clearfix:after, .content-box:after { + clear: both; } +.center-block { + display: block; + margin-left: auto; + margin-right: auto; } +.pull-right { + float: right !important; } +.pull-left { + float: left !important; } +.hide { + display: none !important; } +.show { + display: block !important; } +.invisible { + visibility: hidden; } +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } +.hidden { + display: none !important; + visibility: hidden !important; } +.affix { + position: fixed; + -webkit-transform: translate3d(255, 255, 255); + transform: translate3d(255, 255, 255); } +@-ms-viewport { + width: device-width; } +.visible-xs, .visible-sm, .visible-md, .visible-lg { + display: none !important; } +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; } +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + + table.visible-xs { + display: table; + } + + tr.visible-xs { + display: table-row !important; + } + + th.visible-xs, +td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + + table.visible-sm { + display: table; + } + + tr.visible-sm { + display: table-row !important; + } + + th.visible-sm, +td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + + table.visible-md { + display: table; + } + + tr.visible-md { + display: table-row !important; + } + + th.visible-md, +td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + + table.visible-lg { + display: table; + } + + tr.visible-lg { + display: table-row !important; + } + + th.visible-lg, +td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} + +@media (max-width: 767px) { + .hidden-xs, .page-side { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (max-width: 768px), (max-height: 669px) { + .toggle-sidebar { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; } +@media print { + .visible-print { + display: block !important; + } + + table.visible-print { + display: table; + } + + tr.visible-print { + display: table-row !important; + } + + th.visible-print, +td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; } +@media print { + .visible-print-block { + display: block !important; + } +} + +.visible-print-inline { + display: none !important; } +@media print { + .visible-print-inline { + display: inline !important; + } +} + +.visible-print-inline-block { + display: none !important; } +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} + +@media print { + .hidden-print { + display: none !important; + } +} +* { + -webkit-font-smoothing: antialiased; } +html, body { + height: 100%; + font-family: "SourceSansProRegular"; + scrollbar-width: thin; + scrollbar-color: var(--scbarcolor); + background-color: var(--pageback); +} + +body { + touch-action: manipulation; + min-width: 320px; } +.widget-sort-handle { + touch-action: none; } + +.widgetdiv .content-box-head { + background: var(--sback) !important; + color: var(--sfore) !important; + padding-bottom: 1px !important; + padding-top: 1px !important; + padding-right: 1px !important; + padding-left: 5px !important; + min-height: 25px !important; } + +.widgetdiv .content-box-head .btn-group .btn { + color: var(--sfore) !important; + background: none; + border: 1px solid var(--stdborder); } + +.widgetdiv .content-box-head .btn-group .btn .glyphicon { + color: var(--stdborder) !important; } + +.widgetdiv .content-box-head .list-inline li > h3 { + padding-top: 4px; } +.page-head { /* Seite Kopf (Funktion nicht klar) */ + top: 0; + left: 0; + width: 100%; + position: fixed; + z-index: 2; } +.page-content { + height: calc(100% - 52px); + padding-top: 52px; + position: relative; + z-index: 1; } +.page-content > .row { + height: 100%; } +.page-content-head .container-fluid { + color: var(--pagefore); + background-color: var(--headlineback); + margin-left: 20px; + margin-right: 20px; + min-height: 47px; + height:auto; + padding: 10px 14px 5px 14px; + -webkit-box-shadow: var(--headlinebackshadow); + -moz-box-shadow: var(--headlinebackshadow); + box-shadow: var(--headlinebackshadow); } +.page-content-head, .content-box-head { /* Seite Kopf Zeile unterhalb Kopfzeile */ + background: var(--pageback); + padding-top: 5px; + padding-bottom: 5px; } +.page-content-head .navbar-nav, .content-box-head .navbar-nav { + width: 100%; } +.page-content-head h1, .content-box-head h1, .page-content-head h2, .content-box-head h2, .page-content-head h3, .content-box-head h3 { + line-height: 1; + margin: 0; } +.page-content-main { /* Seiten hintergrund, Bereich um die Textboxen */ + background: var(--pageback); + min-height: calc(100% - 64px); + padding: 15px 0 73px; } +.page-side { /* Seitenleiste Hintergrundfarbe */ + background: var(--pageback); + border-right: 1px solid var(--pageborder); + border-top: 1px solid var(--pageborder); + border-bottom: 1px solid var(--pageborder); + height: 100% !important; + height: calc(100% - 52px) !important; + left: 0; + overflow: auto; + margin-top: 52px; + position: fixed; + top: 0; + z-index: 3; } +.page-side-nav--active { + background: var(--sback); + border-left: 3px solid var(--pageborder); } +.page-foot { /* Seite Fußzeile */ + background: var(--pageback); + bottom: 0; + border-top: 1px solid var(--pageborder); + font-size: 12px; + padding: 0; + position: fixed; + width: 100%; + z-index: 2; } +section.page-content-main div.tab-content { /* Umrandung Boxen */ + border: 1px solid var(--pageborder) !important; + border-radius: 4px;} + +.content-box { + background: var(--contentboxback); + border: 1px solid var(--stdborder); + border-radius: 4px; } +.content-box-main { + padding-bottom: 15px; + padding-top: 15px; } +div.content-box.wizard div img { + filter: invert(25%); } +.tab-content { + border-top: 0px; + padding: 0px 0; } +.tab-content > .tab-content { + margin-bottom: 0; + padding: 0 15px; } +.tab-content .tab-content:last-child { + margin-bottom: 0; } +.page-content-main section[class^=col-] + section[class^=col-] { + padding-top: 20px; } +.brand-logo { + display: none; } +@media (min-width: 768px) { + .brand-logo { + display: inline-block; + } +} + +.brand-icon { + display: inline-block; } +@media (min-width: 768px) { + .brand-icon { + display: none; + } +} + +@media (min-width: 768px) { + .col-sm-disable-spacer { + padding-top: 0 !important; + } +} + +@media (min-width: 992px) { + .col-md-disable-spacer { + padding-top: 0 !important; + } +} + +@media (min-width: 1200px) { + .col-lg-disable-spacer { + padding-top: 0 !important; + } +} + +.page-login { + background: var(--loginback); } +.page-login .container { + min-height: 100%; + margin-bottom: -60px; } +.page-login .container:after { + color: var(--success); + height: 60px; } +.login-foot { + color: var(--logindatefore); + font-size: 12px; } +.login-modal-container { + color: var(--loginboxfore); + background: var(--loginboxback); + max-width: 400px; + margin: 100px auto 15px auto; + border: 1px solid var(--stdborder); + border-radius: 4px; } +.login-modal-head { + background: var(--loginheadback); + height: 75px; + border-top: 1px solid var(--stdborder); + border-top-right-radius: 4px; + border-top-left-radius: 4px; } +.login-modal-content { + padding: 20px 20px 20px 20px; } +.login-modal-foot { + background: var(--loginheadback); + height: 60px; + border-bottom: 1px solid var(--stdborder); + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } +.login-modal-foot a { + color: var(--loginboxfore); + text-decoration: none; } +.login-modal-foot a:hover { + text-decoration: underline; } +@media (min-width: 768px) { + .list-inline .btn-group-container { + float: right; + } +} + +.btn.btn-fixed { + max-width: 174px; + width: 100%; } +.progress-bar-placeholder { + font-size: 12px; + position: absolute; + text-align: center; + width: 100%; + z-index: 1; } +/* BOOTSTRAP EDIT */ +.list-group-item { + border-left: none; + border-right: none; } +.list-group-item.collapsed .caret { + border-bottom: 4px solid green; + border-top: 0; } +/* COLLAPSE SIDEBAR */ +main.page-content.col-lg-12 { + padding-left: 90px; } +#navigation.col-sidebar-left { + width: 70px; + overflow: hidden; + background-color: transparent !important; + border: none !important; } +#navigation.col-sidebar-left > div.row { + height: 100% !important; } +#navigation.col-sidebar-left > div.row > nav.page-side-nav { + width: 70px; + height: 100% !important; + border-right: 1px solid var(--stdborder); } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > a.list-group-item { + font-size: 14px; + text-align: center; + width: 70px; + height: 70px; + padding-left: 0px; + padding-right: 0px; + padding-top: 12px; + border-bottom: 1px solid var(--stdborder); + border-right: 1px solid var(--stdborder); } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > a.list-group-item > span.fa, #navigation.col-sidebar-left > div > nav > #mainmenu > div > a.list-group-item > span.glyphicon { + visibility: visible; + font-size: 20px; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > a.list-group-item > span.__iconspacer { + width: 50px; + height: 30px; + padding: 0px; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapsing > a.list-group-item { + padding-left: 10px !important; + font-size: 14px !important; + display: block !important; + position: absolute !important; + left: 70px !important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in > div.collapsing > a.list-group-item { + padding-left: 10px !important; + font-size: 14px !important; + display: block !important; + position: absolute !important; + left: 166px !important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in > a.list-group-item, #navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in > div.collapse.in > a.list-group-item { + background-color: var(--sdbarback)!important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in > div.collapse.in > a.list-group-item { + padding-left: 10px !important; + font-size: 14px !important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse > div.collapse > a.list-group-item, #navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse > a.list-group-item { + padding-left: 10px !important; + font-size: 14px !important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapsed > a.list-group-item { + padding-left: 10px !important; + font-size: 14px !important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse > a.list-group-item, #navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse > div.collapse > a.list-group-item { + padding: 3px 8px !important; } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in { + width: 168px; + font-size: 14px; + z-index: 10; + position: absolute; + left: 70px; + margin-top: -70px; + border: 1px solid var(--stdborder); + -webkit-box-shadow: var(--mozshadow); + -moz-box-shadow: var(--mozshadow); + box-shadow: var(--mozshadow); } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in > div.collapse.in { + color: var(--pfore); + width: 168px; + font-size: 14px; + z-index: 10; + position: absolute; + left: 166px; + margin-top: -26px; + border: 1px solid var(--stdborder); + -webkit-box-shadow: var(--mozshadow); + -moz-box-shadow: var(--mozshadow); + box-shadow: 2px 2px 1px 0px var(--mozshadow); } +#navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapsing, #navigation.col-sidebar-left > div > nav > #mainmenu > div > div.collapse.in > div.collapsing { + display: none; } +button.toggle-sidebar { + color: var(--pagefore); + background-color: var(--pageback); + font-size: 14px; + border: none; + margin-top: 18px; + float: left; + outline: none; } +/* COLLAPSE SIDEBAR END*/ +#navigation.collapse.in { + display: block !important; } +.list-group-submenu .list-group-item:last-child, +.collapse .list-group-item:last-child { + border-bottom: none; } +ul.nav > li.dropdown > ul.dropdown-menu > li > a { + padding: 3px 10px; } + section.page-content-main ul + div.tab-content { /* Umrandung Tab-Navigation */ + border: 1px solid var(--stdborderprimary) !important; + outline: 0; + -webkit-box-shadow: (--btnshadow1), var(--btnshadow2); + box-shadow: (--btnshadow1), var(--btnshadow2); } + +.nav-tabs { + margin-right: 1px; + border-bottom: 1px solid transparent; } +.nav-tabs > li { + border-radius: 0px; + border-top-right-radius: 10px; + margin-right: 2px; } +.nav-tabs > li > a { /* Tab-Navigation inaktive Reiter */ + color: var(--navtabforeinactive); + background: var(--navtabbackinactive); + border-right: 1px solid var(--navtabborderinactive); + border-top: 1px solid var(--navtabborderinactive); + border-left: 1px solid var(--navtabborderinactive); + border-bottom: 1px solid var(--navtabborderinactive); + border-radius: 0px; + border-top-right-radius: 10px; + margin-right: 0px; } +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + color: var(--navtabforehover); + background: var(--navtabbackhover); + border-right: 1px solid var(--navtabborderhover); + border-top: 1px solid var(--navtabborderhover); + border-left: 1px solid var(--navtabborderhover); + border-bottom: var(--navtabborderhover); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2);} + +.nav-tabs > li.active > a, /* Tab-Navigation aktiver Reiter */ +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: var(--navtabforeactive); + background: var(--navtabbackactive) !important; + border-right: 1px solid var(--navtabborderactive); + border-top: 1px solid var(--navtabborderactive); + border-left: 1px solid var(--navtabborderactive); + border-bottom: 1px solid var(--navtabborderactive); + border-radius: 0px; + border-top-right-radius: 10px; + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2); } +.nav-tabs > li > a.visible-lg-inline-block:not(.pull-right) { + background-color: var(--navtabbackactive); + color: var(--navtabforeactive); + border-right: 1px var(--navtabborderactive); + border-color: 1px var(--navtabborderactive); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2);} + +.nav-tabs > li > a.visible-lg-inline-block.pull-right { + background-color: var(--navtabbackactive); + color: var(--navtabforeactive); + border-color: 1px solid var(--navtabborderactive); + outline: 0; + -webkit-box-shadow: var(--btnshadow1), var(--btnshadow2); + box-shadow: var(--btnshadow1), var(--btnshadow2);} + +.nav-tabs.nav-justified { + border-right: 1px solid var(--stdborder50bright); } +.nav-tabs.nav-justified > li { + border-bottom: 1px solid var(--stdborder50bright); + border-top: 1px solid var(--stdborder50bright); + border-left: 1px solid var(--stdborder50bright); + border-radius: 0px; + background: var(--navtabbackinactive); } +.nav-tabs.nav-justified > li > a { + color: var(--navtabforeactive); + border-bottom: var(--navtabborderactive); + font-family: "SourceSansProSemibold"; } +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid var(--stdborderfore); + } +} +@media (max-width: 767px) { + .nav-tabs.nav-justified > li.active > a { + border-right: 0 !important; + } +} + +@media (min-width: 768px) { + > li.active + li > a { + border-left: 1px solid transparent; + } +} + +> li:last-child > a { + border-right: 1px solid transparent !important; } +@media (max-width: 767px) { + > li:last-child > a { + margin-bottom: 0; + } +} + +.btn .glyphicon { + vertical-align: -1px; } +.btn-default .glyphicon { + color: var(--pfore); } +table { + width: 100%; } +.table { + margin-bottom: 0px !important; } +.nav-tabs-justified .nav-tabs.nav-justified > .active > a:focus, .nav-tabs.nav-justified .nav-tabs.nav-justified > .active > a:focus { + border: 0px !important; } +.table th, strong, b { + font-family: "SourceSansProSemibold"; + font-weight: normal; } +.table > tbody > tr > td:last-child { + padding-right: 15px; } +/* helpers */ +.__nowrap { + white-space: nowrap; } +.__nomb { + margin-bottom: 0; } +.__mb { + margin-bottom: 15px; } +.__mt { + margin-top: 15px; } +.__ml { + margin-left: 15px; } +.__mr { + margin-right: 15px; } +.__iconspacer { + padding-right: 10px; } +#mainmenu .glyphicon { + vertical-align: -2px; } +.list-group-item { + overflow: hidden; + text-overflow: ellipsis; } +.list-group-item + div.collapse { + margin-bottom: -1px; } +.list-group-item + div > a { + padding-left: 44px; } +.list-group-item:before { + background: var(--warning); + content: ""; + height: 42px; + min-height: 100%; + left: 0; + position: absolute; + top: 0px; + width: 0; + -webkit-transition: width 0.2s; + -moz-transition: width 0.2s; + -o-transition: width 0.2s; + transition: width 0.2s; } +.list-group-submenu a { + padding-left: 56px; } +.active-menu-title, .active-menu a { /* Seitenleiste, aktives Menü */ + background-color: var(--sdbaractback); + text-decoration: none; + position: relative; } + .active-menu-title:before, .active-menu a:before { + width: 3px; } + .list-group-item.active-menu-title, .active-menu-title.active, .active-menu a.active { + color: var(--navbarinversefore); + background-color: var(--navbarinverse); } /* sidebar active menu */ +.active-menu a:before { + background: var(--navbaractivebefore); /*sidebar active before */} +.alert.alert-danger { + color: var(--danger) !important; } +.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-radius: 0 !important; } +.navbar-brand { + padding: 10px 20px; } +.label-opnsense { + /* emulates btn */ + border: 1px solid transparent; + display: inline-block; + vertical-align: middle; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } +.label-opnsense-sm { + /* emulates btn-sm */ + padding: 5px 10px; } +.label-opnsense-xs, +.btn-xs, +.btn-group-xs > .btn { + /* emulates btn-xs */ + padding: 1px 3px; } +::-webkit-scrollbar { + width: 8px; } +::-webkit-scrollbar-button { + background: var(--scbarbutton); + width: 8px; + height: 0px; } +::-webkit-scrollbar-track { + background: var(--pageback); + box-shadow: 0px 0px 0px; + border-radius: 0; } +::-webkit-scrollbar-thumb { + background: var(--scbar); + border: thin solid var(--scbarborder); + border-radius: 0px; } +::-webkit-scrollbar-thumb:hover { + background: var(--scbarhover); } +.widgetdiv { + padding-top: 0px !important; + padding-bottom: 20px; } +select { + overflow: hidden; + border: 1px solid var(--stdborder); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + cursor: pointer; + background-repeat: no-repeat; + background-position: right; + background-image: url(/ui/themes/flexcolor/build/images/caret.png) !important; } +#grid-log th[data-column-id=__timestamp__], +#filter-log-entries th[data-column-id=__timestamp__] { + min-width: 3.5em; } +@media screen and (max-width: 767px) { + .table-responsive { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, +.table-responsive > .table > thead > tr > td, +.table-responsive > .table > tbody > tr > th, +.table-responsive > .table > tbody > tr > td, +.table-responsive > .table > tfoot > tr > th, +.table-responsive > .table > tfoot > tr > td { + white-space: normal; + } +} + +label > input[type=checkbox], +label > input[type=radio] { + margin-right: 0.4em; + float: left; } +div[data-for*=help_for] { + padding-top: 0.4em; } +#log-settings label[for^=act] { + margin-right: 1.5em; } +#log-settings table > tbody > tr > td { + vertical-align: middle; } +#log-settings select#filterlogentries, +#log-settings select#filterlogentriesupdateinterval { + width: 5em; } +#log-settings select#filterlogentriesinterfaces { + min-width: 100%; + max-width: 100%; } +/* fields in firewall schedule */ +[data-state=lightcoral] { + background-color: var(--danger); } +[data-state=white] { + background-color: transparent; } +[data-state=red] { + background-color: var(--warning); } +.tokens-container { + margin-top: 0px; + margin-bottom: 0px; } +.bootstrap-dialog-body { + padding: 15px; } +#OPNsenseStdWaitDialog div.modal-body { + padding: 15px; } +.modal-body { + max-height: calc(100vh - 265px); + overflow-y: auto; } +.modal-footer { + padding: 15px; } +.bootgrid-table th > .column-header-anchor { + color: var(--pfore) !important; } +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item:hover, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item:hover, +.bootgrid-header .actionBar .btn-group > .btn-group .dropdown-menu .dropdown-item:focus, +.bootgrid-footer .infoBar .btn-group > .btn-group .dropdown-menu .dropdown-item:focus { + color: var(--pfore); } +.state_text { + color: var(--info); } +div.tab-content.content-box { + border-top: 1px solid var(--stdborderfore); } +ul.jqtree-tree .jqtree-title { + color: var(--info) !important; } +ul.jqtree-tree .jqtree-toggler { + color: var(--pagefore) !important; } +.nvtooltip { + color: var(--pfore) !important; } +.diff_record_default { + color: var(--pfore) !important; } diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css.sample similarity index 99% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css.sample index 6c2eaad9c3..24d3287b4b 100644 --- a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css.shadow +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/main.css.sample @@ -119,10 +119,14 @@ input::-moz-focus-inner { padding: 0; } input { line-height: normal; } -input[type=checkbox], +input[type=checkbox] { + box-sizing: border-box; + padding: 0; + accent-color: var(--colorcheckbox); } input[type=radio] { box-sizing: border-box; - padding: 0; } + padding: 0; + accent-color: var(--colorradio); } input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { height: auto; } @@ -3996,14 +4000,11 @@ a.thumbnail:focus, a.thumbnail.active { border-color: var(--primary); } .alert { - background-color: var(--pback); - color: var(--pfore); padding: 15px; + background-color: var(--alertback); margin-bottom: 20px; - border: 2px solid transparent; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 var(--boxshadow), 0 1px 0 var(--boxshadow); - box-shadow: inset 0 1px 0 var(--boxshadow), 0 1px 0 var(--boxshadow); } + border: 2px solid var(--alertborder); + border-radius: 3px; } .alert h4 { margin-top: 0; color: inherit; } @@ -4024,25 +4025,33 @@ a.thumbnail.active { right: -21px; color: inherit; } .alert-success { - border-color: var(--success); } + color: var(--alertsuccessfore); + background-color: var(--alertsuccessback); + border-color: var(--alertsuccessborder); } .alert-success hr { border-top-color: var(--pfore); } .alert-success .alert-link { color: var(--primary); } .alert-info { - border-color: var(--info); } + color: var(--alertinfofore); + background-color: var(--alertinfoback); + border-color: var(--alertinfoborder); } .alert-info hr { border-top-color: var(--pfore); } .alert-info .alert-link { color: var(--info); } .alert-warning { - border-color: var(--warning); } + color: var(--alertwarningfore); + background-color: var(--alertwarningback); + border-color: var(--alertwarningborder); } .alert-warning hr { border-top-color: var(--pfore); } .alert-warning .alert-link { color: var(--primary); } .alert-danger { - border-color: var(--danger); } + color: var(--alertdangerfore); + background-color: var(--alertdangerback); + border-color: var(--alertdangerborder); } .alert-danger hr { border-top-color: var(--pfore); } .alert-danger .alert-link { diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css new file mode 100644 index 0000000000..4eabdba689 --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css @@ -0,0 +1,1047 @@ +/* nvd3 version 1.8.6 (https://github.com/novus/nvd3) 2017-08-23 */ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +.nvd3 .nv-axis { + pointer-events:none; + opacity: 1; + fill: var(--graphfore); +} + +.nvd3 .nv-axis path { + fill: none; + stroke: var(--graphfore); + stroke-opacity: .20; + shape-rendering: crispEdges; +} + +.nvd3 .nv-axis path.domain { + stroke-opacity: .10; +} + +.nvd3 .nv-axis.nv-x path.domain { + stroke-opacity: 0; +} + +.nvd3 .nv-axis line { + fill: none; + stroke: var(--graphfore); + stroke-opacity: .20; + shape-rendering: crispEdges; +} + +.nvd3 .nv-axis .zero line, + /*this selector may not be necessary*/ .nvd3 .nv-axis line.zero { + stroke-opacity: .20; +} + +.nvd3 .nv-axis .nv-axisMaxMin text { + font-weight: bold; +} + +.nvd3 .x .nv-axis .nv-axisMaxMin text, +.nvd3 .x2 .nv-axis .nv-axisMaxMin text, +.nvd3 .x3 .nv-axis .nv-axisMaxMin text { + text-anchor: middle; +} + +.nvd3 .nv-axis.nv-disabled { + opacity: 0; +} + +.nvd3 .nv-bars rect { + fill-opacity: .50; + + transition: fill-opacity 250ms linear; +} + +.nvd3 .nv-bars rect.hover { + fill-opacity: 1; +} + +.nvd3 .nv-bars .hover rect { + fill: lightblue; +} + +.nvd3 .nv-bars text { + fill: rgba(0,0,0,0); +} + +.nvd3 .nv-bars .hover text { + fill: rgba(0,0,0,1); +} + +.nvd3 .nv-multibar .nv-groups rect, +.nvd3 .nv-multibarHorizontal .nv-groups rect, +.nvd3 .nv-discretebar .nv-groups rect { + stroke-opacity: 0; + transition: fill-opacity 250ms linear; +} + +.nvd3 .nv-multibar .nv-groups rect:hover, +.nvd3 .nv-multibarHorizontal .nv-groups rect:hover, +.nvd3 .nv-candlestickBar .nv-ticks rect:hover, +.nvd3 .nv-discretebar .nv-groups rect:hover { + fill-opacity: 1; +} + +.nvd3 .nv-discretebar .nv-groups text, +.nvd3 .nv-multibarHorizontal .nv-groups text { + font-weight: bold; + fill: rgba(0,0,0,1); + stroke: rgba(0,0,0,0); +} + +/* boxplot CSS */ +.nvd3 .nv-boxplot circle { + fill-opacity: 0.5; +} + +.nvd3 .nv-boxplot circle:hover { + fill-opacity: 1; +} + +.nvd3 .nv-boxplot rect:hover { + fill-opacity: 1; +} + +.nvd3 line.nv-boxplot-median { + stroke: black; +} + +.nv-boxplot-tick:hover { + stroke-width: 2.5px; +} +/* bullet */ +.nvd3.nv-bullet { font: 10px sans-serif; } +.nvd3.nv-bullet .nv-measure { fill-opacity: .8; } +.nvd3.nv-bullet .nv-measure:hover { fill-opacity: 1; } +.nvd3.nv-bullet .nv-marker { stroke: #000; stroke-width: 2px; } +.nvd3.nv-bullet .nv-markerTriangle { stroke: #000; fill: #fff; stroke-width: 1.5px; } +.nvd3.nv-bullet .nv-markerLine { stroke: #000; stroke-width: 1.5px; } +.nvd3.nv-bullet .nv-tick line { stroke: #666; stroke-width: .5px; } +.nvd3.nv-bullet .nv-range.nv-s0 { fill: #eee; } +.nvd3.nv-bullet .nv-range.nv-s1 { fill: #ddd; } +.nvd3.nv-bullet .nv-range.nv-s2 { fill: #ccc; } +.nvd3.nv-bullet .nv-title { font-size: 14px; font-weight: bold; } +.nvd3.nv-bullet .nv-subtitle { fill: #999; } + +.nvd3.nv-bullet .nv-range { + fill: #bababa; + fill-opacity: .4; +} + +.nvd3.nv-bullet .nv-range:hover { + fill-opacity: .7; +} + +.nvd3.nv-candlestickBar .nv-ticks .nv-tick { + stroke-width: 1px; +} + +.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover { + stroke-width: 2px; +} + +.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect { + stroke: #2ca02c; + fill: #2ca02c; +} + +.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect { + stroke: #d62728; + fill: #d62728; +} + +.with-transitions .nv-candlestickBar .nv-ticks .nv-tick { + transition: stroke-width 250ms linear, stroke-opacity 250ms linear; +} + +.nvd3.nv-candlestickBar .nv-ticks line { + stroke: #333; +} + +.nv-force-node { + stroke: #fff; + stroke-width: 1.5px; +} + +.nv-force-link { + stroke: #999; + stroke-opacity: .6; +} + +.nv-force-node text { + stroke-width: 0px; +} + +.nvd3 .nv-legend .nv-disabled rect { + /*fill-opacity: 0;*/ +} + +.nvd3 .nv-check-box .nv-box { + fill-opacity:0; + stroke-width:2; +} + +.nvd3 .nv-check-box .nv-check { + fill-opacity:0; + stroke-width:4; +} + +.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check { + fill-opacity:0; + stroke-opacity:0; +} + +.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check { + opacity: 0; + stroke-width: 1; + fill: var(--nv3daxis); + stroke: var(--nv3daxis); +} + +/* line plus bar */ +.nvd3.nv-linePlusBar .nv-bar rect { + fill-opacity: .50; +} + +.nvd3.nv-linePlusBar .nv-bar rect:hover { + fill-opacity: 1; +} +.nvd3 .nv-groups path.nv-line { + fill: none; +} + +.nvd3 .nv-groups path.nv-area { + stroke: none; +} + +.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + fill-opacity: 0; + stroke-opacity: 0; +} + +.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point { + fill-opacity: .5 !important; + stroke-opacity: .5 !important; +} + + +.with-transitions .nvd3 .nv-groups .nv-point { + transition: stroke-width 250ms linear, stroke-opacity 250ms linear; +} + +.nvd3.nv-scatter .nv-groups .nv-point.hover, +.nvd3 .nv-groups .nv-point.hover { + stroke-width: 7px; + fill-opacity: .95 !important; + stroke-opacity: .95 !important; +} +.nvd3 .nv-point-paths path { + stroke: #aaa; + stroke-opacity: 0; + fill: #eee; + fill-opacity: 0; +} +.nvd3 .nv-indexLine { + cursor: ew-resize; +} + +/******************** + * SVG CSS + */ + +/******************** + Default CSS for an svg element nvd3 used +*/ +svg.nvd3-svg { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: block; + width:100%; + height:100%; +} + +/******************** + Box shadow and border radius styling +*/ +.nvtooltip.with-3d-shadow, .with-3d-shadow .nvtooltip { + background-color: rgb(32, 32, 32); + color: rgba(0,0,0,1.0); + border: 1px solid rgb(255, 127, 14); +} + +.nvd3 text { + font: normal 12px Arial, sans-serif; + fill: var(--graphfore); +} + +.nvd3 .title { + font: bold 14px Arial, sans-serif; +} + +.nvd3 .nv-background { + fill: white; + fill-opacity: 0; +} + +.nvd3.nv-noData { + font-size: 18px; + font-weight: bold; + fill: var(--graphfore); +} + + +/********** +* Brush +*/ + +.nv-brush .extent { + fill-opacity: .125; + shape-rendering: crispEdges; +} + +.nv-brush .resize path { + fill: #eee; + stroke: #666; +} + + +/********** +* Legend +*/ + +.nvd3 .nv-legend .nv-series { + cursor: pointer; +} + +/* .nv-controlsWrap.nvd3-svg circle.nv-legend-symbol { + stroke-width: 1 !important; + fill: rgb(255, 255, 255) !important; + stroke: rgb(231, 231, 231) !important; +}*// + +.nvd3 .nv-legend .nv-disabled circle { + fill-opacity: 0; +} + +/* focus */ +.nvd3 .nv-brush .extent { + fill-opacity: 0 !important; +} + +.nvd3 .nv-brushBackground rect { + stroke: var(--graphback); + stroke-width: .4; + fill: var(--graphfore); + fill-opacity: .7; +} + +/********** +* Print +*/ + +@media print { + .nvd3 text { + stroke-width: 0; + fill-opacity: 1; + } +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick { + stroke-width: 1px; +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover { + stroke-width: 2px; +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive { + stroke: #2ca02c; +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative { + stroke: #d62728; +} + + +.nvd3 .background path { + fill: none; + stroke: #EEE; + stroke-opacity: .4; + shape-rendering: crispEdges; +} + +.nvd3 .foreground path { + fill: none; + stroke-opacity: .7; +} + +.nvd3 .nv-parallelCoordinates-brush .extent { + fill: #fff; + fill-opacity: .6; + stroke: gray; + shape-rendering: crispEdges; +} + +.nvd3 .nv-parallelCoordinates .hover { + fill-opacity: 1; + stroke-width: 3px; +} + + +.nvd3 .missingValuesline line { + fill: none; + stroke: black; + stroke-width: 1; + stroke-opacity: 1; + stroke-dasharray: 5, 5; +} + +.nvd3.nv-pie path { + stroke-opacity: 0; + transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; +} + +.nvd3.nv-pie .nv-pie-title { + font-size: 24px; + fill: rgba(19, 196, 249, 0.59); +} + +.nvd3.nv-pie .nv-slice text { + stroke: var(--highlighted); + stroke-width: 0; +} + +.nvd3.nv-pie path { + stroke: var(--highlighted); + stroke-width: 1px; + stroke-opacity: 0.6; +} + +.nvd3.nv-pie path { + fill-opacity: .7; +} + +.nvd3.nv-pie .hover path { + fill-opacity: 1; +} + +.nvd3.nv-pie .nv-label { + pointer-events: none; +} + +.nvd3.nv-pie .nv-label rect { + fill-opacity: 0; + stroke-opacity: 0; +} + +/* scatter */ +.nvd3 .nv-groups .nv-point.hover { + stroke-width: 20px; + stroke-opacity: .5; +} + +.nvd3 .nv-scatter .nv-point.hover { + fill-opacity: 1; +} + +.nv-noninteractive { + pointer-events: none; +} + +.nv-distx, .nv-disty { + pointer-events: none; +} + +/* sparkline */ +.nvd3.nv-sparkline path { + fill: none; +} + +.nvd3.nv-sparklineplus g.nv-hoverValue { + pointer-events: none; +} + +.nvd3.nv-sparklineplus .nv-hoverValue line { + stroke: #333; + stroke-width: 1.5px; +} + +.nvd3.nv-sparklineplus, +.nvd3.nv-sparklineplus g { + pointer-events: all; +} + +.nvd3 .nv-hoverArea { + fill-opacity: 0; + stroke-opacity: 0; +} + +.nvd3.nv-sparklineplus .nv-xValue, +.nvd3.nv-sparklineplus .nv-yValue { + stroke-width: 0; + font-size: .9em; + font-weight: normal; +} + +.nvd3.nv-sparklineplus .nv-yValue { + stroke: #f66; +} + +.nvd3.nv-sparklineplus .nv-maxValue { + stroke: #2ca02c; + fill: #2ca02c; +} + +.nvd3.nv-sparklineplus .nv-minValue { + stroke: #d62728; + fill: #d62728; +} + +.nvd3.nv-sparklineplus .nv-currentValue { + font-weight: bold; + font-size: 1.1em; +} +/* stacked area */ +.nvd3.nv-stackedarea path.nv-area { + fill-opacity: .7; + stroke-opacity: 0; + transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; +} + +.nvd3.nv-stackedarea path.nv-area.hover { + fill-opacity: .9; +} + + +.nvd3.nv-stackedarea .nv-groups .nv-point { + stroke-opacity: 0; + fill-opacity: 0; +} + +.nvtooltip { + position: absolute; + background-color: var(--graphback); + color: rgba(0,0,0,1.0); + border: 1px solid var(--stdborder); + padding: 1px; + z-index: 10000; + display: block; + font-family: Arial, sans-serif; + font-size: 13px; + text-align: left; + pointer-events: none; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/*Give tooltips that old fade in transition by + putting a "with-transitions" class on the container div. +*/ +.nvtooltip.with-transitions, .with-transitions .nvtooltip { + transition: opacity 50ms linear; + transition-delay: 200ms; +} + +.nvtooltip.x-nvtooltip, +.nvtooltip.y-nvtooltip { + padding: 8px; +} + +.nvtooltip h3 { + margin: 0; + padding: 4px 14px; + line-height: 18px; + font-weight: normal; + background-color: rgba(247,247,247,0.50); + color: rgba(0,0,0,1.0); + text-align: center; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.nvtooltip p { + margin: 0; + padding: 5px 14px; + text-align: center; +} + +.nvtooltip span { + display: inline-block; + margin: 2px 0; +} + +.nvtooltip table { + margin: 0; + border-spacing:0; + background-color: var(--graphback); + padding: 6px; +} + + +.nvtooltip table td { + padding: 2px 9px 2px 0; + vertical-align: middle; +} + +.nvtooltip table td.key { + font-weight: normal; +} + +.nvtooltip table td.key.total { + font-weight: bold; +} + +.nvtooltip table td.value { + text-align: right; + font-weight: bold; +} + +.nvtooltip table td.percent { + color: darkgray; +} + +.nvtooltip table tr.highlight td { + padding: 1px 9px 1px 0; + border-bottom-style: solid; + border-bottom-width: 1px; + border-top-style: solid; + border-top-width: 1px; +} + +.nvtooltip table td.legend-color-guide div { + width: 8px; + height: 8px; + vertical-align: middle; +} + +.nvtooltip table td.legend-color-guide div { + width: 12px; + height: 12px; + border: 1px solid #999; +} + +.nvtooltip .footer { + padding: 3px; + text-align: center; +} + +.nvtooltip-pending-removal { + pointer-events: none; + display: none; +} + + +/**** +Interactive Layer +*/ +.nvd3 .nv-interactiveGuideLine { + pointer-events:none; +} + +.nvd3 line.nv-guideline { + stroke: #ccc; +} diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/nv.d3.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css new file mode 100644 index 0000000000..5bbbdcb024 --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css @@ -0,0 +1,733 @@ +/** +* Main theming elements +*/ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +.tabulator { + font-size: 15px; + background-color: transparent; + border: none; + border-top: 1px solid var(--tbborder); +} + +/* theme: header */ +.tabulator .tabulator-header { + background-color: transparent; + border-bottom: none; + border-left: 1px solid var(--tbborder); +} + +.tabulator .tabulator-header .tabulator-col { + border-right: 1px solid var(--tbborder); + background-color: var(--tbheadback); + color: var(--tbheadfore); +} + +.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover { + background-color: var(--tbheadbackhover); +} +.tabulator .tabulator-headers { + height: 100% !important; /* make sure the border below appears */ + border-bottom: 1px solid var(--tbborder); +} + +/*------------*/ +/* theme: body */ +.tabulator .tabulator-tableholder .tabulator-table { + background-color: var(--tbbodybackhover); + border-left: 1px solid var(--tbbordertable); +} + +.tabulator-row +{ + background-color: var(--tbbodybackhover); + border: 1px solid var(--tbbordertable); +} + +.tabulator-row.tabulator-row-odd { + color: var(--tbrowforeodd); + background-color: var(--tbrowbackodd); +} + +.tabulator-row.tabulator-row-odd.tabulator-selectable:hover:not(.tabulator-selected) { + color: var(--tbrowforeodd); + background-color: var(--tbrowbackodd); +} + +.tabulator-row.tabulator-row-even { + color: var(--tbrowforeeven); + background-color: var(--tbrowbackeven); +} + +.tabulator-row.tabulator-row-even.tabulator-selectable:hover:not(.tabulator-selected) { + color: var(--tbrowforeeven); + background-color: var(--tbrowbackeven); +} + +.tabulator .tabulator-tableholder { + background-color: var(--tbfback); +} + +.tabulator-row.tabulator-selected { + background-color: var(--tbheadbackhover); +} + +.tabulator-row.tabulator-selected:hover { + cursor: pointer; + background-color: var(--tbheadbackhover); +} + +.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg { + color: var(--warning); /* spinner icon */ +} + +/* Command column styles */ +.tabulator-col.tabulator-frozen.tabulator-frozen-right { +} + +.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right { +} + +/* Tabulator groupBy row styles */ +.tabulator-row.tabulator-group +{ + border: none; + pointer-events: none; +} + + .tabulator-row.tabulator-group span + { + margin-left: 0; + color: var(--tbrowforeodd); + } + +.tabulator-row .badge.chip +{ + background-color: var(--dfbtnbackbadge); + color: var(--dfbtnforebadge); + font-size: 10px; + padding: 2px 4px; + position: relative; + top: -1px; +} + +.tabulator-row.tabulator-group .tabulator-group-toggle, +.tabulator-row.tabulator-group .tabulator-group-toggle * +{ + pointer-events: auto; +} + +.tabulator-row.tabulator-group:has(> .tabulator-group-toggle:only-child) +{ + display: none; /* Trick to hide empty groupBy header rows */ +} + +/* Checkbox column styles */ +.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left { + border-right: 1px solid var(--tbborder); /* separates checkbox column from table rows */ + border-left: 1px solid var(--tbborder); +} + +.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left { + border-right: 1px solid var(--tbborder); + border-top: 1px solid var(--tbborder); + border-bottom: 1px solid var(--tbborder); + border-left: 1px solid var(--tbborder); +} + +.tabulator-col.tabulator-row-header.tabulator-frozen.tabulator-frozen-left { +} + +.tabulator-cell.tabulator-row-header.tabulator-frozen.tabulator-frozen-left { +} + +/*------------*/ +/* theme: cells */ +.tabulator-row .tabulator-cell { + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.2; + vertical-align: top; + border-bottom: 1px solid var(--tbborder); + border-right: 1px solid var(--tbborder); +} + +/*-------------*/ +/* theme: footer */ +.tabulator .tabulator-footer { + border-top: none; + background-color: var(--tbfback); +} + +.tabulator .tabulator-footer .tabulator-page { + color: var(--tffore); + background-color: var(--tfback); + border: 1px solid var(--tfborder); +} + +.tabulator .tabulator-footer .tabulator-page { + border-radius: 0px; + margin: 0px; + padding: 6px 12px;} + +.tabulator .tabulator-footer .tabulator-page:not(disabled):hover { + color: var(--tfforehover); + background-color: var(--tfbackhover); + border-color: var(--tfborderhover); +} + +.tabulator .tabulator-footer .tabulator-page:not(disabled).active:hover { + color: var(--tfforeactivehover); + background-color: var(--tfbackactivehover); + border-color: var(--tfborderactivehover); + cursor: default; +} + +.tabulator .tabulator-footer .tabulator-page.active { + color: var(--tfforeactive); + background-color: var(--tfbackactive); + border-color: var(--tfborderactive); + cursor: default; +} +.tabulator-page-counter { + color: var(--tbheadfore); +} + +.tabulator .tabulator-footer .tabulator-paginator { + color: var(--tffore); +} +/*----------*/ +/* end of main theming elements */ +.tabulator-paginator { + flex: 0 !important; + background-color: var(--tbfback); +} + +.tabulator-page-counter { + flex: 1; + text-align: right; +} + +.tabulator-col-sorter i { + display: flex; + justify-content: center; + align-items: center; +} + +.tabulator .tabulator-header .tabulator-col { + padding: 5px; +} + +.tabulator .tabulator-headers > :first-child { + padding-left: 10px; +} + +.opnsense-bootgrid-responsive { + white-space: wrap !important; + text-overflow: inherit !important; + overflow: visible !important; + word-break: break-word !important; +} + +.opnsense-bootgrid-ellipsis { + overflow: hidden !important; + white-space: nowrap !important; + text-overflow: ellipsis !important; +} + +.tabulator-row > :first-child { + padding-left: 10px; +} + +.tabulator .tabulator-header .tabulator-col .tabulator-col-content { + padding: 0px; +} + +.tabulator-page-counter { + padding-right: 20px; +} + +.bootgrid-footer-commands { + width: 90px; + padding-left: 8px; +} + +.tabulator-tableholder::after { + content: ""; + display: block; + width: 1px; + height: 1px; + min-width: 100%; +} + +.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:first-child { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:last-child { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +/* border line corrections and hover/selection behavior */ +.tabulator-row:first-child > .tabulator-cell { + border-top: none; +} + +.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title { + padding: 0px; +} + +/* Row highlight behavior */ +@keyframes highlight { + 0% { + background: var(--stdborder); + } + 100% { + background: none; + } +} +.highlight-bg { + animation: highlight 2s; +} + +/* Tabulator "loading" and "error" overrides */ +.tabulator .tabulator-alert { + background: none; +} + +.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg { + border: none; +} + +.tabulator .tabulator-alert .tabulator-alert-msg { + background: initial; + font-size: 18px; +} + +.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error { + border: none; +} + +.bootgrid-placeholder { + font-size: 15px; + text-align: center; + white-space: normal; + font-weight: 400; + margin: 10px; +} + +.bootgrid-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--tbheadbackhover); + display: flex; + justify-content: center; + align-items: center; + z-index: 99; +} +.overlay > i { + font-size: 20px; + color: var(--tbheadfore); +} diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/opnsense-bootgrid.css.sample diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css new file mode 100644 index 0000000000..80baa45ac9 --- /dev/null +++ b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css @@ -0,0 +1,572 @@ +:root +{ + /* theme black, flexcolor */ + /* main colors */ + --pfore: #E6E6E6; /* main textcolor */ + --pforehover: #FFFFFF; /* primary text hover */ + --pforemuted: #B1B1B1; /* muted text */ + --pforeinverse: #181E25; /* main textcolor inverse */ + --pforeinversehover: #232323; /* main textcolor inverse hover */ + --pback: #000000; /* primary background */ + --pbackmuted: #E6E6E6; /* primary background */ + --pbackinverse: #E6E6E6; /* primary background inverse */ + --pbackhover: #232323; /* primary background hover*/ + --sfore: #A3A3A3; /*second background */ + --sback: #000000; /* second background #FAF9F6*/ + --stdborder: #515151; /* standard border */ + --stdborderfore: #E6E6E6; /* standard border with accent*/ + --stdborderprimary: #336CDF; /* standard border with accent*/ + --stdborderinverse: #000000; /* standard border with accent*/ + --stdborder50bright: #A1A1A1; /* standard border with accent*/ + --badgeback: #234A99; /* badge background & progress-bar & blockquote*/ + --progressbar: #D4D4D4; /* progress-bar*/ + --token: #AF3604; /* background token */ + --highlighted: #FFFFFF; /* highlighted element */ + /* bootstrap */ + /* bootstrap titlebar */ + --bsheadfore: #E6E6E6; + --bsheadback: #000000; + --bsbodyfore: #E6E6E6; + --bsbodyback: #000000; + /* jquery-bootgrid */ + --jqueryfore: #E6E6E6; + --jqueryback: #000000; + --jquerybarfore: #E6E6E6; + --jquerybarback: #1F57C6; + --jquerybarborder: #1F57C6; + /* login,(complete indepent, despite textboxes) */ + --loginback: #000000; /* loginscreen background */ + --loginboxtitle: #E6E6E6; /* loginscreen boxtitle */ + --logindatefore: #E6E6E6; /* loginscreen textcolor */ + --loginheadback: #000000; /* login-dialogbox head background */ + --loginboxback: #000000; /* login-dialogbox background */ + --loginboxfore: #E6E6E6; /* Login-dialogbox textcolor */ + /* textbox (all kinds, tokenize, listbox, textbox, bootstrap select */ + /* foreground */ + --txtboxfore: #E6E6E6; + --txtboxforehover: #336CDF; + --txtboxforeactive: #336CDF; + --txtboxforeinverse: #E6E6E6; + --txtboxforedisabled: #E6E6E6; + --txtboxforetoken: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxforedismiss: #E6E6E6; /* only tokenize, dismiss */ + --txtboxforeplaceholder: #E6E6E6; + /* background */ + --txtboxback: #000000; + --txtboxbackhover: #000000; + --txtboxbackactive: #000000; + --txtboxbackdisabled: #000000; + --txtboxbacktoken: #E65C00; + --txtboxbackdel: #FF5252; /* only tokenize, pending delete */ + --txtboxbackdismiss: #F2F7FD; /* only tokenize, dismiss */ + /* border */ + --txtboxborder: #E6E6E6; + --txtboxborderhover: #1C4DB0; + --txtboxborderactive: #336CDF; + --txtboxborderdisabled: #515151; + --txtboxbordertoken: #000000; + --txtboxborderdel: #E6E6E6; /* only tokenize, pending delete */ + --txtboxborderdismiss: #E6E6E6; /* only tokenize, dismiss */ + /* page */ + --pagefore: #E6E6E6; /* text color page */ + --pageback: #000000; /* backround color page */ + --pageborder: #E6E6E6; /* border color page */ + --headlineback: #000000; /*background headline box*/ + --headlinebackshadow: 2px 2px 1px 0px rgba(0, 0, 0, 0); /* shadow headlinebackgroundbox */ + /* navigation sidebar (complete independent) */ + /* unselected */ + --sdbarfore: #E6E6E6; /*textcolor navigation sidebar */ + --sdbarback: #000000; /*background unselected navigation sidebar */ + --sdbarhoverback: #000000; /* background sidebar hover */ + --sdbarhoverfore: #D66E12; /* textcolor sidebar hover */ + --sdbaractback: #1C1C1C; /* active menu #ECE7E2, #FFEDF5, #E5F4FF, #FFFBE5, #F5F5DC, #F2F2F2, #FFFACD */ + --navbarinverse: #000000; /* navtab */ + --navbarinversefore: #336CDF; /* navtab */ + --navbaractivebefore: #FA6121; /*sidebar active before */ + /* special characters */ + --link: #FA6121; /* OPNsense text login and links */ + --linkhover: #E04605; /* OPNsense text login and links hover */ + --colorcheckbox: #388E3C; /* background color checkbox */ + --colorradio: #FA6121; /* background color radio button */ + /* accents */ + --primary: #336CDF; /* primary accent */ + --primaryhover: #608DE6; /* primary accent hover */ + --info: #008CDD; /* info accent */ + --infohover: #0FA7FF; /* info accent hover */ + --success: #388E3C; /* success accent */ + --successhover: #47B34C; /* success accent hover */ + --warning: #D66E12; /* warning accent */ + --warninghover: #ED862B; /* warning accent hover */ + --danger: #FF5252; /* danger accent */ + --dangerhover: #BE2326FF8585; /* danger accent hover */ + /* alert messages */ + /* alert success */ + --alertsuccessfore: #E6E6E6; + --alertsuccessback: #000000; + --alertsuccessborder: #36D93E; + /* alert info */ + --alertinfofore: #E6E6E6; + --alertinfoback: #000000; + --alertinfoborder: #369DD9; + /* alert warning */ + --alertwarningfore: #E6E6E6; + --alertwarningback: #000000; + --alertwarningborder: #D98236; + /* alert danger */ + --alertdangerfore: #E6E6E6; + --alertdangerback: #000000; + --alertdangerborder: #D93636; + /* buttons (complete (independent) */ + /* unselected */ + --btnfore: #E6E6E6; /* textcolor */ + --btnback: #000000; /* background */ + --btnborder: #E6E6E6; /* border */ + /* hover */ + --btnforehover: #E6E6E6; /* textcolor hover*/ + --btnbackhover: #000000; /* background hover*/ + --btnborderhover: #336CDF; /* border hover */ + /* active */ + --btnforeactive: #336CDF; /* textcolor active*/ + --btnbackactive: #000000; /* background active*/ + --btnborderactive: #336CDF; /* border active */ + /* disabled */ + --btnforedisabled: #999999; /* textcolor disabled*/ + --btnbackdisabled: #000000; /* background disabled*/ + /* badge */ + --btnforebadge: #000000; /* textcolor badge*/ + --btnbackbadge: #000000; /* background badge*/ + --btnborderbadge: #000000; /* border badge */ + /* default button */ + /* unselected */ + --dfbtnfore: #E6E6E6; /* textcolor */ + --dfbtnback: #000000; /* background */ + --dfbtnborder: #E6E6E6; /* border */ + /* hover */ + --dfbtnforehover: #E6E6E6; /* textcolor hover*/ + --dfbtnbackhover: #000000; /* background hover*/ + --dfbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dfbtnforeactive: #336CDF; /* textcolor active*/ + --dfbtnbackactive: #000000; /* background active*/ + --dfbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --dfbtnforedisabled: #999999; /* textcolor disabled*/ + --dfbtnbackdisabled: #000000; /* background disabled*/ + --dfbtnborderdisabled: #E6E6E6; /* border disabled */ + /* Badge */ + --dfbtnforebadge: #000000; /* textcolor badge, traffic badge textcolor*/ + --dfbtnbackbadge: #E6E6E6; /* background badge*/ + --dfbtnborderbadge: #000000; /* border badge */ + /* primary button */ + /* unselected */ + --pbtnfore: #E6E6E6; /* textcolor */ + --pbtnback: #000000; /* background */ + --pbtnborder: #336CDF; /* border */ + /* hover */ + --pbtnforehover: #336CDF; /* textcolor hover*/ + --pbtnbackhover: #000000; /* background hover*/ + --pbtnborderhover: #336CDF; /* border hover */ + /* active */ + --pbtnforeactive: #336CDF; /* textcolor active*/ + --pbtnbackactive: #000000; /* background active*/ + --pbtnborderactive: #336CDF; /* border active */ + /* disabled */ + --pbtnforedisabled: #999999; /* textcolor disabled*/ + --pbtnbackdisabled: #000000; /* background disabled*/ + --pbtnborderdisabled: #635D55; /* border disabled */ + /* badge */ + --pbtnforebadge: #000000; /* textcolor badge*/ + --pbtnbackbadge: #000000; /* background badge*/ + --pbtnborderbadge: #000000; /* border badge */ + /* info button */ + /* unselected */ + --ibtnfore: #008CDD; /* textcolor */ + --ibtnback: #000000; /* background */ + --ibtnborder: #008CDD; /* border */ + /* hover */ + --ibtnforehover: #E6E6E6; /* textcolor hover*/ + --ibtnbackhover: #000000; /* background hover*/ + --ibtnborderhover: #336CDF; /* border hover */ + /* active */ + --ibtnforeactive: #336CDF; /* textcolor active*/ + --ibtnbackactive: #000000; /* background active*/ + --ibtnborderactive: #008CDD; /* border active */ + /* disabled */ + --ibtnforedisabled: #999999; /* textcolor disabled*/ + --ibtnbackdisabled: #000000; /* background disabled*/ + --ibtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --ibtnforebadge: #008CDD; /* textcolor badge*/ + --ibtnbackbadge: #000000; /* background badge*/ + --ibtnborderbadge: #000000; /* border badge */ + /* success button */ + /* unselected */ + --sbtnfore: #388E3C; /* textcolor */ + --sbtnback: #000000; /* background */ + --sbtnborder: #388E3C; /* border */ + /* hover */ + --sbtnforehover: #E6E6E6; /* textcolor hover*/ + --sbtnbackhover: #000000; /* background hover*/ + --sbtnborderhover: #336CDF; /* border hover */ + /* active */ + --sbtnforeactive: #336CDF; /* textcolor active*/ + --sbtnbackactive: #000000; /* background active*/ + --sbtnborderactive: #388E3C; /* border active */ + /* disabled */ + --sbtnforedisabled: #999999; /* textcolor disabled*/ + --sbtnbackdisabled: #000000; /* background disabled*/ + --sbtnborderdisabled: #31C234; /* border disabled */ + /* badge */ + --sbtnforebadge: #388E3C; /* textcolor badge*/ + --sbtnbackbadge: #000000; /* background badge*/ + --sbtnborderbadge: #000000; /* border badge */ + /* warning button */ + /* unselected */ + --wbtnfore: #D66E12; /* textcolor */ + --wbtnback: #000000; /* background */ + --wbtnborder: #D66E12; /* border */ + /* hover */ + --wbtnforehover: #E6E6E6; /* textcolor hover*/ + --wbtnbackhover: #000000; /* background hover*/ + --wbtnborderhover: #336CDF; /* border hover */ + /* active */ + --wbtnforeactive: #336CDF; /* textcolor active*/ + --wbtnbackactive: #000000; /* background active*/ + --wbtnborderactive: #D66E12; /* border active */ + /* disabled */ + --wbtnforedisabled: #999999; /* textcolor disabled*/ + --wbtnbackdisabled: #000000; /* background disabled*/ + --wbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --wbtnforebadge: #D66E12; /* textcolor badge*/ + --wbtnbackbadge: #000000; /* background badge*/ + --wbtnborderbadge: #000000; /* border badge */ + /* danger button */ + /* unselected */ + --dbtnfore: #FF5252; /* textcolor */ + --dbtnback: #000000; /* background */ + --dbtnborder: #FF5252; /* border */ + /* hover */ + --dbtnforehover: #E6E6E6; /* textcolor hover*/ + --dbtnbackhover: #000000; /* background hover*/ + --dbtnborderhover: #336CDF; /* border hover */ + /* active */ + --dbtnforeactive: #336CDF; /* textcolor active*/ + --dbtnbackactive: #000000; /* background active*/ + --dbtnborderactive: #FF5252; /* border active */ + /* disabled */ + --dbtnforedisabled: #999999; /* textcolor disabled*/ + --dbtnbackdisabled: #000000; /* background disabled*/ + --dbtnborderdisabled: #515151; /* border disabled */ + /* badge */ + --dbtnforebadge: #FF5252; /* textcolor badge*/ + --dbtnbackbadge: #000000; /* background badge*/ + --dbtnborderbadge: #000000; /* border badge */ + /* link button */ + /* unselected */ + --lbtnfore: #336CDF; /* textcolor */ + --lbtnback: #000000; /* background */ + --lbtnborder: #E6E6E6; /* border */ + /* hover */ + --lbtnforehover: #437CEF; /* textcolor hover*/ + --lbtnbackhover: #000000; /* background hover*/ + --lbtnborderhover: #E6E6E6; /* border hover */ + /* active */ + --lbtnforeactive: #437CEF; /* textcolor active*/ + --lbtnbackactive: transparent; /* background active*/ + --lbtnborderactive: #E6E6E6; /* border active */ + /* disabled */ + --lbtnforedisabled: #999999; /* textcolor disabled*/ + --lbtnbackdisabled: #515151; /* background disabled*/ + --lbtnborderdisabled: #515151; /* border disabled */ + /* navtabs (complete independent) */ + /* active */ + --navtabforeactive: #336CDF; /* textcolor active navtab */ + --navtabbackactive: #000000; /* background active navtab */ + --navtabborderactive: #336CDF; /* border active navtab */ + /* inactive */ + --navtabforeinactive: #E6E6E6; /* textcolor inactive navtab */ + --navtabbackinactive: #000000; /* background inactive navtab */ + --navtabborderinactive: #E6E6E6; /* border inactive navtab */ + /* hover */ + --navtabforehover: #E6E6E6; /* textcolor navtab hover */ + --navtabbackhover: #000000; /* background navtab hover */ + --navtabborderhover: #336CDF; /* border navtab hover */ + /* tabulator (complete independent) */ + /* tabulator frame foot background */ + --tbfback: #000000; + /* tabulator header */ + --tbheadfore: #E6E6E6; /* background */ + --tbheadback: #1F1F1F; /* background */ + --tbheadbackhover: #1F1F1F; /* background hover*/ + --tbborder: #515151; /* border color headline */ + /* tabulator body */ + --tbbodybackhover: #333333; /* first row hover*/ + --tbbordertable: #515151; /* border color table */ + /* odd row */ + --tbrowforeodd: #E6E6E6; /* background */ + --tbrowbackodd: #000000; /* background */ + /* even row */ + --tbrowforeeven: #E6E6E6; /* background */ + --tbrowbackeven: #000000; /* background */ + /* tabulator footer */ + /* unselected */ + --tffore: #E6E6E6; /* textcolor */ + --tfback: #000000; /* background */ + --tfborder: #E6E6E6; /* border */ + /* hover */ + --tfforehover: #E6E6E6; /* textcolor hover*/ + --tfbackhover: #000000; /* border hover */ + --tfborderhover: #336CDF; /* textcolor hover*/ + /* active */ + --tfforeactive: #336CDF; /* textcolor active*/ + --tfbackactive: #000000; /* background active*/ + --tfborderactive: #336CDF; /* border active */ + /* active hover*/ + --tfforeactivehover: #467ECF; /* textcolor active*/ + --tfbackactivehover: #000000; /* background active*/ + --tfborderactivehover: #467CCF; /* border active */ + /* panel, example: Reporting health */ + --panelbody: #000000; /* panel body background*/ + --panelheading: #000000; /* panel heading background*/ + --panelheadingfore: #E6E6E6; /* panel heading textcolor*/ + --panelfooter: #000000; /* panel footer */ + --panelinfo: #E6E6E6; /* panel info, example wait circle */ + /* content-box, example report traffic*/ + --contentboxfore: #E6E6E6; /* content-box foreground and tabulator frame head background*/ + --contentboxback: #000000; /* content-box background and tabulator frame head background*/ + /* table */ + --tableheadfore: #E6E6E6; /* textcolor table head */ + --tablelegend: #E6E6E6; + --tableborder: #515151; /* background table in a table */ + /* table not stripe */ + --tablefore: #E6E6E6; /* textcolor table */ + --tableback: #000000; /* background table */ + /* table stripe */ + --tablestripeback: #000000; /* alternative background table */ + /* table inside a table */ + --tabletablefore: #E6E6E6; /* headline table in a table */ + --tabletableback: #000000; /* background table in a table */ + /* scrollbar */ + --scbarcolor: #4D4D4D #000000; /* scrollbarcolor: foreground vs background, the following colors are not important */ + --scbarborder: #515151; /* bordercolor scrollbar*/ + --scbar: #4D4D4D; /* scrollbar foreground*/ + --scbarhover: #5D5D5D; /* scrollbar foreground hover*/ + --scbarbutton: #4D4D4D; /* scrollbar button*/ + /* unbound (complete independent) */ + --unbiconsback: rgba(33,33,33,0.9); /* large icons on tabs */ + --unbfore1: #E6E6E6; /* main text 1 */ + --unbback1: #1F1F1F; /* background 1 */ + --unbfore2: #008CDD; /* main text 2 */ + --unbback2: #1F1F1F; /* background 2 */ + --unbborder: #4D4D4D; /* unbound-border */ + --unbborderactive: #336CDF; /* unbound-border active */ + --unbsuccess: rgba(16,175,66,0.4); /* unbound detail background success */ + --unbsuccessfore: rgba(241,241,241,1); /* unbound textcolor success */ + --unbinfo: rgba(51,108,223,0.4); /* unbound detail background info */ + --unbinfofore: rgba(241,241,241,1); /* unbound textcolor info */ + --unbdanger: rgba(239,48,64,0.6); /* unbound detail background danger */ + --unbdangerfore: rgba(241,241,241,1); /* unbound textcolor danger */ + --unbwarning: rgba(219,57,61,0.4); /* unbound detail background warning */ + --unbwarningfore: rgba(241,241,241,1,1); /* unbound textcolor warning */ + --unberror: rgba(18,19,19,0); /* unbound detail background error */ + --unberrorfore: rgba(162,17,42,1); /* unbound textcolor error */ + --unbshadow: rgba(47,47,47,.8); /* unbound overview circle shadow */ + /* dashboard, (independent, despite the buttons on the top ) */ + --dbfore: #E6E6E6; /* textcolor dashboard */ + --dbback: #000000; /* background color dashboard */ + --dbbackhover: #000000; /* background color dashboard */ + --dbborder: rgba(80,80,80,1); /* bordercolor dashboard */ + --dbchartfore: rgba(241,241,241,1); /* textcolor dashboard charts */ + --dbchartborder: rgba(61,61,61,1); /* bordercolor dashboard charts*/ + --dbtoolfore: #000000; /* textcolor tooltip dashboard */ + --dbtoolback: rgba(241, 241, 241, 0.9); /*background color tooltip */ + /* graph */ + --graphfore: #E6E6E6; + --graphback: #000000; + --nv3daxis: #E6E6E6; + /* rgb */ + --rgb50: rgba(255,255,255,0,5); + --rgbshadowdark: rgba(255,255,255,.1); + --bootstrapshadow: rgba(204, 204, 204, 0.2); + --boxshadow: inset 0 1px 1px rgba(255,255,255,0.075); + --btnshadow1: inset 0 1px 1px rgba(25, 57, 183, 0.075); + --btnshadow2: 0 0 8px rgba(25, 57, 183, 0.6); + --progresshadow: inset 0px 1px 2px 1px rgb(217, 217, 217); + --progresshadow2: 0 5px 10px rgb(255, 255, 255, 0.1); + --mozshadow: 2px 2px 1px 0px rgba(234, 234, 234, 0.5) +} +.tokenize > .tokens-container { + position: relative; + list-style: none; + padding: 0 0 5px 5px; + height: auto; + min-height: 34px; + cursor: text; + border-radius: 3px; + border: 1px solid var(--txtboxborder); + background-color: var(--txtboxback); + color: var(--txtboxfore); +} + +.tokenize > .tokens-container.disabled { + background-color: var(--txtboxbackdisabled); + cursor: not-allowed; +} + +.tokenize.focus > .tokens-container { + outline: 0; + border-color:var(--txtboxborderhover); + background-color:var(--txtboxbackhover); + -webkit-box-shadow: none; + box-shadow: none; +} + +.tokenize > .tokens-container.input-sm { + padding: 0 0 4px 4px; + min-height: 30px; +} + +.tokenize > .tokens-container.input-lg { + padding: 0 0 9px 9px; + min-height: 46px; +} + +.tokenize > .tokens-container > .token { + padding: 0 1.2em 0 5px; + background-color: var(--txtboxbacktoken); + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + border: 1px solid var(--txtboxbordertoken); +} + +.tokenize > .tokens-container > .token, +.tokenize > .tokens-container > .placeholder, +.tokenize > .tokens-container > .token-search { + display: inline-block; + margin: 5px 5px 0 0; + position: relative; + vertical-align: middle; +} + +.tokenize.sortable > .tokens-container > .token { + cursor: move; +} + +.tokenize.single > .tokens-container > .token { + display: block; + border-color: var(--txtboxbordertoken); +} + +.tokenize.sortable > .tokens-container > .token.shadow { + border-color: var(--txtboxbordertoken); + background-color: var(--txtboxbacktoken); + filter: alpha(opacity=50); + opacity: .2; +} + +.tokenize > .tokens-container > .placeholder { + color:var(--txtboxforedisabled); + padding: 0; +} + +.tokenize > .tokens-container > .token-search { + color:var(--txtboxforetoken); + padding: 0; +} + +.tokenize > .tok01Fens-container:focus, +.tokenize > .tokens-container:hover { + border-color: var(--txtboxborderhover); + background-color: var(--txtboxbackhover); +} + +.tokenize > .tokens-container > .token-search > input { + padding: 0; + margin: 0; + line-height: 1em; + border:none; + outline: none; + width: 100%; + background-color: transparent; +} + +.tokenize > .tokens-container > .token-search > input::-ms-clear { + display: none; +} + +.tokenize > .tokens-container.input-sm > .placeholder, +.tokenize > .tokens-container.input-sm > .token-search, +.tokenize > .tokens-container.input-sm > .token { + margin: 4px 4px 0 0; +} + +.tokenize > .tokens-container.input-lg > .placeholder, +.tokenize > .tokens-container.input-lg > .token-search, +.tokenize > .tokens-container.input-lg > .token { + margin: 9px 9px 0 0; +} + +.tokenize > .tokens-container > .token.pending-delete { + background-color: var(--txtboxbackdel); + border-color: var(--txtboxborderdel); + color: var(--txtboxforedel); +} + +.tokenize > .tokens-container > .token > .dismiss { + position: absolute; + right: 5px; + color: var(--txtboxforedismiss); + text-decoration: none; + cursor: pointer; +} + +.tokenize > .tokens-container > .token > .dismiss:after { + content: "×"; + color: var(--txtboxforedismiss); +} + +.tokenize > .tokens-container > .token.pending-delete > .dismiss { + color: var(--txtboxforedismiss); +} + +.tokenize-dropdown { + position: absolute; + display: none; +} + +.tokenize-dropdown > .dropdown-menu { + min-height: 10px; + width: 100%; + display: block; + margin: -1px 0 0 0; + visibility: visible; + opacity: 1; +} + +.tokenize-dropdown > .dropdown-menu li { + cursor: pointer; +} + +.tokenize-dropdown > .dropdown-menu li > a .tokenize-highlight { + font-weight: bold; +} + +.tokenize-dropdown > .dropdown-menu li.locked { + padding: 3px 20px; + color: var(--txtboxforedisabled); + white-space: nowrap; +} + +.tokenize-dropdown > .dropdown-menu li.locked, +.tokenize-dropdown > .dropdown-menu li > a { + text-overflow: ellipsis; + overflow-x: hidden; +} + +.tokenize-dropdown > .dropdown-menu li:not(.active) a:hover, +.tokenize-dropdown > .dropdown-menu li:not(.active) a:focus { + background-color: transparent; +} diff --git a/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css.shadow b/misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css.sample similarity index 100% rename from misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css.shadow rename to misc/theme-flexcolor/src/opnsense/www/themes/flexcolor/build/css/tokenize2.css.sample diff --git a/misc/theme-rebellion/Makefile b/misc/theme-rebellion/Makefile index 20a3f7b783..0711ceeae1 100644 --- a/misc/theme-rebellion/Makefile +++ b/misc/theme-rebellion/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= theme-rebellion -PLUGIN_VERSION= 1.9.4 +PLUGIN_VERSION= 1.9.3 PLUGIN_COMMENT= A suitably dark theme PLUGIN_MAINTAINER= martin@queens-park.com PLUGIN_NO_ABI= yes diff --git a/misc/theme-rebellion/src/opnsense/www/themes/rebellion/build/css/opnsense-bootgrid.css b/misc/theme-rebellion/src/opnsense/www/themes/rebellion/build/css/opnsense-bootgrid.css deleted file mode 100644 index 76e0b46f3d..0000000000 --- a/misc/theme-rebellion/src/opnsense/www/themes/rebellion/build/css/opnsense-bootgrid.css +++ /dev/null @@ -1,276 +0,0 @@ -/** -* Main theming elements -*/ -.tabulator { - font-size: 15px; - background-color: transparent; - border: 1px solid #E5E5E5; -} - -/* theme: header */ -.tabulator .tabulator-header { - background-color: transparent; - border-bottom: none; -} - -.tabulator .tabulator-header .tabulator-col { - border-right: 1px solid #E5E5E5; - background-color: transparent; - background: transparent; - color: #ECECEC; -} - -.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover { - background-color: #373736; -} - -.tabulator .tabulator-headers { - height: 100% !important; /* make sure the border below appears */ - border-bottom: 1px solid #E5E5E5; -} - -/*------------*/ -/* theme: body */ -.tabulator .tabulator-tableholder .tabulator-table { - background-color: transparent; -} - -.tabulator-row { - background-color: transparent; - color: #ECECEC; -} - -.tabulator-row.tabulator-row-odd { - background-color: #373736; -} - -.tabulator-row.tabulator-row-odd.tabulator-selectable:hover:not(.tabulator-selected) { - background-color: #373736; -} - -.tabulator-row.tabulator-row-even { - background-color: transparent; -} - -.tabulator-row.tabulator-row-even.tabulator-selectable:hover:not(.tabulator-selected) { - background-color: transparent; -} - -.tabulator .tabulator-tableholder { - background-color: transparent; - border-right: 1px solid #373736; -} - -.tabulator-row.tabulator-selected { - background-color: #9abcea; -} - -.tabulator-row.tabulator-selected:hover { - cursor: pointer; - background-color: #9abcea; -} - -.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg { - color: #ECECEC; /* spinner icon */ -} - -/* Command column styles */ -.tabulator-col.tabulator-frozen.tabulator-frozen-right { - background-color: #333333; -} - -.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right { - background-color: #333333; -} - -/* Checkbox column styles */ -.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left { - border-right: 1px solid #E5E5E5; /* separates checkbox column from table rows */ - border-left: 1px solid #373736; -} - -.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left { - border-right: 1px solid #E5E5E5; - border-top: 1px solid #373736; - border-bottom: 1px solid #E5E5E5; - border-left: 1px solid #373736; -} - -.tabulator-col.tabulator-row-header.tabulator-frozen.tabulator-frozen-left { - background-color: #333333; -} - -.tabulator-cell.tabulator-row-header.tabulator-frozen.tabulator-frozen-left { - background-color: #333333; -} - -/*------------*/ -/* theme: cells */ -.tabulator-row .tabulator-cell { - text-overflow: ellipsis; - white-space: nowrap; - line-height: 1.2; - vertical-align: top; - border-bottom: 1px solid rgba(229, 229, 229, 0.5); - border-right: 1px solid rgba(229, 229, 229, 0.5); -} - -/*-------------*/ -/* theme: footer */ -.tabulator .tabulator-footer { - border-top: 1px solid #E5E5E5; - background-color: transparent; -} - -.tabulator .tabulator-footer .tabulator-page { - background-color: #333333; - color: #C03E14; -} - -.tabulator .tabulator-footer .tabulator-page.active { - background-color: #C03E14; - border-color: #C03E14; - cursor: default; - color: #333333; -} - -.tabulator .tabulator-footer .tabulator-page:not(disabled):hover { - color: #7b280d; - background-color: #242937; - border-color: #ddd; -} - -.tabulator .tabulator-footer .tabulator-page:not(disabled).active:hover { - background-color: #C03E14; - border-color: #C03E14; - color: #333333; - cursor: default; -} - -.tabulator-page-counter { - color: #ECECEC; -} - -.tabulator .tabulator-footer .tabulator-paginator { - color: #ECECEC; -} - -.tabulator .tabulator-footer .tabulator-page { - border-radius: 0px; - margin: 0px; - padding: 6px 12px; - border: 1px solid #E5E5E5; -} - -/*----------*/ -/* end of main theming elements */ -.tabulator-paginator { - flex: 0 !important; -} - -.tabulator-page-counter { - flex: 1; - text-align: right; -} - -.tabulator-col-sorter i { - display: flex; - justify-content: center; - align-items: center; -} - -.tabulator .tabulator-header .tabulator-col { - padding: 5px; -} - -.tabulator .tabulator-headers > :first-child { - padding-left: 10px; -} - -.opnsense-bootgrid-responsive { - white-space: wrap !important; - text-overflow: inherit !important; - overflow: visible !important; - word-break: break-word !important; -} - -.opnsense-bootgrid-ellipsis { - overflow: hidden !important; - white-space: nowrap !important; - text-overflow: ellipsis !important; -} - -.tabulator-row > :first-child { - padding-left: 10px; -} - -.tabulator .tabulator-header .tabulator-col .tabulator-col-content { - padding: 0px; -} - -.tabulator-page-counter { - padding-right: 20px; -} - -.bootgrid-footer-commands { - width: 90px; - padding-left: 8px; -} - -.tabulator-tableholder::after { - content: ""; - display: block; - width: 1px; - height: 1px; - min-width: 100%; -} - -.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:first-child { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.tabulator .tabulator-footer .tabulator-paginator .tabulator-page:last-child { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -/* border line corrections and hover/selection behavior */ -.tabulator-row:first-child > .tabulator-cell { - border-top: none; -} - -.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title { - padding: 0px; -} - -/* Row highlight behavior */ -@keyframes highlight { - 0% { - background: #ffff99; - } - 100% { - background: none; - } -} -.highlight-bg { - animation: highlight 2s; -} - -/* Tabulator "loading" and "error" overrides */ -.tabulator .tabulator-alert { - background: none; -} - -.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg { - border: none; -} - -.tabulator .tabulator-alert .tabulator-alert-msg { - background: initial; - font-size: 18px; -} - -.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error { - border: none; -} diff --git a/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/General.xml b/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/General.xml index 19118edcef..c3e0d7e951 100644 --- a/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/General.xml +++ b/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/General.xml @@ -7,9 +7,18 @@ 0 Y - - - + + + N + + + + N + + + + N + 0 Y @@ -27,6 +36,8 @@ Y + , + N Y diff --git a/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/User.xml b/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/User.xml index 9b788f584b..9a705d5320 100644 --- a/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/User.xml +++ b/net-mgmt/net-snmp/src/opnsense/mvc/app/models/OPNsense/Netsnmp/User.xml @@ -10,19 +10,22 @@ Y + Y /^([0-9a-zA-Z._\-]){1,64}$/u - Should be a string between 1 and 64 characters. Allowed characters are 0-9a-zA-Z_-. + Should be a string between 1 and 64 characters. Allowed characters are 0-9a-zA-Z._- + Y /^([0-9a-zA-Z._\-\!\$\%\/\(\)\+\#\=]){8,64}$/u - Should be a string between 8 and 64 characters. Allowed characters are 0-9a-zA-Z_-!$%/()+#=. + Should be a string between 8 and 64 characters. Allowed characters are 0-9a-zA-Z._-!$%/()+#= + Y /^([0-9a-zA-Z._\-\!\$\%\/\(\)\+\#\=]){8,64}$/u - Should be a string between 8 and 64 characters. Allowed characters are 0-9a-zA-Z_-!$%/()+#=. + Should be a string between 8 and 64 characters. Allowed characters are 0-9a-zA-Z._-!$%/()+#= 0 diff --git a/net-mgmt/net-snmp/src/opnsense/service/templates/OPNsense/Netsnmp/snmpd.conf b/net-mgmt/net-snmp/src/opnsense/service/templates/OPNsense/Netsnmp/snmpd.conf index cdf813a1a6..61699aea19 100644 --- a/net-mgmt/net-snmp/src/opnsense/service/templates/OPNsense/Netsnmp/snmpd.conf +++ b/net-mgmt/net-snmp/src/opnsense/service/templates/OPNsense/Netsnmp/snmpd.conf @@ -18,8 +18,6 @@ agentxsocket /var/agentx/master agentxperms 777 777 {% endif %} -smuxsocket 127.0.0.1 - {% if OPNsense.netsnmp.general.enableobservium == '1' %} extend .1.3.6.1.4.1.2021.7890.1 distro /usr/local/opnsense/scripts/OPNsense/Netsnmp/distro.sh extend .1.3.6.1.4.1.2021.7890.2 hardware /bin/kenv smbios.planar.product diff --git a/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/Command.xml b/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/Command.xml index af8d72e492..a158754a3e 100644 --- a/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/Command.xml +++ b/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/Command.xml @@ -10,6 +10,7 @@ Y + Y /^[0-9a-z_\-]{1,32}$/ui Only alphanumeric characters, dashes and underscores allowed. diff --git a/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/General.xml b/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/General.xml index 5e4975e407..b1ed611e84 100644 --- a/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/General.xml +++ b/net-mgmt/nrpe/src/opnsense/mvc/app/models/OPNsense/Nrpe/General.xml @@ -14,11 +14,13 @@ 127.0.0.1 Y + , Y 127.0.0.1,::1 Y + , Y diff --git a/net-mgmt/telegraf/pkg-descr b/net-mgmt/telegraf/pkg-descr index 70c56c7d57..2be143db98 100644 --- a/net-mgmt/telegraf/pkg-descr +++ b/net-mgmt/telegraf/pkg-descr @@ -12,10 +12,6 @@ WWW: https://www.influxdata.com/time-series-platform/telegraf/ Plugin Changelog ================ -1.12.14 - -* Add name_prefix in influxdb config - 1.12.13 * Implement memory_saving_mode formerly named enable_file_download (contributed by sopex) diff --git a/net-mgmt/telegraf/src/opnsense/mvc/app/controllers/OPNsense/Telegraf/forms/output.xml b/net-mgmt/telegraf/src/opnsense/mvc/app/controllers/OPNsense/Telegraf/forms/output.xml index ba6b50c21f..056f64a929 100644 --- a/net-mgmt/telegraf/src/opnsense/mvc/app/controllers/OPNsense/Telegraf/forms/output.xml +++ b/net-mgmt/telegraf/src/opnsense/mvc/app/controllers/OPNsense/Telegraf/forms/output.xml @@ -27,12 +27,6 @@ text Write timeout (for the InfluxDB client), formatted as a string. If not provided, will default to 5s. 0s means no timeout (not recommended).
- - output.influx_name_prefix - - text - Specifies a prefix to attach to the measurement name, formatted as a string. - output.influx_username diff --git a/net-mgmt/telegraf/src/opnsense/mvc/app/models/OPNsense/Telegraf/Output.xml b/net-mgmt/telegraf/src/opnsense/mvc/app/models/OPNsense/Telegraf/Output.xml index 199dbd6630..21c424e128 100644 --- a/net-mgmt/telegraf/src/opnsense/mvc/app/models/OPNsense/Telegraf/Output.xml +++ b/net-mgmt/telegraf/src/opnsense/mvc/app/models/OPNsense/Telegraf/Output.xml @@ -19,7 +19,6 @@ 5 N - N diff --git a/net-mgmt/telegraf/src/opnsense/service/templates/OPNsense/Telegraf/telegraf.conf b/net-mgmt/telegraf/src/opnsense/service/templates/OPNsense/Telegraf/telegraf.conf index acc65c9040..b5c1414c5c 100644 --- a/net-mgmt/telegraf/src/opnsense/service/templates/OPNsense/Telegraf/telegraf.conf +++ b/net-mgmt/telegraf/src/opnsense/service/templates/OPNsense/Telegraf/telegraf.conf @@ -66,9 +66,6 @@ {% if helpers.exists('OPNsense.telegraf.output.influx_timeout') and OPNsense.telegraf.output.influx_timeout != '' %} timeout = "{{ OPNsense.telegraf.output.influx_timeout }}s" {% endif %} -{% if helpers.exists('OPNsense.telegraf.output.influx_name_prefix') and OPNsense.telegraf.output.influx_name_prefix != '' %} - name_prefix = "{{ OPNsense.telegraf.output.influx_name_prefix }}" -{% endif %} {% if helpers.exists('OPNsense.telegraf.output.influx_username') and OPNsense.telegraf.output.influx_username != '' %} username = "{{ OPNsense.telegraf.output.influx_username }}" {% endif %} diff --git a/net-mgmt/zabbix-agent/Makefile b/net-mgmt/zabbix-agent/Makefile index a01225eb54..796854acee 100644 --- a/net-mgmt/zabbix-agent/Makefile +++ b/net-mgmt/zabbix-agent/Makefile @@ -1,8 +1,8 @@ PLUGIN_NAME= zabbix-agent -PLUGIN_VERSION= 1.18 +PLUGIN_VERSION= 1.16 PLUGIN_COMMENT= Zabbix monitoring agent PLUGIN_MAINTAINER= opnsense@moov.de -PLUGIN_VARIANTS= zabbix7 zabbix72 zabbix74 zabbix6 +PLUGIN_VARIANTS= zabbix7 zabbix72 zabbix6 zabbix7_NAME= zabbix7-agent zabbix7_DEPENDS= zabbix7-agent @@ -10,9 +10,6 @@ zabbix7_DEPENDS= zabbix7-agent zabbix72_NAME= zabbix72-agent zabbix72_DEPENDS= zabbix72-agent -zabbix74_NAME= zabbix74-agent -zabbix74_DEPENDS= zabbix74-agent - zabbix6_NAME= zabbix6-agent zabbix6_DEPENDS= zabbix6-agent diff --git a/net-mgmt/zabbix-agent/pkg-descr b/net-mgmt/zabbix-agent/pkg-descr index f884fbcd5a..0cae91b594 100644 --- a/net-mgmt/zabbix-agent/pkg-descr +++ b/net-mgmt/zabbix-agent/pkg-descr @@ -12,16 +12,6 @@ WWW: https://www.zabbix.com/ Plugin Changelog ---------------- -1.18 - -Added: -* Add ListenBacklog option (#5046) - -1.17 - -Added: -* Plugin variant for Zabbix Agent 7.4 - 1.16 Changed: diff --git a/net-mgmt/zabbix-agent/src/opnsense/mvc/app/controllers/OPNsense/ZabbixAgent/forms/settings.xml b/net-mgmt/zabbix-agent/src/opnsense/mvc/app/controllers/OPNsense/ZabbixAgent/forms/settings.xml index cc854c45bc..46fdf4947c 100644 --- a/net-mgmt/zabbix-agent/src/opnsense/mvc/app/controllers/OPNsense/ZabbixAgent/forms/settings.xml +++ b/net-mgmt/zabbix-agent/src/opnsense/mvc/app/controllers/OPNsense/ZabbixAgent/forms/settings.xml @@ -34,14 +34,6 @@ Optional - - zabbixagent.settings.main.listenBacklog - - text - 0 - 2147483647 - - zabbixagent.settings.main.serverList diff --git a/net-mgmt/zabbix-agent/src/opnsense/mvc/app/models/OPNsense/ZabbixAgent/ZabbixAgent.xml b/net-mgmt/zabbix-agent/src/opnsense/mvc/app/models/OPNsense/ZabbixAgent/ZabbixAgent.xml index 7c05fcd070..0a181f74bf 100644 --- a/net-mgmt/zabbix-agent/src/opnsense/mvc/app/models/OPNsense/ZabbixAgent/ZabbixAgent.xml +++ b/net-mgmt/zabbix-agent/src/opnsense/mvc/app/models/OPNsense/ZabbixAgent/ZabbixAgent.xml @@ -22,8 +22,7 @@ 127.0.0.1 Y Y - /^[a-zA-Z0-9\.:\[\]\-\/]+$/ - Y + /^([a-zA-Z0-9\.:\[\]\-\/]*?,)*([a-zA-Z0-9\.:\[\]\-\/]*)$/ lower Please provide valid Zabbix server addresses, i.e. zabbix.example.com, 10.0.0.2 or 10.0.0.0/24. @@ -39,16 +38,14 @@ Y N Y + , Please provide one or more valid IP addresses, i.e. 10.0.0.1. + N N Please provide a valid IP address, i.e. 10.0.0.1. - - 0 - 2147483647 - 100 @@ -116,9 +113,9 @@ Y + N Y - /^[a-zA-Z0-9\.:\[\]\-]+$/ - Y + /^([a-zA-Z0-9\.:\[\]\-]*?,)*([a-zA-Z0-9\.:\[\]\-]*)$/ lower Please provide valid active check receivers, i.e. 10.0.0.1:10051, zabbix.example.com or [::1]:30051. diff --git a/net-mgmt/zabbix-agent/src/opnsense/service/templates/OPNsense/ZabbixAgent/zabbix_agentd.conf b/net-mgmt/zabbix-agent/src/opnsense/service/templates/OPNsense/ZabbixAgent/zabbix_agentd.conf index f8f08a5b50..bafea22b4f 100644 --- a/net-mgmt/zabbix-agent/src/opnsense/service/templates/OPNsense/ZabbixAgent/zabbix_agentd.conf +++ b/net-mgmt/zabbix-agent/src/opnsense/service/templates/OPNsense/ZabbixAgent/zabbix_agentd.conf @@ -33,10 +33,6 @@ Server={{OPNsense.ZabbixAgent.settings.main.serverList}} ListenPort={{OPNsense.ZabbixAgent.settings.main.listenPort}} ListenIP={{OPNsense.ZabbixAgent.settings.main.listenIP}} -{% if helpers.exists('OPNsense.ZabbixAgent.settings.main.listenBacklog') and OPNsense.ZabbixAgent.settings.main.listenBacklog != '' %} -ListenBacklog={{ OPNsense.ZabbixAgent.settings.main.listenBacklog }} -{% endif %} - {% if OPNsense.ZabbixAgent.settings.features.enableActiveChecks == '1' and OPNsense.ZabbixAgent.settings.features.activeCheckServers|default("") != "" %} ServerActive={{OPNsense.ZabbixAgent.settings.features.activeCheckServers}} {% endif %} diff --git a/net-mgmt/zabbix-proxy/Makefile b/net-mgmt/zabbix-proxy/Makefile index 1500e25317..228a5a6437 100644 --- a/net-mgmt/zabbix-proxy/Makefile +++ b/net-mgmt/zabbix-proxy/Makefile @@ -1,8 +1,8 @@ PLUGIN_NAME= zabbix-proxy -PLUGIN_VERSION= 1.16 +PLUGIN_VERSION= 1.13 PLUGIN_COMMENT= Zabbix monitoring proxy PLUGIN_MAINTAINER= m.muenz@gmail.com -PLUGIN_VARIANTS= zabbix7 zabbix72 zabbix74 zabbix6 +PLUGIN_VARIANTS= zabbix7 zabbix72 zabbix6 zabbix7_NAME= zabbix7-proxy zabbix7_DEPENDS= zabbix7-proxy @@ -10,9 +10,6 @@ zabbix7_DEPENDS= zabbix7-proxy zabbix72_NAME= zabbix72-proxy zabbix72_DEPENDS= zabbix72-proxy -zabbix74_NAME= zabbix74-proxy -zabbix74_DEPENDS= zabbix74-proxy - zabbix6_NAME= zabbix6-proxy zabbix6_DEPENDS= zabbix6-proxy diff --git a/net-mgmt/zabbix-proxy/pkg-descr b/net-mgmt/zabbix-proxy/pkg-descr index 8b9d500538..7de9a21811 100644 --- a/net-mgmt/zabbix-proxy/pkg-descr +++ b/net-mgmt/zabbix-proxy/pkg-descr @@ -12,19 +12,6 @@ WWW: https://www.zabbix.com/ Plugin Changelog ---------------- -1.16 - -* Add StartAgentPollers and MaxConcurrentChecksPerPoller options (#5037) -* Add ListenBacklog option (#5046) - -1.15 - -* Add VMware parameters (contributed by us3241) - -1.14 - -* Add plugin variant for Zabbix Proxy 7.4 - 1.13 * Removed plugin variant for Zabbox Proxy 5.0 which is EoL diff --git a/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/controllers/OPNsense/Zabbixproxy/forms/general.xml b/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/controllers/OPNsense/Zabbixproxy/forms/general.xml index c31655fb8f..a75cc7eb2d 100644 --- a/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/controllers/OPNsense/Zabbixproxy/forms/general.xml +++ b/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/controllers/OPNsense/Zabbixproxy/forms/general.xml @@ -57,12 +57,6 @@ text Source IP address for outgoing connections. - - general.listenbacklog - - text - The maximum number of pending connections in the TCP queue. - general.startpollers @@ -81,12 +75,6 @@ text Number of pre-forked instances of pollers for unreachable hosts (including IPMI and Java). - - general.startagentpollers - - text - The number of pre-forked instances of Zabbix agent pollers. - general.starttrappers @@ -111,12 +99,6 @@ text Number of pre-forked instances of VMware Collectors. - - general.maxconcurrentchecksperpoller - - text - The maximum number of asynchronous checks that can be executed at once. - general.starthttppollers @@ -173,34 +155,6 @@ true IP address of host allowed to retrieve proxy statistics. - - general.vmwarecachesize - - text - Shared memory size for storing VMware data. - true - - - general.vmwarefrequency - - text - Delay in seconds between data gathering from a single VMware service. - true - - - general.vmwareperffrequency - - text - Delay in seconds between performance counter statistics retrieval from a single VMware service. - true - - - general.vmwaretimeout - - text - The maximum number of seconds vmware collector will wait for a response from VMware service. - true - general.syslogEnable diff --git a/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/models/OPNsense/Zabbixproxy/General.xml b/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/models/OPNsense/Zabbixproxy/General.xml index 24ccaf3833..fc214f6917 100644 --- a/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/models/OPNsense/Zabbixproxy/General.xml +++ b/net-mgmt/zabbix-proxy/src/opnsense/mvc/app/models/OPNsense/Zabbixproxy/General.xml @@ -23,24 +23,13 @@ + , Y - - 0 - 2147483647 - - - 0 - 1000 - - - 1 - 1000 - @@ -58,23 +47,9 @@ + , Y - - /^\d+[KMG]$/ - - - 10 - 86400 - - - 10 - 86400 - - - 1 - 300 - 0 Y diff --git a/net-mgmt/zabbix-proxy/src/opnsense/service/templates/OPNsense/Zabbixproxy/zabbix_proxy.conf.in b/net-mgmt/zabbix-proxy/src/opnsense/service/templates/OPNsense/Zabbixproxy/zabbix_proxy.conf.in index 6849c02b60..80373b0e1e 100644 --- a/net-mgmt/zabbix-proxy/src/opnsense/service/templates/OPNsense/Zabbixproxy/zabbix_proxy.conf.in +++ b/net-mgmt/zabbix-proxy/src/opnsense/service/templates/OPNsense/Zabbixproxy/zabbix_proxy.conf.in @@ -25,9 +25,6 @@ ListenPort={{ OPNsense.zabbixproxy.general.listenport }} {% if helpers.exists('OPNsense.zabbixproxy.general.sourceip') and OPNsense.zabbixproxy.general.sourceip != '' %} SourceIP={{ OPNsense.zabbixproxy.general.sourceip }} {% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.listenbacklog') and OPNsense.zabbixproxy.general.listenbacklog != '' %} -ListenBacklog={{ OPNsense.zabbixproxy.general.listenbacklog }} -{% endif %} {% if helpers.exists('OPNsense.zabbixproxy.general.syslogEnable') and OPNsense.zabbixproxy.general.syslogEnable == '1' %} LogType=system {% else %} @@ -60,12 +57,6 @@ StartIPMIPollers={{ OPNsense.zabbixproxy.general.startipmipollers }} {% if helpers.exists('OPNsense.zabbixproxy.general.startpollersunreachable') and OPNsense.zabbixproxy.general.startpollersunreachable != '' %} StartPollersUnreachable={{ OPNsense.zabbixproxy.general.startpollersunreachable }} {% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.startagentpollers') and OPNsense.zabbixproxy.general.startagentpollers != '' %} -StartAgentPollers={{ OPNsense.zabbixproxy.general.startagentpollers }} -{% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.maxconcurrentchecksperpoller') and OPNsense.zabbixproxy.general.maxconcurrentchecksperpoller != '' %} -MaxConcurrentChecksPerPoller={{ OPNsense.zabbixproxy.general.maxconcurrentchecksperpoller }} -{% endif %} {% if helpers.exists('OPNsense.zabbixproxy.general.starttrappers') and OPNsense.zabbixproxy.general.starttrappers != '' %} StartTrappers={{ OPNsense.zabbixproxy.general.starttrappers }} {% endif %} @@ -93,18 +84,6 @@ HistoryCacheSize={{ OPNsense.zabbixproxy.general.historycachesize }} {% if helpers.exists('OPNsense.zabbixproxy.general.historyindexcachesize') and OPNsense.zabbixproxy.general.historyindexcachesize != '' %} HistoryIndexCacheSize={{ OPNsense.zabbixproxy.general.historyindexcachesize }} {% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.vmwarecachesize') and OPNsense.zabbixproxy.general.vmwarecachesize != '' %} -VMwareCacheSize={{ OPNsense.zabbixproxy.general.vmwarecachesize }} -{% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.vmwarefrequency') and OPNsense.zabbixproxy.general.vmwarefrequency != '' %} -VMwareFrequency={{ OPNsense.zabbixproxy.general.vmwarefrequency }} -{% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.vmwareperffrequency') and OPNsense.zabbixproxy.general.vmwareperffrequency != '' %} -VMwarePerfFrequency={{ OPNsense.zabbixproxy.general.vmwareperffrequency }} -{% endif %} -{% if helpers.exists('OPNsense.zabbixproxy.general.vmwaretimeout') and OPNsense.zabbixproxy.general.vmwaretimeout != '' %} -VMwareTimeout={{ OPNsense.zabbixproxy.general.vmwaretimeout }} -{% endif %} {% if helpers.exists('OPNsense.zabbixproxy.general.timeout') and OPNsense.zabbixproxy.general.timeout != '' %} Timeout={{ OPNsense.zabbixproxy.general.timeout }} {% endif %} diff --git a/net/chrony/Makefile b/net/chrony/Makefile index d4d807ea8b..02436f088c 100644 --- a/net/chrony/Makefile +++ b/net/chrony/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= chrony PLUGIN_VERSION= 1.5 -PLUGIN_REVISION= 3 +PLUGIN_REVISION= 2 PLUGIN_COMMENT= Chrony time synchronisation PLUGIN_DEPENDS= chrony PLUGIN_MAINTAINER= m.muenz@gmail.com diff --git a/net/chrony/src/opnsense/mvc/app/views/OPNsense/Chrony/general.volt b/net/chrony/src/opnsense/mvc/app/views/OPNsense/Chrony/general.volt index 40d7552e95..308d4c4eaf 100644 --- a/net/chrony/src/opnsense/mvc/app/views/OPNsense/Chrony/general.volt +++ b/net/chrony/src/opnsense/mvc/app/views/OPNsense/Chrony/general.volt @@ -62,7 +62,7 @@ // Put API call into a function, needed for auto-refresh function update_chronysources() { ajaxCall(url="/api/chrony/service/chronysources", sendData={}, callback=function(data,status) { - $("#listchronysources").text($('
').html(data['response']).text()); + $("#listchronysources").text(data['response']); }); } diff --git a/net/freeradius/Makefile b/net/freeradius/Makefile index 3b4090d528..b40352f967 100644 --- a/net/freeradius/Makefile +++ b/net/freeradius/Makefile @@ -1,6 +1,5 @@ PLUGIN_NAME= freeradius -PLUGIN_VERSION= 1.9.28 -PLUGIN_REVISION= 1 +PLUGIN_VERSION= 1.9.27 PLUGIN_COMMENT= RADIUS Authentication, Authorization and Accounting Server PLUGIN_DEPENDS= freeradius3 PLUGIN_MAINTAINER= m.muenz@gmail.com diff --git a/net/freeradius/pkg-descr b/net/freeradius/pkg-descr index cfd09d34c6..66640e76e9 100644 --- a/net/freeradius/pkg-descr +++ b/net/freeradius/pkg-descr @@ -9,14 +9,13 @@ needs of many Fortune-500 companies and Tier 1 ISPs. It is also widely used for Enterprise Wi-Fi and IEEE 802.1X network security, particularly in the academic community, including eduroam. -Plugin Changelog -================ +The server is fast, feature-rich, modular, and scalable. + +WWW: https://www.freeradius.org -1.9.28 -* Add Groups for VLAN assignment -* Add fallback PPSK (contributed by Tobias Perschon) -* Add fallback Tunnel-Password field (contributed by Robert Resch) +Plugin Changelog +================ 1.9.27 diff --git a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/Api/LdapgroupController.php b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/Api/LdapgroupController.php deleted file mode 100644 index 06b8377b95..0000000000 --- a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/Api/LdapgroupController.php +++ /dev/null @@ -1,203 +0,0 @@ - - * 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\Freeradius\Api; - -use OPNsense\Freeradius\Ldapgroup; -use OPNsense\Core\Config; -use OPNsense\Base\ApiMutableModelControllerBase; -use OPNsense\Base\UIModelGrid; - -class LdapgroupController extends ApiMutableModelControllerBase -{ - protected static $internalModelName = 'Ldapgroup'; - protected static $internalModelClass = '\OPNsense\Freeradius\Ldapgroup'; - - public function getAction() - { - // define list of configurable settings - $result = array(); - if ($this->request->isGet()) { - $mdlLdapgroup = new Ldapgroup(); - $result['ldapgroup'] = $mdlLdapgroup->getNodes(); - } - return $result; - } - - public function setAction() - { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - // load model and update with provided data - $mdlLdapgroup = new Ldapgroup(); - $mdlLdapgroup->setNodes($this->request->getPost("ldapgroup")); - // perform validation - $valMsgs = $mdlLdapgroup->performValidation(); - foreach ($valMsgs as $field => $msg) { - if (!array_key_exists("validations", $result)) { - $result["validations"] = array(); - } - $result["validations"]["ldapgroup." . $msg->getField()] = $msg->getMessage(); - } - // serialize model to config and save - if ($valMsgs->count() == 0) { - $mdlLdapgroup->serializeToConfig(); - Config::getInstance()->save(); - $result["result"] = "saved"; - } - } - return $result; - } - - public function searchLdapgroupAction() - { - $mdlLdapgroup = $this->getModel(); - $grid = new UIModelGrid($mdlLdapgroup->ldapgroups->ldapgroup); - return $grid->fetchBindRequest( - $this->request, - array("enabled", "ldapgroupname", "vlan" ) - ); - } - - public function getLdapgroupAction($uuid = null) - { - $mdlLdapgroup = $this->getModel(); - if ($uuid != null) { - $node = $mdlLdapgroup->getNodeByReference('ldapgroups.ldapgroup.' . $uuid); - if ($node != null) { - // return node - return array("ldapgroup" => $node->getNodes()); - } - } else { - $node = $mdlLdapgroup->ldapgroups->ldapgroup->add(); - return array("ldapgroup" => $node->getNodes()); - } - return array(); - } - - public function addLdapgroupAction() - { - $result = array("result" => "failed"); - if ($this->request->isPost() && $this->request->hasPost("ldapgroup")) { - $result = array("result" => "failed", "validations" => array()); - $mdlLdapgroup = $this->getModel(); - $node = $mdlLdapgroup->ldapgroups->ldapgroup->Add(); - $node->setNodes($this->request->getPost("ldapgroup")); - $valMsgs = $mdlLdapgroup->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "ldapgroup", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - unset($result['validations']); - // save config if validated correctly - $mdlLdapgroup->serializeToConfig(); - Config::getInstance()->save(); - unset($result['validations']); - $result["result"] = "saved"; - } - } - return $result; - } - - public function delLdapgroupAction($uuid) - { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlLdapgroup = $this->getModel(); - if ($uuid != null) { - if ($mdlLdapgroup->ldapgroups->ldapgroup->del($uuid)) { - $mdlLdapgroup->serializeToConfig(); - Config::getInstance()->save(); - $result['result'] = 'deleted'; - } else { - $result['result'] = 'not found'; - } - } - } - return $result; - } - - public function setLdapgroupAction($uuid) - { - if ($this->request->isPost() && $this->request->hasPost("ldapgroup")) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference('ldapgroups.ldapgroup.' . $uuid); - if ($node != null) { - $result = array("result" => "failed", "validations" => array()); - $ldapgroupInfo = $this->request->getPost("ldapgroup"); - $node->setNodes($ldapgroupInfo); - $valMsgs = $mdlSetting->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "ldapgroup", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - // save config if validated correctly - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - $result = array("result" => "saved"); - } - return $result; - } - } - } - return array("result" => "failed"); - } - - public function toggle_handler($uuid, $elements, $element) - { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference($elements . '.' . $element . '.' . $uuid); - if ($node != null) { - if ($node->enabled->__toString() == "1") { - $result['result'] = "Disabled"; - $node->enabled = "0"; - } else { - $result['result'] = "Enabled"; - $node->enabled = "1"; - } - // if item has toggled, serialize to config and save - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - } - } - } - return $result; - } - - public function toggleLdapgroupAction($uuid) - { - return $this->toggle_handler($uuid, 'ldapgroups', 'ldapgroup'); - } -} diff --git a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/LdapgroupController.php b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/LdapgroupController.php deleted file mode 100644 index 4834bf5fd0..0000000000 --- a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/LdapgroupController.php +++ /dev/null @@ -1,38 +0,0 @@ - - * 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\Freeradius; - -class LdapgroupController extends \OPNsense\Base\IndexController -{ - public function indexAction() - { - $this->view->formDialogEditFreeRADIUSLdapgroup = $this->getForm("dialogEditFreeRADIUSLdapgroup"); - $this->view->pick('OPNsense/Freeradius/ldapgroup'); - } -} diff --git a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSLdapgroup.xml b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSLdapgroup.xml deleted file mode 100644 index ac48a4bb23..0000000000 --- a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSLdapgroup.xml +++ /dev/null @@ -1,20 +0,0 @@ -
- - ldapgroup.enabled - - checkbox - This will enable or disable the user account. - - - ldapgroup.ldapgroupname - - text - The complete LDAP DN. - - - ldapgroup.vlan - - text - VLAN ID for the specific LDAP group. - -
diff --git a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSUser.xml b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSUser.xml index 992334fc29..0a6f50c54d 100644 --- a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSUser.xml +++ b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/dialogEditFreeRADIUSUser.xml @@ -164,10 +164,4 @@ true Select the configured AVPairs for this user. - - user.tunnel_password - - password - Set the Tunnel-Password attribute for the user. Allowed characters are 0-9, a-z, A-Z, and ,._-!$%/()+#=: with up to 128 characters. - diff --git a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/eap.xml b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/eap.xml index 1f9cc42dc5..cb032d2fcc 100644 --- a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/eap.xml +++ b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/eap.xml @@ -29,17 +29,6 @@ dropdown Choose the certificate the Radius service should use. - - eap.enable_pwd - - checkbox - This enables EAP-PWD authentication - - - eap.pwd_serverid - - text - eap.crl diff --git a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/general.xml b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/general.xml index aca4163624..13272db6f0 100644 --- a/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/general.xml +++ b/net/freeradius/src/opnsense/mvc/app/controllers/OPNsense/Freeradius/forms/general.xml @@ -25,13 +25,6 @@ true Define the Fallback VLAN group ID. - - general.fallback_tunnel_password - - password - true - Define the Fallback VLAN Tunnel-Password. Allowed characters are 0-9, a-z, A-Z, and ,._-!$%/()+#=: with up to 128 characters. - general.ldap_enabled diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Eap.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Eap.xml index 6a18117fe2..9bab64ac50 100644 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Eap.xml +++ b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Eap.xml @@ -9,7 +9,6 @@ N MD5 - PWD MSCHAPv2 PEAP TLS @@ -38,14 +37,6 @@ cert N - - 0 - Y - - - theserver@example.com - Y - crl N diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/General.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/General.xml index b530c42bcb..790839e8cc 100644 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/General.xml +++ b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/General.xml @@ -23,10 +23,16 @@ 1 4096 + + + You need to set a propper VLAN ID. + DependConstraint + + fallbackvlan_enabled + + + - - /^([0-9a-zA-Z._\-\!\$\%\/\(\)\+\#\=\{\}:]){1,128}$/u - 0 N diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldap.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldap.xml index 67cffa256e..a6165dd99b 100644 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldap.xml +++ b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldap.xml @@ -18,7 +18,7 @@ N - + N diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldapgroup.php b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldapgroup.php deleted file mode 100644 index 0e75f22967..0000000000 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldapgroup.php +++ /dev/null @@ -1,31 +0,0 @@ - - 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. -*/ - -class Ldapgroup extends BaseModel -{ -} diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldapgroup.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldapgroup.xml deleted file mode 100644 index b120513e4a..0000000000 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Ldapgroup.xml +++ /dev/null @@ -1,23 +0,0 @@ - - //OPNsense/freeradius/ldapgroup - FreeRADIUS ldapgroup configuration - 1.0.0 - - - - - 1 - Y - - - Y - - - N - 1 - 4096 - - - - - diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Menu/Menu.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Menu/Menu.xml index 8f471bcb4b..d74274127d 100644 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Menu/Menu.xml +++ b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Menu/Menu.xml @@ -8,7 +8,6 @@ - diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Proxy.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Proxy.xml index 8f25f7292e..f5b7673619 100644 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Proxy.xml +++ b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/Proxy.xml @@ -127,7 +127,7 @@ Y - + @@ -159,9 +159,12 @@ lower Please provide valid server addresses, i.e. radius.example.com, 10.0.0.2 or 10.0.0.0/24. - + + + N + - + @@ -171,9 +174,17 @@ Y - - - + + + N + + + + N + + + N + diff --git a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/User.xml b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/User.xml index b1e2dd2370..308802c78a 100644 --- a/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/User.xml +++ b/net/freeradius/src/opnsense/mvc/app/models/OPNsense/Freeradius/User.xml @@ -132,9 +132,6 @@ Y N - - /^([0-9a-zA-Z._\-\!\$\%\/\(\)\+\#\=\{\}:]){1,128}$/u - diff --git a/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/general.volt b/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/general.volt index 4db7788a6d..d87dedf7e9 100644 --- a/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/general.volt +++ b/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/general.volt @@ -1,33 +1,36 @@ {# - # Copyright (c) 2014-2017 Deciso B.V. - # Copyright (c) 2017 Michael Muenz - # 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. - #} + +OPNsense® is Copyright © 2014 – 2017 by Deciso B.V. +This file is Copyright © 2017 by Michael Muenz +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. + +#}
{{ partial("layout_partials/base_form",['fields':generalForm,'id':'frm_general_settings'])}} -
+
+
@@ -49,7 +52,7 @@ updateServiceControlUI('freeradius'); $("#saveAct_progress").removeClass("fa fa-spinner fa-pulse"); }); - }, true); + }); }); }); diff --git a/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/ldapgroup.volt b/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/ldapgroup.volt deleted file mode 100644 index 88d74b363e..0000000000 --- a/net/freeradius/src/opnsense/mvc/app/views/OPNsense/Freeradius/ldapgroup.volt +++ /dev/null @@ -1,135 +0,0 @@ -{# - -OPNsense® is Copyright © 2014 – 2017 by Deciso B.V. -Copyright (C) 2017 - 2025 Michael Muenz -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. - -#} - - - - - -
-
- - - - - - - - - - - - - - - - - -
{{ lang._('Enabled') }}{{ lang._('Groupname') }}{{ lang._('VLAN ID') }}{{ lang._('ID') }}{{ lang._('Commands') }}
- - -
-
-
-
- -

-
-
- -{{ partial("layout_partials/base_dialog",['fields':formDialogEditFreeRADIUSLdapgroup,'id':'dialogEditFreeRADIUSLdapgroup','label':lang._('Edit LDAP Group')])}} diff --git a/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/mods-enabled-eap b/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/mods-enabled-eap index 652bebc8e9..954edf8b66 100644 --- a/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/mods-enabled-eap +++ b/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/mods-enabled-eap @@ -87,13 +87,12 @@ eap { } -{% if OPNsense.freeradius.eap.enable_pwd == '1' %} # EAP-pwd -- secure password-based authentication # - pwd { + #pwd { # group = 19 - server_id = {{ OPNsense.freeradius.eap.pwd_serverid }} + # server_id = theserver@example.com # This has the same meaning as for TLS. # @@ -107,8 +106,7 @@ eap { # no User-Password, CHAP-Password, EAP-Message, etc. # # virtual_server = "inner-tunnel" - } -{% endif %} + #} # Cisco LEAP @@ -456,7 +454,7 @@ eap { # The values must be in quotes. # tls_min_version = "{{ OPNsense.freeradius.eap.tls_min_version }}" - tls_max_version = "1.3" + tls_max_version = "1.2" # Elliptical cryptography configuration # diff --git a/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/users b/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/users index 4fa541ac78..ff9a97916f 100644 --- a/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/users +++ b/net/freeradius/src/opnsense/service/templates/OPNsense/Freeradius/users @@ -24,9 +24,6 @@ Service-Type = {{ servicelist }}, {% endfor %} {% endif %} -{% if user_list.tunnel_password is defined %} - Tunnel-Password = {{ user_list.tunnel_password }}, -{% endif %} {% if helpers.exists('OPNsense.freeradius.general.vlanassign') and OPNsense.freeradius.general.vlanassign == '1' %} {% if user_list.vlan is defined %} Tunnel-Type = VLAN, @@ -101,28 +98,12 @@ DEFAULT Hint == "CSLIP" DEFAULT Hint == "SLIP" Framed-Protocol = SLIP +{% if helpers.exists('OPNsense.freeradius.general.fallbackvlan_enabled') and OPNsense.freeradius.general.fallbackvlan_enabled == '1' %} -{% if helpers.exists('OPNsense.freeradius.ldapgroup.ldapgroups.ldapgroup') %} -{% for ldapgroup_list in helpers.toList('OPNsense.freeradius.ldapgroup.ldapgroups.ldapgroup') %} -{% if ldapgroup_list.enabled == '1' %} -DEFAULT Ldap-Group == "{{ ldapgroup_list.ldapgroupname }}" - Tunnel-Type = VLAN, - Tunnel-Medium-Type = IEEE-802, - Tunnel-Private-Group-Id = "{{ ldapgroup_list.vlan }}" -{% endif %} -{% endfor %} -{% endif %} - -{% if OPNsense.freeradius.general.fallbackvlan_enabled == '1' %} DEFAULT Auth-Type := Accept Tunnel-Type = VLAN, Tunnel-Medium-Type = IEEE-802, -{% if helpers.exists('OPNsense.freeradius.general.fallbackvlan_id') and OPNsense.freeradius.general.fallbackvlan_id != '' %} Tunnel-Private-Group-Id = {{ OPNsense.freeradius.general.fallbackvlan_id }}, -{% endif %} -{% if helpers.exists('OPNsense.freeradius.general.fallback_tunnel_password') and OPNsense.freeradius.general.fallback_tunnel_password != '' %} - Tunnel-Password = {{ OPNsense.freeradius.general.fallback_tunnel_password }}, -{% endif %} Framed-Protocol = PPP {% endif %} {% endif %} diff --git a/net/frr/Makefile b/net/frr/Makefile index 72426c8e52..63a0a654c7 100644 --- a/net/frr/Makefile +++ b/net/frr/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= frr -PLUGIN_VERSION= 1.49 +PLUGIN_VERSION= 1.47 PLUGIN_COMMENT= The FRRouting Protocol Suite PLUGIN_DEPENDS= frr10-pythontools PLUGIN_MAINTAINER= ad@opnsense.org diff --git a/net/frr/pkg-descr b/net/frr/pkg-descr index 0f648c4dbe..c4bf9a4da1 100644 --- a/net/frr/pkg-descr +++ b/net/frr/pkg-descr @@ -12,19 +12,6 @@ WWW: https://frrouting.org/ Plugin Changelog ================ -1.49 - -* Add hint about service reload / restart behaviour -* Fix SNMP OSPF argument flags in RC configuration file -* Fix STATIC template interface issue -* Replace shell_exec() with mwexecfm() - -1.48 - -* Add BFD detect-multiplier, transmit-interval, receive-interval (opnsense/plugins/pull/5000) -* Add BGP enforce-first-as (opnsense/plugins/pull/5001) -* Add BGP bestpath route selection options (opnsense/plugins/pull/5002) - 1.47 * Add OSPF area configuration options (opnsense/plugins/pull/4880) diff --git a/net/frr/src/etc/rc.syshook.d/carp/50-frr b/net/frr/src/etc/rc.syshook.d/carp/50-frr index e028a3e1d5..5ffb4ca82a 100755 --- a/net/frr/src/etc/rc.syshook.d/carp/50-frr +++ b/net/frr/src/etc/rc.syshook.d/carp/50-frr @@ -49,14 +49,14 @@ if (frr_carp_enabled()) { switch ($type) { case 'MASTER': - mwexecfm('/usr/local/etc/rc.d/frr start'); + shell_exec('/usr/local/etc/rc.d/frr start'); break; case 'BACKUP': - mwexecfm('/usr/local/etc/rc.d/frr stop'); + shell_exec('/usr/local/etc/rc.d/frr stop'); break; } } elseif (frr_enabled()) { // XXX: when not toggling between active and disabled, pass event so underlaying protocols can // determine which actions to perform when reaching a certain state. - mwexecfm('/usr/local/opnsense/scripts/frr/carp_event_handler'); + shell_exec('/usr/local/opnsense/scripts/frr/carp_event_handler'); } diff --git a/net/frr/src/etc/rc.syshook.d/start/50-frr b/net/frr/src/etc/rc.syshook.d/start/50-frr index dd4254a89b..efded3c94a 100755 --- a/net/frr/src/etc/rc.syshook.d/start/50-frr +++ b/net/frr/src/etc/rc.syshook.d/start/50-frr @@ -1,37 +1,4 @@ -#!/usr/local/bin/php - - * Copyright (C) 2004 Scott Ullrich - * 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. - */ - -require_once('config.inc'); -require_once('util.inc'); -require_once('plugins.inc.d/frr.inc'); - -if (frr_enabled()) { - shell_exec('/usr/local/opnsense/scripts/frr/carp_event_handler'); -} \ No newline at end of file +# XXX this should not be strictly needed +/usr/local/etc/rc.d/frr start diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml index 5b1e02975a..f515a7b714 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml @@ -40,13 +40,6 @@ true Defines connected networks to be advertised over BGP. Disable Network Import-Check to announce all networks. - - bgp.bestpath - - select_multiple - true - Route selection modifiers that influence the best path. - bgp.networkimportcheck @@ -54,13 +47,6 @@ true When enabled (default), BGP only announces networks set at 'Network' if they are present in the routers routing table (alternatively, you can also set a null-route via System -> Routes). If disabled, all configured networks will be announced. - - bgp.enforce_first_as - - checkbox - true - Deny an update received from an external BGP (eBGP) peer that does not list its autonomous system number at the beginning of the AS_PATH in the incoming update. - bgp.logneighborchanges diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml index c9bf3bfb3e..fbaeabcd7d 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml @@ -31,34 +31,4 @@ boolean - - neighbor.detect_multiplier - - text - true - Configures the detection multiplier to determine packet loss. The remote transmission interval will be multiplied by this value to determine the connection loss detection timer. The default value is 3. - - false - - - - neighbor.receive_interval - - text - true - Configures the minimum interval that this system is capable of receiving control packets. The default value is 300 milliseconds. - - false - - - - neighbor.transmit_interval - - text - true - The minimum transmission interval (less jitter) that this system wants to use to send BFD control packets. Defaults to 300ms. - - false - - diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFArea.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFArea.xml index bd1170545f..a027c2187a 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFArea.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFArea.xml @@ -13,7 +13,7 @@ area.id text - Enter area ID in dotted (e.g. 0.0.0.1) format. You only need to define areas that are not normal. All areas defined in the network or interface tab will automatically be normal, unless explicitely overwritten here with a different area type. + Enter area ID in dotted (e.g. 0.0.0.1) format. area.type diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml index 962ff08e6b..4986cc173b 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml @@ -1,7 +1,7 @@ //OPNsense/quagga/bfd BFD configuration - 1.0.2 + 1.0.1 0 @@ -21,27 +21,6 @@ 0 Y - - 3 - Y - 1 - 255 - Value must be between 1 and 255. - - - 300 - Y - 10 - 4294967 - Value must be between 10 and 4294967. - - - 300 - Y - 10 - 4294967 - Value must be between 10 and 4294967. - diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml index 732e5aa16c..2a7c33da92 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml @@ -28,26 +28,11 @@ 1 Y - - 1 - Y - 0 Y - - - as-path confed - as-path multipath-relax - compare-routerid - peer-type multipath-relax - aigp - med missing-as-worst - - Y - diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml index 4ea5b86a75..6e59b88816 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml @@ -63,8 +63,9 @@ Y - stub + standard + standard stub stub no-summary nssa diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.php index 5d9213b738..c336b3ad22 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.php +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.php @@ -48,7 +48,7 @@ public function performValidation($validateFullModel = false) continue; } $key = $route->__reference; - if (!$route->network->isEmpty() && !$route->gateway->isEmpty()) { + if (!empty((string)$route->network) && !empty((string)$route->gateway)) { $net_proto = str_contains($route->network, ':') ? 'inet6' : 'inet'; $gw_proto = str_contains($route->gateway, ':') ? 'inet6' : 'inet'; if ($net_proto != $gw_proto) { @@ -57,10 +57,10 @@ public function performValidation($validateFullModel = false) ); } } - if ($route->gateway->isEmpty() && $route->interfacename->isEmpty()) { + if (empty((string)$route->gateway) && empty((string)$route->interfacename)) { $messages->appendMessage( new Message( - gettext("Either an interface or a gateway is required."), + gettext("When no interface is provided, at least a gateway must be offered"), $key . ".gateway" ) ); diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bfd.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bfd.volt index 2d496f1899..d7598f4668 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bfd.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bfd.volt @@ -74,12 +74,5 @@ POSSIBILITY OF SUCH DAMAGE. {{ partial('layout_partials/base_bootgrid_table', formGridEditBFDNeighbor)}}
-{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} {{ partial("layout_partials/base_dialog",['fields':formDialogEditBFDNeighbor,'id':formGridEditBFDNeighbor['edit_dialog_id'],'label':lang._('Edit Neighbor')])}} diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt index 5123843fbd..1014b83ada 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt @@ -172,14 +172,7 @@ POSSIBILITY OF SUCH DAMAGE. {{ partial('layout_partials/base_bootgrid_table', formGridEditBGPPeergroups)}} -{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} {{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPNeighbor,'id':formGridEditBGPNeighbor['edit_dialog_id'],'label':lang._('Edit Neighbor')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPASPaths,'id':formGridEditBGPASPaths['edit_dialog_id'],'label':lang._('Edit AS Paths')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPPrefixLists,'id':formGridEditBGPPrefixLists['edit_dialog_id'],'label':lang._('Edit Prefix Lists')])}} diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt index 0421762229..d6113799a3 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt @@ -51,11 +51,4 @@ POSSIBILITY OF SUCH DAMAGE.
{{ partial("layout_partials/base_form",['fields':generalForm,'id':'frm_general_settings'])}}
-{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt index 51d069d388..2a22a50394 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt @@ -199,14 +199,7 @@ POSSIBILITY OF SUCH DAMAGE. {{ partial('layout_partials/base_bootgrid_table', formGridEditRouteMaps)}} -{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} {{ partial("layout_partials/base_dialog",['fields':formDialogEditOSPFArea,'id':formGridEditOSPFArea['edit_dialog_id'],'label':lang._('Edit Area')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditOSPFNeighbor,'id':formGridEditOSPFNeighbor['edit_dialog_id'],'label':lang._('Edit Neighbor')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditNetwork,'id':formGridEditNetwork['edit_dialog_id'],'label':lang._('Edit Network')])}} diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt index fda09a55d0..0bb6e9f5b8 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt @@ -154,14 +154,7 @@ {{ partial('layout_partials/base_bootgrid_table', formGridEditRouteMaps)}} -{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} {{ partial("layout_partials/base_dialog",['fields':formDialogEditNetwork,'id':formGridEditNetwork['edit_dialog_id'],'label':lang._('Edit Network')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditInterface,'id':formGridEditInterface['edit_dialog_id'],'label':lang._('Edit Interface')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditPrefixLists,'id':formGridEditPrefixLists['edit_dialog_id'],'label':lang._('Edit Prefix Lists')])}} diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/rip.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/rip.volt index 332666f2f7..4434550201 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/rip.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/rip.volt @@ -51,11 +51,4 @@ POSSIBILITY OF SUCH DAMAGE.
{{ partial("layout_partials/base_form",['fields':ripForm,'id':'frm_rip_settings'])}}
-{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/static.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/static.volt index 33c01a198d..e0fb2d4f4c 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/static.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/static.volt @@ -71,12 +71,5 @@ {{ partial('layout_partials/base_bootgrid_table', formGridEditSTATICRoute)}} -{{ partial( - 'layout_partials/base_apply_button', - { - 'data_endpoint': '/api/quagga/service/reconfigure', - 'data_service_widget': 'quagga', - 'data_change_message_content': lang._('Apply will reload the service without causing interruptions. Some changes will need a full restart with the available service control buttons.') - } -) }} +{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/quagga/service/reconfigure', 'data_service_widget': 'quagga'}) }} {{ partial("layout_partials/base_dialog",['fields':formDialogEditSTATICRoute,'id':formGridEditSTATICRoute['edit_dialog_id'],'label':lang._('Edit Routes')])}} diff --git a/net/frr/src/opnsense/scripts/frr/frr_wrapper.sh b/net/frr/src/opnsense/scripts/frr/frr_wrapper.sh deleted file mode 100755 index 5b3a812991..0000000000 --- a/net/frr/src/opnsense/scripts/frr/frr_wrapper.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh - -# Copyright (c) 2025 Andy Binder -# -# 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 BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. - -# Service wrapper for starting/restarting frr service -# This wrapper is needed to react on specific service interactions through watchfrr. -# Startup details with watchfrr enabled (default): -# 1. "service frr start" calls "service frr start watchfrr" -# 2. watchfrr once started calls "service frr restart all" -# 3. "restart all" need to loop the list of $frr_daemons to start each -# of then -# 4. vtysh -b is executed to load boot startup configuration - -ACTION="$1" -COMMAND="$2" - -/usr/sbin/service frr "$ACTION" "$COMMAND" -SERVICE_EXIT_CODE=$? - -# If frr starts/restarts ospfd, e.g. on process error (parameter: start/restart ospfd) -if [ "$2" = "ospfd" ]; then - logger -t frr_wrapper "WATCHFRR - OSPFD - Starting CARP event handler now" - /usr/local/opnsense/scripts/frr/carp_event_handler -fi -# If frr starts up (parameter: restart all) -if [ "$2" = "all" ]; then - ( - /usr/bin/logger -t frr_wrapper "WATCHFRR - STARTUP - Starting CARP event handler now" - /usr/local/opnsense/scripts/frr/carp_event_handler - ) & -fi -exit $SERVICE_EXIT_CODE diff --git a/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf b/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf index 32b7e533c0..aa2e0b70bd 100644 --- a/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf +++ b/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf @@ -18,7 +18,7 @@ message:restarting frr description:Restart FRR [reload] -command:service frr reload; /usr/local/opnsense/scripts/frr/carp_event_handler +command:service frr reload parameters: type:script message:reloading frr diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf index 58db29a339..e4e3d832c8 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf @@ -5,9 +5,6 @@ bfd {% for neighbor in helpers.toList('OPNsense.quagga.bfd.neighbors.neighbor') %} {% if neighbor.enabled == '1' %} peer {{ neighbor.address }} {% if neighbor.multihop|default('0') == '1' %}multihop{% endif +%} - detect-multiplier {{ neighbor.detect_multiplier }} - receive-interval {{ neighbor.receive_interval }} - transmit-interval {{ neighbor.transmit_interval }} {% endif %} {% endfor %} {% endif %} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf index 140a66cf25..5f64a9bc39 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf @@ -31,9 +31,6 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }} {% if not helpers.empty('OPNsense.quagga.bgp.logneighborchanges') %} bgp log-neighbor-changes -{% endif %} -{% if OPNsense.quagga.bgp.enforce_first_as == '0' %} - no bgp enforce-first-as {% endif %} no bgp default ipv4-unicast no bgp ebgp-requires-policy @@ -45,11 +42,6 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }} {% if helpers.exists('OPNsense.quagga.bgp.graceful') and OPNsense.quagga.bgp.graceful == '1' %} bgp graceful-restart {% endif %} -{% if OPNsense.quagga.bgp.bestpath %} -{% for option in OPNsense.quagga.bgp.bestpath.split(',') %} - bgp bestpath {{ option }} -{% endfor %} -{% endif %} {% if helpers.exists('OPNsense.quagga.bgp.routerid') and OPNsense.quagga.bgp.routerid != '' %} bgp router-id {{ OPNsense.quagga.bgp.routerid }} {% endif %} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr index 97d1f02c09..c9069cd810 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr @@ -18,12 +18,20 @@ frr_carp_demote="{% if not helpers.empty('OPNsense.quagga.ospf.carp_demote') %} ospfd{% endif %}{% if not helpers.empty('OPNsense.quagga.ospf6.carp_demote') %} ospf6d{% endif %}" -watchfrr_flags="-r /usr/local/opnsense/scripts/frr/frr_wrapper.shbBrestartbB%s -s /usr/local/opnsense/scripts/frr/frr_wrapper.shbBstartbB%s -k /usr/sbin/servicebBfrrbBstopbB%s -b bB -t 30" +start_postcmd=' + # XXX rc.d/frr declares its own post command we need to hook first + start_postcmd + # XXX rc.d/frr iterates through daemons so we need to hook last one + if [ "${frr_daemons}" != "${frr_daemons% ${name}}" ]; then + echo "Starting CARP event handler now" + /usr/local/opnsense/scripts/frr/carp_event_handler + fi +' {% if OPNsense.quagga.general.enablesnmp == '1' %} zebra_flags="${zebra_flags} -M snmp" bgpd_flags="${bgpd_flags} -M snmp" -ospfd_flags="${ospfd_flags} -M snmp" -ospf6d_flags="${ospf6d_flags} -M snmp" +ospf_flags="${ospf_flags} -M snmp" +ospf6_flags="${ospf6_flags} -M snmp" {% endif %} {% else %} frr_enable="NO" diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/staticd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/staticd.conf index 43a810beb4..fdff7d0f28 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/staticd.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/staticd.conf @@ -2,18 +2,7 @@ {% if not helpers.empty('OPNsense.quagga.static.enabled') %} {% for route in helpers.toList('OPNsense.quagga.static.routes.route') %} {% if route.enabled == '1' %} -{%- if ':' in route.network %} -ipv6 -{%- else %} -ip -{%- endif %} - route {{ route.network }} -{%- if route.gateway %} - {{ route.gateway}} -{%- endif %} -{%- if route.interfacename %} - {{ helpers.physical_interface(route.interfacename) }} -{%- endif +%} +{% if ':' in route.network %}ipv6{% else %}ip{% endif %} route {{ route.network }} {{ route.gateway|default('')}} {{ helpers.physical_interface(route.interfacename) }} {% endif %} {% endfor %} {% endif %} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Syslog/local/routing_frr.conf b/net/frr/src/opnsense/service/templates/OPNsense/Syslog/local/routing_frr.conf index 61a95d16ac..ad0869d3c7 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Syslog/local/routing_frr.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Syslog/local/routing_frr.conf @@ -2,5 +2,5 @@ # Local syslog-ng configuration filter definition [FRR]. ################################################################### filter f_local_routing_frr { - program("bgpd") or program("ospfd") or program("ospf6d") or program("ripd") or program("zebra") or program("frr_carp") or program("frr_wrapper"); + program("bgpd") or program("ospfd") or program("ospf6d") or program("ripd") or program("zebra") or program("frr_carp"); }; diff --git a/net/ftp-proxy/src/opnsense/mvc/app/models/OPNsense/FtpProxy/FtpProxy.xml b/net/ftp-proxy/src/opnsense/mvc/app/models/OPNsense/FtpProxy/FtpProxy.xml index f105108f07..a2c7447f3a 100644 --- a/net/ftp-proxy/src/opnsense/mvc/app/models/OPNsense/FtpProxy/FtpProxy.xml +++ b/net/ftp-proxy/src/opnsense/mvc/app/models/OPNsense/FtpProxy/FtpProxy.xml @@ -1,77 +1,77 @@ - //OPNsense/ftpproxies - 1.0.0 - Ftp Proxy settings - - - - 1 - Y - - - Y - 127.0.0.1 - /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ - Listen address must be a valid IPv4 address - - - 8021 - Y - 1 - 65535 - Listen port needs to be an integer value between 1 and 65535 - - - N - /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ - Source address must be a valid IPv4 address - - - 0 - N - - - 86400 - N - 1 - 86400 - Idle timeout needs to be an integer value between 1 and 86400 - - - 100 - N - 1 - 500 - Maximum number of concurrent FTP sessions needs to be an integer value between 1 and 500 - - - N - /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ - Reverse address must be a valid IPv4 address - - - 21 - N - 1 - 65535 - Reverse port needs to be an integer value between 1 and 65535 - - - 0 - N - - - 5 - N - 0 - 7 - Debug level needs to be an integer value between 0 and 7 - - - N - /^([\t\n\v\f\r 0-9a-zA-Z.,_\x{00A0}-\x{FFFF}]){1,255}$/u - Enter a description. - - - + //OPNsense/ftpproxies + 1.0.0 + Ftp Proxy settings + + + + 1 + Y + + + Y + 127.0.0.1 + /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ + Listen address must be a valid IPv4 address + + + 8021 + Y + 1 + 65535 + Listen port needs to be an integer value between 1 and 65535 + + + N + /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ + Source address must be a valid IPv4 address + + + 0 + N + + + 86400 + N + 1 + 86400 + Idle timeout needs to be an integer value between 1 and 86400 + + + 100 + N + 1 + 500 + Maximum number of concurrent FTP sessions needs to be an integer value between 1 and 500 + + + N + /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-4]|2[0-5][0-9]|[01]?[0-9][0-9]?)$/ + Reverse address must be a valid IPv4 address + + + 21 + N + 1 + 65535 + Reverse port needs to be an integer value between 1 and 65535 + + + 0 + N + + + 5 + N + 0 + 7 + Debug level needs to be an integer value between 0 and 7 + + + N + /^([\t\n\v\f\r 0-9a-zA-Z.,_\x{00A0}-\x{FFFF}]){1,255}$/u + Enter a description. + + + diff --git a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/dialogFrontend.xml b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/dialogFrontend.xml index ded45f08c2..a826ecfa85 100644 --- a/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/dialogFrontend.xml +++ b/net/haproxy/src/opnsense/mvc/app/controllers/OPNsense/HAProxy/forms/dialogFrontend.xml @@ -207,9 +207,9 @@
frontend.forwardFor - + checkbox - + frontend.prometheus_enabled diff --git a/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml b/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml index e1a40e1c57..e4704470a9 100644 --- a/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml +++ b/net/haproxy/src/opnsense/mvc/app/models/OPNsense/HAProxy/HAProxy.xml @@ -1366,9 +1366,11 @@ N + 1 65535 Please specify a value between 1 and 65535. + N N @@ -1563,16 +1565,18 @@ /^([0-9a-zA-Z._\-]){1,255}$/u Should be a string between 1 and 255 characters. N - + 0 N + 1 65535 Please specify a value between 1 and 65535. + N N @@ -2518,13 +2522,13 @@ N - N + N - N + N - N + N diff --git a/net/igmp-proxy/Makefile b/net/igmp-proxy/Makefile index 036669b4f0..5c83bdf7e3 100644 --- a/net/igmp-proxy/Makefile +++ b/net/igmp-proxy/Makefile @@ -1,7 +1,8 @@ PLUGIN_NAME= igmp-proxy PLUGIN_VERSION= 1.5 -PLUGIN_REVISION= 6 +PLUGIN_REVISION= 4 PLUGIN_DEPENDS= igmpproxy PLUGIN_COMMENT= IGMP-Proxy Service +PLUGIN_MAINTAINER= franco@opnsense.org .include "../../Mk/plugins.mk" diff --git a/net/igmp-proxy/src/etc/inc/plugins.inc.d/igmpproxy.inc b/net/igmp-proxy/src/etc/inc/plugins.inc.d/igmpproxy.inc index 6a50501857..246ca5e0f8 100644 --- a/net/igmp-proxy/src/etc/inc/plugins.inc.d/igmpproxy.inc +++ b/net/igmp-proxy/src/etc/inc/plugins.inc.d/igmpproxy.inc @@ -87,13 +87,13 @@ EOD; foreach ($config['igmpproxy']['igmpentry'] as $igmpcf) { unset($iflist[$igmpcf['ifname']]); - $device = get_real_interface($igmpcf['ifname']); + $realif = get_real_interface($igmpcf['ifname']); if (empty($igmpcf['threshold'])) { $threshld = 1; } else { $threshld = $igmpcf['threshold']; } - $igmpconf .= "phyint {$device} {$igmpcf['type']} ratelimit 0 threshold {$threshld}\n"; + $igmpconf .= "phyint {$realif} {$igmpcf['type']} ratelimit 0 threshold {$threshld}\n"; if ($igmpcf['address'] <> "") { $item = explode(" ", $igmpcf['address']); @@ -104,13 +104,13 @@ EOD; $igmpconf .= "\n"; } foreach ($iflist as $ifn => $unused) { - $device = get_real_interface($ifn); - $igmpconf .= "phyint {$device} disabled\n"; + $realif = get_real_interface($ifn); + $igmpconf .= "phyint {$realif} disabled\n"; } $igmpconf .= "\n"; - file_safe('/usr/local/etc/igmpproxy.conf', $igmpconf); - mwexecf('/usr/local/etc/rc.d/igmpproxy onestart'); + file_put_contents('/usr/local/etc/igmpproxy.conf', $igmpconf); + mwexec('/usr/local/etc/rc.d/igmpproxy onestart'); service_log("done.\n", $verbose); } diff --git a/net/ndp-proxy-go/Makefile b/net/ndp-proxy-go/Makefile deleted file mode 100644 index 76068232f1..0000000000 --- a/net/ndp-proxy-go/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -PLUGIN_NAME= ndp-proxy-go -PLUGIN_VERSION= 1.2 -PLUGIN_COMMENT= IPv6 Neighbor Discovery Protocol (NDP) Proxy -PLUGIN_MAINTAINER= cedrik@pischem.com -PLUGIN_DEPENDS= ndp-proxy-go - -.include "../../Mk/plugins.mk" diff --git a/net/ndp-proxy-go/pkg-descr b/net/ndp-proxy-go/pkg-descr deleted file mode 100644 index 68c72ebadc..0000000000 --- a/net/ndp-proxy-go/pkg-descr +++ /dev/null @@ -1,20 +0,0 @@ -IPv6 Neighbor Discovery Protocol (NDP) Proxy - -WWW: https://github.com/monviech/ndp-proxy-go -DOC: https://docs.opnsense.org/manual/ndp-proxy-go.html - -Plugin Changelog -================ - -1.2 - -* Add firewall alias support -* Add cache file support for faster recovery after system reboots - -1.1 - -* Add experimental point-to-point device upstream support (e.g. PPPoE) - -1.0 - -* Initial Release diff --git a/net/ndp-proxy-go/src/etc/inc/plugins.inc.d/ndpproxy.inc b/net/ndp-proxy-go/src/etc/inc/plugins.inc.d/ndpproxy.inc deleted file mode 100644 index 52b0f5b251..0000000000 --- a/net/ndp-proxy-go/src/etc/inc/plugins.inc.d/ndpproxy.inc +++ /dev/null @@ -1,66 +0,0 @@ - gettext('NDP Proxy'), - 'configd' => [ - 'start' => ['ndpproxy start'], - 'restart' => ['ndpproxy restart'], - 'stop' => ['ndpproxy stop'], - ], - 'name' => 'ndpproxy', - 'pidfile' => '/var/run/ndp_proxy_go.pid' - ]; - } - - return $services; -} - -function ndpproxy_xmlrpc_sync() -{ - $result = []; - - $result[] = array( - 'description' => gettext('NDP Proxy'), - 'section' => 'OPNsense.ndpproxy', - 'id' => 'ndpproxy', - 'services' => ["ndpproxy"], - ); - - return $result; -} diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/Api/GeneralController.php b/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/Api/GeneralController.php deleted file mode 100644 index 7662fcbd8e..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/Api/GeneralController.php +++ /dev/null @@ -1,65 +0,0 @@ -searchBase('aliases.alias'); - } - - public function setAliasAction($uuid) - { - return $this->setBase('alias', 'aliases.alias', $uuid); - } - - public function addAliasAction() - { - return $this->addBase('alias', 'aliases.alias'); - } - - public function getAliasAction($uuid = null) - { - return $this->getBase('alias', 'aliases.alias', $uuid); - } - - public function delAliasAction($uuid) - { - return $this->delBase('aliases.alias', $uuid); - } -} diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/Api/ServiceController.php b/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/Api/ServiceController.php deleted file mode 100644 index 1430b910ac..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/Api/ServiceController.php +++ /dev/null @@ -1,41 +0,0 @@ -view->pick('OPNsense/NdpProxy/general'); - $this->view->generalForm = $this->getForm('general'); - - $this->view->formDialogAlias = $this->getForm('dialogAlias'); - $this->view->formGridAlias = $this->getFormGrid('dialogAlias'); - } -} diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/forms/dialogAlias.xml b/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/forms/dialogAlias.xml deleted file mode 100644 index 31ac751182..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/forms/dialogAlias.xml +++ /dev/null @@ -1,22 +0,0 @@ -
- - alias.interface - - dropdown - Add IPv6 addresses to the firewall alias that belongs to this proxied interface. When choosing any, all IPv6 addresses will be added. - - any - - - - alias.alias - - dropdown - Choose an "external (advanced)" type alias from "Firewall - Aliases". Whenever a client is discovered, the IPv6 address will be automatically added to the chosen alias. When the neighbor cache lifetime expires, the IPv6 address will be removed from the alias. - - - alias.description - - text - -
diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/forms/general.xml b/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/forms/general.xml deleted file mode 100644 index d496342cda..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/controllers/OPNsense/NdpProxy/forms/general.xml +++ /dev/null @@ -1,84 +0,0 @@ -
- - header - - - - ndpproxy.general.enabled - - checkbox - Enable or disable this service. - - - header - - - - ndpproxy.general.upstream - - dropdown - Choose the upstream interface which receives the external IPv6 prefix from the ISP. Usually, this is the WAN interface. Ethernet interfaces are fully supported, point-to-point (PPPoE) devices are experimental. - - - ndpproxy.general.downstream - - select_multiple - Choose one or multiple downstream interfaces which should proxy the upstream IPv6 prefix. Only ethernet interfaces are supported. - - - ndpproxy.general.ra - - checkbox - Proxy upstream RAs to downstream interfaces. Disable this if you use your own RA daemon. - - - ndpproxy.general.routes - - checkbox - Automatically create host routes for discovered clients. Disabling this means you must manually handle all routing decisions. - - - header - - - - ndpproxy.general.cache_ttl - - text - 10 - Neighbor cache lifetime in minutes. This controls when stale clients, host routes and firewall aliases are cleaned up. When using a point-to-point interface as upstream, increasing this lifetime is necessary to not prematurely clean up routes. - - - ndpproxy.general.cache_max - - text - 4096 - Maximum learned neighbors, increase for large networks. - - - ndpproxy.general.cache_file - - checkbox - Persist cache to file on service stop and load it on service start. Only neighbors with a valid cache lifetime are loaded. This helps on system reboots to minimize downtime of individual clients. - - - ndpproxy.general.route_qps - - text - 50 - Max route operations per second, increase for large networks. - - - ndpproxy.general.pcap_timeout - - text - 50 - Controls CPU usage vs. NDP responsiveness. Lower values (e.g., 25 ms) minimize latency during cache refresh at the cost of more CPU. Higher values (100–250 ms) reduce CPU use but may introduce small latency spikes. - - - ndpproxy.general.debug - - checkbox - Enable debug logging. - -
diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/ACL/ACL.xml b/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/ACL/ACL.xml deleted file mode 100644 index b70514587e..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/ACL/ACL.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - Services: NDP Proxy: General Settings - Allow access to NDP Proxy General Settings - - ui/ndpproxy/general/* - api/ndpproxy/general/* - - - - Services: NDP Proxy: Log File - - ui/diagnostics/log/core/ndpproxy/* - api/diagnostics/log/core/ndpproxy/* - - - diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/Menu/Menu.xml b/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/Menu/Menu.xml deleted file mode 100644 index 7efc570587..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/Menu/Menu.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/NdpProxy.php b/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/NdpProxy.php deleted file mode 100644 index 5831f6887a..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/NdpProxy.php +++ /dev/null @@ -1,68 +0,0 @@ -general->enabled->isEqual('1')) { - foreach (['upstream', 'downstream'] as $field) { - if ($this->general->$field->isEmpty()) { - $messages->appendMessage(new Message( - gettext('Interface is required.'), - "general.$field" - )); - } - } - - $upstream = $this->general->upstream->getValue(); - $downstreamList = array_filter(explode(',', $this->general->downstream->getValue())); - - if (!empty($upstream) && in_array($upstream, $downstreamList, true)) { - $messages->appendMessage(new Message( - gettext('Downstream interfaces cannot contain upstream interface.'), - 'general.downstream' - )); - } - } - } - - public function performValidation($validateFullModel = false) - { - $messages = parent::performValidation($validateFullModel); - $this->checkConfiguration($messages); - return $messages; - } -} diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/NdpProxy.xml b/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/NdpProxy.xml deleted file mode 100644 index a88c26c5f0..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/models/OPNsense/NdpProxy/NdpProxy.xml +++ /dev/null @@ -1,67 +0,0 @@ - - //OPNsense/ndpproxy - NDP Proxy model - 1.0 - - - - 0 - Y - - - - Y - - - 1 - Y - - - 1 - Y - - - 1 - - - 1 - - - 0 - Y - - - 1 - - - 1 - - - 0 - Y - - - - - - any - - - - - OPNsense.Firewall.Alias - aliases.alias - name - - /^[Ee]xternal.*/ - /^(?!bogons$|bogonsv6$|virusprot$|sshlockout$|__.*).*/ - - - - Y - - - - - - diff --git a/net/ndp-proxy-go/src/opnsense/mvc/app/views/OPNsense/NdpProxy/general.volt b/net/ndp-proxy-go/src/opnsense/mvc/app/views/OPNsense/NdpProxy/general.volt deleted file mode 100644 index 4c36c5e879..0000000000 --- a/net/ndp-proxy-go/src/opnsense/mvc/app/views/OPNsense/NdpProxy/general.volt +++ /dev/null @@ -1,79 +0,0 @@ -{# - # Copyright (c) 2025 Cedrik Pischem - # 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. - #} - - - - - -
-
- {{ partial('layout_partials/base_form', ['fields': generalForm, 'id': 'frm_GeneralSettings']) }} -
-
- {{ partial('layout_partials/base_bootgrid_table', formGridAlias)}} -
-
- -{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/ndpproxy/service/reconfigure', 'data_service_widget': 'ndpproxy'}) }} -{{ partial('layout_partials/base_dialog',['fields':formDialogAlias,'id':formGridAlias['edit_dialog_id'],'label':lang._('Edit Alias')])}} diff --git a/net/ndp-proxy-go/src/opnsense/service/conf/actions.d/actions_ndpproxy.conf b/net/ndp-proxy-go/src/opnsense/service/conf/actions.d/actions_ndpproxy.conf deleted file mode 100644 index f5fcf8731d..0000000000 --- a/net/ndp-proxy-go/src/opnsense/service/conf/actions.d/actions_ndpproxy.conf +++ /dev/null @@ -1,24 +0,0 @@ -[start] -command:service ndp-proxy-go start -parameters: -type:script -message:Starting NDP Proxy service - -[stop] -command:service ndp-proxy-go stop -parameters: -type:script -message:Stopping NDP Proxy service - -[restart] -command:service ndp-proxy-go restart -parameters: -type:script -message:Restarting NDP Proxy service -description:Restart NDP Proxy service - -[status] -command:service ndp-proxy-go status -parameters: -type:script_output -message:Requesting NDP Proxy status diff --git a/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/NdpProxy/+TARGETS b/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/NdpProxy/+TARGETS deleted file mode 100644 index a75c8d5120..0000000000 --- a/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/NdpProxy/+TARGETS +++ /dev/null @@ -1 +0,0 @@ -ndp_proxy_go:/etc/rc.conf.d/ndp_proxy_go diff --git a/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/NdpProxy/ndp_proxy_go b/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/NdpProxy/ndp_proxy_go deleted file mode 100644 index 71acffe934..0000000000 --- a/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/NdpProxy/ndp_proxy_go +++ /dev/null @@ -1,49 +0,0 @@ -# DO NOT EDIT THIS FILE -- OPNsense auto-generated file -{% set general = helpers.getNodeByTag('OPNsense.ndpproxy.general') %} -{% if general.enabled|default("0") == "1" and general.upstream and general.downstream %} -ndp_proxy_go_enable="YES" -ndp_proxy_go_upstream="{{ helpers.physical_interface(general.upstream) }}" -{% set downstream_interfaces = [] %} -{% for interface in general.downstream.split(',') %} -{% do downstream_interfaces.append(helpers.physical_interface(interface)) %} -{% endfor %} -ndp_proxy_go_downstream="{{ downstream_interfaces|join(' ') }}" -{% if general.cache_file == "1" %} -ndp_proxy_go_cache_file="/var/db/ndpproxy/cache.json" -{% endif %} -{% set flags = [] %} -{% if general.debug == "1" %} -{% do flags.append('--debug') %} -{% endif %} -{% if general.ra == "0" %} -{% do flags.append('--no-ra') %} -{% endif %} -{% if general.routes == "0" %} -{% do flags.append('--no-routes') %} -{% endif %} -{% if general.cache_ttl %} -{% do flags.append('--cache-ttl ' ~ general.cache_ttl ~ 'm') %} -{% endif %} -{% if general.cache_max %} -{% do flags.append('--cache-max ' ~ general.cache_max) %} -{% endif %} -{% if general.route_qps %} -{% do flags.append('--route-qps ' ~ general.route_qps) %} -{% endif %} -{% if general.pcap_timeout %} -{% do flags.append('--pcap-timeout ' ~ general.pcap_timeout ~ 'ms') %} -{% endif %} -{% for alias in helpers.toList('OPNsense.ndpproxy.aliases.alias') %} -{% set iface = alias.interface|default('') %} -{% if iface == '' %} -{% do flags.append('--pf=:' ~ helpers.getUUID(alias.alias).name) %} -{% else %} -{% do flags.append('--pf=' ~ helpers.physical_interface(iface) ~ ':' ~ helpers.getUUID(alias.alias).name) %} -{% endif %} -{% endfor %} -{% if flags|length > 0 %} -ndp_proxy_go_flags="{{ flags|join(' ') }}" -{% endif %} -{% else %} -ndp_proxy_go_enable="NO" -{% endif %} diff --git a/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/Syslog/local/ndpproxy.conf b/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/Syslog/local/ndpproxy.conf deleted file mode 100644 index 302335e1c9..0000000000 --- a/net/ndp-proxy-go/src/opnsense/service/templates/OPNsense/Syslog/local/ndpproxy.conf +++ /dev/null @@ -1,6 +0,0 @@ -################################################################### -# Local syslog-ng configuration [ndpproxy]. -################################################################### -filter f_local_ndpproxy { - program("ndpproxy"); -}; diff --git a/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.xml b/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.xml index 41d446fe56..273500536a 100644 --- a/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.xml +++ b/net/radsecproxy/src/opnsense/mvc/app/models/OPNsense/RadSecProxy/RadSecProxy.xml @@ -6,10 +6,12 @@ 0.0.1 + 0 Y + Y 2 @@ -21,6 +23,7 @@ 5 (log everything) + Y off @@ -29,6 +32,7 @@ Off + Y Original @@ -41,6 +45,7 @@ FullyKeyHashed + Y on @@ -49,37 +54,49 @@ Off + N + N + N + N + N + N + N + N + + + 1 Y + Y /^([0-9a-zA-Z_\-]){1,25}$/u @@ -91,9 +108,11 @@
+ N + Y Y @@ -103,6 +122,7 @@
+ Y udp @@ -113,6 +133,7 @@ DTLS + N @@ -130,6 +151,7 @@ + N @@ -140,6 +162,7 @@ + Y off @@ -148,9 +171,11 @@ Off + N + N @@ -161,6 +186,7 @@ + N @@ -171,10 +197,13 @@ + + + Y /^([0-9a-zA-Z_\-]){1,25}$/u @@ -186,16 +215,20 @@ + N + Y Y + N + Y off @@ -206,6 +239,7 @@ Auto + Y udp @@ -216,6 +250,7 @@ DTLS + N @@ -233,6 +268,7 @@ + N @@ -243,6 +279,7 @@ + Y off @@ -251,9 +288,11 @@ Off + N + N @@ -264,6 +303,7 @@ + N @@ -274,10 +314,13 @@ + + + Y /^([0-9a-zA-Z_\-]){1,25}$/u @@ -290,23 +333,28 @@ + N + Y Field is required ca + Y Field is required cert + N Y + Y off @@ -315,20 +363,26 @@ Off + N + + + 1 Y + N + Y Must not be empty @@ -339,6 +393,7 @@ + Y N @@ -352,6 +407,7 @@ Related server not found + Y N @@ -365,6 +421,7 @@ Related server not found + Y off @@ -373,17 +430,22 @@ Off + N + + + 1 Y + Y /^([0-9a-zA-Z_\-]){1,25}$/u @@ -396,30 +458,39 @@ + N + N + N + N + N + N + N + N + Y off @@ -428,12 +499,15 @@ Off + N + N + diff --git a/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.xml b/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.xml index 5029e52726..45e1fd94bc 100644 --- a/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.xml +++ b/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.xml @@ -1,359 +1,359 @@ - //OPNsense/relayd - 1.0.6 - Relayd settings - - - - 0 - Y - - - N - 1 - Check interval must be greater than 0 - - - N - - new states - all states - - - - N - 1 - Number of processes must be greater than 0 - - - N - 1 - The timeout must be greater than 0 - - - - - 1 - Y - - - Y - /^([0-9a-zA-Z\._\- ]){1,255}$/u - Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. - - - Host names should be unique. - UniqueConstraint - - - -
- Y - /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u - lower - Please specify a valid servername or IP address. -
- - N - 1 - The IP TTL must be greater than 0 - - - N - 1 - The route priority must be greater than 0 - - - N - 1 - The number of retries must be greater than 0 - -
- - - Y - /^([0-9a-zA-Z\._\- ]){1,255}$/u - Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. - - - Table names should be unique. - UniqueConstraint - - - - - 1 - Y - - - - - - Host not found - Y - Y - -
- - - Y - /^([0-9a-zA-Z\._\- ]){1,255}$/u - Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. - - - icmp - Y - - ICMP - TCP - TLS - SEND - - HTTP - - - - N - - - /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u - lower - Please specify a valid servername or IP address. - N - - - N - Expected return code must be a number. - - - N - - - N - - - N - - - N - - - - - Y - /^([0-9a-zA-Z\._\- ]){1,31}$/u - Should be a string between 1 and 31 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. - - - Virtual server names should be unique. - UniqueConstraint - - - - - 1 - Y - - - relay - Y - - Relay - Redirection - - - - Y - /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u - lower - Please specify a valid servername or IP address. - - - Y - tcp - - TCP - UDP - - - - Y - 1 - 65535 - A valid Port number must be specified. - - - N - 1 - 65535 - A valid Port number must be specified. - - - N - - /^(?!0).*$/ - /^((?!dhcp).)*$/ - - - - forward - Y - - Forward - Route - - - - N - - /^(?!0).*$/ - /^((?!dhcp).)*$/ - - - - - - - Table not found - Y - - - N - 1 - 65535 - A valid Port number must be specified. - - - N - 2 - Check interval must be a multiple of the global interval. - - - N - 1 - The timeout must be greater than 0 - - - Y - roundrobin - - Hash - Least States - Load Balance - Random - Round Robin - Source Hash - - - - - - - Table check not found - Y - - - - - - Table not found - N - - - N - 2 - Check interval must be a multiple of the global interval. - - - N - 1 - The timeout must be greater than 0 - - - - - - Table check not found - N - - - Table check must be set. - DependConstraint - - backuptransport_table - - - - - - Y - roundrobin - - Hash - Least States - Load Balance - Random - Round Robin - Source Hash - - - - N - 1 - 2147483647 - The timeout must be a number between 1 and 2147483647. - - - - - - - Protocol not found - N - - - - - Y - /^([0-9a-zA-Z\._\- ]){1,255}$/u - Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. - - - tcp - Y - - TCP - DNS - HTTP - - - - N - - -
+ //OPNsense/relayd + 1.0.6 + Relayd settings + + + + 0 + Y + + + N + 1 + Check interval must be greater than 0 + + + N + + new states + all states + + + + N + 1 + Number of processes must be greater than 0 + + + N + 1 + The timeout must be greater than 0 + + + + + 1 + Y + + + Y + /^([0-9a-zA-Z\._\- ]){1,255}$/u + Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. + + + Host names should be unique. + UniqueConstraint + + + +
+ Y + /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u + lower + Please specify a valid servername or IP address. +
+ + N + 1 + The IP TTL must be greater than 0 + + + N + 1 + The route priority must be greater than 0 + + + N + 1 + The number of retries must be greater than 0 + +
+ + + Y + /^([0-9a-zA-Z\._\- ]){1,255}$/u + Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. + + + Table names should be unique. + UniqueConstraint + + + + + 1 + Y + + + + + + Host not found + Y + Y + +
+ + + Y + /^([0-9a-zA-Z\._\- ]){1,255}$/u + Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. + + + icmp + Y + + ICMP + TCP + TLS + SEND + + HTTP + + + + N + + + /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u + lower + Please specify a valid servername or IP address. + N + + + N + Expected return code must be a number. + + + N + + + N + + + N + + + N + + + + + Y + /^([0-9a-zA-Z\._\- ]){1,31}$/u + Should be a string between 1 and 31 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. + + + Virtual server names should be unique. + UniqueConstraint + + + + + 1 + Y + + + relay + Y + + Relay + Redirection + + + + Y + /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u + lower + Please specify a valid servername or IP address. + + + Y + tcp + + TCP + UDP + + + + Y + 1 + 65535 + A valid Port number must be specified. + + + N + 1 + 65535 + A valid Port number must be specified. + + + N + + /^(?!0).*$/ + /^((?!dhcp).)*$/ + + + + forward + Y + + Forward + Route + + + + N + + /^(?!0).*$/ + /^((?!dhcp).)*$/ + + + + + + + Table not found + Y + + + N + 1 + 65535 + A valid Port number must be specified. + + + N + 2 + Check interval must be a multiple of the global interval. + + + N + 1 + The timeout must be greater than 0 + + + Y + roundrobin + + Hash + Least States + Load Balance + Random + Round Robin + Source Hash + + + + + + + Table check not found + Y + + + + + + Table not found + N + + + N + 2 + Check interval must be a multiple of the global interval. + + + N + 1 + The timeout must be greater than 0 + + + + + + Table check not found + N + + + Table check must be set. + DependConstraint + + backuptransport_table + + + + + + Y + roundrobin + + Hash + Least States + Load Balance + Random + Round Robin + Source Hash + + + + N + 1 + 2147483647 + The timeout must be a number between 1 and 2147483647. + + + + + + + Protocol not found + N + + + + + Y + /^([0-9a-zA-Z\._\- ]){1,255}$/u + Should be a string between 1 and 255 characters. Allowed characters are letters and numbers as well as underscore, minus, dot and space. + + + tcp + Y + + TCP + DNS + HTTP + + + + N + + +
diff --git a/net/shadowsocks/Makefile b/net/shadowsocks/Makefile index 34945a08ca..ba50d1d293 100644 --- a/net/shadowsocks/Makefile +++ b/net/shadowsocks/Makefile @@ -1,5 +1,6 @@ PLUGIN_NAME= shadowsocks -PLUGIN_VERSION= 1.3 +PLUGIN_VERSION= 1.2 +PLUGIN_REVISION= 1 PLUGIN_COMMENT= Secure socks5 proxy PLUGIN_DEPENDS= shadowsocks-rust PLUGIN_MAINTAINER= m.muenz@gmail.com diff --git a/net/shadowsocks/pkg-descr b/net/shadowsocks/pkg-descr index e152306d6b..a271c00c4f 100644 --- a/net/shadowsocks/pkg-descr +++ b/net/shadowsocks/pkg-descr @@ -3,11 +3,6 @@ Shadowsocks is a fast tunnel proxy that helps you bypass firewalls. Plugin Changelog ================ -1.3 - -* Update ciphers to match shadowsocks-rust (contributed by eguun) -* Update WebUI to allow setting for TCP timeout and UDP fragmentation (contributed by kvoffka and eguun) - 1.2 * Switch to shadowsocks-rust diff --git a/net/shadowsocks/src/opnsense/mvc/app/controllers/OPNsense/Shadowsocks/forms/general.xml b/net/shadowsocks/src/opnsense/mvc/app/controllers/OPNsense/Shadowsocks/forms/general.xml index 185decc5aa..b87f8e8385 100644 --- a/net/shadowsocks/src/opnsense/mvc/app/controllers/OPNsense/Shadowsocks/forms/general.xml +++ b/net/shadowsocks/src/opnsense/mvc/app/controllers/OPNsense/Shadowsocks/forms/general.xml @@ -41,17 +41,4 @@ dropdown Choose TCP, UDP or both relay mode - - general.timeout - - text - 60 - Set the TCP relay timeout in seconds. - - - general.fragmentation - - checkbox - Allow IP fragmentation on the outbound UDP socket. - diff --git a/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/General.xml b/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/General.xml index 6819ff0986..b66a08112e 100644 --- a/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/General.xml +++ b/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/General.xml @@ -1,7 +1,7 @@ //OPNsense/shadowsocks/general Shadowsocks configuration - 1.0.2 + 1.0.1 0 @@ -28,30 +28,19 @@ - aes-256-gcm + aes-256-cfb Y - - AES-128-GCM - AES-256-GCM - 2022-BLAKE3-AES-128-GCM - 2022-BLAKE3-AES-256-GCM - 2022-BLAKE3-ChaCha8-Poly1305 - 2022-BLAKE3-ChaCha20-Poly1305 - ChaCha20-IETF-Poly1305 - - - AES-128-CFB - AES-128-CTR - AES-192-CFB - AES-192-CTR - AES-192-GCM - AES-256-CFB - AES-256-CTR - - - None (plain) - + AES-256-CFB + AES-256-GCM + AES-256-CTR + AES-192-CFB + AES-192-GCM + AES-192-CTR + AES-128-CFB + AES-128-GCM + AES-128-CTR + ChaCha20-IETF-Poly1305 @@ -63,13 +52,5 @@ TCP and UDP - - 60 - Y - - - 0 - Y - diff --git a/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/Local.xml b/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/Local.xml index 0883dce34e..00ab061c40 100644 --- a/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/Local.xml +++ b/net/shadowsocks/src/opnsense/mvc/app/models/OPNsense/Shadowsocks/Local.xml @@ -33,30 +33,19 @@ - aes-256-gcm + aes-256-cfb Y - - AES-128-GCM - AES-256-GCM - 2022-BLAKE3-AES-128-GCM - 2022-BLAKE3-AES-256-GCM - 2022-BLAKE3-ChaCha8-Poly1305 - 2022-BLAKE3-ChaCha20-Poly1305 - ChaCha20-IETF-Poly1305 - - - AES-128-CFB - AES-128-CTR - AES-192-CFB - AES-192-CTR - AES-192-GCM - AES-256-CFB - AES-256-CTR - - - None (plain) - + AES-256-CFB + AES-256-GCM + AES-256-CTR + AES-192-CFB + AES-192-GCM + AES-192-CTR + AES-128-CFB + AES-128-GCM + AES-128-CTR + ChaCha20-IETF-Poly1305 diff --git a/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/config.json b/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/config.json index 09062d237f..b4337ea4a8 100644 --- a/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/config.json +++ b/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/config.json @@ -4,9 +4,8 @@ "server_port":{{ OPNsense.shadowsocks.general.serverport }}, "local_port":{{ OPNsense.shadowsocks.general.localport }}, "password":"{{ OPNsense.shadowsocks.general.password }}", - "timeout":{{ OPNsense.shadowsocks.general.timeout }}, + "timeout":60, "mode":"{{ OPNsense.shadowsocks.general.tcpudpmode }}", - "method":"{{ OPNsense.shadowsocks.general.cipher }}", - "outbound_udp_allow_fragmentation":{{ "true" if OPNsense.shadowsocks.general.fragmentation == '1' else "false"}} + "method":"{{ OPNsense.shadowsocks.general.cipher }}" } {% endif %} diff --git a/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/sslocal b/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/sslocal index bf81f63bd4..d7fe2808ac 100644 --- a/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/sslocal +++ b/net/shadowsocks/src/opnsense/service/templates/OPNsense/Shadowsocks/sslocal @@ -1,6 +1,5 @@ {% if helpers.exists('OPNsense.shadowsocks.local.enabled') and OPNsense.shadowsocks.local.enabled == '1' %} sslocal_rust_enable="YES" -sslocal_rust_args="-c /usr/local/etc/shadowsocks-rust/local.json" {% else %} sslocal_rust_enable="NO" {% endif %} diff --git a/net/tayga/Makefile b/net/tayga/Makefile index 9b9a62daf1..fe232e6ac0 100644 --- a/net/tayga/Makefile +++ b/net/tayga/Makefile @@ -1,5 +1,6 @@ PLUGIN_NAME= tayga -PLUGIN_VERSION= 1.3 +PLUGIN_VERSION= 1.2 +PLUGIN_REVISION= 2 PLUGIN_COMMENT= Tayga NAT64 PLUGIN_DEPENDS= tayga PLUGIN_MAINTAINER= m.muenz@gmail.com diff --git a/net/tayga/pkg-descr b/net/tayga/pkg-descr index 2a97f216ff..4ff06aba27 100644 --- a/net/tayga/pkg-descr +++ b/net/tayga/pkg-descr @@ -7,10 +7,6 @@ networks where dedicated NAT64 hardware would be overkill. Plugin Changelog ================ -1.3 - -* Static mapping support (contributed by Matthias Valvekens) - 1.2 * Custom IPv6 routing option diff --git a/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/Api/MappingController.php b/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/Api/MappingController.php deleted file mode 100644 index 05b88d7270..0000000000 --- a/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/Api/MappingController.php +++ /dev/null @@ -1,67 +0,0 @@ - - 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\Tayga\Api; - -use OPNsense\Base\ApiMutableModelControllerBase; - -class MappingController extends ApiMutableModelControllerBase -{ - protected static $internalModelName = 'staticmapping'; - protected static $internalModelClass = '\OPNsense\Tayga\StaticMapping'; - - public function searchStaticmappingAction() - { - return $this->searchBase('staticmappings.staticmapping', ['enabled', 'v4', 'v6']); - } - - public function getStaticmappingAction($uuid = null) - { - return $this->getBase('staticmapping', 'staticmappings.staticmapping', $uuid); - } - - public function addStaticmappingAction() - { - return $this->addBase('staticmapping', 'staticmappings.staticmapping'); - } - - public function delStaticmappingAction($uuid) - { - return $this->delBase('staticmappings.staticmapping', $uuid); - } - - public function setStaticmappingAction($uuid) - { - return $this->setBase('staticmapping', 'staticmappings.staticmapping', $uuid); - } - - public function toggleStaticmappingAction($uuid) - { - return $this->toggleBase('staticmappings.staticmapping', $uuid); - } -} diff --git a/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/GeneralController.php b/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/GeneralController.php index 667f30cc9d..6cf94562b2 100644 --- a/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/GeneralController.php +++ b/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/GeneralController.php @@ -34,7 +34,5 @@ public function indexAction() { $this->view->generalForm = $this->getForm("general"); $this->view->pick('OPNsense/Tayga/general'); - $this->view->formDialogEditStaticMapping = $this->getForm("dialogEditStaticMapping"); - $this->view->formGridStaticMapping = $this->getFormGrid("dialogEditStaticMapping"); } } diff --git a/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/forms/dialogEditStaticMapping.xml b/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/forms/dialogEditStaticMapping.xml deleted file mode 100644 index e1402cbf33..0000000000 --- a/net/tayga/src/opnsense/mvc/app/controllers/OPNsense/Tayga/forms/dialogEditStaticMapping.xml +++ /dev/null @@ -1,34 +0,0 @@ -
- - staticmapping.enabled - - checkbox - This will enable or disable the static mapping - - 6em - boolean - rowtoggle - - - - staticmapping.v4 - - text - IPv4 network to map. Can overlap with dynamic pool. - - - staticmapping.v6 - - text - IPv6 network to map. Must not overlap with NAT64 prefix. - - - staticmapping.description - - text - Optionally describe the purpose of the mapping. - - false - - -
diff --git a/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/General.xml b/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/General.xml index 393717aedf..0644ef6187 100644 --- a/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/General.xml +++ b/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/General.xml @@ -1,7 +1,7 @@ //OPNsense/tayga/general Tayga configuration - 1.3.0 + 1.2.0 0 @@ -10,29 +10,24 @@ 192.168.255.1 Y - ipv4 192.168.254.1 Y - ipv4 - ipv6 + N 2001:db8:1:ffff::1 - ipv6 Y 64:ff9b::/96 - ipv6 Y 192.168.255.0/24 - ipv4 Y diff --git a/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/StaticMapping.php b/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/StaticMapping.php deleted file mode 100644 index be26d28b0e..0000000000 --- a/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/StaticMapping.php +++ /dev/null @@ -1,35 +0,0 @@ - - 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\Tayga; - -use OPNsense\Base\BaseModel; - -class StaticMapping extends BaseModel -{ -} diff --git a/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/StaticMapping.xml b/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/StaticMapping.xml deleted file mode 100644 index ad7429652e..0000000000 --- a/net/tayga/src/opnsense/mvc/app/models/OPNsense/Tayga/StaticMapping.xml +++ /dev/null @@ -1,24 +0,0 @@ - - //OPNsense/tayga/staticmapping - Static NAT64 mappings - 1.3.0 - - - - - Y - 1 - - - Y - ipv4 - - - Y - ipv6 - - - - - - diff --git a/net/tayga/src/opnsense/mvc/app/views/OPNsense/Tayga/general.volt b/net/tayga/src/opnsense/mvc/app/views/OPNsense/Tayga/general.volt index 0732903f5b..bded11ae61 100644 --- a/net/tayga/src/opnsense/mvc/app/views/OPNsense/Tayga/general.volt +++ b/net/tayga/src/opnsense/mvc/app/views/OPNsense/Tayga/general.volt @@ -26,23 +26,13 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #} - - - - -
-
- {{ partial("layout_partials/base_form",['fields':generalForm,'id':'frm_general_settings'])}} -
-
- {{ partial('layout_partials/base_bootgrid_table', formGridStaticMapping) }} +
+ {{ partial("layout_partials/base_form",['fields':generalForm,'id':'frm_general_settings'])}} +
+
+
-{{ partial("layout_partials/base_dialog",['fields':formDialogEditStaticMapping,'id': formGridStaticMapping['edit_dialog_id'], 'label':lang._('Edit mapping')])}} -{{ partial('layout_partials/base_apply_button', {'data_endpoint': '/api/tayga/service/reconfigure', 'data_service_widget': 'tayga'}) }} diff --git a/net/tayga/src/opnsense/service/templates/OPNsense/Tayga/tayga.conf b/net/tayga/src/opnsense/service/templates/OPNsense/Tayga/tayga.conf index 853353f95a..2c8a3bd580 100644 --- a/net/tayga/src/opnsense/service/templates/OPNsense/Tayga/tayga.conf +++ b/net/tayga/src/opnsense/service/templates/OPNsense/Tayga/tayga.conf @@ -10,12 +10,4 @@ ipv6-addr {{ OPNsense.tayga.general.v6address }} prefix {{ OPNsense.tayga.general.v6prefix }} dynamic-pool {{ OPNsense.tayga.general.v4pool }} -{% if helpers.exists('OPNsense.tayga.staticmapping.staticmappings.staticmapping') %} -{% for mapping in helpers.toList('OPNsense.tayga.staticmapping.staticmappings.staticmapping') %} -{% if mapping.enabled == '1' %} -map {{ mapping.v4 }} {{ mapping.v6 }} -{% endif %} -{% endfor %} -{% endif %} - {% endif %} diff --git a/net/turnserver/Makefile b/net/turnserver/Makefile index 9fbad5318f..dfe3b1ce6e 100644 --- a/net/turnserver/Makefile +++ b/net/turnserver/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= turnserver -PLUGIN_VERSION= 1.1 +PLUGIN_VERSION= 1.0 PLUGIN_COMMENT= The coturn STUN/TURN Server PLUGIN_DEPENDS= turnserver PLUGIN_MAINTAINER= opnsense@moov.de diff --git a/net/turnserver/pkg-descr b/net/turnserver/pkg-descr index 3b816781b2..f801217423 100644 --- a/net/turnserver/pkg-descr +++ b/net/turnserver/pkg-descr @@ -2,22 +2,3 @@ Coturn is a free open source implementation of TURN and STUN Server. The TURN Server is a VoIP media traffic NAT traversal server and gateway. WWW: https://github.com/coturn/coturn - -Plugin Changelog -================ - -1.1 - -Added: -* add log page - -Changed: -* hide protocol violating options -* switch to local syslog logging - -Removed: -* remove old log files - -1.0 - -* Initial release diff --git a/net/turnserver/src/opnsense/mvc/app/controllers/OPNsense/Turnserver/forms/settings.xml b/net/turnserver/src/opnsense/mvc/app/controllers/OPNsense/Turnserver/forms/settings.xml index f16808f18c..37f6633cb3 100644 --- a/net/turnserver/src/opnsense/mvc/app/controllers/OPNsense/Turnserver/forms/settings.xml +++ b/net/turnserver/src/opnsense/mvc/app/controllers/OPNsense/Turnserver/forms/settings.xml @@ -116,14 +116,12 @@ turnserver.settings.ChannelLifetime text - The lifetime for the channel in seconds. Default value is 600 seconds (10 minutes). Changing this value violates RFC 5766. Use with care. - true + The lifetime for the channel (in seconds). Default value is 600 secs (10 minutes). turnserver.settings.PermissionLifetime text - The permission lifetime in seconds. Default value is 300 seconds (5 minutes). Changing this value violates RFC 5766. Use with care. - true + The permission lifetime (in seconds). Default value is 300 secs (5 minutes). diff --git a/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/ACL/ACL.xml b/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/ACL/ACL.xml index 4e4cb549ab..dfc800ea50 100644 --- a/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/ACL/ACL.xml +++ b/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/ACL/ACL.xml @@ -4,8 +4,6 @@ ui/turnserver api/turnserver/* - ui/diagnostics/log/core/turnserver/* - api/diagnostics/log/core/turnserver/* diff --git a/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Menu/Menu.xml b/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Menu/Menu.xml index a52806dd54..4134d75c29 100644 --- a/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Menu/Menu.xml +++ b/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Menu/Menu.xml @@ -1,8 +1,5 @@ - - - - + diff --git a/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Turnserver.xml b/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Turnserver.xml index 47aae5f065..573ff81230 100644 --- a/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Turnserver.xml +++ b/net/turnserver/src/opnsense/mvc/app/models/OPNsense/Turnserver/Turnserver.xml @@ -10,6 +10,7 @@ 127.0.0.1 + , Y Y @@ -29,7 +30,10 @@ 0 Y - + + N + Please select a valid certificate from the list. + 5349 Y @@ -39,10 +43,12 @@ Y + N /^.{16,128}$/u Should be a string between 16 and 128 characters. + N /^.{1,128}$/u Should be a string between 1 and 128 characters. diff --git a/net/turnserver/src/opnsense/scripts/OPNsense/Turnserver/export_certs.php b/net/turnserver/src/opnsense/scripts/OPNsense/Turnserver/export_certs.php index cbacca2b13..247d301fee 100755 --- a/net/turnserver/src/opnsense/scripts/OPNsense/Turnserver/export_certs.php +++ b/net/turnserver/src/opnsense/scripts/OPNsense/Turnserver/export_certs.php @@ -59,12 +59,3 @@ } } } - -# Purge obsolete log files. -# TODO: Should be removed in plugin version 2.0. -$log_files = glob('/var/log/turn_*.log'); -foreach ($log_files as $file) { - if (is_file($file)) { - unlink($file); - } -} diff --git a/net/turnserver/src/opnsense/service/templates/OPNsense/Syslog/local/turnserver.conf b/net/turnserver/src/opnsense/service/templates/OPNsense/Syslog/local/turnserver.conf deleted file mode 100644 index a1623cd385..0000000000 --- a/net/turnserver/src/opnsense/service/templates/OPNsense/Syslog/local/turnserver.conf +++ /dev/null @@ -1,6 +0,0 @@ -################################################################### -# Local syslog-ng configuration filter definition [turnserver]. -################################################################### -filter f_local_turnserver { - program("turnserver"); -}; diff --git a/net/turnserver/src/opnsense/service/templates/OPNsense/Turnserver/turnserver.conf b/net/turnserver/src/opnsense/service/templates/OPNsense/Turnserver/turnserver.conf index f5442f1d9d..67c96cbabb 100644 --- a/net/turnserver/src/opnsense/service/templates/OPNsense/Turnserver/turnserver.conf +++ b/net/turnserver/src/opnsense/service/templates/OPNsense/Turnserver/turnserver.conf @@ -50,7 +50,6 @@ channel-lifetime={{ OPNsense.turnserver.settings.ChannelLifetime }} permission-lifetime={{ OPNsense.turnserver.settings.PermissionLifetime }} # Defaults -log-file=syslog no-cli no-software-attribute no-multicast-peers diff --git a/net/udpbroadcastrelay/Makefile b/net/udpbroadcastrelay/Makefile index e0170423b9..0dd56ef13d 100644 --- a/net/udpbroadcastrelay/Makefile +++ b/net/udpbroadcastrelay/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= udpbroadcastrelay PLUGIN_VERSION= 1.0 -PLUGIN_REVISION= 6 +PLUGIN_REVISION= 5 PLUGIN_COMMENT= Control udpbroadcastrelay processes PLUGIN_DEPENDS= udpbroadcastrelay PLUGIN_MAINTAINER= mjwasley@gmail.com diff --git a/net/udpbroadcastrelay/src/opnsense/mvc/app/views/OPNsense/UDPBroadcastRelay/index.volt b/net/udpbroadcastrelay/src/opnsense/mvc/app/views/OPNsense/UDPBroadcastRelay/index.volt index f521ae1899..a59babcc02 100644 --- a/net/udpbroadcastrelay/src/opnsense/mvc/app/views/OPNsense/UDPBroadcastRelay/index.volt +++ b/net/udpbroadcastrelay/src/opnsense/mvc/app/views/OPNsense/UDPBroadcastRelay/index.volt @@ -87,16 +87,16 @@ POSSIBILITY OF SUCH DAMAGE. - - - - - - - - - - + + + + + + + + + + diff --git a/net/upnp/Makefile b/net/upnp/Makefile index 4c5c4109b4..ea12da5524 100644 --- a/net/upnp/Makefile +++ b/net/upnp/Makefile @@ -1,7 +1,7 @@ PLUGIN_NAME= upnp -PLUGIN_VERSION= 1.8 +PLUGIN_VERSION= 1.7 PLUGIN_DEPENDS= miniupnpd -PLUGIN_COMMENT= UPnP IGD & PCP/NAT-PMP Service +PLUGIN_COMMENT= Universal Plug and Play (UPnP IGD & PCP/NAT-PMP) Service PLUGIN_MAINTAINER= franco@opnsense.org .include "../../Mk/plugins.mk" diff --git a/net/upnp/src/etc/inc/plugins.inc.d/miniupnpd.inc b/net/upnp/src/etc/inc/plugins.inc.d/miniupnpd.inc index 069680a361..6214f4ce0b 100644 --- a/net/upnp/src/etc/inc/plugins.inc.d/miniupnpd.inc +++ b/net/upnp/src/etc/inc/plugins.inc.d/miniupnpd.inc @@ -55,7 +55,7 @@ function miniupnpd_services() $pconfig = []; $pconfig['name'] = 'miniupnpd'; - $pconfig['description'] = gettext('UPnP IGD & PCP/NAT-PMP'); + $pconfig['description'] = gettext('Universal Plug and Play'); $pconfig['php']['restart'] = ['miniupnpd_stop', 'miniupnpd_start']; $pconfig['php']['start'] = ['miniupnpd_start']; $pconfig['php']['stop'] = ['miniupnpd_stop']; @@ -75,15 +75,15 @@ function miniupnpd_start() return; } - mwexecfb('/usr/local/sbin/miniupnpd -f %s -P %s', [ '/var/etc/miniupnpd.conf', '/var/run/miniupnpd.pid']); + mwexec_bg('/usr/local/sbin/miniupnpd -f /var/etc/miniupnpd.conf -P /var/run/miniupnpd.pid'); } function miniupnpd_stop() { killbypid('/var/run/miniupnpd.pid'); - mwexecf('/sbin/pfctl -a miniupnpd -Fr'); - mwexecf('/sbin/pfctl -a miniupnpd -Fn'); + mwexec('/sbin/pfctl -aminiupnpd -Fr 2>&1 >/dev/null'); + mwexec('/sbin/pfctl -aminiupnpd -Fn 2>&1 >/dev/null'); } function miniupnpd_configure() @@ -131,7 +131,7 @@ function miniupnpd_configure_do($verbose = false) return; } - service_log('Starting UPnP IGD & PCP/NAT-PMP service...', $verbose); + service_log('Starting UPnP service...', $verbose); $upnp_config = $config['installedpackages']['miniupnpd']['config'][0]; @@ -142,7 +142,7 @@ function miniupnpd_configure_do($verbose = false) } $config_text = "ext_ifname={$ext_ifname}\n"; - $config_text .= "http_port=2189\n"; + $config_text .= "port=2189\n"; $ifaces_active = ''; @@ -185,7 +185,7 @@ function miniupnpd_configure_do($verbose = false) /* configure STUN server if needed */ if (!empty($upnp_config['stun_host'])) { - $config_text .= "ext_perform_stun=allow-filtered\n"; + $config_text .= "ext_perform_stun=yes\n"; $config_text .= "ext_stun_host=" . ($upnp_config['stun_host']) . "\n"; $config_text .= "ext_stun_port=" . ($upnp_config['stun_port'] ?? "3478") . "\n"; } @@ -198,17 +198,7 @@ function miniupnpd_configure_do($verbose = false) $config_text .= "bitrate_up={$upload}\n"; } - if (!empty($upnp_config['allow_third_party_mapping'])) { - $config_text .= "secure_mode=no\n"; - $config_text .= "pcp_allow_thirdparty=yes\n"; - } else { - $config_text .= "secure_mode=yes\n"; - $config_text .= "pcp_allow_thirdparty=no\n"; - } - - if (!empty($upnp_config['ipv6_disable'])) { - $config_text .= "ipv6_disable=yes\n"; - } + $config_text .= "secure_mode=yes\n"; /* enable logging of packets handled by miniupnpd rules */ if (!empty($upnp_config['logpackets'])) { @@ -229,19 +219,12 @@ function miniupnpd_configure_do($verbose = false) $config_text .= "/\n"; } - if (!empty($upnp_config['friendly_name'])) { - // Encode required XML entities of text UPnP IGD config options until the daemon does so - $config_text .= "friendly_name=" . htmlspecialchars($upnp_config['friendly_name'], ENT_NOQUOTES | ENT_XML1) . "\n"; - } else { - $config_text .= "friendly_name=OPNsense UPnP IGD & PCP\n"; - } - /* set uuid and serial */ $config_text .= "uuid=" . miniupnpd_uuid() . "\n"; $config_text .= "serial=" . strtoupper(substr(miniupnpd_uuid(), 0, 8)) . "\n"; /* set model number */ - $config_text .= "model_number=" . shell_safe('opnsense-version -v') . "\n"; + $config_text .= "model_number=" . trim(shell_exec('opnsense-version -v')) . "\n"; /* upnp access restrictions */ foreach (miniupnpd_permuser_list() as $permuser) { @@ -251,21 +234,17 @@ function miniupnpd_configure_do($verbose = false) } if (!empty($upnp_config['permdefault'])) { - $config_text .= "deny 1-65535 0.0.0.0/0 1-65535\n"; + $config_text .= "deny 0-65535 0.0.0.0/0 0-65535\n"; } /* Allow UPnP IGD or PCP/NAT-PMP as requested */ $config_text .= "enable_upnp=" . ( $upnp_config['enable_upnp'] ? "yes\n" : "no\n" ); $config_text .= "enable_pcp_pmp=" . ( $upnp_config['enable_natpmp'] ? "yes\n" : "no\n" ); - // When building the daemon with UPnP IGDv2, infinite (IGDv1 only) lease duration port maps are reduced - // to 7d, following the IGDv2 standard. Disabling it at runtime allows IGDv2-incompatible clients - if (($upnp_config['upnp_igd_compat'] ?? 'igdv1') == 'igdv1') { - $config_text .= "force_igd_desc_v1=yes\n"; - } - - $config_text .= "lease_file=/var/run/miniupnpd.leases\n"; - $config_text .= "lease_file6=/var/run/miniupnpd.leases-ipv6\n"; + /* configure lifetimes to force periodic expire */ + $config_text .= "clean_ruleset_interval=600\n"; + $config_text .= "min_lifetime=120\n"; + $config_text .= "max_lifetime=86400\n"; /* write out the configuration */ file_put_contents('/var/etc/miniupnpd.conf', $config_text); diff --git a/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/ACL/ACL.xml b/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/ACL/ACL.xml index 23a2fa96e2..cc93dde4ad 100644 --- a/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/ACL/ACL.xml +++ b/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/ACL/ACL.xml @@ -1,12 +1,12 @@ - Services: UPnP IGD & PCP: Settings + Service: Universal Plug and Play services_upnp.php* - Services: UPnP IGD & PCP: Active Maps + Status: Universal Plug and Play status_upnp.php* diff --git a/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/Menu/Menu.xml b/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/Menu/Menu.xml index c040d5ea16..0dfae6b0f3 100644 --- a/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/Menu/Menu.xml +++ b/net/upnp/src/opnsense/mvc/app/models/OPNsense/UPnP/Menu/Menu.xml @@ -1,10 +1,10 @@ - - + + - + diff --git a/net/upnp/src/www/services_upnp.php b/net/upnp/src/www/services_upnp.php index ec54020425..d3a5897d88 100644 --- a/net/upnp/src/www/services_upnp.php +++ b/net/upnp/src/www/services_upnp.php @@ -69,15 +69,12 @@ function miniupnpd_validate_port($port) $pconfig = []; $copy_fields = [ - 'allow_third_party_mapping', 'download', 'enable', 'enable_natpmp', 'enable_upnp', 'ext_iface', - 'friendly_name', 'iface_array', - 'ipv6_disable', 'logpackets', 'overridesubnet', 'overridewanip', @@ -87,7 +84,6 @@ function miniupnpd_validate_port($port) 'num_permuser', 'sysuptime', 'upload', - 'upnp_igd_compat', ]; foreach (miniupnpd_permuser_list() as $permuser) { @@ -178,7 +174,7 @@ function miniupnpd_validate_port($port) // save form data $upnp = []; // boolean types - foreach (['enable', 'enable_upnp', 'enable_natpmp', 'logpackets', 'sysuptime', 'permdefault', 'allow_third_party_mapping', 'ipv6_disable'] as $fieldname) { + foreach (['enable', 'enable_upnp', 'enable_natpmp', 'logpackets', 'sysuptime', 'permdefault'] as $fieldname) { $upnp[$fieldname] = !empty($pconfig[$fieldname]); } // numeric types @@ -186,7 +182,7 @@ function miniupnpd_validate_port($port) $upnp['num_permuser'] = $pconfig['num_permuser']; } // text field types - foreach (['ext_iface', 'download', 'upload', 'overridewanip', 'overridesubnet', 'stun_host', 'stun_port', 'friendly_name', 'upnp_igd_compat'] as $fieldname) { + foreach (['ext_iface', 'download', 'upload', 'overridewanip', 'overridesubnet', 'stun_host', 'stun_port'] as $fieldname) { $upnp[$fieldname] = $pconfig[$fieldname]; } foreach (miniupnpd_permuser_list() as $fieldname) { @@ -197,7 +193,7 @@ function miniupnpd_validate_port($port) // sync to config $config['installedpackages']['miniupnpd']['config'] = $upnp; - write_config('Modified UPnP IGD & PCP settings'); + write_config('Modified Universal Plug and Play settings'); miniupnpd_configure_do(); filter_configure(); header(url_safe('Location: /services_upnp.php')); @@ -223,7 +219,9 @@ function miniupnpd_validate_port($port)
{{ lang._('Enabled') }}{{ lang._('Interfaces') }}{{ lang._('Multicast Addresses') }}{{ lang._('Source Address') }}{{ lang._('Listen Port') }}{{ lang._('ID') }}{{ lang._('Description') }}{{ lang._('ID') }}{{ lang._('Use ID as TTL') }}{{ lang._('Commands') }}{{ lang._('Enabled') }}{{ lang._('Interfaces') }}{{ lang._('Multicast Addresses') }}{{ lang._('Source Address') }}{{ lang._('Listen Port') }}{{ lang._('ID') }}{{ lang._('Description') }}{{ lang._('ID') }}{{ lang._('Use ID as TTL') }}{{ lang._('Commands') }}
- + - + @@ -255,82 +253,49 @@ function miniupnpd_validate_port($port) - + - + - -
+ + @@ -233,11 +231,11 @@ function miniupnpd_validate_port($port)
/>
/>
-
-
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - -
- - -
- -
- -
- /> -
- /> + +
- /> - + +
-
-
-
-
-
-
- - - - + + - - - - - - - + - + - + @@ -436,47 +388,37 @@ function miniupnpd_validate_port($port)
+ +
- -
- - + /> +
- - + /> +
- + /> +
- + - - - - - + $permuser): ?> - + - + -
- /> - -
- +
- +
@@ -490,7 +432,7 @@ function miniupnpd_validate_port($port)   - + " /> diff --git a/net/upnp/src/www/status_upnp.php b/net/upnp/src/www/status_upnp.php index 394d421706..96ac60e80f 100644 --- a/net/upnp/src/www/status_upnp.php +++ b/net/upnp/src/www/status_upnp.php @@ -29,21 +29,19 @@ require_once("guiconfig.inc"); require_once("interfaces.inc"); -require_once("util.inc"); require_once("plugins.inc.d/miniupnpd.inc"); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!empty($_POST['clear'])) { miniupnpd_stop(); - unlink('/var/run/miniupnpd.leases'); - unlink('/var/run/miniupnpd.leases-ipv6'); miniupnpd_start(); header(url_safe('Location: /status_upnp.php')); exit; } } -$rdr_entries = shell_safe('/sbin/pfctl -P -a miniupnpd -s nat; /sbin/pfctl -P -a miniupnpd -s rules', [], true); +$rdr_entries = array(); +exec("/sbin/pfctl -aminiupnpd -sn", $rdr_entries, $pf_ret); $service_hook = 'miniupnpd'; include("head.inc"); @@ -59,50 +57,38 @@
-

+

- +
- - - - - - - + + + + + + + .+) inet proto (?P.+) from (?P[^ ]+) (port (?P.+) )?to (?P.+) port = (?P.+) keep state (label "(?P.+)" )?rtable [0-9] -> (?P.+) port (?P.+)/', $rdr_entry, $matches) && - !preg_match('/on (?P.+) inet6 proto (?P.+) from (?P[^ ]+) (port = (?P.+) )?to (?P.+) port = (?P\d+) (flags [^ ]+ )?keep state (label "(?P.+)" )?rtable [0-9]/', $rdr_entry, $matches)) { + if (!preg_match("/on (?P.*) inet proto (?P.*) from (?P.*) (port (?P.*) )?to (?P.*) port = (?P.*) keep state (label \"(?P.*)\" )?rtable [0-9] -> (?P.*) port (?P.*)/", $rdr_entry, $matches)) { continue; } - if (preg_match('/PCP ([A-Z]+) ([0-9a-f]{24})$/', $matches['descr'], $descrmatch) === 1) { - $descr = "PCP ({$descrmatch[1]} nonce {$descrmatch[2]})"; - } elseif (preg_match('/^NAT-PMP \d+ \w+$/', $matches['descr'], $descrmatch) === 1) { - $descr = 'NAT-PMP'; - } elseif (preg_match('/^pinhole-(\d+).*IGD2 pinhole$/', $matches['descr'], $descrmatch) === 1) { - $descr = "UPnP IGDv2 IPv6 (UID {$descrmatch[1]})"; - } elseif (preg_match('/^UPnP IGD/', $matches['descr'], $descrmatch) === 1) { - $descr = $matches['descr']; - } else { - $descr = "UPnP IGD / {$matches['descr']}"; - } ?> + - - + @@ -111,10 +97,8 @@ diff --git a/net/wol/Makefile b/net/wol/Makefile index 90f4508aac..19e6aa94dd 100644 --- a/net/wol/Makefile +++ b/net/wol/Makefile @@ -3,5 +3,6 @@ PLUGIN_VERSION= 2.5 PLUGIN_REVISION= 3 PLUGIN_DEPENDS= wol PLUGIN_COMMENT= Wake on LAN Service +PLUGIN_MAINTAINER= franco@opnsense.org .include "../../Mk/plugins.mk" diff --git a/net/zerotier/Makefile b/net/zerotier/Makefile index ae7f99b1ee..bd40a597be 100644 --- a/net/zerotier/Makefile +++ b/net/zerotier/Makefile @@ -3,5 +3,6 @@ PLUGIN_VERSION= 1.3.2 PLUGIN_REVISION= 6 PLUGIN_COMMENT= Virtual Networks That Just Work PLUGIN_DEPENDS= zerotier +PLUGIN_MAINTAINER= dharrigan@gmail.com .include "../../Mk/plugins.mk" diff --git a/security/acme-client/Makefile b/security/acme-client/Makefile index 8ae4798d8e..a81e74fb70 100644 --- a/security/acme-client/Makefile +++ b/security/acme-client/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= acme-client -PLUGIN_VERSION= 4.11 +PLUGIN_VERSION= 4.10 PLUGIN_COMMENT= ACME Client PLUGIN_MAINTAINER= opnsense@moov.de PLUGIN_DEPENDS= acme.sh py${PLUGIN_PYTHON}-dns-lexicon diff --git a/security/acme-client/pkg-descr b/security/acme-client/pkg-descr index 971425135c..f954107257 100644 --- a/security/acme-client/pkg-descr +++ b/security/acme-client/pkg-descr @@ -8,24 +8,6 @@ WWW: https://github.com/acmesh-official/acme.sh Plugin Changelog ================ -4.11 - -Added: -* add support for Hetzner Cloud DNS API (#5020) -* add support for Selectel.ru V2 API (#4824) -* add support for mijn.host DNS API (#4446) -* add support for AzureDNS System Assigned Managed Identity #4830 (4830) -* add support for ZoneEdit DNS API (#4671) - -Changed: -* use mwexec/file_safe for HTTP-01/TLSALPN challenge types (core #9325) - -Fixed: -* fix deprecated PHP syntax in cron settings (#4824) - -Deprecated: -* deprecate support for HTTP-01 challenge types (no removal date yet) - 4.10 Added: @@ -372,7 +354,7 @@ Changed: Changed: * rename "Linode Cloud API" to "Linode API (v4)" (#2609) -* rename "Linode API" to "Linode API (v3/deprecated)" (#2609) +* rename "Linode API" to "Linode API (v3 / Deprecated)" (#2609) 3.3 diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php index 4104f6bf29..5251a32f7c 100644 --- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php +++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php @@ -77,7 +77,7 @@ public function fetchCronIntegrationAction() } else { // Cron job NOT found. This should not happen, try to fix // this automatically. - $this->getLogger()->error("AcmeClient: cron job with stored UUID not found in system config: {$cron_uuid}"); + $this->getLogger()->error("AcmeClient: cron job with stored UUID not found in system config: ${cron_uuid}"); // Search for existing AcmeClient cron job. foreach ((new Cron())->getNodeByReference('jobs.job')->iterateItems() as $cron) { @@ -86,7 +86,7 @@ public function fetchCronIntegrationAction() if ($_origin == 'AcmeClient') { // Found a matching AcmeClient cron job. $cron_found = 1; - $this->getLogger()->notice("AcmeClient: found existing AcmeClient cron job, fixing inconsistency in config (new UUID: {$_uuid})"); + $this->getLogger()->notice("AcmeClient: found existing AcmeClient cron job, fixing inconsistency in config (new UUID: ${_uuid})"); // Update UUID in Acme Client config. $mdlAcme->settings->UpdateCron = $_uuid; // Save updated configuration. diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml index 5773c1c0f9..d710440361 100644 --- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml +++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml @@ -226,12 +226,6 @@ text - - validation.dns_azuredns_managedidentity - - checkbox - documentation.]]> - header @@ -568,21 +562,6 @@ password - - - header - - - - validation.dns_zoneedit_id - - text - - - validation.dns_zoneedit_token - - text - header @@ -595,9 +574,9 @@ validation.dns_gandi_livedns_key - + text - The API key is the previous mechanism that was replaced with Personal Access Tokens. API keys should no longer be used. + The API Key is the previous mechanism that was replaced with Personal Access Tokens. API Keys should no longer be used. @@ -840,7 +819,7 @@ Specify the location of the generated TSIG Key inside the TSIG file using grep and cut, example: grep \# /etc/knot/acme.key | cut -d' ' -f2 - + header @@ -870,7 +849,7 @@ text - + header @@ -1245,47 +1224,14 @@ text - + header validation.dns_sl_key - - text - - - validation.dns_sl_apiver - - dropdown - - - validation.dns_sl_token_lifetime - - text - Token lifetime in minutes (0-1440) - - - validation.dns_sl_account_id - - text - The account number can be found on the Selectel control panel - - - validation.dns_sl_project_name - - text - - - validation.dns_sl_login_name - + text - The service username can be found in the Selectel control panel - - - validation.dns_sl_password - - password @@ -1644,16 +1590,6 @@ password - - - header - - - - validation.dns_hetznercloud_token - - password - header @@ -2004,15 +1940,6 @@ password - - header - - - - validation.dns_mijnhost_api_key - - text - API documentation for further information.]]> header diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsAzure.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsAzure.php index 88e86551fc..1b2acc9dcc 100644 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsAzure.php +++ b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsAzure.php @@ -43,9 +43,5 @@ public function prepare() $this->acme_env['AZUREDNS_TENANTID'] = (string)$this->config->dns_azuredns_tenantid; $this->acme_env['AZUREDNS_APPID'] = (string)$this->config->dns_azuredns_appid; $this->acme_env['AZUREDNS_CLIENTSECRET'] = (string)$this->config->dns_azuredns_clientsecret; - - if ($this->config->dns_azuredns_managedidentity == '1') { - $this->acme_env['AZUREDNS_MANAGEDIDENTITY'] = 'true'; - } } } diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsHetznercloud.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsHetznercloud.php deleted file mode 100644 index a45a3007fb..0000000000 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsHetznercloud.php +++ /dev/null @@ -1,44 +0,0 @@ -acme_env['HETZNER_TOKEN'] = (string)$this->config->dns_hetznercloud_token; - } -} diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsMijnhost.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsMijnhost.php deleted file mode 100644 index f077995c25..0000000000 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsMijnhost.php +++ /dev/null @@ -1,44 +0,0 @@ -acme_env['MIJNHOST_API_KEY'] = (string)$this->config->dns_mijnhost_api_key; - } -} diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsSelectel.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsSelectel.php index 54a115cd39..56e3112666 100644 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsSelectel.php +++ b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsSelectel.php @@ -2,7 +2,6 @@ /* * Copyright (C) 2020 Frank Wall - * Copyright (C) 2025 Renat Gorbushin * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,11 +40,5 @@ class DnsSelectel extends Base implements LeValidationInterface public function prepare() { $this->acme_env['SL_Key'] = (string)$this->config->dns_sl_key; - $this->acme_env['SL_Ver'] = (string)$this->config->dns_sl_apiver; - $this->acme_env['SL_Expire'] = (string)$this->config->dns_sl_token_lifetime; - $this->acme_env['SL_Login_ID'] = (string)$this->config->dns_sl_account_id; - $this->acme_env['SL_Project_Name'] = (string)$this->config->dns_sl_project_name; - $this->acme_env['SL_Login_Name'] = (string)$this->config->dns_sl_login_name; - $this->acme_env['SL_Pswd'] = (string)$this->config->dns_sl_password; } } diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsZoneedit.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsZoneedit.php deleted file mode 100644 index 5252b44104..0000000000 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsZoneedit.php +++ /dev/null @@ -1,45 +0,0 @@ -acme_env['ZONEEDIT_ID'] = (string)$this->config->dns_zoneedit_id; - $this->acme_env['ZONEEDIT_Token'] = (string)$this->config->dns_zoneedit_token; - } -} diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/HttpOpnsense.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/HttpOpnsense.php index 03ca5e97cd..12ab4ba56c 100644 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/HttpOpnsense.php +++ b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/HttpOpnsense.php @@ -31,8 +31,6 @@ use OPNsense\AcmeClient\LeValidationInterface; use OPNsense\AcmeClient\LeUtils; use OPNsense\Core\Config; -use OPNsense\Core\File; -use OPNsense\Core\Shell; /** * Use internal OPNsense webserver for HTTP-01 validation @@ -127,16 +125,19 @@ public function prepare() } // Create temporary port forward to allow acme challenges to get through - File::file_put_contents("{$configdir}/acme_anchor_setup", "rdr-anchor \"acme-client\"\n", 0600); - Shell::run_safe('/sbin/pfctl -f %s', ["{$configdir}/acme_anchor_setup"]); - File::file_put_contents("{$configdir}/acme_anchor_rules", $anchor_rules, 0600); - Shell::run_safe('/sbin/pfctl -a %s -f %s', ['acme-client', "{$configdir}/acme_anchor_rules"]); + $anchor_setup = "rdr-anchor \"acme-client\"\n"; + file_put_contents("{$configdir}/acme_anchor_setup", $anchor_setup); + chmod("{$configdir}/acme_anchor_setup", 0600); + mwexec("/sbin/pfctl -f {$configdir}/acme_anchor_setup"); + file_put_contents("{$configdir}/acme_anchor_rules", $anchor_rules); + chmod("{$configdir}/acme_anchor_rules", 0600); + mwexec("/sbin/pfctl -a acme-client -f {$configdir}/acme_anchor_rules"); } public function cleanup() { // Flush OPNsense port forward rules. - Shell::run_safe('/sbin/pfctl -a %s -F %s', ['acme-client', 'all']); + mwexec('/sbin/pfctl -a acme-client -F all'); // Workaround to solve disconnection issues reported by some users. $backend = new \OPNsense\Core\Backend(); diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/TlsalpnAcme.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/TlsalpnAcme.php index df5819600e..03a4f9d763 100644 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/TlsalpnAcme.php +++ b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/TlsalpnAcme.php @@ -31,8 +31,6 @@ use OPNsense\AcmeClient\LeValidationInterface; use OPNsense\AcmeClient\LeUtils; use OPNsense\Core\Config; -use OPNsense\Core\File; -use OPNsense\Core\Shell; /** * Use acme.sh TLS web server for TLS-ALPN-01 validation @@ -128,16 +126,19 @@ public function prepare() } // Create temporary port forward to allow acme challenges to get through - File::file_put_contents("{$configdir}/acme_anchor_setup", "rdr-anchor \"acme-client\"\n", 0600); - Shell::run_safe('/sbin/pfctl -f %s', ["{$configdir}/acme_anchor_setup"]); - File::file_put_contents("{$configdir}/acme_anchor_rules", $anchor_rules, 0600); - Shell::run_safe("/sbin/pfctl -a %s -f %s", ['acme-client', "{$configdir}/acme_anchor_rules"]); + $anchor_setup = "rdr-anchor \"acme-client\"\n"; + file_put_contents("{$configdir}/acme_anchor_setup", $anchor_setup); + chmod("{$configdir}/acme_anchor_setup", 0600); + mwexec("/sbin/pfctl -f {$configdir}/acme_anchor_setup"); + file_put_contents("{$configdir}/acme_anchor_rules", $anchor_rules); + chmod("{$configdir}/acme_anchor_rules", 0600); + mwexec("/sbin/pfctl -a acme-client -f {$configdir}/acme_anchor_rules"); } public function cleanup() { // Flush OPNsense port forward rules. - Shell::run_safe('/sbin/pfctl -a %s -F %s', ['acme-client', 'all']); + mwexec('/sbin/pfctl -a acme-client -F all'); // Workaround to solve disconnection issues reported by some users. $backend = new \OPNsense\Core\Backend(); diff --git a/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml b/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml index d552f3d0b6..e9dbfa6d1e 100644 --- a/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml +++ b/security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml @@ -469,7 +469,6 @@ Google Domains GratisDNS.dk Hetzner - Hetzner Cloud hexonet.com hosting.de Hurricane Electric @@ -485,14 +484,13 @@ KingHost Knot (knsupdate) LeaseWeb - Lexicon (deprecated) + lexicon (DEPRECATED) Lima-City (TrafficPlex) - Linode (v3/deprecated) + Linode (v3 / Deprecated) Linode (v4) Loopia LuaDNS.com MailinaBox - mijn.host MyDNS.JP Mythic Beasts Name.com @@ -532,7 +530,6 @@ Yandex PDD Zilore Zone.eu - ZoneEdit zonomi.com @@ -582,10 +579,6 @@ N - - 0 - N - N @@ -1057,28 +1050,6 @@ N - - N - - API version 1 (deprecated) - API version 2 - - - - N - - - N - - - N - - - N - - - N - N @@ -1206,9 +1177,6 @@ N - - N - N @@ -1347,18 +1315,9 @@ N - - N - N - - N - - - N - @@ -1532,7 +1491,10 @@ Select a command from the list. N - + + + N + 5000 N diff --git a/security/etpro-telemetry/Makefile b/security/etpro-telemetry/Makefile index d206a5d1c5..c45747de65 100644 --- a/security/etpro-telemetry/Makefile +++ b/security/etpro-telemetry/Makefile @@ -1,8 +1,8 @@ PLUGIN_NAME= etpro-telemetry -PLUGIN_VERSION= 1.8 +PLUGIN_VERSION= 1.7 +PLUGIN_REVISION= 5 PLUGIN_COMMENT= ET Pro Telemetry Edition PLUGIN_MAINTAINER= ad@opnsense.org -PLUGIN_DEPENDS= py${PLUGIN_PYTHON}-netaddr PLUGIN_WWW= https://docs.opnsense.org/manual/etpro_telemetry.html PLUGIN_TIER= 2 diff --git a/security/etpro-telemetry/src/opnsense/www/js/widgets/ETProTelemetry.js b/security/etpro-telemetry/src/opnsense/www/js/widgets/ETProTelemetry.js index 046736bc75..8ec7b63b2c 100644 --- a/security/etpro-telemetry/src/opnsense/www/js/widgets/ETProTelemetry.js +++ b/security/etpro-telemetry/src/opnsense/www/js/widgets/ETProTelemetry.js @@ -41,7 +41,7 @@ export default class ETProTelemetry extends BaseTableWidget { async onWidgetTick() { const data = await this.ajaxCall('/api/diagnostics/proofpoint_et/status'); - if (data['sensor_status'].length) { + if (data['sensor_status'].toLowerCase() == 'active') { $('#etpro_sensor_status').text(data['sensor_status']); $('#etpro_event_received').text(data['event_received']); $('#etpro_last_rule_download').text(data['last_rule_download']); diff --git a/security/netbird/Makefile b/security/netbird/Makefile index 94edc0d4f2..94eb027d84 100644 --- a/security/netbird/Makefile +++ b/security/netbird/Makefile @@ -1,8 +1,10 @@ PLUGIN_NAME= netbird -PLUGIN_VERSION= 1.1 +PLUGIN_VERSION= 0.2 +PLUGIN_REVISION= 1 PLUGIN_DEPENDS= netbird PLUGIN_COMMENT= Peer-to-peer VPN that seamlessly connects your devices PLUGIN_MAINTAINER= dev@netbird.io PLUGIN_WWW= https://netbird.io +PLUGIN_DEVEL= yes .include "../../Mk/plugins.mk" diff --git a/security/netbird/src/opnsense/mvc/app/controllers/OPNsense/Netbird/forms/settings.xml b/security/netbird/src/opnsense/mvc/app/controllers/OPNsense/Netbird/forms/settings.xml index 2f5f4224fc..4d9f69bb27 100644 --- a/security/netbird/src/opnsense/mvc/app/controllers/OPNsense/Netbird/forms/settings.xml +++ b/security/netbird/src/opnsense/mvc/app/controllers/OPNsense/Netbird/forms/settings.xml @@ -90,14 +90,4 @@ checkbox Enable Rosenpass permissive mode - - header - - - - settings.syslog.logLevel - - dropdown - Set the syslog logging level. Setting a certain log level will cause all messages of the specified and more severe log levels to be logged. - diff --git a/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Authentication.xml b/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Authentication.xml index b9ac20dd27..c12afa3b2e 100644 --- a/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Authentication.xml +++ b/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Authentication.xml @@ -8,7 +8,7 @@ https://api.netbird.io:443 - + Y /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i Please specify a valid setup key. diff --git a/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Settings.xml b/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Settings.xml index a99ce9985a..0d9fa123c5 100644 --- a/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Settings.xml +++ b/security/netbird/src/opnsense/mvc/app/models/OPNsense/Netbird/Settings.xml @@ -1,7 +1,7 @@ //OPNsense/netbird/settings NetBird settings - 1.1.0 + 1.0.0 @@ -62,19 +62,5 @@ Y - - - Y - info - - fatal - error - warn - info - debug - trace - - - diff --git a/security/netbird/src/opnsense/mvc/app/views/OPNsense/Netbird/settings.volt b/security/netbird/src/opnsense/mvc/app/views/OPNsense/Netbird/settings.volt index 7c505a7a11..ba255057c8 100644 --- a/security/netbird/src/opnsense/mvc/app/views/OPNsense/Netbird/settings.volt +++ b/security/netbird/src/opnsense/mvc/app/views/OPNsense/Netbird/settings.volt @@ -29,8 +29,9 @@ - - -
-
- {{ partial("layout_partials/base_form",['fields':formSettings,'id':'frm_settings'])}} -
-
-
- + + .
- - - - - - - - - - - -
{{ lang._('Description') }}{{ lang._('Type') }}{{ lang._('Updated at') }}{{ lang._('Next update') }}{{ lang._('Licensed') }}
-
-
- - - - - - - - - - - - - - - -
{{ lang._('Timestamp') }}{{ lang._('Interface') }}{{ lang._('Direction') }}{{ lang._('Source') }}{{ lang._('Source Port') }}{{ lang._('Destination') }}{{ lang._('Destination Port') }}
-
{{ lang._('Collected events from the firewall log for QFeed aliases') }}
-
-
- -
-
-
-
- -

-
-
-
diff --git a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/__init__.py b/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/__init__.py deleted file mode 100755 index f0f029c1db..0000000000 --- a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/__init__.py +++ /dev/null @@ -1,187 +0,0 @@ -""" - Copyright (c) 2025 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. -""" -import os -import subprocess -import time -import ujson -from datetime import datetime -from lib.api import Api -from lib.log import PFLogCrawler -from lib.file import LockedFile - - -class QFeedsActions: - def __init__(self, target_dir, forced=False): - self._target_dir = target_dir - self._forced = forced - - @classmethod - def list_actions(cls): - return [ - 'fetch_index', - 'fetch', - 'show_index', - 'firewall_load', - 'unbound_load', - 'update', - 'stats', - 'logs' - ] - - @property - def index_file(self): - return "%s/index.json" % self._target_dir - - @property - def index(self): - if not os.path.exists(self.index_file) and self._forced: - # require index file to get feeds - list(self.fetch_index()) - elif not os.path.exists(self.index_file): - return {} - data = ujson.load(open(self.index_file)) or {} - if type(data) is dict: - for feed in data.get('feeds', []): - feed['local_filename'] = "%s/%s.txt" % (self._target_dir, feed['feed_type']) - feed['updated_at_dt'] = datetime.fromisoformat(feed['updated_at']).timestamp() - feed['next_update_dt'] = datetime.fromisoformat(feed['next_update']).timestamp() - - return data - - def _file_stat(self, filename): - if not os.path.exists(filename): - return 0 - return os.stat(filename).st_mtime - - def fetch_index(self): - if not os.path.isdir(self._target_dir): - os.makedirs(self._target_dir) - with LockedFile(self.index_file) as f: - payload = Api().licenses() - f.truncate() - f.write(ujson.dumps(payload)) - yield 'downloaded index to %s' % f.filename - - def show_index(self): - yield ujson.dumps(self.index) - - def fetch(self): - for feed in self.index.get('feeds', []): - if feed['licensed'] and feed['updated_at_dt'] != self._file_stat(feed['local_filename']): - with LockedFile(feed['local_filename']) as f: - counter = 0 - for entry in Api().fetch(feed['feed_type']): - if counter == 0: - f.truncate() - f.write("%s\n" % entry) - counter += 1 - os.utime(feed['local_filename'], (feed['updated_at_dt'], feed['updated_at_dt'])) - yield "downloaded %d entries into %s [%s]" % (counter, feed['local_filename'], feed['updated_at']) - elif feed['licensed']: - yield "skipped %s [%s]" % (feed['local_filename'], feed['updated_at']) - - def firewall_load(self): - for feed in self.index.get('feeds', []): - if feed['licensed'] and os.path.exists(feed['local_filename']) and feed['type'] == 'ip': - table_name = '__qfeeds_%s' % feed['feed_type'] - sp = subprocess.run( - ['/sbin/pfctl', '-t', table_name, '-T', 'replace', '-f', feed['local_filename']], - capture_output=True, - text=True - ) - yield 'load feed %s [%s]' % (feed['feed_type'], sp.stderr.strip().replace("\n", " ")) - - def unbound_load(self): - bl_conf = '/usr/local/etc/unbound/qfeeds-blocklists.conf' - if os.path.exists(bl_conf) and os.path.getsize(bl_conf) > 20: - # when qfeeds-blocklists.conf is ~empty, skip updates - subprocess.run(['/usr/local/sbin/configctl', 'unbound', 'dnsbl']) - yield 'update unbound blocklist' - - def update(self): - update_sleep = 99999 - try: - index_payload = self.index - except TypeError: - # when the index can't be parsed, assume we have none while updating - index_payload = {} - do_update = len(index_payload.get('feeds', [])) == 0 - for feed in index_payload.get('feeds', []): - update_sleep = min(feed['next_update_dt'] - time.time(), update_sleep) - if feed['licensed'] and update_sleep <= 300: # 5 minute cron interval - do_update = True - if do_update: - if 0 < update_sleep <= 300: - time.sleep(update_sleep) - for action in ['fetch_index', 'fetch', 'firewall_load', 'unbound_load']: - yield from getattr(self, action)() - - def stats(self): - result = {'feeds': []} - for feed in self.index.get('feeds', []): - if feed['licensed'] and os.path.exists(feed['local_filename']) and feed['type'] == 'ip': - table_name = '__qfeeds_%s' % feed['feed_type'] - sp = subprocess.Popen( - ['/sbin/pfctl', '-t', table_name, '-vT', 'show'], - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - text=True - ) - record = { - 'name': feed['feed_type'], - 'total_entries': 0, - 'packets_blocked': 0, - 'bytes_blocked': 0, - 'addresses_blocked': 0 - } - while (line := sp.stdout.readline()): - if line.startswith(' '): - record['total_entries'] += 1 - elif 'Packets:' in line and 'Packets: 0 ' not in line: - parts = line.split() - if parts[3].isdigit() and parts[5].isdigit() and parts[0].lower().find('block') > 0: - record['packets_blocked'] += int(parts[3]) - record['bytes_blocked'] += int(parts[5]) - record['addresses_blocked'] += 1 - - result['feeds'].append(record) - result['totals'] = { - 'entries': sum(r['total_entries'] for r in result['feeds']), - # assumes no overlaps in datafeeds - 'addresses_blocked': sum(r['addresses_blocked'] for r in result['feeds']), - 'packets_blocked': sum(r['packets_blocked'] for r in result['feeds']), - 'bytes_blocked': sum(r['bytes_blocked'] for r in result['feeds']), - } - - yield ujson.dumps(result) - - def logs(self): - feeds = [] - for feed in self.index.get('feeds', []): - if feed['type'] == 'ip': - feeds.append('__qfeeds_%s' % feed['feed_type']) - - yield ujson.dumps({'rows': PFLogCrawler(feeds).find()}) diff --git a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/api.py b/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/api.py deleted file mode 100755 index 6f2bb6a3cb..0000000000 --- a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/api.py +++ /dev/null @@ -1,70 +0,0 @@ -""" - Copyright (c) 2025 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. -""" -import os -import requests -from configparser import ConfigParser - - -class QFeedsConfig: - api_key = None - - def __init__(self): - config_filename = '/usr/local/etc/qfeeds.conf' - if os.path.isfile(config_filename): - cnf = ConfigParser() - cnf.read(config_filename) - if cnf.has_section('api') and cnf.has_option('api', 'key'): - self.api_key = cnf.get('api', 'key') - - -class Api: - def __init__(self): - self.api_key = QFeedsConfig().api_key - - def licenses(self): - r = requests.get( - url='https://api.qfeeds.com/licenses.php', - auth=('api_token', self.api_key), - timeout=60, - headers={'User-Agent': 'Q-Feeds_OPNsense'} - ) - r.raise_for_status() - return r.json() - - def fetch(self, feed): - r = requests.get( - url='https://api.qfeeds.com/api.php', - params={'feed_type': feed}, - auth=('api_token', self.api_key), - headers={'User-Agent': 'Q-Feeds_OPNsense'}, - stream=True, - timeout=60 - ) - r.raise_for_status() - for line in r.raw: - entry = line.decode().strip() - if entry: - yield entry diff --git a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/file.py b/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/file.py deleted file mode 100755 index 89fbf8ae8a..0000000000 --- a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/file.py +++ /dev/null @@ -1,52 +0,0 @@ -""" - Copyright (c) 2025 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. -""" -import fcntl - - -class LockedFile: - def __init__(self, filename): - self._filename = filename - self._fh = None - - def __enter__(self): - self._fh = open(self._filename, 'a+') - fcntl.flock(self._fh, fcntl.LOCK_EX | fcntl.LOCK_NB) - return self - - def __exit__(self, ex_type, ex_value, traceback): - if self._fh: - self._fh.close() - - def truncate(self): - self._fh.seek(0) - self._fh.truncate() - - def write(self, data): - self._fh.write(data) - - @property - def filename(self): - return self._filename diff --git a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/log.py b/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/log.py deleted file mode 100755 index d3aca4ee2e..0000000000 --- a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/log.py +++ /dev/null @@ -1,86 +0,0 @@ -""" - Copyright (c) 2025 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. -""" - -import glob -import time -import subprocess -import ipaddress - -def is_ip_address(value): - try: - ipaddress.ip_address(value) - return True - except ValueError: - return False - - -class PFLogCrawler: - def __init__(self, table_names:list=[]): - self._table_names = table_names - self._rule_ids = set() - self._collect_rule_ids() - - def _collect_rule_ids(self): - self._rule_ids = set() - sp = subprocess.run(['/sbin/pfctl', '-sr'], capture_output=True, text=True) - for line in sp.stdout.split("\n"): - for table in self._table_names: - if line.find("<%s>" % table) > 0: - self._rule_ids.add(line.split()[-1].strip('"')) - if 'label "' in line: - quote_start = line.find('"', line.find('label "')) - quote_end = line.find('"', quote_start + 1) - if quote_end > quote_start: - self._rule_ids.add(line[quote_start + 1:quote_end]) - - @staticmethod - def _parse_log_line(line): - # quick scan for datetime, interface, direction, source, dest, source_port, dest_port - parts = line.split() - fw_line = parts[-1].split(',') # strip syslog - ip_addresses = [x for x in fw_line if is_ip_address(x)] - # Find destination IP position to get ports from next fields (only if numeric) - dest_idx = fw_line.index(ip_addresses[1]) if len(ip_addresses) > 1 else len(fw_line) - source_port = fw_line[dest_idx + 1] if dest_idx + 1 < len(fw_line) and fw_line[dest_idx + 1].isdigit() else '' - dest_port = fw_line[dest_idx + 2] if dest_idx + 2 < len(fw_line) and fw_line[dest_idx + 2].isdigit() else '' - return [parts[1], fw_line[4], fw_line[7]] + ip_addresses + [source_port, dest_port] - - def find(self, max_time=60, max_results=50000): - result = [] - start_time = time.time() - rows_processed = 0 - for filename in sorted(glob.glob("/var/log/filter/filter_*.log"), reverse=True): - with open(filename) as f_in: - for idx, line in enumerate(f_in): - for rule_id in self._rule_ids: - if rule_id in line: - result.append(self._parse_log_line(line)) - rows_processed +=1 - break # inner loop - if (idx % 100000 == 0 and time.time() - start_time > max_time) or rows_processed >= max_results: - return result - - return result diff --git a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/qfeedsctl.py b/security/q-feeds-connector/src/opnsense/scripts/qfeeds/qfeedsctl.py deleted file mode 100755 index 7973d59f4c..0000000000 --- a/security/q-feeds-connector/src/opnsense/scripts/qfeeds/qfeedsctl.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/local/bin/python3 - -""" - Copyright (c) 2025 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. -""" - -import argparse -import sys -import ujson -from requests.exceptions import HTTPError, Timeout -from lib import QFeedsActions - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--target_dir', default='/var/db/qfeeds-tables') - parser.add_argument('-f', help='forced (auto index)' , default=False, action='store_true') - parser.add_argument('-v', help='verbose output' , default=False, action='store_true') - parser.add_argument("action", choices=QFeedsActions.list_actions(), nargs='*') - args = parser.parse_args() - if args.v: - # verbose mode - import http.client as http_client - http_client.HTTPConnection.debuglevel = 1 - try: - actions = QFeedsActions(args.target_dir, args.f) - for action in args.action: - for msg in getattr(actions, action)(): - print(msg) - except HTTPError as exc: - print('exit with HTTPError %d (%s)' % (exc.response.status_code, exc.response.text)) - sys.exit(-1) - except Timeout as exc: - print('timeout reaching api endpoint') - sys.exit(-1) - except IOError as e: - print("output filename locked or missing") - sys.exit(-1) - except ujson.JSONDecodeError: - print("JSON decode error") - sys.exit(-1) diff --git a/security/q-feeds-connector/src/opnsense/scripts/unbound/blocklists/qfeeds_bl.py b/security/q-feeds-connector/src/opnsense/scripts/unbound/blocklists/qfeeds_bl.py deleted file mode 100755 index e10428db08..0000000000 --- a/security/q-feeds-connector/src/opnsense/scripts/unbound/blocklists/qfeeds_bl.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/local/bin/python3 - -""" - Copyright (c) 2025 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. -""" - -import os -from . import BaseBlocklistHandler - -class DefaultBlocklistHandler(BaseBlocklistHandler): - def __init__(self): - super().__init__('/usr/local/etc/unbound/qfeeds-blocklists.conf') - self.priority = 50 - - def get_config(self): - # do not use, unbound worker settings - return {} - - def get_blocklist(self): - # Only return domains if integration is enabled (filenames are offered) - qfeeds_filenames = [] - if self.cnf and self.cnf.has_section('settings'): - if self.cnf.has_option('settings', 'filenames'): - qfeeds_filenames = self.cnf.get('settings', 'filenames').split(',') - - result = {} - for filename in qfeeds_filenames: - bl_shortcode = "qf_%s" % os.path.splitext(os.path.basename(filename).strip())[0] - if os.path.exists(filename): - with open(filename, 'r') as f_in: - for line in f_in: - result[line.strip()] = {'bl': bl_shortcode, 'wildcard': False} - return result - - def get_passlist_patterns(self): - return [] diff --git a/security/q-feeds-connector/src/opnsense/service/conf/actions.d/actions_qfeeds.conf b/security/q-feeds-connector/src/opnsense/service/conf/actions.d/actions_qfeeds.conf deleted file mode 100644 index e2fba096ec..0000000000 --- a/security/q-feeds-connector/src/opnsense/service/conf/actions.d/actions_qfeeds.conf +++ /dev/null @@ -1,40 +0,0 @@ -[reconfigure] -command:/usr/local/opnsense/scripts/qfeeds/qfeedsctl.py fetch_index fetch firewall_load unbound_load && echo 'EXIT OK' -parameters: -type:script_output -message:reconfigure QFeeds -errors:no - -[update] -command:/usr/local/opnsense/scripts/qfeeds/qfeedsctl.py update -parameters: -type:script_output -message:update QFeeds -errors:no - -[info] -command:/usr/local/opnsense/scripts/qfeeds/qfeedsctl.py show_index -parameters: -type:script_output -message:fetch QFeeds info - -[stats] -command:/usr/local/opnsense/scripts/qfeeds/qfeedsctl.py stats -parameters: -type:script_output -cache_ttl: 3600 -message:return Qfeeds local stats - -[logs] -command:/usr/local/opnsense/scripts/qfeeds/qfeedsctl.py logs -parameters: -type:script_output -cache_ttl: 300 -message:return Qfeeds log data - -[index] -command:cat /var/db/qfeeds-tables/index.json -parameters: -type:script_output -message:return raw QFeeds index file -cache_ttl: 60 diff --git a/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/+TARGETS b/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/+TARGETS deleted file mode 100644 index 219dc39f84..0000000000 --- a/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/+TARGETS +++ /dev/null @@ -1,2 +0,0 @@ -qfeeds.conf:/usr/local/etc/qfeeds.conf -qfeeds-blocklists.conf:/usr/local/etc/unbound/qfeeds-blocklists.conf diff --git a/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/qfeeds-blocklists.conf b/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/qfeeds-blocklists.conf deleted file mode 100644 index 6113177758..0000000000 --- a/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/qfeeds-blocklists.conf +++ /dev/null @@ -1,5 +0,0 @@ -{% if not helpers.empty('OPNsense.QFeedsConnector.general.apikey') and - not helpers.empty('OPNsense.QFeedsConnector.general.enable_unbound_bl') %} -[settings] -filenames=/var/db/qfeeds-tables/malware_domains.txt -{% endif %} diff --git a/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/qfeeds.conf b/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/qfeeds.conf deleted file mode 100644 index be8460cb8e..0000000000 --- a/security/q-feeds-connector/src/opnsense/service/templates/OPNsense/QFeeds/qfeeds.conf +++ /dev/null @@ -1,4 +0,0 @@ -{% if not helpers.empty('OPNsense.QFeedsConnector.general.apikey') %} -[api] -key={{OPNsense.QFeedsConnector.general.apikey}} -{% endif %} diff --git a/security/q-feeds-connector/src/opnsense/www/img/QFeeds.png b/security/q-feeds-connector/src/opnsense/www/img/QFeeds.png deleted file mode 100644 index 5dd5e38a5c..0000000000 Binary files a/security/q-feeds-connector/src/opnsense/www/img/QFeeds.png and /dev/null differ diff --git a/security/q-feeds-connector/src/opnsense/www/js/widgets/Metadata/QFeeds.xml b/security/q-feeds-connector/src/opnsense/www/js/widgets/Metadata/QFeeds.xml deleted file mode 100644 index faec76e2a2..0000000000 --- a/security/q-feeds-connector/src/opnsense/www/js/widgets/Metadata/QFeeds.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - QFeeds.js - - /api/q_feeds/settings/* - - - Q-Feeds Threat Protection - Unable to contact information feed. - Installed Feeds - Database - Size - Blocked - Updated - Next - Licensed - Unlicensed - - - diff --git a/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js b/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js deleted file mode 100644 index d69ed21cd4..0000000000 --- a/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2025 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. - */ - -export default class QFeeds extends BaseTableWidget { - constructor() { - super(); - } - - getMarkup() { - let $container = $('
'); - let $sysinfotable = this.createTable('qfeeds-table', { - headerPosition: 'left', - }); - $container.append($sysinfotable); - return $container; - } - - async onWidgetTick() { - return; - } - - async onMarkupRendered() { - let header = $("div.widget.widget-qfeeds").find('.widget-header'); - let title = $('#qfeeds-title'); - let divider = $("div.widget.widget-qfeeds").find('.panel-divider'); - header.css({ - 'background-image': 'URL("/ui/img/QFeeds.png")', - 'background-size': 'auto 50px', - 'background-position': 'center left', - 'margin-top': '0px', - 'mix-blend-mode': 'difference', - 'background-repeat': 'no-repeat' - }); - title.empty(); - title.css({ - 'height': '70px' - }) - divider.hide(); - $("#qfeeds-table").css({ - 'margin-top': '0px', - 'margin-bottom': '5px', - }); - - const data = await this.ajaxCall(`/api/q_feeds/settings/${'stats'}`); - if (!data.feeds.length) { - $('#qfeeds-table').html(`${this.translations.no_feed}`); - return; - } - let rows = []; - let feeds = []; - let licenseInfoShown = false; - - for (let feed of data.feeds) { - feeds.push( - ` ${feed.name}`, - `
  ${this.translations.last_update}: ${feed.updated_at}
`, - `
  ${this.translations.next_update}: ${feed.next_update}
` - ); - if (feed.licensed) { - let licenseText = this.translations.licensed; - if (data.license && data.license.name) { - licenseText += ` (${data.license.name})`; - } - feeds.push(`
  ${licenseText}
`); - if (!licenseInfoShown && data.license && data.license.expiry_date) { - const expiryDate = new Date(data.license.expiry_date); - if (!isNaN(expiryDate.getTime())) { - const formattedDate = expiryDate.toLocaleDateString(); - feeds.push(`
  Expires: ${formattedDate}
`); - } - licenseInfoShown = true; - } - } else { - feeds.push(`
  ${this.translations.unlicensed}
`); - } - } - rows.push([[this.translations.installed_feeds], feeds]); - let db = [ - `
${this.translations.size}: ${data.totals.entries.toLocaleString()}
`, - `
${this.translations.blocked}: ${data.totals.addresses_blocked.toLocaleString()}
` - - ]; - rows.push([[this.translations.database], db]); - - super.updateTable('qfeeds-table', rows); - } -} diff --git a/security/strongswan-legacy/Makefile b/security/strongswan-legacy/Makefile index f6a1ff3e6c..2f2a02c733 100644 --- a/security/strongswan-legacy/Makefile +++ b/security/strongswan-legacy/Makefile @@ -3,5 +3,6 @@ PLUGIN_VERSION= 1.0 PLUGIN_COMMENT= IPsec legacy support PLUGIN_DEPENDS= # strongswan PLUGIN_MAINTAINER= ad@opnsense.org +PLUGIN_TIER= 2 .include "../../Mk/plugins.mk" diff --git a/security/tailscale/Makefile b/security/tailscale/Makefile index 6c95b7cd0e..ed1eeaebb6 100644 --- a/security/tailscale/Makefile +++ b/security/tailscale/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= tailscale -PLUGIN_VERSION= 1.3 +PLUGIN_VERSION= 1.2 PLUGIN_COMMENT= VPN mesh securely connecting clients using WireGuard PLUGIN_DEPENDS= tailscale PLUGIN_MAINTAINER= sam@sheridan.uk diff --git a/security/tailscale/pkg-descr b/security/tailscale/pkg-descr index b2066fa79c..54639ddb97 100644 --- a/security/tailscale/pkg-descr +++ b/security/tailscale/pkg-descr @@ -6,10 +6,6 @@ https://tailscale.com/ Plugin Changelog ================ -1.3 - -* modify RC script to prevent re-using auth key if already authenticated - 1.2 * add option to allow Tailscale to manage SSH connections diff --git a/security/tailscale/src/opnsense/service/templates/OPNsense/Tailscale/rc.conf.d b/security/tailscale/src/opnsense/service/templates/OPNsense/Tailscale/rc.conf.d index 42c21b5615..e8e9e63938 100644 --- a/security/tailscale/src/opnsense/service/templates/OPNsense/Tailscale/rc.conf.d +++ b/security/tailscale/src/opnsense/service/templates/OPNsense/Tailscale/rc.conf.d @@ -7,7 +7,6 @@ tailscaled_enable="YES" # see - https://github.com/tailscale/tailscale/issues/5573#issuecomment-1584695981 tailscaled_env="TS_DEBUG_NETSTACK_SUBNETS=0" {% endif %} -tailscaled_up_args_ext= {% if helpers.exists('OPNsense.tailscale.settings.listenPort') %} tailscaled_port="{{ OPNsense.tailscale.settings.listenPort }}" {% endif %} @@ -39,26 +38,23 @@ tailscaled_port="{{ OPNsense.tailscale.settings.listenPort }}" {% if helpers.exists('OPNsense.tailscale.authentication.loginServer') %} {% do up_args.append("--login-server=" + OPNsense.tailscale.authentication.loginServer) %} {% endif %} -{# loop through subnets to build list #} -{% if helpers.exists('OPNsense.tailscale.settings.subnets.subnet4') %} -{% set subnets = [] %} -{% for subnet_list in helpers.toList('OPNsense.tailscale.settings.subnets.subnet4') %} -{% do subnets.append(subnet_list.subnet) %} -{% endfor %} -{% set subnetString = subnets|join(',') %} -{% do up_args.append("--advertise-routes=" + subnetString) %} -{% else %} -{% do up_args.append("--advertise-routes=") %} -{% endif %} -{% if helpers.exists('OPNsense.tailscale.authentication.preAuthKey') %} -# Conditionally add auth-key only if not already authenticated -if [ -f /var/db/tailscale/tailscaled.state ]; then - if ! grep -q '"_current-profile"' /var/db/tailscale/tailscaled.state; then - tailscaled_up_args_ext="--auth-key={{ OPNsense.tailscale.authentication.preAuthKey }}" - fi -fi -{% endif %} -tailscaled_up_args="{{ up_args|join(' ') }} ${tailscaled_up_args_ext}" +{% if helpers.exists('OPNsense.tailscale.authentication.preAuthKey') %} +{% do up_args.append("--auth-key=" + OPNsense.tailscale.authentication.preAuthKey) %} +{% else %} +{% do up_args.append("--auth-key=non-specified") %} +{% endif %} +{# loop through subnets to build list #} +{% if helpers.exists('OPNsense.tailscale.settings.subnets.subnet4') %} +{% set subnets = [] %} +{% for subnet_list in helpers.toList('OPNsense.tailscale.settings.subnets.subnet4') %} +{% do subnets.append(subnet_list.subnet) %} +{% endfor %} +{% set subnetString = subnets|join(',') %} +{% do up_args.append("--advertise-routes=" + subnetString) %} +{% else %} +{% do up_args.append("--advertise-routes=") %} +{% endif %} +tailscaled_up_args="{{ up_args|join(' ') }}" {% else %} -tailscaled_enable="NO" +tailscaled_enable=NO {% endif %} diff --git a/security/tinc/Makefile b/security/tinc/Makefile index 20ab416b8b..4db6cb7a70 100644 --- a/security/tinc/Makefile +++ b/security/tinc/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= tinc PLUGIN_VERSION= 1.7 -PLUGIN_REVISION= 5 +PLUGIN_REVISION= 4 PLUGIN_COMMENT= Tinc VPN PLUGIN_DEPENDS= tinc PLUGIN_MAINTAINER= ad@opnsense.org diff --git a/security/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Tinc.xml b/security/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Tinc.xml index 18c611398b..078be08320 100644 --- a/security/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Tinc.xml +++ b/security/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Tinc.xml @@ -76,17 +76,17 @@ aes-256-cbc - Y - router - - router - switch - - - - subnet.check001 - - + Y + router + + router + switch + + + + subnet.check001 + + 1 diff --git a/security/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py b/security/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py index 43839a8cfb..7979c93002 100755 --- a/security/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py +++ b/security/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py @@ -116,13 +116,13 @@ def deploy(config_filename): # configure and rename new tun device, place all in group "tinc" symlink associated tun device if interface_name not in interfaces: - # remove symlink from previus run (created by ifconfig) if it wasn't cleaned up properly on exit - if os.path.islink('/dev/%s' % interface_name): - os.remove('/dev/%s' % interface_name) tundev = subprocess.run(['/sbin/ifconfig', interface_type, 'create'], capture_output=True, text=True).stdout.split()[0] subprocess.run(['/sbin/ifconfig',tundev,'name',interface_name]) subprocess.run(['/sbin/ifconfig',interface_name,'group','tinc']) + if os.path.islink('/dev/%s' % interface_name): + os.remove('/dev/%s' % interface_name) + os.symlink('/dev/%s' % tundev, '/dev/%s' % interface_name) return networks if len(sys.argv) > 1: diff --git a/sysutils/dmidecode/Makefile b/sysutils/dmidecode/Makefile index bcc369e09f..590aef8fa9 100644 --- a/sysutils/dmidecode/Makefile +++ b/sysutils/dmidecode/Makefile @@ -2,6 +2,7 @@ PLUGIN_NAME= dmidecode PLUGIN_VERSION= 1.2 PLUGIN_COMMENT= Display hardware information on the dashboard PLUGIN_DEPENDS= dmidecode +PLUGIN_MAINTAINER= evbevz@gmail.com PLUGIN_WWW= https://smart-soft.ru .include "../../Mk/plugins.mk" diff --git a/sysutils/gdrive-backup/Makefile b/sysutils/gdrive-backup/Makefile index ff88386c0c..4372dbfc80 100644 --- a/sysutils/gdrive-backup/Makefile +++ b/sysutils/gdrive-backup/Makefile @@ -3,5 +3,6 @@ PLUGIN_VERSION= 1.0 PLUGIN_COMMENT= Backup configurations using Google Drive PLUGIN_DEPENDS= php${PLUGIN_PHP}-google-api-php-client PLUGIN_MAINTAINER= ad@opnsense.org +PLUGIN_TIER= 2 .include "../../Mk/plugins.mk" diff --git a/sysutils/git-backup/Makefile b/sysutils/git-backup/Makefile index 65ebacdb40..9c31c558f8 100644 --- a/sysutils/git-backup/Makefile +++ b/sysutils/git-backup/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= git-backup -PLUGIN_VERSION= 1.1 -PLUGIN_REVISION= 2 +PLUGIN_VERSION= 1.0 +PLUGIN_REVISION= 3 PLUGIN_COMMENT= Track config changes using git PLUGIN_DEPENDS= git PLUGIN_MAINTAINER= ad@opnsense.org diff --git a/sysutils/git-backup/pkg-descr b/sysutils/git-backup/pkg-descr index f8b99a6f0b..58fcb26dc5 100644 --- a/sysutils/git-backup/pkg-descr +++ b/sysutils/git-backup/pkg-descr @@ -1,15 +1,3 @@ This package adds a backup option using git version control. -Due to the sensitive nature of the data being send to the backup, -we strongly advise to not use a public service to send backups to. - -Plugin Changelog -================ - -1.1 - -* Add a force-push option (contributed by Hleb Shauchenka) - -1.0 - -* Initial release +Due to the sensitive nature of the data being send to the backup, we strongly advise to not use a public service to send backups to. diff --git a/sysutils/git-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Git.php b/sysutils/git-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Git.php index f780a5500f..a109a1adc9 100644 --- a/sysutils/git-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Git.php +++ b/sysutils/git-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Git.php @@ -1,37 +1,38 @@ gettext("Target branch to push to."), "value" => null ], - [ - "name" => "force_push", - "type" => "checkbox", - "label" => gettext("Force Push"), - "help" => gettext("When enabled, force push to origin if diverged (e.g., after restoring from an earlier backup). Use with caution as this overwrites remote history."), - "value" => null - ], [ "name" => "privkey", "type" => "passwordarea", @@ -135,35 +129,29 @@ public function setConfiguration($conf) */ public function backup() { - $targetdir = '/conf/backup/git'; + $targetdir = "/conf/backup/git"; + $git = "/usr/local/bin/git"; $mdl = new GitSettings(); - if (!is_dir($targetdir)) { mkdir($targetdir); } - if (!is_dir('{$targetdir}/.git')) { - Shell::run_safe('/usr/local/bin/git init %s', $targetdir); + exec("{$git} init {$targetdir}"); } - // XXX: since our git backup is plain text and already contains the private key, it doesn't really matter // to keep the same key in the git directory (we're not going to push it) $ident_file = "{$targetdir}/identity"; $privkey = trim(str_replace("\r", "", (string)$mdl->privkey)) . "\n"; file_put_contents($ident_file, $privkey); chmod("{$targetdir}/identity", 0600); - // When there are unprocessed config backups, flush them out. - (new Backend())->configdRun('system event config_changed'); - + (new Backend())->configdRun("system event config_changed"); // configure upstream - Shell::run_safe('/usr/local/bin/git -C %s config core.sshCommand %s', [ - $targetdir, "ssh -i {$ident_file} -o StrictHostKeyChecking=accept-new -o PasswordAuthentication=no", - ]); - + exec("cd {$targetdir} && " . + "{$git} config core.sshCommand " . + "\"ssh -i {$ident_file} -o StrictHostKeyChecking=accept-new -o PasswordAuthentication=no\""); $url = (string)$mdl->url; $pos = strpos($url, '//'); - // inject credentials in url (either username or username:password, depending on transport) if (stripos(trim((string)$mdl->url), 'http') === 0) { $cred = urlencode((string)$mdl->user) . ":" . urlencode((string)$mdl->password); @@ -171,16 +159,12 @@ public function backup() } else { $url = substr($url, 0, $pos + 2) . urlencode((string)$mdl->user) . "@" . substr($url, $pos + 2); } - - Shell::run_safe('/usr/local/bin/git -C %s remote remove origin', $targetdir); - Shell::run_safe('/usr/local/bin/git -C %s remote add origin %s', [$targetdir, $url]); - $gitfrmt = ['(/usr/local/bin/git -C %s push']; - if ($mdl->force_push->isEqual('1')) { - $gitfrmt[] = '--force'; - } - $gitfrmt[] = 'origin %s && echo "__exit_ok__") 2>&1'; - $pushtxt = Shell::shell_safe($gitfrmt, "master:{$mdl->branch}"); - + exec("cd {$targetdir} && {$git} remote remove origin"); + exec("cd {$targetdir} && {$git} remote add origin " . escapeshellarg($url)); + $pushtxt = shell_exec( + "(cd {$targetdir} && {$git} push origin " . escapeshellarg("master:{$mdl->branch}") . + " && echo '__exit_ok__') 2>&1" + ); if (strpos($pushtxt, '__exit_ok__')) { $error_type = null; } elseif (strpos($pushtxt, 'Permission denied') || strpos($pushtxt, 'Authentication failed ')) { @@ -192,13 +176,12 @@ public function backup() } else { $error_type = "unknown error, check log for details"; } - if (!empty($error_type)) { syslog(LOG_ERR, "git-backup {$error_type} (" . str_replace("\n", " ", $pushtxt) . ")"); throw new \Exception($error_type); } else { // return filelist in git - return Shell::shell_safe('/usr/local/bin/git -C %s ls-files', $targetdir, true); + return explode("\n", shell_exec("cd {$targetdir} && git ls-files")); } } diff --git a/sysutils/git-backup/src/opnsense/mvc/app/models/OPNsense/Backup/GitSettings.xml b/sysutils/git-backup/src/opnsense/mvc/app/models/OPNsense/Backup/GitSettings.xml index dbd7b4ca8c..08fafa1610 100644 --- a/sysutils/git-backup/src/opnsense/mvc/app/models/OPNsense/Backup/GitSettings.xml +++ b/sysutils/git-backup/src/opnsense/mvc/app/models/OPNsense/Backup/GitSettings.xml @@ -1,21 +1,22 @@ //system/backup/git 1.0.0 - Git Backup Settings + OPNsense Git Backup Settings - 0 - Y - - - user.check001 - - - url.check001 - - + 0 + Y + + + user.check001 + + + url.check001 + + + N /^((https)|(ssh))?:\/\/.*[^\/]$/ A valid git location must be provided. e.g. ssh://server/project.git, https://server/project.git @@ -29,24 +30,22 @@ - master - Y + master + Y - - 0 - Y - - + + N + - - - A username is required. - DependConstraint - - enabled - - - + + + A username is required. + DependConstraint + + enabled + + + diff --git a/sysutils/lcdproc-sdeclcd/Makefile b/sysutils/lcdproc-sdeclcd/Makefile index 73a802ba99..a709853da7 100644 --- a/sysutils/lcdproc-sdeclcd/Makefile +++ b/sysutils/lcdproc-sdeclcd/Makefile @@ -3,5 +3,6 @@ PLUGIN_VERSION= 1.1 PLUGIN_REVISION= 1 PLUGIN_COMMENT= LCDProc for SDEC LCD devices PLUGIN_DEPENDS= lcdproc +PLUGIN_MAINTAINER= ad@opnsense.org .include "../../Mk/plugins.mk" diff --git a/sysutils/nextcloud-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Nextcloud.php b/sysutils/nextcloud-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Nextcloud.php index b2fdde4973..5adad6c43b 100644 --- a/sysutils/nextcloud-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Nextcloud.php +++ b/sysutils/nextcloud-backup/src/opnsense/mvc/app/library/OPNsense/Backup/Nextcloud.php @@ -138,7 +138,13 @@ public function backup() $password = (string)$nextcloud->password; $backupdir = (string)$nextcloud->backupdir; $crypto_password = (string)$nextcloud->password_encryption; - + $hostname = $config->system->hostname . '.' . $config->system->domain; + $configname = 'config-' . $hostname . '-' . date('Y-m-d_H_i_s') . '.xml'; + // backup source data to local strings (plain/encrypted) + $confdata = file_get_contents('/conf/config.xml'); + if (!empty($crypto_password)) { + $confdata = $this->encrypt($confdata, $crypto_password); + } // Check if destination directory exists, create (full path) if not try { $internal_username = $this->getInternalUsername($url, $username, $password); @@ -147,51 +153,26 @@ public function backup() return array(); } - // Get list of files from local backup system - $local_files = array(); - $tmp_local_files = scandir('/conf/backup/'); - // Remove '.' and '..' - foreach ($tmp_local_files as $tmp_local_file) { - if ($tmp_local_file === '.' || $tmp_local_file === '..') { continue; } - $local_files[] = $tmp_local_file; - } - - // Get list of filenames (without path) on remote location - $remote_files = array(); - $tmp_remote_files = $this->listfiles($url, $username, $password, $internal_username, "/$backupdir/", false); - foreach ($tmp_remote_files as $tmp_remote_file) { - $remote_files[] = pathinfo($tmp_remote_file)['basename']; - } - - - $uploaded_files = array(); - - // Loop over each local file, - // see if it's in $remote_files, - // if not, optionally encrypt, and upload - foreach ($local_files as $file_to_upload) { - if (!in_array($file_to_upload, $remote_files)) { - $confdata = file_get_contents("/conf/backup/$file_to_upload"); - if (!empty($crypto_password)) { - $confdata = $this->encrypt($confdata, $crypto_password); - } - try { - $this->upload_file_content( - $url, - $username, - $password, - $internal_username, - $backupdir, - $file_to_upload, - $confdata - ); - $uploaded_files[] = $file_to_upload; - } catch (\Exception $e) { - return $uploaded_files; + try { + $this->upload_file_content( + $url, + $username, + $password, + $internal_username, + $backupdir, + $configname, + $confdata + ); + // do not list directories + return array_filter( + $this->listFiles($url, $username, $password, $internal_username, "/$backupdir/", false), + function ($filename) { + return (substr($filename, -1) !== '/'); } - } + ); + } catch (\Exception $e) { + return array(); } - return $uploaded_files; } } diff --git a/sysutils/nut/src/opnsense/mvc/app/models/OPNsense/Nut/Nut.xml b/sysutils/nut/src/opnsense/mvc/app/models/OPNsense/Nut/Nut.xml index 8ff52d8237..9de3788b5e 100644 --- a/sysutils/nut/src/opnsense/mvc/app/models/OPNsense/Nut/Nut.xml +++ b/sysutils/nut/src/opnsense/mvc/app/models/OPNsense/Nut/Nut.xml @@ -1,151 +1,156 @@ - //OPNsense/Nut - Network UPS Tools - 1.0.4 - - - - 0 - Y - - - standalone - Y - - standalone - netclient - - - - UPSName - Y - /^([0-9a-zA-Z._\-]){1,128}$/u - The name should only contain alphanumeric characters, dashes, underscores or a dot. - - - 127.0.0.1,::1 - Y - - - - - Y - Password - - - Y - Password - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - - - Y - localhost - - - N - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - -
- - 3493 - N - - - N - - - N - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - - - port=auto - N - - - - - Y - 0 - - - community=public - N - - - + //OPNsense/Nut + Network UPS Tools + 1.0.4 + + + + 0 + Y + + + standalone + Y + + standalone + netclient + + + + UPSName + Y + /^([0-9a-zA-Z._\-]){1,128}$/u + The name should only contain alphanumeric characters, dashes, underscores or a dot. + + + 127.0.0.1,::1 + Y + + + + + + Y + Password + + + Y + Password + + + + + + Y + 0 + + + port=auto + N + + + + + Y + 0 + + + port=auto + N + + + + + Y + 0 + + + Y + localhost + + + N + + + + + Y + 0 + + + port=auto + N + + + + + Y + 0 + + + port=auto + N + + + + + Y + 0 + + + port=auto + N + + + + + Y + 0 + +
+ + N +
+ + 3493 + N + + + N + + + N + +
+ + + Y + 0 + + + port=auto + N + + + + + Y + 0 + + + port=auto + N + + + + + Y + 0 + + + community=public + N + + +
diff --git a/sysutils/sftp-backup/src/opnsense/mvc/app/models/OPNsense/Backup/SftpSettings.xml b/sysutils/sftp-backup/src/opnsense/mvc/app/models/OPNsense/Backup/SftpSettings.xml index 292568a8db..187a9b04c5 100644 --- a/sysutils/sftp-backup/src/opnsense/mvc/app/models/OPNsense/Backup/SftpSettings.xml +++ b/sysutils/sftp-backup/src/opnsense/mvc/app/models/OPNsense/Backup/SftpSettings.xml @@ -4,16 +4,16 @@ OPNsense sftp Backup Settings - 0 - Y - - - privkey.check001 - - - url.check001 - - + 0 + Y + + + privkey.check001 + + + url.check001 + + N @@ -49,8 +49,8 @@ 0 - 0 - N + 0 + N diff --git a/sysutils/smart/Makefile b/sysutils/smart/Makefile index d09cf52331..132bbe4b30 100644 --- a/sysutils/smart/Makefile +++ b/sysutils/smart/Makefile @@ -2,5 +2,6 @@ PLUGIN_NAME= smart PLUGIN_VERSION= 2.4 PLUGIN_COMMENT= SMART tools PLUGIN_DEPENDS= smartmontools +PLUGIN_MAINTAINER= franco@opnsense.org .include "../../Mk/plugins.mk" diff --git a/sysutils/virtualbox/Makefile b/sysutils/virtualbox/Makefile index c8025aada2..19a947dbc8 100644 --- a/sysutils/virtualbox/Makefile +++ b/sysutils/virtualbox/Makefile @@ -2,7 +2,7 @@ PLUGIN_NAME= virtualbox PLUGIN_VERSION= 1.0 PLUGIN_REVISION= 1 PLUGIN_COMMENT= VirtualBox guest additions -PLUGIN_DEPENDS= virtualbox-ose-additions-nox11-72 +PLUGIN_DEPENDS= virtualbox-ose-additions-nox11 PLUGIN_MAINTAINER= franco@opnsense.org .include "../../Mk/plugins.mk" diff --git a/vendor/sunnyvalley/Makefile b/vendor/sunnyvalley/Makefile index 1dcd36551d..2c9bc2d133 100644 --- a/vendor/sunnyvalley/Makefile +++ b/vendor/sunnyvalley/Makefile @@ -1,6 +1,5 @@ PLUGIN_NAME= sunnyvalley PLUGIN_VERSION= 1.5 -PLUGIN_REVISION= 1 PLUGIN_COMMENT= Vendor Repository for Zenarmor (Enterprise Security Modules - NGFW, SSE, SASE, f.k.a Sensei) PLUGIN_MAINTAINER= opensource@zenarmor.com PLUGIN_WWW= https://www.zenarmor.com diff --git a/www/OPNProxy/Makefile b/www/OPNProxy/Makefile index d134b25984..c225b41a17 100644 --- a/www/OPNProxy/Makefile +++ b/www/OPNProxy/Makefile @@ -1,9 +1,10 @@ PLUGIN_NAME= OPNProxy PLUGIN_VERSION= 1.0.5 -PLUGIN_REVISION= 4 +PLUGIN_REVISION= 3 PLUGIN_COMMENT= OPNsense proxy additions PLUGIN_DEPENDS= os-redis${PLUGIN_PKGSUFFIX} \ os-squid${PLUGIN_PKGSUFFIX} \ py${PLUGIN_PYTHON}-redis +PLUGIN_MAINTAINER= ad@opnsense.org .include "../../Mk/plugins.mk" diff --git a/www/OPNProxy/src/etc/inc/plugins.inc.d/opnproxy.inc b/www/OPNProxy/src/etc/inc/plugins.inc.d/opnproxy.inc index bf63709460..96f00a995a 100644 --- a/www/OPNProxy/src/etc/inc/plugins.inc.d/opnproxy.inc +++ b/www/OPNProxy/src/etc/inc/plugins.inc.d/opnproxy.inc @@ -28,21 +28,22 @@ function opnproxy_configure() { - return [ + return array( 'user_changed' => ['opnproxy_user_changed:2'], 'webproxy' => ['opnproxy_webproxy:2'], - ]; + ); } -function opnproxy_user_changed($unused, $username = '') + +function opnproxy_user_changed($verbose = false, $username = '') { - mwexecf('/usr/local/opnsense/scripts/OPNProxy/redis_sync_users.py %', $username); + exec("/usr/local/opnsense/scripts/OPNProxy/redis_sync_users.py " . escapeshellarg($username)); } + function opnproxy_webproxy($verbose = false, $action = null) { $response = configd_run('template reload Deciso/Proxy'); - if ($verbose) { printf("template reload Deciso/Proxy: %s\n", trim($response)); } diff --git a/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/Antivirus.xml b/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/Antivirus.xml index cd45fe479e..d31805eb8d 100644 --- a/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/Antivirus.xml +++ b/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/Antivirus.xml @@ -11,15 +11,15 @@ TEXT,DATA,EXECUTABLE,ARCHIVE,GIF,JPEG,MSOFFICE Y Y - - Text files - Binary files - Executables - Archives - GIF animations - JPEG pictures - Microsoft office files - + + Text files + Binary files + Executables + Archives + GIF animations + JPEG pictures + Microsoft office files + 5 @@ -41,5 +41,5 @@ 5M Y - + diff --git a/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/General.xml b/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/General.xml index ba65b5243b..8f1d7232a4 100644 --- a/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/General.xml +++ b/www/c-icap/src/opnsense/mvc/app/models/OPNsense/CICAP/General.xml @@ -33,25 +33,31 @@ 20 - Y - + Y + 10 - Y - + Y + 0 - Y - + Y + ::1 - N - N - , + N + N + , Y - - + + + N + + + + N + 1 Y diff --git a/www/caddy/Makefile b/www/caddy/Makefile index 344360c87d..652ac84d7b 100644 --- a/www/caddy/Makefile +++ b/www/caddy/Makefile @@ -1,6 +1,5 @@ PLUGIN_NAME= caddy -PLUGIN_VERSION= 2.0.4 -PLUGIN_REVISION= 3 +PLUGIN_VERSION= 2.0.3 PLUGIN_DEPENDS= caddy-custom PLUGIN_COMMENT= Modern Reverse Proxy with Automatic HTTPS, Dynamic DNS and Layer4 Routing PLUGIN_MAINTAINER= cedrik@pischem.com diff --git a/www/caddy/pkg-descr b/www/caddy/pkg-descr index 71e6740172..2c24dd7ffa 100644 --- a/www/caddy/pkg-descr +++ b/www/caddy/pkg-descr @@ -6,14 +6,6 @@ DOC: https://docs.opnsense.org/manual/how-tos/caddy.html Plugin Changelog ================ -2.0.4 - -Add: DNS-01 challenge delegation via CNAME (contributed by sdsys-ch) (opnsense/plugins/pull/4950) -Fix: Enabling HTTP access log wrongly excluded the process logs (opnsense/plugins/pull/4974) -Fix: fix setup.sh script not setting correct ownership in www user mode (opnsense/plugins/pull/4976) -Fix: Prevent sudo on startup via skip_install_trust (opnsense/plugins/pull/5015) -Fix: Fix race condition that moved domain filter selectpicker into invisible tab (opnsense/plugins/pull/5076) - 2.0.3 Add: Tabulator groupBy of domain and subdomain (opnsense/plugins/pull/4909) diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml index ed431a6dbe..a2b3d67585 100644 --- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml +++ b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml @@ -73,16 +73,6 @@ boolean - - reverse.DnsChallengeOverrideDomain - - text - - true - - false - - reverse.DynDns diff --git a/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml b/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml index 8a1ffeb463..a8d1234950 100644 --- a/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml +++ b/www/caddy/src/opnsense/mvc/app/models/OPNsense/Caddy/Caddy.xml @@ -212,10 +212,6 @@ - - N - Please enter a valid domain name. - Auto HTTPS diff --git a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt index 9ea070147d..bf6de62520 100644 --- a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt +++ b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt @@ -260,16 +260,12 @@ {% if entrypoint == 'reverse_proxy' %} - // insert buttons and selectpicker only when the tab is actually visible + // insert buttons and selectpicker if (['{{formGridReverseProxy["table_id"]}}', '{{formGridHandle["table_id"]}}'].includes(grid_id)) { - if (!$(e.target.hash).is(':visible')) { - return; // prevents the selectpicker from being moved into hidden tabs - } - const header = $("#" + grid_id + "-header"); const $actionBar = header.find('.actionBar'); if ($actionBar.length) { - $('#add_filter_container').detach().insertAfter($actionBar.find('.search')).show(); + $('#add_filter_container').detach().insertBefore($actionBar.find('.search')).show(); } } @@ -451,6 +447,9 @@ diff --git a/www/caddy/src/opnsense/scripts/OPNsense/Caddy/caddy_certs.php b/www/caddy/src/opnsense/scripts/OPNsense/Caddy/caddy_certs.php index bcf424ece4..c8e860d455 100755 --- a/www/caddy/src/opnsense/scripts/OPNsense/Caddy/caddy_certs.php +++ b/www/caddy/src/opnsense/scripts/OPNsense/Caddy/caddy_certs.php @@ -43,8 +43,7 @@ } }; -/* XXX used later to only append a file name */ -$tempDir = '/usr/local/etc/caddy/certificates/'; +$tempDir = '/usr/local/etc/caddy/certificates'; // leaf certificate chain $certificateRefs = []; diff --git a/www/caddy/src/opnsense/scripts/OPNsense/Caddy/setup.sh b/www/caddy/src/opnsense/scripts/OPNsense/Caddy/setup.sh index 8cbc15e24f..5b757de219 100755 --- a/www/caddy/src/opnsense/scripts/OPNsense/Caddy/setup.sh +++ b/www/caddy/src/opnsense/scripts/OPNsense/Caddy/setup.sh @@ -31,6 +31,10 @@ CADDY_USER="${caddy_user:-root}" CADDY_GROUP="${caddy_group:-wheel}" +# Canary to detect root->www switch (disable superuser) permission issues +# The storage instance will always exist, it's a good assumption +CANARY="/var/db/caddy/data/caddy/instance.uuid" + # Define directories CADDY_CONF_DIR="/usr/local/etc/caddy" CADDY_DATA_DIR="/var/db/caddy" @@ -39,23 +43,35 @@ CADDY_CONF_CUSTOM_DIR="${CADDY_CONF_DIR}/caddy.d" CADDY_CONF_CERT_DIR="${CADDY_CONF_DIR}/certificates" CADDY_LOG_CUSTOM_DIR="${CADDY_LOG_DIR}/access" -# Group the main directories -CADDY_DIRS=" -${CADDY_CONF_DIR} -${CADDY_DATA_DIR} -${CADDY_LOG_DIR} -${CADDY_CONF_CERT_DIR} -${CADDY_CONF_CUSTOM_DIR} -${CADDY_LOG_CUSTOM_DIR} -" - -# No inode changes occur when directory already exists or permissions are correct. -# Always running these when caddy starts guarantees correct ownership with minimal read and writes. -mkdir -p ${CADDY_DIRS} -chown -R "${CADDY_USER}:${CADDY_GROUP}" ${CADDY_DIRS} +mkdir -p "${CADDY_CONF_DIR}" \ + "${CADDY_DATA_DIR}" \ + "${CADDY_LOG_DIR}" \ + "${CADDY_CONF_CUSTOM_DIR}" \ + "${CADDY_CONF_CERT_DIR}" \ + "${CADDY_LOG_CUSTOM_DIR}" # Format and overwrite the Caddyfile ( cd "${CADDY_CONF_DIR}" && /usr/local/bin/caddy fmt --overwrite ) # Write custom certs from the OPNsense Trust Store /usr/local/opnsense/scripts/OPNsense/Caddy/caddy_certs.php + +# Ownership decision based on current service user/group, otherwise skip +EXPECTED_USER="$CADDY_USER" +EXPECTED_GROUP="$CADDY_GROUP" + +if [ -f "$CANARY" ]; then + CANARY_USER="$(stat -f '%Su' "$CANARY")" + CANARY_GROUP="$(stat -f '%Sg' "$CANARY")" + + if [ "$CANARY_USER" = "$EXPECTED_USER" -a "$CANARY_GROUP" = "$EXPECTED_GROUP" ]; then + exit 0 + fi +fi + +# Use detected service user/group, only migrate ownership +# We only interact with the storage in this specific edge case, in all other cases caddy must have atomic write guarantee +chown -R "${CADDY_USER}:${CADDY_GROUP}" "${CADDY_CONF_DIR}" \ + "${CADDY_DATA_DIR}" \ + "${CADDY_LOG_DIR}" \ + "${CADDY_CONF_CERT_DIR}" diff --git a/www/caddy/src/opnsense/service/templates/OPNsense/Caddy/Caddyfile b/www/caddy/src/opnsense/service/templates/OPNsense/Caddy/Caddyfile index d0b58323c4..e7c7168e95 100644 --- a/www/caddy/src/opnsense/service/templates/OPNsense/Caddy/Caddyfile +++ b/www/caddy/src/opnsense/service/templates/OPNsense/Caddy/Caddyfile @@ -43,6 +43,13 @@ # with the syslog-ng instance running on the OPNsense. #} log { + {% if generalSettings.LogAccessPlain|default("0") == "0" %} + {% for reverse in helpers.toList('Pischem.caddy.reverseproxy.reverse') %} + {% if reverse.enabled|default("0") == "1" and reverse.AccessLog|default("0") == "1" %} + include http.log.access.{{ reverse['@uuid'] }} + {% endif %} + {% endfor %} + {% endif %} output net unixgram//var/run/caddy/log.sock { } format json { @@ -228,7 +235,6 @@ # Default of Caddy is to wait for all connections to close before allowing reload, meaning the higher the value, the longer applies take. #} grace_period {{ generalSettings.GracePeriod }}s - skip_install_trust import /usr/local/etc/caddy/caddy.d/*.global } @@ -296,7 +302,6 @@ http://{{ domain }} { {% macro tls_configuration( customCert="", dnsChallenge="0", - dnsChallengeOverrideDomain="", clientAuthTrustPool="", clientAuthMode="", dnsProvider="", @@ -311,9 +316,6 @@ http://{{ domain }} { {% if not customCert and (dnsChallenge == "1" and dnsProvider) %} issuer acme { dns {{ dnsProvider }} {{ dnsApiKey }} - {% if dnsChallengeOverrideDomain %} - dns_challenge_override_domain {{ dnsChallengeOverrideDomain }} - {% endif %} {% if tlsDnsPropagationResolvers %} resolvers {{ tlsDnsPropagationResolvers }} @@ -608,7 +610,7 @@ http://{{ domain }} { {% if reverse.DisableTls|default("0") == "1" %}http://{% endif %}{{ reverse.FromDomain|default("") }}{% if reverse.FromPort %}:{{ reverse.FromPort }}{% endif %} { {% if reverse.AccessLog|default("0") == "1" %} {% if generalSettings.LogAccessPlain|default("0") == "0" %} - log default + log {{ reverse['@uuid'] }} {% else %} log { output file /var/log/caddy/access/{{ reverse['@uuid'] }}.log { @@ -620,7 +622,6 @@ http://{{ domain }} { {{ tls_configuration( customCert=reverse.CustomCertificate|default(""), dnsChallenge=reverse.DnsChallenge|default("0"), - dnsChallengeOverrideDomain=reverse.DnsChallengeOverrideDomain|default(""), clientAuthTrustPool=reverse.ClientAuthTrustPool|default(""), clientAuthMode=reverse.ClientAuthMode|default(""), dnsProvider=generalSettings.TlsDnsProvider, @@ -646,7 +647,7 @@ http://{{ domain }} { {% if reverse.DisableTls|default("0") == "1" %}http://{% endif %}{{ subdomain.FromDomain|default("") }}{% if reverse.FromPort %}:{{ reverse.FromPort }}{% endif %} { {% if reverse.AccessLog|default("0") == "1" %} {% if generalSettings.LogAccessPlain|default("0") == "0" %} - log default + log {{ reverse['@uuid'] }} {% else %} log { output file /var/log/caddy/access/{{ subdomain['@uuid'] }}.log { diff --git a/www/nginx/Makefile b/www/nginx/Makefile index ee39050d5c..a952c7337f 100644 --- a/www/nginx/Makefile +++ b/www/nginx/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= nginx -PLUGIN_VERSION= 1.35 -PLUGIN_REVISION= 4 +PLUGIN_VERSION= 1.34 +PLUGIN_REVISION= 8 PLUGIN_COMMENT= Nginx HTTP server and reverse proxy PLUGIN_DEPENDS= nginx PLUGIN_MAINTAINER= franz.fabian.94@gmail.com diff --git a/www/nginx/pkg-descr b/www/nginx/pkg-descr index c12a093281..0f7cb8ac84 100644 --- a/www/nginx/pkg-descr +++ b/www/nginx/pkg-descr @@ -5,21 +5,11 @@ NGINX functionality includes HTTP server, HTTP and mail reverse proxy, caching, load balancing, compression, request throttling, connection multiplexing and reuse, SSL offload and HTTP media streaming. +WWW: https://nginx.org/ + Plugin Changelog ================ -1.35 - -* Global options sendfile directive typo fix -* Add HTTP/2 option to GUI -* Add multiple client authentication trusted CA support -* Add proxy_intercept_errors directive support -* Add Variables hashes size support -* Add proxy_cache_valid directive support with response codes and multiple selection options -* Clean up model definition file -* Change ban_ttl default value to avoid unintentional system slowdown -* Fix NAXSI rules install - 1.34 * Add the option to not log TLS handshakes diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php index 7b2043b904..0458bc2aa3 100644 --- a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php +++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/Api/SettingsController.php @@ -249,32 +249,6 @@ public function setresolverAction($uuid) return $this->setBase('resolver', 'resolver', $uuid); } - // proxy_cache_valid - public function searchproxyCacheValidAction() - { - return $this->searchBase('proxy_cache_valid', array('uuid', 'description', 'code', 'valid')); - } - - public function getproxyCacheValidAction($uuid = null) - { - return $this->getBase('proxy_cache_valid', 'proxy_cache_valid', $uuid); - } - - public function addproxyCacheValidAction() - { - return $this->addBase('proxy_cache_valid', 'proxy_cache_valid'); - } - - public function delproxyCacheValidAction($uuid) - { - return $this->delBase('proxy_cache_valid', $uuid); - } - - public function setproxyCacheValidAction($uuid) - { - return $this->setBase('proxy_cache_valid', 'proxy_cache_valid', $uuid); - } - // http server public function searchhttpserverAction() { diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php index 01ad3330a2..a30d036d17 100644 --- a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php +++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/IndexController.php @@ -64,7 +64,6 @@ public function indexAction() $this->view->errorpage = $this->getForm("errorpage"); $this->view->tls_fingerprint = $this->getForm("tls_fingerprint"); $this->view->resolver = $this->getForm("resolver"); - $this->view->proxy_cache_valid = $this->getForm("proxy_cache_valid"); $this->view->syslog_target = $this->getForm("syslog_target"); $nginx = new Nginx(); $this->view->show_naxsi_download_button = diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml index cc441d1a1e..33cf1ce522 100644 --- a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml +++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/httpserver.xml @@ -113,8 +113,7 @@ httpserver.ca - select_multiple - Trusted CA certificates + dropdown httpserver.verify_client @@ -166,20 +165,6 @@ checkbox If the request scheme is not HTTPS, redirect to use HTTPS for this server. - - httpserver.http2 - - checkbox - Enable the HTTP/2 protocol. - true - - - httpserver.enable_http3 - - checkbox - Enable HTTP/3/QUIC for this server (adds QUIC listeners and Alt-Svc header). - true - httpserver.tls_protocols @@ -335,11 +320,4 @@ select_multiple Select custom error pages to display instead of the default builtin error pages. If at least one error page is selected here, all default error pages will be disabled. - - httpserver.proxy_intercept_errors - - checkbox - Intercept responses with codes greater than or equal to 300 and redirect to processing with custom error pages. - true - diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml index 23fdccff54..d6ee67abb0 100644 --- a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml +++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/location.xml @@ -98,19 +98,11 @@ location.cache_valid - + text true Force caching of 200, 301 and 302 responses according to the request methods enabled for caching. Given in minutes; leave empty to rely on request/response headers from client and upstream. - - location.proxy_cache_valid - - select_multiple - - true - Force caching of response codes specified at Response Code Caching page. - location.cache_background_update @@ -343,12 +335,4 @@ select_multiple Select custom error pages to display instead of the default builtin error pages. Selection will override error pages configured on HTTP server. - - location.proxy_intercept_errors - - dropdown - - Intercept responses with codes greater than or equal to 300 and redirect to processing with custom error pages. - true - diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/proxy_cache_valid.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/proxy_cache_valid.xml deleted file mode 100644 index e37702e9d3..0000000000 --- a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/proxy_cache_valid.xml +++ /dev/null @@ -1,22 +0,0 @@ -
- - proxy_cache_valid.description - - text - Brief description for reference. - - - proxy_cache_valid.code - - true - - select_multiple - Enter a Respone codes or use "any" to cache any responses. - - - proxy_cache_valid.valid - - text - Specify caching time in minutes. - -
diff --git a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml index 1fc2c9c9c7..8ac01921ce 100644 --- a/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml +++ b/www/nginx/src/opnsense/mvc/app/controllers/OPNsense/Nginx/forms/settings.xml @@ -11,7 +11,7 @@ nginx.general.ban_ttl text - Set autoblock lifetime in minutes. 72 hours by default. Set to 0 for infinite. Please note that setting this to 0 may result in gradual system slowdown and the need to manually clear the entries. + Set autoblock lifetime in minutes. Set to 0 for infinite. true @@ -31,7 +31,7 @@ true - nginx.http.sendfile + nginx.http.enabled checkbox Enable sendfile support (faster). @@ -56,7 +56,7 @@ nginx.http.server_names_hash_bucket_size - + text true @@ -66,18 +66,6 @@ text true - - nginx.http.variables_hash_bucket_size - - text - true - - - nginx.http.variables_hash_max_size - - text - true - nginx.http.bots_ua diff --git a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Migrations/M1_35_1.php b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Migrations/M1_35_1.php deleted file mode 100644 index 8f545c7fbd..0000000000 --- a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Migrations/M1_35_1.php +++ /dev/null @@ -1,46 +0,0 @@ - - * 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\Nginx\Migrations; - -use OPNsense\Base\BaseModelMigration; - -class M1_35_1 extends BaseModelMigration -{ - // Rewrite default ban_ttl value - public function run($model) - { - $general_node = $model->getNodeByReference('general'); - - if ($general_node->ban_ttl->isEqual('0')) { - $general_node->ban_ttl = '4320'; - } - // run default migration actions - parent::run($model); - } -} diff --git a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.xml b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.xml index f740f7297d..fdc25d56d8 100644 --- a/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.xml +++ b/www/nginx/src/opnsense/mvc/app/models/OPNsense/Nginx/Nginx.xml @@ -1,1091 +1,1199 @@ - //OPNsense/Nginx - 1.35.2 - nginx web server, reverse proxy and waf - - - - 0 - Y - - - 4320 - 0 - Y - - - - - 0 - Y - - - - - 1 - 1 - Y - - - 1024 - 1 - Y - - - - - 0 - Y - - - - 1 - - - 1 - - - 1 - - - 1 - - - - 403 Forbidden - 444 Terminate Connection - - Y - 403 - - - 0 - Y - - - Y - Python-urllib,Nmap,python-requests,libwww-perl,MJ12bot,Jorgee,fasthttp,libwww,Telesphoreo,A6-Indexer,ltx71,okhttp,ZmEu,sqlmap,LMAO/2.0,l9explore,l9tcpid,Masscan,zgrab,Ronin/2.0,Hakai/2.0,Indy\sLibrary,^Mozilla/[\d\.]+$,Morfeus\sFucking\sScanner,MSIE\s[0-6]\.\d+ - - - - - - Y - - - - - - Selected user not found. - Y - Y - - - - - Y - - - Y - - - - - Y - - - - - - Selected server not found. - Y - Y - - - - IP Hash - - Weighted Round Robin - - - 0 - - - 1 - - - 1 - - - 1 - - - 0 - Y - - - 0 - Y - - - Y - 0 - - - Y - 0 - - - cert - - - - Y - - TLSv1 - TLSv1.1 - TLSv1.2 - TLSv1.3 - - - - Y - 1 - - - ca - Y - - - Y - 1 - - - 1 - - - - - Y - - - Y - - - Y - - - 0 - Y - - - - - - - Permanently Unreachable - Backup Server - - - - - - Y - - - Y - - - - Exact Match ("=") - Case Sensitive Match ("~") - Case Insensitive Match ("~*") - Don't check regular expressions on longest prefix match ("^~") - - - - 0 - Y - - - 0 - Y - - - - - - Selected error page not found. - - - - - - - - Selected server not found. - Y - - - - - - Selected upstream not found. - - - /^[^" \t]+$/ - - - - - - Selected cache directory not found. - - - Y - - Error - Timeout - Invalid_header - Updating - HTTP Status Code 403 - HTTP Status Code 404 - HTTP Status Code 429 - HTTP Status Code 500 - HTTP Status Code 502 - HTTP Status Code 503 - HTTP Status Code 504 - - - - Y - - Post - - - - - Y - 1 - - - - - - - Selected caching time settings not found. - Y - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - - - - Selected rewrite not found. - Y - - - - - - - - - Selected user file not found. - - - 0 - Y - - - - Y - 0 - - - - - - - Selected limit zone not found. - Y - - - /^\d+[kmg]$/i - Enter a number followed by k, m or g. - - - /^\d+[kmg]$/i - Enter a number followed by k, m or g. - - - Y - 0 - - - Y - 0 - - - WebSocket and Upstream Keepalive support can not be combined. - SingleSelectConstraint - - upstream_keepalive - - - - - - Y - 0 - - - websocket.check001 - - - - - 1 - - - NgxBusyBufferConstraint - - - - - 1 - - - NgxBusyBufferConstraint - - - - - 1 - - - NgxBusyBufferConstraint - - - - - 1 - - - NgxBusyBufferConstraint - - - - - Y - 0 - - - Y - 1 - - - Y - 1 - - - 1 - - - 1 - - - - - - Selected ACL not found. - - - - Any - All - - - - 0 - - - Y - 0 - - - - - - Selected error page not found. - Y - - - Inherit - Y - - Inherit - On - Off - - - - - - Y - - - - - - Selected rule not found. - Y - Y - - - Y - - - Y - >= - - Bigger or Equal - Bigger - Lesser - Lesser or Equal - - - - Y - BLOCK - - Block Request - Allow Request - Drop The Connection - Log Request - - - - - - Y - - - -
Main Rule
- Basic Rule -
- Y -
- - /^[^"]+$/ - - - This field must be set. - SetIfConstraint - match_type - id - - - - - Y - - - NaxsiIdentifierConstraint - - - - - /^[^"]+$/ - - - /^[^"]+$/ - - - This field must be set. - SetIfConstraint - match_type - id - - - - - Y - id - - Blacklist - Whitelist - - - - identifier.check001 - - - - - Y - - - - - This field must be set. - SetIfConstraint - match_type - id - - - - - Y - - - Y - - - 0 - Y - - - Y - - - 0 - Y - - - /^[^"]+$/ - - - /^[^"]+$/ - - - /^[^"]+$/ - - - Y - - - Y - - - Y - -
- - - Y - - - - - - Selected SYSLOG target not found. - Y - - - Y - /^(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\])):\d+|:?\d+)(?:\s*,\s*(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\])):\d+|:?\d+))*$/i - Please provide a valid listen address or port, i.e. 127.0.0.1:8080, [::1]:8080, 8080. - - - NgxUniqueDefaultServerConstraint - - - - - Y - /^(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\])):\d+|:?\d+)(?:\s*,\s*(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\])):\d+|:?\d+))*$/i - Please provide a valid listen address or port, i.e. 127.0.0.1:8080, [::1]:8080, 8080. - - - Y - 0 - - - NgxUniqueDefaultServerConstraint - - - - - 0 - Y - - - 0 - Y - - - /^((?:\d+\.){3,3}\d+|[a-f0-9\:]+)(?:\/\d+)?(,?(?:(?:(\d+\.){3,3}\d+|[a-f0-9\:]+)(?:\/\d+)?))*$/i - Y - - - - - - Selected alias not found. - - - - X-Real-IP (default) - X-Forwarded-For - PROXY Protocol - CloudFlare Connecting IP - - - - - - - Selected location not found. - Y - - - - - - Selected rewrite not found. - Y - - - - cert - - - ca - Y - - - Off - - Off - On - Optional - Optional, don't verify - - Y - - - main - -
Default
- Extended - Anonymized - Disabled -
- Y -
- - - Emergency - Alert - Critical - Error (default) - Warning - Notice - Informational - - Y - error - - - 1 - Y - - - Y - 1 - - - - utf-8 - - - - 0 - Y - - - 1 - Y - - - 0 - Y - - - Y - Y - - TLSv1.2 - TLSv1.3 - - Y - TLSv1.2,TLSv1.3 - - - /^((((!|\+|-)?[A-Z][A-Z\d\+-]+)|(@STRENGTH)):?)*$/i - - - /^(([A-Z\d-]+):?)*$/i - - - 1 - Y - - - - - - Selected resolver not found. - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - 0 - Y - - - /^((?:\d+\.){3,3}\d+|[a-f0-9\:]+)(?:\/\d+)?(,?(?:(?:(\d+\.){3,3}\d+|[a-f0-9\:]+)(?:\/\d+)?))*$/i - Y - - - 0 - Y - - - 1 - Y - - - Y - 1 - 1 - - - Y - 4 - 1 - - - Y - 8 - 1 - - - - - - Selected security rule not found. - - - - - - Selected limit zone not found. - Y - - - /^\d+[kmg]$/i - Enter a number followed by k, m or g. - - - /^\d+[kmg]$/i - Enter a number followed by k, m or g. - - - - - - Selected ACL not found. - - - - - Any - All - - - - Y - 0 - - - - - - Selected error page not found. - Y - - - 0 - Y - -
- - - Y - /^(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\])):\d+|:?\d+)(?:\s*,\s*(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\])):\d+|:?\d+))*$/i - Please provide a valid listen address or port, i.e. 127.0.0.1:8080, [::1]:8080, 8080. - - - - - - Selected SYSLOG target not found. - Y - - - Y - 0 - - - /^((?:\d+\.){3,3}\d+|[a-f0-9\:]+)(?:\/\d+)?(,?(?:(?:(\d+\.){3,3}\d+|[a-f0-9\:]+)(?:\/\d+)?))*$/i - Y - - - 0 - Y - - - cert - - - ca - - - Off - - Off - On - Optional - Optional, don't verify - - Y - - - main - -
Default
- Extended - Anonymized - Disabled -
- Y -
- - - Emergency - Alert - Critical - Error - Warning - Notice - Informational (default) - - Y - info - - - upstream - - Upstream - SNI Upstream Mapping - - Y - - - - - - Selected upstream not found. - - - This field must be set. - SetIfConstraint - route_field - upstream - - - - - - - - Selected upstream not found. - - - This field must be set. - SetIfConstraint - route_field - sni_upstream_map - - - - - - - - Selected ACL not found. - - - 0 - - - 0 - - - 0 - -
- - - Y - - - - Y - - - - - Y - - - - - - Y - - - - - Y - - - - Y - - - - Deny Access - Allow Access - - - - - - Y - - - deny - - Deny Access - Allow Access - - Y - - - - - Y - /^[^" \t]+$/i - -
- Y - Y - /^(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\]))(:\d+|:?\d+)*)(?:\s*,\s*(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\]))(:\d+|:?\d+)*))*$/i - Please provide a valid resolver address, i.e. 8.8.8.8, [2001:4860:4860::8888], 8.8.8.8:5353. -
- - 1 - - - - - Can not disable all record types. - SingleSelectConstraint - - ipv6_off - - - - - - - - ipv4_off.check001 - - - - - 1 - -
- - - Y - /^[^" \t]+$/i - - - Y - - - Y - /^[^" \t]+$/i - - - - Stop processing rules - Stop processing rules and find location - Redirect - Permanent - - - - - - Y - - - - No Referrer - No Referrer When Downgrading - Same Origin (recommended) - Origin - Strict Origin - Strict Origin When Cross Origin - Origin When Cross Origin - Unsafe URL - - - - - Block - Off - On - - - - Y - - - - Y - 1 - - - Y - 0 - - - Y - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - Y - 0 - - - - - Y - - - binary_remote_addr - - Remote IP Address - - Y - - - r/s - - Requests Per Second - Requests Per Minute - - Y - - - Y - 10 - 1 - - - Y - 20 - 1 - - - - - Y - - - Y - - 400 Bad Request - 401 Unauthorized - 403 Forbidden - 404 Not Found - 405 Method Not Allowed - 407 Proxy Authentication Required - 408 Request Timeout - 410 Gone - 415 Unsupported Media Type - 429 Too Many Requests - 431 Request Header Fields Too Large - 500 Internal Server Error - 501 Not Implemented - 502 Bad Gateway - 503 Service Unavailable - 504 Gateway Timeout - - Y - - - - - SingleSelectConstraint - Page content is required if redirect is not used and needs to be empty otherwise. - - redirect - - Y - - - - - - - pagecontent.check001 - - - - - - 200 OK - 300 Multiple Choice - 301 Moved Permanently - 302 Found - 401 Unauthorized - 403 Forbidden - 404 Not Found - 451 Unavailable For Legal Reasons - 500 Internal Server Error - 503 Service Unavailable - - - - - - Y - - - Y - - - 0 - Y - - - - /^(0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)(?::((0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)))*$/ - - - - Y - /^(0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)(?::((0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)))*$/ - - - - - - - - Selected limit zone not found. - Y - Y - - - 1 - Y - 5 - - - 1 - - - 1 - Y - - - Y - - - - - Y - - - - - - Y - /\/(srv|var|tmp|mnt)[a-z0-9\-\._\:\,\/]+[a-z0-9\-\._\:\,]+/i - - - 10 - - - 1 - - - Y - 0 - - - 1 - - - - - Y - /^[^" \t]+$/i - - - Y - any - Y - /(^\d{3}(,\d{3})*$)|(^any$)/ - Please use three digit response code(s) or use "any" word. - - - 1 - Y - - - - - Y - - - Y - - - - - kern - user - mail - daemon - auth - intern - lpr - news - uucp - clock - authpriv - ftp - ntp - audit - alert - cron - local0 - local1 - local2 - local3 - local4 - local5 - local6 - local7 - - Y - local7 - - - - debug - info - notice - warn - error - crit - alert - emerg - - Y - error - - - /[a-z][a-z0-9]*/i - - - Y - N - - -
+ Y + + + + Deny Access + Allow Access + + N + + + + + + Y + + + deny + + Deny Access + Allow Access + + Y + + + + + + Y + /^[^" \t]+$/i + +
+ Y + Y + /^(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\]))(:\d+|:?\d+)*)(?:\s*,\s*(?:(?:(?:\d{1,3}(?:\.\d{1,3}){3})|(?:\[[a-f0-9:]{1,4}(?::[a-f0-9:]{0,4}){1,7}\]))(:\d+|:?\d+)*))*$/i + Please provide a valid resolver address, i.e. 8.8.8.8, [2001:4860:4860::8888], 8.8.8.8:5353. +
+ + 1 + N + + + N + + + Can not disable all record types. + SingleSelectConstraint + + ipv6_off + + + + + + N + + + ipv4_off.check001 + + + + + 1 + N + +
+ + + + Y + /^[^" \t]+$/i + + + Y + + + Y + /^[^" \t]+$/i + + + + Stop processing rules + Stop processing rules and find location + Redirect + Permanent + + N + + + + + + Y + + + N + + No Referrer + No Referrer When Downgrading + Same Origin (recommended) + Origin + Strict Origin + Strict Origin When Cross Origin + Origin When Cross Origin + Unsafe URL + + N + + + N + + Block + Off + On + + N + + + Y + + + N + + + Y + 1 + + + Y + 0 + + + Y + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + N + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + Y + 0 + + + + + + Y + + + binary_remote_addr + + Remote IP Address + + Y + + + r/s + + Requests Per Second + Requests Per Minute + + Y + + + Y + 10 + 1 + + + Y + 20 + 1 + + + + + + Y + + + Y + + 400 Bad Request + 401 Unauthorized + 403 Forbidden + 404 Not Found + 405 Method Not Allowed + 407 Proxy Authentication Required + 408 Request Timeout + 410 Gone + 415 Unsupported Media Type + 429 Too Many Requests + 431 Request Header Fields Too Large + 500 Internal Server Error + 501 Not Implemented + 502 Bad Gateway + 503 Service Unavailable + 504 Gateway Timeout + + Y + + + PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIiAvPgogICAgPHRpdGxlPkVycm9yPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KICAgIDxoMT5FcnJvcjwvaDE+CiAgICA8cD5Tb3JyeSwgYnV0IHNvbWV0aGluZyB3ZW50IHdyb25nLjwvcD4KPC9ib2R5Pgo8L2h0bWw+ + + + SingleSelectConstraint + Page content is required if redirect is not used and needs to be empty otherwise. + + redirect + + Y + + + + + N + + + pagecontent.check001 + + + + + N + + 200 OK + 300 Multiple Choice + 301 Moved Permanently + 302 Found + 401 Unauthorized + 403 Forbidden + 404 Not Found + 451 Unavailable For Legal Reasons + 500 Internal Server Error + 503 Service Unavailable + + N + + + + + + Y + + + Y + + + 0 + Y + + + + N + /^(0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)(?::((0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)))*$/ + + + + Y + /^(0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)(?::((0x[0-9a-fA-F]{4,4}|[a-zA-Z_\-0-9]+)))*$/ + + + + + + + + + Selected limit zone not found + Y + Y + + + 1 + Y + 5 + + + 1 + N + 20 + + + 1 + Y + + + Y + + + + + + Y + + + + + + + Y + /\/(srv|var|tmp|mnt)[a-z0-9\-\._\:\,\/]+[a-z0-9\-\._\:\,]+/i + + + 10 + 10 + + + N + 1 + + + Y + 0 + + + N + 1 + + + + + + Y + + + Y + + + N + + + + kern + user + mail + daemon + auth + intern + lpr + news + uucp + clock + authpriv + ftp + ntp + audit + alert + cron + local0 + local1 + local2 + local3 + local4 + local5 + local6 + local7 + + Y + local7 + + + + debug + info + notice + warn + error + crit + alert + emerg + + Y + error + + + N + /[a-z][a-z0-9]*/i + + + Y + N + + +
diff --git a/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt b/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt index f64990afb1..5c715e748c 100644 --- a/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt +++ b/www/nginx/src/opnsense/mvc/app/views/OPNsense/Nginx/index.volt @@ -193,9 +193,6 @@
  • {{ lang._('Cache Path')}}
  • -
  • - {{ lang._('Response Code Caching')}} -
  • {{ lang._('Error Pages')}}
  • @@ -606,30 +603,6 @@ -
    - - - - - - - - - - - - - - - - - - -
    {{ lang._('ID') }}{{ lang._('Description') }}{{ lang._('Codes') }}{{ lang._('Time') }}{{ lang._('Commands') }}
    - - -
    -
    @@ -852,7 +825,6 @@ {{ partial("layout_partials/base_dialog",['fields': limit_request_connection,'id':'limit_request_connectiondlg', 'label':lang._('Edit Request Connection Limit')]) }} {{ partial("layout_partials/base_dialog",['fields': limit_zone,'id':'limit_zonedlg', 'label':lang._('Edit Limit Zone')]) }} {{ partial("layout_partials/base_dialog",['fields': cache_path,'id':'cache_pathdlg', 'label':lang._('Edit Cache Path')]) }} -{{ partial("layout_partials/base_dialog",['fields': proxy_cache_valid,'id':'proxy_cache_validdlg', 'label':lang._('Edit Response Code Caching')]) }} {{ partial("layout_partials/base_dialog",['fields': sni_hostname_map,'id':'sni_hostname_mapdlg', 'label':lang._('Edit SNI Hostname Mapping')]) }} {{ partial("layout_partials/base_dialog",['fields': ipacl,'id':'ipacl_dlg', 'label':lang._('Edit IP ACL')]) }} {{ partial("layout_partials/base_dialog",['fields': errorpage,'id':'errorpage_dlg', 'label':lang._('Edit Error Page')]) }} diff --git a/www/nginx/src/opnsense/scripts/nginx/naxsi_rule_download.php b/www/nginx/src/opnsense/scripts/nginx/naxsi_rule_download.php index 00a8e7aec0..0ef1300595 100755 --- a/www/nginx/src/opnsense/scripts/nginx/naxsi_rule_download.php +++ b/www/nginx/src/opnsense/scripts/nginx/naxsi_rule_download.php @@ -81,7 +81,7 @@ function parse_rules($data) } $tmp = trim($matches[1]); $parsed[$tmp] = []; - } elseif (preg_match('/\S+ "(str|rx):(.+)" "msg:([^\\"]*)" +"mz:([^\"]*)" "s:([^\"]*):(\d+)" id:(\d+);/', $line, $matches)) { + } elseif (preg_match('/\S+ "(str|rx):([^\"]+)" "msg:([^\\"]*)" "mz:([^\"]*)" "s:([^\"]*):(\d+)" id:(\d+);/', $line, $matches)) { $parsed[$tmp][] = prepare_values(array_combine($description, $matches)); } } @@ -167,10 +167,17 @@ function save_to_model($data) } $policy->naxsi_rules = implode(',', array_diff($rule_list, $dis_rules)); } - // skip validation on serialization. possible warnings and errors will still end up in the syslog - $model->serializeToConfig(false, true); + $val_result = $model->performValidation(false); + if (count($val_result) !== 0) { + print_r($val_result); + exit(1); + } + + $model->serializeToConfig(); Config::getInstance()->save(); } + +#$data = parse_rules(file('./naxsi_core.rules')); $data = parse_rules(explode("\n", download_rules())); save_to_model($data); diff --git a/www/nginx/src/opnsense/scripts/nginx/ngx_autoblock.php b/www/nginx/src/opnsense/scripts/nginx/ngx_autoblock.php index 93bfab68bc..7a4ee048e8 100755 --- a/www/nginx/src/opnsense/scripts/nginx/ngx_autoblock.php +++ b/www/nginx/src/opnsense/scripts/nginx/ngx_autoblock.php @@ -216,7 +216,7 @@ function cleanup_work_files($work_files) // Triggering TLS-handshake processor when corresponding work file exists. if (in_array(TLS_HANDSHAKE_FILE_WORK, $work_files)) { - mwexecf(TLS_HANDSHAKE_PROCESSING_TASK); + mwexec(TLS_HANDSHAKE_PROCESSING_TASK); } // Abort if permanent ban file is missing diff --git a/www/nginx/src/opnsense/scripts/nginx/setup.php b/www/nginx/src/opnsense/scripts/nginx/setup.php index 8d1c7af503..96a863c740 100755 --- a/www/nginx/src/opnsense/scripts/nginx/setup.php +++ b/www/nginx/src/opnsense/scripts/nginx/setup.php @@ -29,11 +29,9 @@ const KEY_DIRECTORY = '/usr/local/etc/nginx/key/'; const GROUP_OWNER = 'staff'; - require_once('config.inc'); require_once('certs.inc'); require_once('util.inc'); - use OPNsense\Nginx\Nginx; function export_pem_file($filename, $data, $post_append = null) @@ -122,25 +120,15 @@ function find_ca($refid) $cert['prv'] ); if (!empty($http_server['ca'])) { - syslog(LOG_DEBUG, "NGINX setup: Setting up the CA certs for {$hostname}."); - $ca_certs = []; - foreach ($http_server['ca'] as $carefs) { - foreach (explode(',', $carefs) as $caref) { - syslog(LOG_DEBUG, "NGINX setup: Searching for {$caref} CA data"); - $ca = find_ca($caref); - if (isset($ca)) { - syslog(LOG_DEBUG, "NGINX setup: client auth CA found. Adding to the list"); - $ca_certs[] = base64_decode($ca['crt']); - } + foreach ($http_server['ca'] as $caref) { + $ca = find_ca($caref); + if (isset($ca)) { + export_pem_file( + KEY_DIRECTORY . $hostname . '_ca.pem', + $ca['crt'] + ); } } - if (count($ca_certs) > 0) { - export_pem_file( - KEY_DIRECTORY . $hostname . '_ca.pem', - '', - implode("\n", $ca_certs) - ); - } } } } @@ -363,5 +351,4 @@ function find_ca($refid) syslog(LOG_DEBUG, "NGINX setup routine completed."); closelog(); - -pass_safe('/usr/local/etc/rc.d/php-fpm start'); +passthru('/usr/local/etc/rc.d/php-fpm start'); diff --git a/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/http.conf b/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/http.conf index cc316538ac..87592f4b4e 100644 --- a/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/http.conf +++ b/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/http.conf @@ -48,12 +48,6 @@ server_names_hash_max_size {{ OPNsense.Nginx.http.server_names_hash_max_size }}; {% if OPNsense.Nginx.http.server_names_hash_bucket_size is defined and OPNsense.Nginx.http.server_names_hash_bucket_size != '' %} server_names_hash_bucket_size {{ OPNsense.Nginx.http.server_names_hash_bucket_size }}; {% endif %} -{% if OPNsense.Nginx.http.variables_hash_max_size is defined and OPNsense.Nginx.http.variables_hash_max_size != '' %} -variables_hash_max_size {{ OPNsense.Nginx.http.variables_hash_max_size }}; -{% endif %} -{% if OPNsense.Nginx.http.variables_hash_bucket_size is defined and OPNsense.Nginx.http.variables_hash_bucket_size != '' %} -variables_hash_bucket_size {{ OPNsense.Nginx.http.variables_hash_bucket_size }}; -{% endif %} {% if OPNsense.Nginx.http.keepalive_timeout is defined and OPNsense.Nginx.http.keepalive_timeout != '' %} keepalive_timeout {{ OPNsense.Nginx.http.keepalive_timeout }}; {% endif %} @@ -120,21 +114,10 @@ server { {% endif %} {% if server.listen_https_address is defined and server.listen_https_address != '' %} -{% set http3_alt_svc_ports = [] %} {% for listen_address in server.listen_https_address.split(',') %} listen {{ listen_address }} ssl{% if server.proxy_protocol is defined and server.proxy_protocol == '1' %} proxy_protocol{% endif %}{% if server.default_server is defined and server.default_server == '1' %} default_server{% endif %}; -{% if server.enable_http3|default("0") == "1" %} - listen {{ listen_address }} quic reuseport{% if server.default_server is defined and server.default_server == '1' %} default_server{% endif %}; -{% set listen_address_clean = listen_address.replace(' ', '') %} -{% if listen_address_clean != '' %} -{% set listen_port = listen_address_clean.split(':')[-1] %} -{% if listen_port not in http3_alt_svc_ports %} -{% do http3_alt_svc_ports.append(listen_port) %} -{% endif %} -{% endif %} -{% endif %} {% endfor %} - http2 {% if server.http2|default("1") == "1" %}on{% else %}off{% endif %}; + http2 on; {% if server.tls_reject_handshake is defined and server.tls_reject_handshake == '1'%} ssl_reject_handshake on; {% endif %} @@ -166,9 +149,6 @@ server { {% else %} ssl_stapling off; {% endif %} -{% if server.enable_http3|default("0") == "1" and http3_alt_svc_ports|length > 0 %} - add_header Alt-Svc '{% for listen_port in http3_alt_svc_ports %}h3=":{{ listen_port }}"; ma=86400{% if not loop.last %}, {% endif %}{% endfor %}' always; -{% endif %} {% endif %} {% endif %} {% if server.resolver is defined and server.resolver != '' %} @@ -266,7 +246,6 @@ server { root /usr/local/etc/nginx/views; } {% endif %} - proxy_intercept_errors {% if server.proxy_intercept_errors|default("0") == "1" %}on{% else %}off{% endif %}; {% if server.security_header is defined and server.security_header != '' %} {% set security_rule = helpers.getUUID(server.security_header) %} {% if security_rule is defined %} diff --git a/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/location.conf b/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/location.conf index 71529378b3..9f9b576038 100644 --- a/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/location.conf +++ b/www/nginx/src/opnsense/service/templates/OPNsense/Nginx/location.conf @@ -47,9 +47,6 @@ location {{ location.matchtype }} {{ location.urlpattern }} { error_page {{ errorpage.statuscodes.replace(',', ' ') }} {% if errorpage.response is defined and errorpage.response != '' %}={{ errorpage.response }} {% endif %}{% if errorpage.redirect is defined and errorpage.redirect != '' %}{{ errorpage.redirect }}{% else %}/error_{{ errorpage_uuid.replace('-', '') }}.html{% endif %}; {% endfor %} {% endif %} -{% if location.proxy_intercept_errors is defined and location.proxy_intercept_errors != 'Inherit' %} - proxy_intercept_errors {{ location.proxy_intercept_errors }}; -{% endif %} {% if location.force_https is defined and location.force_https == '1' %} if ($scheme != "https") { return 302 https://$host$request_uri; @@ -147,13 +144,7 @@ location {{ location.matchtype }} {{ location.urlpattern }} { proxy_cache_use_stale {{ location.cache_use_stale.replace(',', ' ') }}; {% endif %} {% if location.cache_valid is defined and location.cache_valid != '' %} - proxy_cache_valid {{ location.cache_valid }}m; -{% endif %} -{% if location.proxy_cache_valid is defined and location.proxy_cache_valid != '' %} -{% for pcache_valid_uuid in location.proxy_cache_valid.split(',') %} -{% set pcache_valid = helpers.getUUID(pcache_valid_uuid) %} - proxy_cache_valid {{ pcache_valid.code.replace(',', ' ') }} {{ pcache_valid.valid }}m; -{% endfor %} + proxy_cache_valid {{ location.cache_valid }}m; {% endif %} proxy_cache_min_uses {{ location.cache_min_uses|default('1') }}; proxy_cache_background_update {% if location.cache_background_update is defined and location.cache_background_update == '1' %}on{% else %}off{% endif %}; diff --git a/www/nginx/src/opnsense/www/js/nginx/dist/configuration.min.js b/www/nginx/src/opnsense/www/js/nginx/dist/configuration.min.js index d25e073871..3ef498d006 100644 --- a/www/nginx/src/opnsense/www/js/nginx/dist/configuration.min.js +++ b/www/nginx/src/opnsense/www/js/nginx/dist/configuration.min.js @@ -1 +1 @@ -!function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=25)}({25:function(t,e,n){"use strict";n.r(e);var i=Backbone.View.extend({tagName:"div",attributes:{class:"container-fluid"},child_views:[],createModel:null,upstreamCollection:null,initialize:function(t){this.dataField=$(t.dataField),this.entryclass=t.entryclass,this.createModel=t.createModel,this.upstreamCollection=t.upstreamCollection,this.listenTo(this.collection,"add remove reset",this.render),this.listenTo(this.collection,"change",this.update),this.dataField.after(this.$el)},events:{"click .add":"addEntry"},render:function(){this.child_views.forEach(t=>t.remove()),this.$el.html(""),this.child_views=[],this.update(),this.collection.each(t=>{const e=new this.entryclass({model:t,collection:this.collection,upstreamCollection:this.upstreamCollection});this.child_views.push(e),this.$el.append(e.$el),e.render()}),this.$el.append($('\n
    \n \n
    '))},update:function(){this.dataField.data("data",this.collection.toJSON())},addEntry:function(t){t.preventDefault(),this.collection.add(this.createModel())}});var s=Backbone.Collection.extend({url:"/api/nginx/settings/searchupstream",parse:function(t){return t.rows}});const a=Backbone.View.extend({tagName:"div",attributes:{class:"row"},events:{"keyup .key":function(){this.model.set("hostname",this.key.value)},"change .value":function(){this.model.set("upstream",this.value.value)},"click .delete":"deleteEntry"},key:null,value:null,delBtn:null,first:null,second:null,third:null,upstreamCollection:null,initialize:function(t){this.upstreamCollection=t.upstreamCollection,this.listenTo(this.upstreamCollection,"update reset add remove",this.regenerate_list),this.first=document.createElement("div"),this.first.classList.add("col-sm-5"),this.key=document.createElement("input"),this.first.append(this.key),this.key.type="text",this.key.classList.add("key"),this.key.value=this.model.get("hostname"),this.second=document.createElement("div"),this.second.classList.add("col-sm-5"),this.value=document.createElement("select"),this.second.append(this.value),this.value.classList.add("value"),this.value.classList.add("form-control"),this.value.value=this.model.get("upstream"),this.third=document.createElement("div"),this.third.classList.add("col-sm-2"),this.third.style.textAlign="right",this.delBtn=document.createElement("button"),this.delBtn.classList.add("delete"),this.delBtn.classList.add("btn"),this.delBtn.innerHTML='',this.third.append(this.delBtn),this.model.has("upstream")&&0!==this.upstreamCollection.where({uuid:this.model.get("upstream")}).length||this.upstreamCollection.length>0&&this.model.set("upstream",this.upstreamCollection.at(0).get("uuid")),this.$el.append(this.first).append(this.second).append(this.third)},render:function(){$(this.key).val(this.model.get("hostname")),this.regenerate_list(),$(this.value).val(this.model.get("upstream"))},deleteEntry:function(t){t.preventDefault(),this.collection.remove(this.model)},regenerate_list:function(){const t=$(this.value);t.html(""),this.upstreamCollection.each(e=>t.append(``)),t.val(this.model.get("upstream")),t.selectpicker("refresh")}}),l=Backbone.View.extend({tagName:"div",attributes:{class:"row"},events:{"keyup .key":function(){this.model.set("network",this.key.value)},"change .value":function(){this.model.set("action",this.value.value)},"click .delete":"deleteEntry"},key:null,value:null,delBtn:null,first:null,second:null,third:null,upstreamCollection:null,initialize:function(t){this.upstreamCollection=t.upstreamCollection,this.listenTo(this.upstreamCollection,"update reset add remove",this.regenerate_list),this.first=document.createElement("div"),this.first.classList.add("col-sm-5"),this.key=document.createElement("input"),this.first.append(this.key),this.key.type="text",this.key.classList.add("key"),this.key.value=this.model.get("network"),this.second=document.createElement("div"),this.second.classList.add("col-sm-5"),this.value=document.createElement("select"),this.second.append(this.value),this.value.classList.add("value"),this.value.classList.add("form-control"),this.value.value=this.model.get("action"),this.third=document.createElement("div"),this.third.classList.add("col-sm-2"),this.third.style.textAlign="right",this.delBtn=document.createElement("button"),this.delBtn.classList.add("delete"),this.delBtn.classList.add("btn"),this.delBtn.innerHTML='',this.third.append(this.delBtn),this.$el.append(this.first).append(this.second).append(this.third)},render:function(){$(this.key).val(this.model.get("network")),this.regenerate_list(),$(this.value).val(this.model.get("action"))},deleteEntry:function(t){t.preventDefault(),this.collection.remove(this.model)},regenerate_list:function(){const t=$(this.value);t.html(""),this.upstreamCollection.each(e=>t.append(``)),t.val(this.model.get("action")),t.selectpicker("refresh")}});var o=Backbone.Collection.extend({initialize:function(){let t=this;$("#snihostname\\.data").change(function(){t.regenerateFromView()})},regenerateFromView:function(){let t=$("#snihostname\\.data").data("data");_.isArray(t)||(t=[]),this.reset(t)}}),r=Backbone.Model.extend({}),d=Backbone.Model.extend({}),c=Backbone.Collection.extend({initialize:function(){let t=this;$("#ipacl\\.data").change(function(){t.regenerateFromView()})},regenerateFromView:function(){let t=$("#ipacl\\.data").data("data");_.isArray(t)||(t=[]),this.reset(t)}});const u=new s,h=new Backbone.Collection([{name:"Deny",value:"deny"},{name:"Allow",value:"allow"}]);$(document).ready(function(){mapDataToFormUI({frm_nginx:"/api/nginx/settings/get"}).done(function(){formatTokenizersUI(),$('select[data-allownew="false"]').selectpicker("refresh"),updateServiceControlUI("nginx")}),""!==window.location.hash&&$('a[href="'+window.location.hash+'"]').click(),$(".nav-tabs a").on("shown.bs.tab",function(t){history.pushState(null,null,t.target.hash)}),$(".reload_btn").click(function(){$(".reloadAct_progress").addClass("fa-spin"),ajaxCall("/api/nginx/service/reconfigure",{},function(){$(".reloadAct_progress").removeClass("fa-spin")})}),$('[id*="save_"]').each(function(){$(this).click(function(){let t=$(this).closest("form").attr("id"),e=$(this).closest("form").attr("data-title");saveFormToEndpoint("/api/nginx/settings/set",t,function(){$("#"+t+"_progress").addClass("fa fa-spinner fa-pulse"),ajaxCall("/api/nginx/service/reconfigure",{},function(n,i){$("#"+t+"_progress").removeClass("fa fa-spinner fa-pulse"),void 0===n||"success"===i&&"ok"===n.status?updateServiceControlUI("nginx"):BootstrapDialog.show({type:BootstrapDialog.TYPE_WARNING,title:e,message:JSON.stringify(n),draggable:!0})})})})}),["upstream","upstreamserver","location","credential","userlist","httpserver","streamserver","httprewrite","custompolicy","security_header","ipacl","limit_zone","cache_path","proxy_cache_valid","limit_request_connection","snifwd","errorpage","tls_fingerprint","resolver","syslog_target","naxsirule"].forEach(function(t){$("#grid-"+t).UIBootgrid({search:"/api/nginx/settings/search"+t,get:"/api/nginx/settings/get"+t+"/",set:"/api/nginx/settings/set"+t+"/",add:"/api/nginx/settings/add"+t+"/",del:"/api/nginx/settings/del"+t+"/",commands:{copy_uuid:{method:function(t){navigator.clipboard.writeText($(this).data("row-id"))}}},options:{selection:!1,multiSelect:!1,formatters:{commands:function(t,e){return''},response:function(t,e){return"none"==e.response?"unchanged":e.response},statuscodes:function(t,e){const n=[],i=e.statuscodes.split(",");for(let t of i)n.push(t.substr(0,3));return n.join(", ")}}}})}),bind_naxsi_rule_dl_button(),function(){let t=new i({dataField:document.getElementById("snihostname.data"),upstreamCollection:u,entryclass:a,collection:new o,createModel:function(){return new r({hostname:"localhost"})}});window.snifield=t,t.render(),$("#grid-upstream").on("loaded.rs.jquery.bootgrid",function(){u.fetch()}),u.fetch()}();let t=new i({dataField:document.getElementById("ipacl.data"),upstreamCollection:h,entryclass:l,collection:new c,createModel:function(){return new d({network:"::",action:"deny"})}});window.ipaclfield=t,t.render()})}}); +!function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=25)}({25:function(t,e,n){"use strict";n.r(e);var i=Backbone.View.extend({tagName:"div",attributes:{class:"container-fluid"},child_views:[],createModel:null,upstreamCollection:null,initialize:function(t){this.dataField=$(t.dataField),this.entryclass=t.entryclass,this.createModel=t.createModel,this.upstreamCollection=t.upstreamCollection,this.listenTo(this.collection,"add remove reset",this.render),this.listenTo(this.collection,"change",this.update),this.dataField.after(this.$el)},events:{"click .add":"addEntry"},render:function(){this.child_views.forEach(t=>t.remove()),this.$el.html(""),this.child_views=[],this.update(),this.collection.each(t=>{const e=new this.entryclass({model:t,collection:this.collection,upstreamCollection:this.upstreamCollection});this.child_views.push(e),this.$el.append(e.$el),e.render()}),this.$el.append($('\n
    \n \n
    '))},update:function(){this.dataField.data("data",this.collection.toJSON())},addEntry:function(t){t.preventDefault(),this.collection.add(this.createModel())}});var s=Backbone.Collection.extend({url:"/api/nginx/settings/searchupstream",parse:function(t){return t.rows}});const a=Backbone.View.extend({tagName:"div",attributes:{class:"row"},events:{"keyup .key":function(){this.model.set("hostname",this.key.value)},"change .value":function(){this.model.set("upstream",this.value.value)},"click .delete":"deleteEntry"},key:null,value:null,delBtn:null,first:null,second:null,third:null,upstreamCollection:null,initialize:function(t){this.upstreamCollection=t.upstreamCollection,this.listenTo(this.upstreamCollection,"update reset add remove",this.regenerate_list),this.first=document.createElement("div"),this.first.classList.add("col-sm-5"),this.key=document.createElement("input"),this.first.append(this.key),this.key.type="text",this.key.classList.add("key"),this.key.value=this.model.get("hostname"),this.second=document.createElement("div"),this.second.classList.add("col-sm-5"),this.value=document.createElement("select"),this.second.append(this.value),this.value.classList.add("value"),this.value.classList.add("form-control"),this.value.value=this.model.get("upstream"),this.third=document.createElement("div"),this.third.classList.add("col-sm-2"),this.third.style.textAlign="right",this.delBtn=document.createElement("button"),this.delBtn.classList.add("delete"),this.delBtn.classList.add("btn"),this.delBtn.innerHTML='',this.third.append(this.delBtn),this.model.has("upstream")&&0!==this.upstreamCollection.where({uuid:this.model.get("upstream")}).length||this.upstreamCollection.length>0&&this.model.set("upstream",this.upstreamCollection.at(0).get("uuid")),this.$el.append(this.first).append(this.second).append(this.third)},render:function(){$(this.key).val(this.model.get("hostname")),this.regenerate_list(),$(this.value).val(this.model.get("upstream"))},deleteEntry:function(t){t.preventDefault(),this.collection.remove(this.model)},regenerate_list:function(){const t=$(this.value);t.html(""),this.upstreamCollection.each(e=>t.append(``)),t.val(this.model.get("upstream")),t.selectpicker("refresh")}}),l=Backbone.View.extend({tagName:"div",attributes:{class:"row"},events:{"keyup .key":function(){this.model.set("network",this.key.value)},"change .value":function(){this.model.set("action",this.value.value)},"click .delete":"deleteEntry"},key:null,value:null,delBtn:null,first:null,second:null,third:null,upstreamCollection:null,initialize:function(t){this.upstreamCollection=t.upstreamCollection,this.listenTo(this.upstreamCollection,"update reset add remove",this.regenerate_list),this.first=document.createElement("div"),this.first.classList.add("col-sm-5"),this.key=document.createElement("input"),this.first.append(this.key),this.key.type="text",this.key.classList.add("key"),this.key.value=this.model.get("network"),this.second=document.createElement("div"),this.second.classList.add("col-sm-5"),this.value=document.createElement("select"),this.second.append(this.value),this.value.classList.add("value"),this.value.classList.add("form-control"),this.value.value=this.model.get("action"),this.third=document.createElement("div"),this.third.classList.add("col-sm-2"),this.third.style.textAlign="right",this.delBtn=document.createElement("button"),this.delBtn.classList.add("delete"),this.delBtn.classList.add("btn"),this.delBtn.innerHTML='',this.third.append(this.delBtn),this.$el.append(this.first).append(this.second).append(this.third)},render:function(){$(this.key).val(this.model.get("network")),this.regenerate_list(),$(this.value).val(this.model.get("action"))},deleteEntry:function(t){t.preventDefault(),this.collection.remove(this.model)},regenerate_list:function(){const t=$(this.value);t.html(""),this.upstreamCollection.each(e=>t.append(``)),t.val(this.model.get("action")),t.selectpicker("refresh")}});var o=Backbone.Collection.extend({initialize:function(){let t=this;$("#snihostname\\.data").change(function(){t.regenerateFromView()})},regenerateFromView:function(){let t=$("#snihostname\\.data").data("data");_.isArray(t)||(t=[]),this.reset(t)}}),r=Backbone.Model.extend({}),d=Backbone.Model.extend({}),c=Backbone.Collection.extend({initialize:function(){let t=this;$("#ipacl\\.data").change(function(){t.regenerateFromView()})},regenerateFromView:function(){let t=$("#ipacl\\.data").data("data");_.isArray(t)||(t=[]),this.reset(t)}});const u=new s,h=new Backbone.Collection([{name:"Deny",value:"deny"},{name:"Allow",value:"allow"}]);$(document).ready(function(){mapDataToFormUI({frm_nginx:"/api/nginx/settings/get"}).done(function(){formatTokenizersUI(),$('select[data-allownew="false"]').selectpicker("refresh"),updateServiceControlUI("nginx")}),""!==window.location.hash&&$('a[href="'+window.location.hash+'"]').click(),$(".nav-tabs a").on("shown.bs.tab",function(t){history.pushState(null,null,t.target.hash)}),$(".reload_btn").click(function(){$(".reloadAct_progress").addClass("fa-spin"),ajaxCall("/api/nginx/service/reconfigure",{},function(){$(".reloadAct_progress").removeClass("fa-spin")})}),$('[id*="save_"]').each(function(){$(this).click(function(){let t=$(this).closest("form").attr("id"),e=$(this).closest("form").attr("data-title");saveFormToEndpoint("/api/nginx/settings/set",t,function(){$("#"+t+"_progress").addClass("fa fa-spinner fa-pulse"),ajaxCall("/api/nginx/service/reconfigure",{},function(n,i){$("#"+t+"_progress").removeClass("fa fa-spinner fa-pulse"),void 0===n||"success"===i&&"ok"===n.status?updateServiceControlUI("nginx"):BootstrapDialog.show({type:BootstrapDialog.TYPE_WARNING,title:e,message:JSON.stringify(n),draggable:!0})})})})}),["upstream","upstreamserver","location","credential","userlist","httpserver","streamserver","httprewrite","custompolicy","security_header","ipacl","limit_zone","cache_path","limit_request_connection","snifwd","errorpage","tls_fingerprint","resolver","syslog_target","naxsirule"].forEach(function(t){$("#grid-"+t).UIBootgrid({search:"/api/nginx/settings/search"+t,get:"/api/nginx/settings/get"+t+"/",set:"/api/nginx/settings/set"+t+"/",add:"/api/nginx/settings/add"+t+"/",del:"/api/nginx/settings/del"+t+"/",commands:{copy_uuid:{method:function(t){navigator.clipboard.writeText($(this).data("row-id"))}}},options:{selection:!1,multiSelect:!1,formatters:{commands:function(t,e){return''},response:function(t,e){return"none"==e.response?"unchanged":e.response},statuscodes:function(t,e){const n=[],i=e.statuscodes.split(",");for(let t of i)n.push(t.substr(0,3));return n.join(", ")}}}})}),bind_naxsi_rule_dl_button(),function(){let t=new i({dataField:document.getElementById("snihostname.data"),upstreamCollection:u,entryclass:a,collection:new o,createModel:function(){return new r({hostname:"localhost"})}});window.snifield=t,t.render(),$("#grid-upstream").on("loaded.rs.jquery.bootgrid",function(){u.fetch()}),u.fetch()}();let t=new i({dataField:document.getElementById("ipacl.data"),upstreamCollection:h,entryclass:l,collection:new c,createModel:function(){return new d({network:"::",action:"deny"})}});window.ipaclfield=t,t.render()})}}); \ No newline at end of file diff --git a/www/nginx/src/opnsense/www/js/nginx/src/nginx_config.js b/www/nginx/src/opnsense/www/js/nginx/src/nginx_config.js index 4272efdaa1..e61a2469be 100644 --- a/www/nginx/src/opnsense/www/js/nginx/src/nginx_config.js +++ b/www/nginx/src/opnsense/www/js/nginx/src/nginx_config.js @@ -66,7 +66,6 @@ function init_grids() { 'ipacl', 'limit_zone', 'cache_path', - 'proxy_cache_valid', 'limit_request_connection', 'snifwd', 'errorpage', diff --git a/www/squid/Makefile b/www/squid/Makefile index def32ee4f3..6e9236529f 100644 --- a/www/squid/Makefile +++ b/www/squid/Makefile @@ -1,6 +1,7 @@ PLUGIN_NAME= squid -PLUGIN_VERSION= 1.4 +PLUGIN_VERSION= 1.3 PLUGIN_COMMENT= Squid is a caching proxy for the web PLUGIN_DEPENDS= squid squid-langpack +PLUGIN_MAINTAINER= franco@opnsense.org .include "../../Mk/plugins.mk" diff --git a/www/squid/pkg-descr b/www/squid/pkg-descr index cf30d7de9e..f885f0ccee 100644 --- a/www/squid/pkg-descr +++ b/www/squid/pkg-descr @@ -5,10 +5,6 @@ content serving applications. Plugin Changelog ================ -1.4 - -* Make email_err_data static due to SQUID-2025:2 CVE 10.0 (contributed by m.a.x. it) - 1.3 * Repackage template files using new contrib directory feature diff --git a/www/squid/src/opnsense/mvc/app/controllers/OPNsense/Proxy/forms/main.xml b/www/squid/src/opnsense/mvc/app/controllers/OPNsense/Proxy/forms/main.xml index 7d0aac1b84..8c01e6af79 100644 --- a/www/squid/src/opnsense/mvc/app/controllers/OPNsense/Proxy/forms/main.xml +++ b/www/squid/src/opnsense/mvc/app/controllers/OPNsense/Proxy/forms/main.xml @@ -312,13 +312,13 @@ proxy.forward.transparentModecheckbox - + Add a new firewall rule ]]> proxy.forward.sslbump checkbox - + Add a new firewall rule ]]> proxy.forward.sslurlonly @@ -336,7 +336,7 @@ proxy.forward.sslcertificate dropdown - Select a certificate authority to use. + CA Manager.]]> proxy.forward.sslnobumpsites diff --git a/www/squid/src/opnsense/mvc/app/models/OPNsense/Proxy/Proxy.xml b/www/squid/src/opnsense/mvc/app/models/OPNsense/Proxy/Proxy.xml index 3a0d406bbc..d870282407 100644 --- a/www/squid/src/opnsense/mvc/app/models/OPNsense/Proxy/Proxy.xml +++ b/www/squid/src/opnsense/mvc/app/models/OPNsense/Proxy/Proxy.xml @@ -101,14 +101,14 @@ Y - 1 - 99999 - Specify a maximum object size (number of MBs). + 1 + 99999 + Specify a maximum object size (number of MBs). - 1 - 99999 - Specify a maximum object size in memory (number of KBs). + 1 + 99999 + Specify a maximum object size in memory (number of KBs). Default @@ -279,27 +279,27 @@ Please select a valid certificate from the list. - /^([a-zA-Z0-9\.:\[\]\s\-]*?,)*([a-zA-Z0-9\.:\[\]\s\-]*)$/ - Please enter ip addresses or domain names here. + /^([a-zA-Z0-9\.:\[\]\s\-]*?,)*([a-zA-Z0-9\.:\[\]\s\-]*)$/ + Please enter ip addresses or domain names here. - 1 - 100 - Worker number needs to be an integer value between 1 and 100. + 1 + 100 + Worker number needs to be an integer value between 1 and 100. - Y - 4 - 1 - 65535 - Maximum size needs to be an integer value between 1 and 65535. + Y + 4 + 1 + 65535 + Maximum size needs to be an integer value between 1 and 65535. - Y - 5 - 1 - 32 - The number of sslrtd children needs to be an integer value between 1 and 32. + Y + 5 + 1 + 32 + The number of sslrtd children needs to be an integer value between 1 and 32. 0 @@ -497,203 +497,203 @@ - - - Y - The proxy name must be set. - - - Proxy name should be unique. - UniqueConstraint - - - - - Y - - Proxy - Direct Connection (no Proxy) - HTTP Proxy - HTTPS Proxy - SOCKS - SOCKS Version 4 - SOCKS Version 5 - - - - This does not look like a valid proxy or direct connection. - - - /^([\t\n\v\f\r 0-9a-zA-Z\-.,_\x{00A0}-\x{FFFF}]){1,255}$/u - - - - - Y - The match name must be set. - - - Match name should be unique. - UniqueConstraint - - - - - /^([\t\n\v\f\r 0-9a-zA-Z\-.,_\x{00A0}-\x{FFFF}]){1,255}$/u - - - 0 - Y - - - Y - - URL Matches - Hostname Matches - DNS Domain Is - IP Is In Network - My IP Is In Network - Plain Hostname (No Dots Inside) - Is Resolvable - DNS Domain Levels (Count Of Dots) - Weekday Range - Date Range - Time Range - - - - - /^[^"]*$/ - - - - 0 - Minimum domain level must be bigger than 0. - - - 0 - A hostname cannot have a negative count of levels. - - - 0 - The first hour of the day is 0. - - - 0 - 23 - The last hour of the day is 23. - - - Y - - January - February - March - April - May - June - July - August - September - October - November - December - - - - Y - - January - February - March - April - May - June - July - August - September - October - November - December - - - - Y - - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - Sunday - - - - Y - - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - Sunday - - - - - - 1 - Y - - - /^([\t\n\v\f\r 0-9a-zA-Z\-.,_\x{00A0}-\x{FFFF}]){1,255}$/u - - - - - OPNsense.Proxy.Proxy - pac.match - name - - - Y - Y - - - Y - - And - Or - - - - Y - - If - Unless - - - - Y - - - OPNsense.Proxy.Proxy - pac.proxy - name - - - Y - Y - - + + + Y + The proxy name must be set. + + + Proxy name should be unique. + UniqueConstraint + + + + + Y + + Proxy + Direct Connection (no Proxy) + HTTP Proxy + HTTPS Proxy + SOCKS + SOCKS Version 4 + SOCKS Version 5 + + + + This does not look like a valid proxy or direct connection. + + + /^([\t\n\v\f\r 0-9a-zA-Z\-.,_\x{00A0}-\x{FFFF}]){1,255}$/u + + + + + Y + The match name must be set. + + + Match name should be unique. + UniqueConstraint + + + + + /^([\t\n\v\f\r 0-9a-zA-Z\-.,_\x{00A0}-\x{FFFF}]){1,255}$/u + + + 0 + Y + + + Y + + URL Matches + Hostname Matches + DNS Domain Is + IP Is In Network + My IP Is In Network + Plain Hostname (No Dots Inside) + Is Resolvable + DNS Domain Levels (Count Of Dots) + Weekday Range + Date Range + Time Range + + + + + /^[^"]*$/ + + + + 0 + Minimum domain level must be bigger than 0. + + + 0 + A hostname cannot have a negative count of levels. + + + 0 + The first hour of the day is 0. + + + 0 + 23 + The last hour of the day is 23. + + + Y + + January + February + March + April + May + June + July + August + September + October + November + December + + + + Y + + January + February + March + April + May + June + July + August + September + October + November + December + + + + Y + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + + + Y + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + + + + + 1 + Y + + + /^([\t\n\v\f\r 0-9a-zA-Z\-.,_\x{00A0}-\x{FFFF}]){1,255}$/u + + + + + OPNsense.Proxy.Proxy + pac.match + name + + + Y + Y + + + Y + + And + Or + + + + Y + + If + Unless + + + + Y + + + OPNsense.Proxy.Proxy + pac.proxy + name + + + Y + Y + + - + diff --git a/www/squid/src/opnsense/service/templates/OPNsense/Proxy/squid.conf b/www/squid/src/opnsense/service/templates/OPNsense/Proxy/squid.conf index 1134b1a9ee..63d948db3d 100644 --- a/www/squid/src/opnsense/service/templates/OPNsense/Proxy/squid.conf +++ b/www/squid/src/opnsense/service/templates/OPNsense/Proxy/squid.conf @@ -329,9 +329,6 @@ cache_dir rock {{OPNsense.proxy.general.cache.local.directory}} {{OPNsense.proxy # Leave coredumps in the first cache dir coredump_dir /var/squid/cache -# Disable Debug information in Administartor Email / SQUID-2025:2 -email_err_data off - # # Add any of your own refresh_pattern entries above these. # diff --git a/www/web-proxy-sso/Makefile b/www/web-proxy-sso/Makefile index e62e084a45..cbfbf3e00f 100644 --- a/www/web-proxy-sso/Makefile +++ b/www/web-proxy-sso/Makefile @@ -3,6 +3,7 @@ PLUGIN_VERSION= 2.2 PLUGIN_REVISION= 3 PLUGIN_COMMENT= Kerberos authentication module PLUGIN_DEPENDS= msktutil cyrus-sasl-gssapi +PLUGIN_MAINTAINER= evbevz@gmail.com PLUGIN_WWW= https://smart-soft.ru .include "../../Mk/plugins.mk" diff --git a/www/web-proxy-sso/src/opnsense/mvc/app/models/OPNsense/ProxySSO/ProxySSO.xml b/www/web-proxy-sso/src/opnsense/mvc/app/models/OPNsense/ProxySSO/ProxySSO.xml index 85760d9271..963d01260c 100644 --- a/www/web-proxy-sso/src/opnsense/mvc/app/models/OPNsense/ProxySSO/ProxySSO.xml +++ b/www/web-proxy-sso/src/opnsense/mvc/app/models/OPNsense/ProxySSO/ProxySSO.xml @@ -1,23 +1,23 @@ - //OPNsense/ProxySSO - +//OPNsense/ProxySSO + Web-proxy Single Sign-On plugin - - - 0 - Y - - - W2008 - Y - - Windows 2003 - Windows 2008 with AES - - - - N - - + + + 0 + Y + + + W2008 + Y + + Windows 2003 + Windows 2008 with AES + + + + N + +