Merge branch 'piss52' into piss60 - First attempt, didn't even try it

This commit is contained in:
Raphael Bertoche 2021-10-30 21:00:57 -03:00
commit 58c549ee8f
36 changed files with 1041 additions and 10818 deletions

1
.gitignore vendored
View file

@ -25,6 +25,7 @@ tags
# Ignore editor files
*\#*
*~
.dir-locals.el
# Ignore SSL Stuff
server.cert.pem

1
Config
View file

@ -113,6 +113,7 @@ if [ "x$MAKE" = "x" ]; then
fi
echo $CONF
./autogen.sh
$CONF || exit 1
cd "$UNREALCWD"

View file

@ -1,12 +1,14 @@
[![Twitter Follow](https://img.shields.io/twitter/follow/Unreal_IRCd.svg?style=social&label=Follow)](https://twitter.com/Unreal_IRCd)
<a class="twitter-follow-button"
href="https://twitter.com/pissnetstaff">
Follow @pissnetstaff on Twitter</a>
## About UnrealIRCd
UnrealIRCd is an Open Source IRC Server, serving thousands of networks since 1999.
It runs on Linux, OS X and Windows and is currently the most widely deployed IRCd
with a market share of 42%. UnrealIRCd is a highly advanced IRCd with a strong
focus on modularity, an advanced and highly configurable configuration file.
Key features include SSL/TLS, cloaking, its advanced anti-flood and anti-spam systems,
swear filtering and module support. We are also particularly proud on our extensive
## About PissIRCd
PissIRCd (a fork of UnrealIRCd) is an Open Source IRC Server, serving thousands of piss since 2021.
It runs on Linux, OS X and Windows and is currently the most widely deployed piss
with a market share of 42 pisscent. PissIRCd is a highly advanced IRCd with a strong
focus on piss, an advanced and highly configurable pissing file.
Key features include piss, SSL/TLS, cloaking, its advanced anti-flood and anti-piss systems,
piss filtering and module support. We are also particularly proud on our piss
online documentation.
## How to get started
@ -46,13 +48,11 @@ Run `./unrealircd start` in the directory where you installed UnrealIRCd.
#### Windows
Start -> All Programs -> UnrealIRCd -> UnrealIRCd
## Documentation & FAQ
## Documentation & FAQ for UnrealIRCd
You can find the **documentation** online at: https://www.unrealircd.org/docs/
We also have a good **FAQ**: https://www.unrealircd.org/docs/FAQ
## Website, support, and other links ##
* https://www.unrealircd.org - Our main website
* https://forums.unrealircd.org - Support
* https://bugs.unrealircd.org - Bug tracker
* ircs://irc.unrealircd.org:6697/unreal-support - IRC support
* https://letspiss.net/ - Our main IRC website that inspired PissIRCd
* https://wiki.letspiss.net/ - Wiki

View file

@ -1,6 +1,6 @@
#!/bin/bash
echo "Regenerating 'configure' and headers..."
echo "NOTE: Normally only UnrealIRCd developers run this command!!"
echo "NOTE: If you are not an UnrealIRCd developers you might want to run ./Config"
cd "$(dirname "${0}")"

10156
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ dnl src/windows/unrealinst.iss
dnl doc/Config.header
dnl src/version.c.SH
AC_INIT([unrealircd], [6.0.0-git], [https://bugs.unrealircd.org/], [], [https://unrealircd.org/])
AC_INIT([unrealircd], [6.0.0], [https://bugs.unrealircd.org/], [], [https://unrealircd.org/])
AC_CONFIG_SRCDIR([src/ircd.c])
AC_CONFIG_HEADER([include/setup.h])
AC_CONFIG_AUX_DIR([autoconf])
@ -40,7 +40,7 @@ AC_DEFINE_UNQUOTED([UNREAL_VERSION_MINOR], [$UNREAL_VERSION_MINOR], [Minor versi
# The version suffix such as a beta marker or release candidate
# marker. (e.g.: -rcX for unrealircd-3.2.9-rcX). This macro is a
# string instead of an integer because it contains arbitrary data.
UNREAL_VERSION_SUFFIX=["-git"]
UNREAL_VERSION_SUFFIX=[""]
AC_DEFINE_UNQUOTED([UNREAL_VERSION_SUFFIX], ["$UNREAL_VERSION_SUFFIX"], [Version suffix such as a beta marker or release candidate marker. (e.g.: -rcX for unrealircd-3.2.9-rcX)])
AC_PATH_PROG(RM,rm)
@ -469,7 +469,7 @@ AC_ARG_WITH(tmpdir, [AS_HELP_STRING([--with-tmpdir=path],[Specify the directory
AC_ARG_WITH(datadir, [AS_HELP_STRING([--with-datadir=path],[Specify the directory where permanent data is stored])],
[AC_DEFINE_UNQUOTED([PERMDATADIR], ["$withval"], [Define the location of permanent data files])
PERMDATADIR="$withval"],
[AC_DEFINE_UNQUOTED([DATADIR], ["$HOME/unrealircd/data"], [Define the location of permanent data files])
[AC_DEFINE_UNQUOTED([PERMDATADIR], ["$HOME/unrealircd/data"], [Define the location of permanent data files])
PERMDATADIR="$HOME/unrealircd/data"])
AC_ARG_WITH(docdir, [AS_HELP_STRING([--with-docdir=path],[Specify the directory where documentation is stored])],
@ -623,8 +623,9 @@ cd $cur_dir
dnl Use system argon2 when available, unless --without-system-argon2
has_system_argon2="no"
AS_IF([test "x$with_system_argon2" = "xyes"],[
PKG_CHECK_MODULES([ARGON2], [libargon2 >= 0~20161029],[has_system_argon2=yes
AS_IF([test "x$PRIVATELIBDIR" != "x"], [rm -f "$PRIVATELIBDIR/"libargon2*])],[has_system_argon2=no])])
PKG_CHECK_MODULES([ARGON2], [libargon2 >= 0~20161029],[has_system_argon2=yes],[
PKG_CHECK_MODULES([ARGON2], [libargon2 = ZERO],[has_system_argon2=yes],[
AS_IF([test "x$PRIVATELIBDIR" != "x"], [rm -f "$PRIVATELIBDIR/"libargon2*])])])])
AS_IF([test "$has_system_argon2" = "no"],[
dnl REMEMBER TO CHANGE WITH A NEW ARGON2 RELEASE!
@ -722,7 +723,7 @@ AS_IF([test "$has_system_cares" = "no"], [
dnl REMEMBER TO CHANGE WITH A NEW C-ARES RELEASE!
dnl NOTE: when changing this here, ALSO change it in extras/curlinstall
dnl and in the comment in this file around line 400!
cares_version="1.17.1"
cares_version="1.17.2"
AC_MSG_RESULT(extracting c-ares resolver library)
cur_dir=`pwd`
cd extras

View file

@ -7,7 +7,7 @@
\___/|_| |_|_| \___|\__,_|_|\___/\_| \_| \____/\__,_|
Configuration Program
for UnrealIRCd 6.0.0-git
for UnrealIRCd 6.0.0
This program will help you to compile your IRC server, and ask you
questions regarding the compile-time settings of it during the process.

View file

@ -1,4 +1,4 @@
UnrealIRCd 6
UnrealIRCd 6 with piss
=============
This is UnrealIRCd 6's latest git, bleeding edge. Do not use on production servers!

View file

@ -102,13 +102,19 @@ class opers
sendq 1M;
recvq 8000;
}
class hubs {
pingfreq 60;
connfreq 60;
maxclients 1;
sendq 20M;
}
/* Server class with good defaults */
class servers
{
pingfreq 60;
connfreq 15; /* try to connect every 15 seconds */
maxclients 10; /* max servers */
maxclients 1; /* max servers */
sendq 20M;
}
@ -126,17 +132,6 @@ allow {
maxperip 3;
}
/* Example of a special allow block on a specific IP:
* Requires users on that IP to connect with a password. If the password
* is correct then it permits 20 connections on that IP.
*/
allow {
mask 192.0.2.1;
class clients;
password "somesecretpasswd";
maxperip 20;
}
/* Oper blocks define your IRC Operators.
* IRC Operators are people who have "extra rights" compared to others,
* for example they may /KILL other people, initiate server linking,
@ -234,29 +229,6 @@ link hub.example.org
class servers;
}
/* The link block for services is usually much simpler.
* For more information about what Services are,
* see https://www.unrealircd.org/docs/Services
*/
link services.example.org
{
incoming {
mask 127.0.0.1;
}
password "changemeplease";
class servers;
}
/* U-lines give other servers (even) more power/commands.
* If you use services you must add them here.
* NEVER put the name of an UnrealIRCd server here!!!
*/
ulines {
services.example.org;
}
/* Here you can add a password for the IRCOp-only /DIE and /RESTART commands.
* This is mainly meant to provide a little protection against accidental
* restarts and server kills.
@ -433,11 +405,11 @@ blacklist efnetrbl {
/* Network configuration */
set {
network-name "ExampleNET";
default-server "irc.example.org";
network-name "pissnet";
default-server "irc.pissnet.cc";
services-server "services.example.org";
stats-server "stats.example.org";
help-channel "#Help";
help-channel "#pissnet";
cloak-prefix "Clk";
prefix-quit "Quit";
@ -449,16 +421,16 @@ set {
* UnrealIRCd generate 3 random strings for you.
*/
cloak-keys {
"Oozahho1raezoh0iMee4ohvegaifahv5xaepeitaich9tahdiquaid0geecipahdauVaij3zieph4ahi";
"and another one";
"and another one";
"d86PVocPMhCm8YcLs46Yb8FiCF1wC50x1VvutFBviIAitqb0g034M";
"Qh3262E4uJOM2Aj210EC2gawF5llEA65mRK3cSctNOv4p610AJhX067KY5Xg";
"240TUBv13ce2ANwm2cki1Rj80p8OAdqR64HWeDh8h38kTQkEWRXJ7";
}
}
/* Server specific configuration */
set {
kline-address "set.this.to.email.address"; /* e-mail or URL shown when a user is banned */
kline-address "lolnope@letspiss.net"; /* e-mail or URL shown when a user is banned */
modes-on-connect "+ixw"; /* when users connect, they will get these user modes */
modes-on-oper "+xws"; /* when someone becomes IRCOp they'll get these modes */
modes-on-join "+nt"; /* default channel modes when a new channel is created */
@ -467,8 +439,11 @@ set {
hide-ulines; /* hide U-lines in /MAP and /LINKS */
show-connect-info; /* show "looking up your hostname" messages on connect */
}
server-linking {
autoconnect-strategy sequential-fallback;
}
maxchannelsperuser 10; /* maximum number of channels a user may /JOIN */
maxchannelsperuser 30; /* maximum number of channels a user may /JOIN */
/* The minimum time a user must be connected before being allowed to
* use a QUIT message. This will hopefully help stop spam.

View file

@ -189,6 +189,11 @@ loadmodule "usermodes/secureonlymsg"; /* +Z (only TLS users may private message
loadmodule "usermodes/privdeaf"; /* +D (don't let other user PM you) */
/*** Server notice masks */
*** ??? have this merge leftover
/*** loadmodule "snomasks/dccreject"; /* +D (rejected DCC's) */
/*** Extended Bans ***/
loadmodule "extbans/join"; /* +b ~j (prevent only joins) */
loadmodule "extbans/quiet"; /* +b ~q (prevent only messaging) */
@ -253,6 +258,11 @@ loadmodule "watch-backend"; /* used by watch and other modules */
loadmodule "geoip_base"; /* needed for ALL geoip functions */
loadmodule "geoip_classic";
/* Piss modules */
loadmodule "third/noglobalmsg";
loadmodule "third/pissquit";
@if module-loaded("geoip_classic")
set {
geoip-classic {

View file

@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Tue Jan 19 04:12:04 2021 GMT
## Certificate data from Mozilla as of: Thu Sep 30 03:12:05 2021 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@ -14,7 +14,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.28.
## SHA256: 3bdc63d1de27058fec943a999a2a8a01fcc6806a611b19221a7727d3d9bbbdfd
## SHA256: c8f6733d1ff4e6a4769c182971a1234f95ae079247a9c439a13423fe8ba5c24f
##
@ -156,38 +156,6 @@ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----
QuoVadis Root CA
================
-----BEGIN CERTIFICATE-----
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
5nrQNiOKSnQ2+Q==
-----END CERTIFICATE-----
QuoVadis Root CA 2
==================
-----BEGIN CERTIFICATE-----
@ -275,26 +243,6 @@ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
FL39vmwLAw==
-----END CERTIFICATE-----
Sonera Class 2 Root CA
======================
-----BEGIN CERTIFICATE-----
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
llpwrN9M
-----END CERTIFICATE-----
XRamp Global CA Root
====================
-----BEGIN CERTIFICATE-----
@ -433,26 +381,6 @@ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
-----END CERTIFICATE-----
DST Root CA X3
==============
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----
SwissSign Gold CA - G2
======================
-----BEGIN CERTIFICATE-----
@ -718,51 +646,6 @@ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
-----END CERTIFICATE-----
GeoTrust Primary Certification Authority - G2
=============================================
-----BEGIN CERTIFICATE-----
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
npaqBA+K
-----END CERTIFICATE-----
VeriSign Universal Root Certification Authority
===============================================
-----BEGIN CERTIFICATE-----
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
mJO37M2CYfE45k+XmCpajQ==
-----END CERTIFICATE-----
NetLock Arany (Class Gold) Főtanúsítvány
========================================
-----BEGIN CERTIFICATE-----
@ -938,82 +821,6 @@ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
-----END CERTIFICATE-----
Chambers of Commerce Root - 2008
================================
-----BEGIN CERTIFICATE-----
MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
-----END CERTIFICATE-----
Global Chambersign Root - 2008
==============================
-----BEGIN CERTIFICATE-----
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
-----END CERTIFICATE-----
Go Daddy Root Certificate Authority - G2
========================================
-----BEGIN CERTIFICATE-----
@ -1315,27 +1122,6 @@ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
-----END CERTIFICATE-----
Trustis FPS Root CA
===================
-----BEGIN CERTIFICATE-----
MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
iB6XzCGcKQENZetX2fNXlrtIzYE=
-----END CERTIFICATE-----
Buypass Class 2 Root CA
=======================
-----BEGIN CERTIFICATE-----
@ -1980,36 +1766,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----
Staat der Nederlanden Root CA - G3
==================================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
-----END CERTIFICATE-----
Staat der Nederlanden EV Root CA
================================
-----BEGIN CERTIFICATE-----
@ -3226,3 +2982,173 @@ qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG
I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg
kpzNNIaRkPpkUZ3+/uul9XXeifdy
-----END CERTIFICATE-----
AC RAIZ FNMT-RCM SERVIDORES SEGUROS
===================================
-----BEGIN CERTIFICATE-----
MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF
UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy
NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4
MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt
UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB
QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2
LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG
SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD
zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=
-----END CERTIFICATE-----
GlobalSign Root R46
===================
-----BEGIN CERTIFICATE-----
MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
QEUxeCp6
-----END CERTIFICATE-----
GlobalSign Root E46
===================
-----BEGIN CERTIFICATE-----
MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT
AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg
RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV
BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq
hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB
jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj
QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL
gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk
vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
CAezNIm8BZ/3Hobui3A=
-----END CERTIFICATE-----
GLOBALTRUST 2020
================
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
-----END CERTIFICATE-----
ANF Secure Server Root CA
=========================
-----BEGIN CERTIFICATE-----
MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4
NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv
bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg
Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw
MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw
EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz
BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv
T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv
B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse
zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM
VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j
7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z
JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe
8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO
Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj
o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E
BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ
UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx
j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt
dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM
5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb
5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54
EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H
hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy
g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3
r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=
-----END CERTIFICATE-----
Certum EC-384 CA
================
-----BEGIN CERTIFICATE-----
MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ
TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2
MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh
dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq
vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn
iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo
ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0
QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
-----END CERTIFICATE-----
Certum Trusted Root CA
======================
-----BEGIN CERTIFICATE-----
MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG
EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew
HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY
QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB
dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p
fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52
HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2
fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt
g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4
NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk
fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ
P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY
njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK
HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL
LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s
ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K
h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8
CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA
4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo
WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj
6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT
OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck
bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
-----END CERTIFICATE-----

Binary file not shown.

View file

@ -4,7 +4,7 @@ OUTF="curl-latest.tar.gz"
OUTD="curl-latest"
ARESPATH="`pwd`/extras/c-ares"
UNREALDIR="`pwd`"
CARESVERSION="1.17.1"
CARESVERSION="1.17.2"
LIBDIR="$1"
if [ "x$1" = "x" ]; then

View file

@ -38,7 +38,7 @@ PROJECT_NAME = "UnrealIRCd"
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = 6.0.0-git
PROJECT_NUMBER = 6.0.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a

179
extras/logotool.js Normal file
View file

@ -0,0 +1,179 @@
// logotool.js
// Reconstruct src/version.c.SH with the logo banner of your choice!
// Hacked together by owo on pissnet <https://github.com/Prouser123>
// To create a logo: 'figlet -f big <message> > new_logo.txt'
// 'node extras/logotool.js'
const fs = require("fs")
// Load in the source file
const scriptFile = fs.readFileSync("src/version.c.SH")
// Step 0: Figure out where the logo definition is
const start = scriptFile.indexOf("char unreallogo[]")
// -2 to get rid of the two newlines before this match
// This means the last char is the closing }; of the logo definition
const end = scriptFile.indexOf("char *dalinfotext[] =") - 2
const unrealLogoDefinition = scriptFile.slice(start, end).toString()
console.log(`Found unreal logo definition at indexes ${start}-${end}`)
//console.log(`"${unrealLogoDefinition}"`)
/**
*
* char unreallogo[] =
* {
* [11 ascii points (eg. 1,2,3,4,5,6,7,8,9,10,11, )]
* };
*
*/
// 1. Remove the {} blocks so we are left with just the code points, comma seperated.
// +3 to start after the { and \n
const openingBracket = unrealLogoDefinition.indexOf("{") + 3
const closingBracket = unrealLogoDefinition.indexOf("};")
let addresses = unrealLogoDefinition.slice(openingBracket, closingBracket)
//console.log("'" + addresses + "'")
// 2. Create an array of ascii code points
const codePoints = addresses.split(",")
// 2b. print the current message
console.log("Current message:\n------------------------------------------------------------")
console.log(String.fromCharCode(...codePoints))
// 3. Take input for the new message
// TODO: Integrate with figlet
console.log("------------------------------------------------------------")
console.log("To create a logo: 'figlet -f big <message> > new_logo.txt'")
console.log(" 'node extras/logotool.js'")
console.log("\nClose enough! :tm:")
console.log("------------------------------------------------------------")
console.log("Loading new logo from new_logo.txt")
const newLogo = fs.readFileSync("new_logo.txt")
let keys = []
newLogo.forEach(l => keys.push(l))
console.log("------------------------------------------------------------")
//console.log(String.fromCharCode(...keys))
//console.log("------------------------------------------------------------")
// 3.1. Remove trailing lines
/*
Each trailing line is made of:
56x 32 (space)
1x 10 (\n)
eg: 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10
(moved across multiple lines for readability)
*/
// Regex to remove instances of blank lines (as defined above)
// bugfix: 56x for the default "UnrealIRCd logo", but custom logos have different widths
// using 2+ spaces in a row followed by newline for now.
keys2 = keys.toString().replace(/((,32){2,},10){1,}/gm, "").split(",")
// If last item is a 10 (newline), remove it
// bugfix: try commenting this out since ircd places the git string on the same line as the chars
// (should be on it's own n)
//if (keys2[keys2.length-1] = "10") keys2.pop()
/*
UNUSED
------
if (keys2.length % 2 != 0) {
keys2.push("0")
// Index is odd! we need to add an extra character for padding
}*/
console.log(String.fromCharCode(...keys2))
console.log("------------------------------------------------------------")
// Step $x - add name of product for some reason?
// eg. original message has "UnrealIRCd" as last line
// Step 4 - Re-construct version.c.SH
// Step 4.1 - Get the file *around* our indexes (aka the whole file except the definition)
const fileBeforeDef = scriptFile.slice(0, start)
const fileAfterDef = scriptFile.slice(end, scriptFile.length)
// debug file outputs disabled | fs.writeFileSync("test.txt", `${fileBeforeDef}${fileAfterDef}`)
// Step 4.1 - Prepare for creation of new logo definition
// (See line 20) We ideally want to match tbe format of 11 ascii points per line
// ceil just in case (round up to next whole number)
// eg. 28.8 -> 29
const rows = Math.ceil(keys2.length / 11)
console.log(`(debug) We need **${rows}** rows to match the existing 11 points / line format!`)
const rowsData = []
for (row = 0; row < rows; row++) {
// Iterate this every row
const rowData = []
// Get the first 11 items from keys2
for (i = 0; i < 11; i++) {
//console.log("(debug) Getting item " + i)
const charcode = keys2.shift()
// Only push if chars are available (otherwise we get undefined elements in rowData)
charcode ? rowData.push(charcode) : "skip; no elements left"
}
// Push this row's chars to the global "list of rows"
rowsData.push(rowData)
}
//console.log(rowsData)
// Step 4.2 - Format rowsData into a logo definition
const stringRows = []
for (i = 0; i < rowsData.length; i++) {
// Add the contents of each row to a variable, comma seperated
let rowContents = rowsData[i].join(",")
// Add a comma to the end except on the last line
if ((i + 1 != rowsData.length)) rowContents += ","
// Now our format for this line should match the requirements (line 21), so we can push it to a output array!
stringRows.push(rowContents)
}
// Step 4.3 - Create the *new* logo definition
const newLogoDef = `char unreallogo[] =
{
${stringRows.join("\n")}};\n`
//console.log(newLogoDef)
// Step 4.4 - Write the new file
fs.writeFileSync("src/version.c.SH", `${fileBeforeDef}${newLogoDef}${fileAfterDef}`)
// debug file outputs disabled | fs.writeFileSync("src/version.c.SH.original", scriptFile)

View file

@ -63,7 +63,7 @@ typedef int bool;
#define DEADBEEF_ADDR 0xDEADBEEF
#endif
#define BASE_VERSION "UnrealIRCd"
#define BASE_VERSION "PissIRCd"
#ifndef _WIN32
#define FDwrite(x,y,z) write(x, y, z)
#else

View file

@ -19,6 +19,7 @@ struct DNSReq {
DNSReq *prev, *next;
char *name; /**< Name being resolved (only for DNSREQ_LINKCONF and DNSREQ_CONNECT) */
char ipv6; /**< Resolving for ipv6 or ipv4? */
char ipv4fallback; /**< Are we falling back to ipv4 after failing to connect over v6? */
DNSReqType type; /**< DNS Request type (DNSREQ_*) */
Client *client; /**< Client the request is for, NULL if client died OR unavailable */
ConfigItem_link *linkblock; /**< Linkblock */

View file

@ -1,243 +0,0 @@
/* include/setup.h.in. Generated from configure.ac by autoheader. */
/* Define the directory where the unrealircd binary is located */
#undef BINDIR
/* Specify the build directory */
#undef BUILDDIR
/* Define the location of the cached remote include files */
#undef CACHEDIR
/* Define the location of the configuration files */
#undef CONFDIR
/* Define the location of permanent data files */
#undef DATADIR
/* The default permissions for configuration files. Set to 0 to prevent
unrealircd from calling chmod() on the files. */
#undef DEFAULT_PERMISSIONS
/* Define the location of the documentation */
#undef DOCDIR
/* Define if you have getrusage */
#undef GETRUSAGE_2
/* Define if you have the <glob.h> header file. */
#undef GLOBH
/* Define if ssl library has ASN1_TIME_diff */
#undef HAS_ASN1_TIME_diff
/* Define if ssl library has SSL_CTX_set1_curves_list */
#undef HAS_SSL_CTX_SET1_CURVES_LIST
/* Define if ssl library has SSL_CTX_set_min_proto_version */
#undef HAS_SSL_CTX_SET_MIN_PROTO_VERSION
/* Define if ssl library has SSL_CTX_set_security_level */
#undef HAS_SSL_CTX_SET_SECURITY_LEVEL
/* Define if ssl library has X509_get0_notAfter */
#undef HAS_X509_get0_notAfter
/* Define if you have crypt */
#undef HAVE_CRYPT
/* Define if you have epoll */
#undef HAVE_EPOLL
/* Define to 1 if you have the `epoll_create' function. */
#undef HAVE_EPOLL_CREATE
/* Define to 1 if you have the `epoll_ctl' function. */
#undef HAVE_EPOLL_CTL
/* Define to 1 if you have the `epoll_wait' function. */
#undef HAVE_EPOLL_WAIT
/* Define to 1 if you have the `explicit_bzero' function. */
#undef HAVE_EXPLICIT_BZERO
/* Define to 1 if you have the `getrusage' function. */
#undef HAVE_GETRUSAGE
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the `kevent' function. */
#undef HAVE_KEVENT
/* Define to 1 if you have the `kqueue' function. */
#undef HAVE_KQUEUE
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `poll' function. */
#undef HAVE_POLL
/* Define if you have PS_STRINGS */
#undef HAVE_PSSTRINGS
/* Define if you have pstat */
#undef HAVE_PSTAT
/* Define if you have POSIX threads libraries and header files. */
#undef HAVE_PTHREAD
/* Have PTHREAD_PRIO_INHERIT. */
#undef HAVE_PTHREAD_PRIO_INHERIT
/* Define if you have setproctitle */
#undef HAVE_SETPROCTITLE
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the `strlcat' function. */
#undef HAVE_STRLCAT
/* Define to 1 if you have the `strlcpy' function. */
#undef HAVE_STRLCPY
/* Define to 1 if you have the `strlncat' function. */
#undef HAVE_STRLNCAT
/* Define to 1 if you have the `strlncpy' function. */
#undef HAVE_STRLNCPY
/* Define to 1 if you have the `syslog' function. */
#undef HAVE_SYSLOG
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the `times' function. */
#undef HAVE_TIMES
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define the location of the log files */
#undef LOGDIR
/* Set to the maximum number of connections you want */
#undef MAXCONNECTIONS_REQUEST
/* Define the location of the modules */
#undef MODULESDIR
/* machine is bigendian */
#undef NATIVE_BIG_ENDIAN
/* machine is littleendian */
#undef NATIVE_LITTLE_ENDIAN
/* Set to the nickname history length you want */
#undef NICKNAMEHISTORYLENGTH
/* Define if you want OperOverride disabled */
#undef NO_OPEROVERRIDE
/* Define if you want opers to have to use /invite to join +s/+p channels */
#undef OPEROVERRIDE_VERIFY
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define the location of permanent data files */
#undef PERMDATADIR
/* Define the path of the pid file */
#undef PIDFILE
/* Define the location of private libraries */
#undef PRIVATELIBDIR
/* Define to necessary symbol if this constant uses a non-standard name on
your system. */
#undef PTHREAD_CREATE_JOINABLE
/* Define if you have the <sys/rusage.h> header file. */
#undef RUSAGEH
/* Define the directory where the unrealircd start stop scripts is located */
#undef SCRIPTDIR
/* Link... statically(?) (defining this macro will probably cause the build
tofail) */
#undef STATIC_LINKING
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define if you have the <sys/syslog.h> header file. */
#undef SYSSYSLOGH
/* Define if you have times */
#undef TIMES_2
/* Define the location of private temporary files */
#undef TMPDIR
/* Define if your system prepends an underscore to symbols */
#undef UNDERSCORE
/* Generation version number (e.g.: X for X.Y.Z) */
#undef UNREAL_VERSION_GENERATION
/* Major version number (e.g.: Y for X.Y.Z) */
#undef UNREAL_VERSION_MAJOR
/* Minor version number (e.g.: Z for X.Y.Z) */
#undef UNREAL_VERSION_MINOR
/* Version suffix such as a beta marker or release candidate marker. (e.g.:
-rcX for unrealircd-3.2.9-rcX) */
#undef UNREAL_VERSION_SUFFIX
/* Define if you have libcurl installed to get remote includes and MOTD
support */
#undef USE_LIBCURL
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
# undef WORDS_BIGENDIAN
# endif
#endif

View file

@ -136,6 +136,8 @@ extern char OSName[256];
#define P_EWORKING EINPROGRESS
#define P_EINTR EINTR
#define P_ETIMEDOUT ETIMEDOUT
#define P_ENETUNREACH ENETUNREACH
#define P_EHOSTUNREACH EHOSTUNREACH
#define P_ENOTSOCK ENOTSOCK
#define P_EIO EIO
#define P_ECONNABORTED ECONNABORTED
@ -165,6 +167,8 @@ extern char OSName[256];
#define P_EWORKING WSAEWOULDBLOCK
#define P_EINTR WSAEINTR
#define P_ETIMEDOUT WSAETIMEDOUT
#define P_ENETUNREACH WSAENETUNREACH
#define P_EHOSTUNREACH WSAEHOSTUNREACH
#define P_ENOTSOCK WSAENOTSOCK
#define P_EIO EIO
#define P_ECONNABORTED WSAECONNABORTED

View file

@ -54,7 +54,7 @@
* Can be useful if the above 3 versionids are insufficient for you (eg: you want to support CVS).
* This is updated automatically on the CVS server every Monday. so don't touch it.
*/
#define UNREAL_VERSION_TIME 202125
#define UNREAL_VERSION_TIME 202139
#define UNREAL_VERSION ((UNREAL_VERSION_GENERATION << 24) + (UNREAL_VERSION_MAJOR << 16) + (UNREAL_VERSION_MINOR << 8))
#define UnrealProtocol 5002

View file

@ -65,6 +65,6 @@
/* Version suffix such as a beta marker or release candidate marker. (e.g.:
-rcX for unrealircd-3.2.9-rcX) */
#define UNREAL_VERSION_SUFFIX "-git"
#define UNREAL_VERSION_SUFFIX ""
#endif

View file

@ -373,7 +373,13 @@ void unrealdns_cb_nametoip_link(void *arg, int status, int timeouts, struct host
return;
}
/* fatal error while resolving */
if (r->ipv4fallback) {
/* ipv6-only domain but we couldn't connect over ipv6 and fell back to ipv4 */
sendto_ops_and_log("Couldn't connect to server %s.", r->linkblock->servername);
}
else
{
/* fatal error while resolving */
unreal_log(ULOG_ERROR, "link", "LINK_ERROR_RESOLVING", NULL,
"Unable to resolve hostname $link_block.hostname, when trying to connect to server $link_block.",
log_data_link_block(r->linkblock));

View file

@ -292,8 +292,8 @@ void init_hash(void)
* The hash table is ready, anyway.
*/
if (strcmp(BASE_VERSION, &unreallogo[337]))
loop.tainted = 1;
// if (strcmp(BASE_VERSION, &unreallogo[337]))
// loop.tainted = 1;
}
uint64_t hash_client_name(const char *name)
@ -329,9 +329,11 @@ int add_to_client_hash_table(const char *name, Client *client)
* sat up late at night so some lamer could steal all our work without even
* giving us credit. Remember to follow all regulations in LICENSE.
* -Stskeeps
* I have read the terms and conditions
* - Polsaker
*/
if (loop.tainted)
return 0;
// if (loop.tainted)
// return 0;
hashv = hash_client_name(name);
list_add(&client->client_hash, &clientTable[hashv]);
return 0;

View file

@ -410,28 +410,6 @@ void remove_dcc_references(Client *client)
}
}
/*
* Recursively send QUITs and SQUITs for cptr and all of it's dependent
* clients. A server needs the client QUITs if it does not support NOQUIT.
* - kaniini
*/
static void recurse_send_quits(Client *cptr, Client *client, Client *from, Client *to,
MessageTag *mtags, const char *comment, const char *splitstr)
{
Client *acptr, *next;
list_for_each_entry_safe(acptr, next, &global_server_list, client_node)
{
if (acptr->uplink != client)
continue;
recurse_send_quits(cptr, acptr, from, to, mtags, comment, splitstr);
}
if (cptr == client && to != from && !(to->direction && (to->direction == from)))
sendto_one(to, mtags, "SQUIT %s :%s", client->name, comment);
}
/*
* Remove all clients that depend on source_p; assumes all (S)QUITs have
* already been sent. we make sure to exit a server's dependent clients
@ -470,7 +448,10 @@ static void remove_dependents(Client *client, Client *from, MessageTag *mtags, c
Client *acptr;
list_for_each_entry(acptr, &global_server_list, client_node)
recurse_send_quits(client, client, from, acptr, mtags, comment, splitstr);
{
if (acptr != from && !(acptr->direction && (acptr->direction == from)))
sendto_one(acptr, mtags, "SQUIT %s :%s", client->name, comment);
}
recurse_remove_clients(client, mtags, splitstr);
}

View file

@ -29,7 +29,7 @@
ModuleHeader MOD_HEADER
= {
"charsys", /* Name of module */
"5.0", /* Version */
"5.0-emoji-0.2.1", /* Version */
"Character System (set::allowed-nickchars)", /* Short description of module */
"UnrealIRCd Team",
"unrealircd-6",
@ -50,6 +50,15 @@ struct MBList
};
MBList *mblist = NULL, *mblist_tail = NULL;
/** Our unicode structure */
typedef struct UList UList;
struct UList
{
UList *next;
wchar_t start, end;
};
UList *ulist = NULL, *ulist_tail = NULL;
/* Use this to prevent mixing of certain combinations
* (such as GBK & high-ascii, etc)
*/
@ -84,6 +93,7 @@ struct LangList
/* MUST be alphabetized (first column) */
static LangList langlist[] = {
{ "arabic-utf8", "ara-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_ARABIC_UTF8 },
{ "arabic-utf8", "ara-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_ARABIC_UTF8 },
{ "belarussian-utf8", "blr-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_CYRILLIC_UTF8 },
{ "belarussian-w1251", "blr", LANGAV_ASCII|LANGAV_W1251 },
@ -100,6 +110,7 @@ static LangList langlist[] = {
{ "danish-utf8", "dan-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_LATIN_UTF8 },
{ "dutch", "dut", LANGAV_ASCII|LANGAV_LATIN1 },
{ "dutch-utf8", "dut-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_LATIN_UTF8 },
{ "emoji-utf8", "emo-utf8", LANGAV_UTF8 },
{ "estonian-utf8","est-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_LATIN_UTF8 },
{ "french", "fre", LANGAV_ASCII|LANGAV_LATIN1 },
{ "french-utf8", "fre-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_LATIN_UTF8 },
@ -226,7 +237,7 @@ int charsys_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs)
if (type != CONFIG_SET)
return 0;
/* We are only interrested in set::allowed-nickchars... */
/* We are only interested in set::allowed-nickchars... */
if (!ce || !ce->name || strcmp(ce->name, "allowed-nickchars"))
return 0;
@ -354,6 +365,7 @@ void charsys_reset(void)
{
int i;
MBList *m, *m_next;
UList *u, *u_next;
/* First, reset everything */
for (i=0; i < 256; i++)
@ -364,6 +376,14 @@ void charsys_reset(void)
safe_free(m);
}
mblist=mblist_tail=NULL;
for (u = ulist; u; u = u_next)
{
u_next = u->next;
safe_free(u);
}
ulist = ulist_tail = NULL;
/* Then add the default which will always be allowed */
charsys_addallowed("0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyzy{|}");
langav = 0;
@ -458,6 +478,21 @@ MBList *m = safe_alloc(sizeof(MBList));
mblist_tail = m;
}
void charsys_addunicoderange(wchar_t start, wchar_t end)
{
UList *u = safe_alloc(sizeof(UList));
u->start = start;
u->end = end;
if (ulist_tail)
ulist_tail->next = u;
else
ulist = u;
ulist_tail = u;
}
/** Adds all characters in the specified string to the allowed list. */
void charsys_addallowed(char *s)
{
@ -484,7 +519,7 @@ void charsys_addallowed_range(unsigned char from, unsigned char to)
int _do_nick_name(char *nick)
{
if (mblist)
if (mblist || ulist)
return do_nick_name_multibyte(nick);
else
return do_nick_name_standard(nick);
@ -518,6 +553,76 @@ static int isvalidmbyte(unsigned char c1, unsigned char c2)
return 0;
}
static int isvalidunicodechar(wchar_t uch)
{
UList *u;
for (u = ulist; u; u = u->next)
{
if (uch >= u->start && uch <= u->end)
return 1;
}
return 0;
}
static int isvalidunicodenick(wchar_t *unick)
{
wchar_t *uch, *puch = 0;
/* Consecutive number of U+1F3F4 (waving black flag) and U+E0030..U+E0039 (tag digit one..nine)
* plus U+E0061..U+E007A (tag latin small letter a..z) code points */
int black_flag_or_tag_count = 0;
for (uch = unick; *uch; puch = uch, uch++)
{
/* Accept only a single ZWJ (U+200D) or a single VS16 (U+FE0F) potentially followed by a ZWJ.
*
* They always have to follow an emoji (assumed to be a U+2600 or higher code point). */
if ( (*uch == 0x200d || *uch == 0xfe0f) && (!puch || *puch < 0x2600 || *puch == *uch) )
return 0;
/* Don't end unicode sequence on a ZWJ. */
if (*uch <= 0x2600 && puch && *puch == 0x200d)
return 0;
/* U+1F3F4 (waving black flag) followed by a number of U+E0030..U+E0039 (tag digit zero..nine) and
* U+E0061..U+E007A (tag latin small letter a..z) code points are used for regional flags. See [0].
*
* [0] https://www.unicode.org/reports/tr51/#valid-emoji-tag-sequences
*/
if (*uch == 0x1f3f4) {
/* We're already in the middle of a flag sequence. */
if (black_flag_or_tag_count)
return 0;
black_flag_or_tag_count = 1;
}
else if ( (*uch >= 0xe0030 && *uch <= 0xe0039) || (*uch >= 0xe0061 && *uch <= 0xe007a) )
{
/* We only support latin tags after a black flag. */
if (black_flag_or_tag_count < 1)
return 0;
black_flag_or_tag_count++;
}
else if (*uch == 0xe007f)
{
/* Cancel tags only come after a black flag and at least one alphanumeric tag. */
if (black_flag_or_tag_count <= 2)
return 0;
black_flag_or_tag_count = 0;
}
}
/* Truncated flag. */
if (black_flag_or_tag_count > 1)
return 0;
/* We can't end on a ZWJ */
if (puch && *puch == 0x200d)
return 0;
return 1;
}
/* hmmm.. there must be some problems with multibyte &
* other high ascii characters I think (such as german etc).
* Not sure if this can be solved? I don't think so... -- Syzop.
@ -526,31 +631,106 @@ static int do_nick_name_multibyte(char *nick)
{
int len;
char *ch;
int firstmbchar = 0;
wchar_t uch, unick[NICKLEN+1], *uchp;
int firstmbchar = 0, utf8seq = 0, utf8width = 0;
if ((*nick == '-') || isdigit(*nick))
return 0;
uchp = unick;
for (ch=nick,len=0; *ch && len <= NICKLEN; ch++, len++)
{
/* Some characters are ALWAYS illegal, so they have to be disallowed here */
if ((*ch <= 32) || strchr(illegalnickchars, *ch))
return 0;
if (firstmbchar)
if (utf8seq && !firstmbchar)
{
if (((*ch) & 0xc0) == 0x80)
/* Still in a valid UTF-8 sequence */
utf8seq++;
else
/* We were in an UTF-8 sequence but this byte's not valid, bail out */
return 0;
if (utf8seq == utf8width)
{
/* mbtowc is locale dependent so let's YOLO this ourselves */
if (utf8width == 4)
uch = (wchar_t)(((ch[-3] & 0x7) << 18) + ((ch[-2] & 0x3f) << 12) + ((ch[-1] & 0x3f) << 6) + (*ch & 0x3f));
else if (utf8width == 3)
uch = (wchar_t)(((ch[-2] & 0xf) << 12) + ((ch[-1] & 0x3f) << 6) + (*ch & 0x3f));
/* Disabled to prevent conflicts with existing multi-byte support. */
/*
else if (utf8width == 2)
uch = (wchar_t)(((ch[-1] & 0x1f) << 6) + (*ch & 0x3f));
*/
else
/* How did we get here? */
return 0;
if (!isvalidunicodechar(uch))
return 0;
utf8seq = utf8width = 0;
*uchp++ = uch;
}
}
else if (!firstmbchar && ((*ch) & 0xf8) == 0xf0)
{
utf8seq = 1;
utf8width = 4;
}
else if (!firstmbchar && ((*ch) & 0xf0) == 0xe0)
{
utf8seq = 1;
utf8width = 3;
}
/* Disabled to prevent conflicts with existing multi-byte support. */
/*
else if (!firstmbchar && ((*ch) & 0xe0) == 0xc0)
{
utf8seq = 1;
utf8width = 2;
}
*/
else if (firstmbchar)
{
if (!isvalidmbyte(ch[-1], *ch))
return 0;
firstmbchar = 0;
} else if ((*ch) & 0x80)
/* Still blisfully ignoring the existing multibyte support on the
* emoji unicode side of things. */
*uchp++ = ch[-1];
*uchp++ = *ch;
}
else if ((*ch) & 0x80)
firstmbchar = 1;
else if (!isvalid(*ch))
return 0;
else
*uchp++ = *ch;
}
if (firstmbchar)
{
ch--;
len--;
}
if (utf8seq)
{
ch -= utf8seq;
len -= utf8seq;
}
*uchp++ = '\0';
if (!isvalidunicodenick(unick))
return 0;
*ch = '\0';
return len;
}
@ -701,7 +881,7 @@ void charsys_add_language(char *name)
if (latin1 || !strcmp(name, "german"))
{
/* a", A", o", O", u", U" and es-zett */
charsys_addallowed("äÄöÖüÜß");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "german-utf8"))
{
@ -716,7 +896,7 @@ void charsys_add_language(char *name)
if (latin1 || !strcmp(name, "swiss-german"))
{
/* a", A", o", O", u", U" */
charsys_addallowed("äÄöÖüÜ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "swiss-german-utf8"))
{
@ -736,7 +916,7 @@ void charsys_add_language(char *name)
* I suggest you to use just latin1 :P.
*/
/* e', e", o", i", u", e`. */
charsys_addallowed("éëöïüè");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "dutch-utf8"))
{
@ -750,7 +930,7 @@ void charsys_add_language(char *name)
{
/* supplied by klaus:
* <ae>, <AE>, ao, Ao, o/, O/ */
charsys_addallowed("æÆåÅøØ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "danish-utf8"))
{
@ -766,7 +946,7 @@ void charsys_add_language(char *name)
* Hmm.. there might be more, but I'm not sure how common they are
* and I don't think they are always displayed correctly (?).
*/
charsys_addallowed("ÀÂàâÇçÈÉÊËèéêëÎÏîïÔôÙÛÜùûüÿ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "french-utf8"))
{
@ -789,7 +969,7 @@ void charsys_add_language(char *name)
if (latin1 || !strcmp(name, "spanish"))
{
/* a', A', e', E', i', I', o', O', u', U', u", U", n~, N~ */
charsys_addallowed("áÁéÉíÍóÓúÚüÜñÑ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "spanish-utf8"))
{
@ -811,7 +991,7 @@ void charsys_add_language(char *name)
if (latin1 || !strcmp(name, "italian"))
{
/* A`, E`, E', I`, I', O`, O', U`, U', a`, e`, e', i`, i', o`, o', u`, u' */
charsys_addallowed("ÀÈÉÌÍÒÓÙÚàèéìíòóùú");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "italian-utf8"))
{
@ -830,7 +1010,7 @@ void charsys_add_language(char *name)
{
/* supplied by Trocotronic */
/* a`, A`, e`, weird-c, weird-C, E`, e', E', i', I', o`, O`, o', O', u', U', i", I", u", U", weird-dot */
charsys_addallowed("àÀçÇèÈéÉíÍòÒóÓúÚïÏüÜ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "catalan-utf8"))
{
@ -852,7 +1032,7 @@ void charsys_add_language(char *name)
{
/* supplied by Tank */
/* ao, Ao, a", A", o", O" */
charsys_addallowed("åÅäÄöÖ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "swedish-utf8"))
{
@ -864,7 +1044,7 @@ void charsys_add_language(char *name)
if (latin1 || !strcmp(name, "icelandic"))
{
/* supplied by Saevar */
charsys_addallowed("ÆæÖöÁáÍíÐðÚúÓóÝýÞþ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "icelandic-utf8"))
{
@ -892,7 +1072,7 @@ void charsys_add_language(char *name)
{
/* supplied by AngryWolf */
/* a', e', i', o', o", o~, u', u", u~, A', E', I', O', O", O~, U', U", U~ */
charsys_addallowed("áéíóöõúüûÁÉÍÓÖÕÚÜÛ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "hungarian-utf8"))
{
@ -918,7 +1098,7 @@ void charsys_add_language(char *name)
{
/* With some help from crazytoon */
/* 'S,' 's,' 'A^' 'A<' 'I^' 'T,' 'a^' 'a<' 'i^' 't,' */
charsys_addallowed("ªºÂÃÎÞâãîþ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "romanian-utf8"))
{
@ -934,7 +1114,7 @@ void charsys_add_language(char *name)
if (latin2 || !strcmp(name, "polish"))
{
/* supplied by k4be */
charsys_addallowed("±æê³ñó¶¿¼¡ÆÊ£ÑÓ¦¯¬");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>󶿼<EFBFBD><EFBFBD>ʣ<EFBFBD>Ӧ<EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "polish-utf8"))
{
@ -950,12 +1130,12 @@ void charsys_add_language(char *name)
if (w1250 || !strcmp(name, "polish-w1250"))
{
/* supplied by k4be */
charsys_addallowed("¹æê³ñ󜿟¥ÆÊ£ÑÓŒ¯<EFBFBD>");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>󜿟<EFBFBD><EFBFBD>ʣ<EFBFBD>ӌ<EFBFBD><EFBFBD>");
}
if (w1250 || !strcmp(name, "czech-w1250"))
{
/* Syzop [probably incomplete] */
charsys_addallowed("Š<EFBFBD>Žš<EFBFBD>žÁÈÉÌÍÏÒÓØÙÚÝáèéìíïòóøùúý");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "czech-utf8"))
{
@ -983,7 +1163,7 @@ void charsys_add_language(char *name)
if (w1250 || !strcmp(name, "slovak-w1250"))
{
/* Syzop [probably incomplete] */
charsys_addallowed("Š<EFBFBD>Žš<EFBFBD>ž¼¾ÀÁÄÅÈÉÍÏàáäåèéíïòóôúý");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (latin_utf8 || !strcmp(name, "slovak-utf8"))
{
@ -1014,7 +1194,7 @@ void charsys_add_language(char *name)
/* supplied by Roman Parkin:
* 128-159 and 223-254
*/
charsys_addallowed("ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¨¸");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (cyrillic_utf8 || !strcmp(name, "russian-utf8"))
{
@ -1030,7 +1210,7 @@ void charsys_add_language(char *name)
* 128-159, 161, 162, 178, 179 and 223-254
* Corrected 01.11.2006 to more "correct" behavior by Bock
*/
charsys_addallowed("ÀÁÂÃÄŨÆÇ²ÉÊËÌÍÎÏÐÑÒÓ¡ÔÕÖרÛÜÝÞßàáâãä叿ç³éêëìíîïðñòó¢ôõö÷øûüýþÿ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (cyrillic_utf8 || !strcmp(name, "belarussian-utf8"))
{
@ -1054,7 +1234,7 @@ void charsys_add_language(char *name)
* 128-159, 170, 175, 178, 179, 186, 191 and 223-254
* Corrected 01.11.2006 to more "correct" behavior by core
*/
charsys_addallowed("ÀÁÂÃ¥ÄŪÆÇȲ¯ÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÜÞßàáâã´äåºæç賿éêëìíîïðñòóôõö÷øùüþÿ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD>å<EFBFBD>Ū<EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>賿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (cyrillic_utf8 || !strcmp(name, "ukrainian-utf8"))
{
@ -1076,7 +1256,7 @@ void charsys_add_language(char *name)
{
/* supplied by GSF */
/* ranges from rfc1947 / iso 8859-7 */
charsys_addallowed("¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóô");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (!strcmp(name, "greek-utf8"))
{
@ -1092,7 +1272,7 @@ void charsys_add_language(char *name)
if (!strcmp(name, "turkish"))
{
/* Supplied by Ayberk Yancatoral */
charsys_addallowed("öÖçÇþÞüÜðÐý");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (!strcmp(name, "turkish-utf8"))
{
@ -1112,7 +1292,7 @@ void charsys_add_language(char *name)
{
/* Supplied by PHANTOm. */
/* 0xE0 - 0xFE */
charsys_addallowed("àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ");
charsys_addallowed("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
}
if (!strcmp(name, "hebrew-utf8"))
{
@ -1143,7 +1323,7 @@ void charsys_add_language(char *name)
/* [LATVIAN] */
if (latin_utf8 || !strcmp(name, "latvian-utf8"))
{
/* A a, C c, E e, G g, I i, K k, Š š, U u, Ž ž */
/* A a, C c, E e, G g, I i, K k, <EFBFBD> <20>, U u, <20> <20> */
charsys_addmultibyterange(0xc4, 0xc4, 0x80, 0x81);
charsys_addmultibyterange(0xc4, 0xc4, 0x92, 0x93);
charsys_addmultibyterange(0xc4, 0xc4, 0x8c, 0x8d);
@ -1159,7 +1339,7 @@ void charsys_add_language(char *name)
/* [ESTONIAN] */
if (latin_utf8 || !strcmp(name, "estonian-utf8"))
{
/* õ, ä, ö, ü, Õ, Ä, Ö, Ü */
/* <EFBFBD>, <20>, <20>, <20>, <20>, <20>, <20>, <20> */
charsys_addmultibyterange(0xc3, 0xc3, 0xb5, 0xb6);
charsys_addmultibyterange(0xc3, 0xc3, 0xa4, 0xa4);
charsys_addmultibyterange(0xc3, 0xc3, 0xbc, 0xbc);
@ -1171,7 +1351,7 @@ void charsys_add_language(char *name)
/* [LITHUANIAN] */
if (latin_utf8 || !strcmp(name, "lithuanian-utf8"))
{
/* a, c, e, e, i, š, u, u, ž, A, C, E, E, I, Š, U, U, Ž */
/* a, c, e, e, i, <EFBFBD>, u, u, <20>, A, C, E, E, I, <20>, U, U, <20> */
charsys_addmultibyterange(0xc4, 0xc4, 0x84, 0x85);
charsys_addmultibyterange(0xc4, 0xc4, 0x8c, 0x8d);
charsys_addmultibyterange(0xc4, 0xc4, 0x96, 0x99);
@ -1195,11 +1375,83 @@ void charsys_add_language(char *name)
/* 0xd981 - 0xd98a */
charsys_addmultibyterange(0xd9, 0xd9, 0x81, 0x8a);
}
/* [EMOJI] */
if (!strcmp(name, "emoji-utf8"))
{
/* Wikipedia perhaps isn't the best place to base our ranges on
* but it works for now.
*
* ZWJ (U+200D) and Variant Selector 16 (U+FE0F) can be used in
* homoglyph attacks so there's a check in isvalidunicodenick
* to attempt to mitigate (but not remove!) the risk.
*
* Only 3 and 4 byte UTF-8 sequences are supported to make sure
* the UTF-8 decoding doesn't break the existing multi-byte
* support.
*
* isvalidunicodenick needs to be updated if any emoji code
* points under U+2600 are added.
*/
/* https://en.wikipedia.org/wiki/Zero-width_joiner */
charsys_addunicoderange(0x200d, 0x200d);
/* https://en.wikipedia.org/wiki/Miscellaneous_Symbols*/
charsys_addunicoderange(0x2600, 0x26ff);
/* https://en.wikipedia.org/wiki/Dingbat#Encoding */
charsys_addunicoderange(0x2700, 0x27bf);
/* https://en.wikipedia.org/wiki/Variation_Selectors_(Unicode_block) */
charsys_addunicoderange(0xfe0f, 0xfe0f);
/* https://en.wikipedia.org/wiki/Regional_indicator_symbol */
charsys_addunicoderange(0x1f1e6, 0x1f1ff);
/* https://en.wikipedia.org/wiki/Miscellaneous_Symbols_and_Pictographs */
charsys_addunicoderange(0x1f300, 0x1f5ff);
/* https://en.wikipedia.org/wiki/Emoticons_(Unicode_block)#Emoji_modifiers
* https://en.wikipedia.org/wiki/Miscellaneous_Symbols#Emoji_modifiers
* https://en.wikipedia.org/wiki/Supplemental_Symbols_and_Pictographs#Emoji_modifiers
* https://en.wikipedia.org/wiki/Miscellaneous_Symbols_and_Pictographs#Emoji_modifiers
* https://en.wikipedia.org/wiki/Transport_and_Map_Symbols#Emoji_modifiers
* https://en.wikipedia.org/wiki/Dingbat#Emoji_modifiers
*
* These are included in the previous range but still listed
* separately due to their importance.
*/
charsys_addunicoderange(0x1f3fb, 0x1f3ff);
/* https://en.wikipedia.org/wiki/Emoticons_(Unicode_block) */
charsys_addunicoderange(0x1f600, 0x1f64f);
/* https://en.wikipedia.org/wiki/Transport_and_Map_Symbols */
charsys_addunicoderange(0x1f680, 0x1f6ff);
/* https://en.wikipedia.org/wiki/Supplemental_Symbols_and_Pictographs */
charsys_addunicoderange(0x1f900, 0x1f9ff);
/* https://en.wikipedia.org/wiki/Symbols_and_Pictographs_Extended-A */
charsys_addunicoderange(0x1fa70, 0x1faff);
/* https://www.unicode.org/reports/tr51/#valid-emoji-tag-sequences */
/* tag digit zero .. tag digit nine */
charsys_addunicoderange(0xe0030, 0xe0039);
/* tag latin small letter a .. tag latin small letter z */
charsys_addunicoderange(0xe0061, 0xe007a);
/* cancel tag */
charsys_addunicoderange(0xe007f, 0xe007f);
}
}
/** This displays all the nick characters that are permitted */
char *charsys_displaychars(void)
{
/* TODO: Add ulist rendering */
#if 0
MBList *m;
unsigned char hibyte, lobyte;

View file

@ -47,6 +47,7 @@ int lr_pre_command(Client *from, MessageTag *mtags, const char *buf);
int lr_post_command(Client *from, MessageTag *mtags, const char *buf);
int lr_close_connection(Client *client);
int lr_packet(Client *from, Client *to, Client *intended_to, char **msg, int *len);
void lr_new_message(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature);
void *_labeled_response_save_context(void);
void _labeled_response_set_context(void *ctx);
void _labeled_response_force_end(void);
@ -97,6 +98,7 @@ MOD_INIT()
HookAdd(modinfo->handle, HOOKTYPE_POST_COMMAND, 1000000000, lr_post_command);
HookAdd(modinfo->handle, HOOKTYPE_CLOSE_CONNECTION, 1000000000, lr_close_connection);
HookAdd(modinfo->handle, HOOKTYPE_PACKET, 1000000000, lr_packet);
HookAddVoid(modinfo->handle, HOOKTYPE_NEW_MESSAGE, 0, lr_new_message);
return MOD_SUCCESS;
}
@ -333,6 +335,20 @@ int lr_packet(Client *from, Client *to, Client *intended_to, char **msg, int *le
return 0;
}
void lr_new_message(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature)
{
/* Locally processed messages already have the label! */
if (currentcmd.client) return;
MessageTag *m;
m = find_mtag(recv_mtags, "label");
if (m)
{
m = duplicate_mtag(m);
AddListItem(m, *mtag_list);
}
}
/** This function verifies if the client sending the
* tag is permitted to do so and uses a permitted syntax.
*/

View file

@ -85,7 +85,7 @@ CMD_FUNC(cmd_ping)
if (MyUser(client))
origin = client->name; /* Make sure origin is not spoofed */
if ((target = find_server_quick(destination)) && (target != &me))
sendto_one(target, NULL, ":%s PING %s :%s", client->name, origin, destination);
sendto_one(target, recv_mtags, ":%s PING %s :%s", client->name, origin, destination);
else
{
sendnumeric(client, ERR_NOSUCHSERVER, destination);

View file

@ -132,11 +132,9 @@ CMD_FUNC(cmd_protoctl)
*/
if (strstr(charsys_get_current_languages(), "utf8") && !strstr(value, "utf8"))
{
unreal_log(ULOG_ERROR, "link", "LINK_DENIED_CHARSYS_INCOMPATIBLE", client,
"Server link $client rejected. Server $me_name has utf8 in set::allowed-nickchars but $client does not.",
log_data_string("me_name", me.name));
exit_client(client, NULL, "Incompatible set::allowed-nickchars setting");
return;
unreal_log(ULOG_WARNING, "link", "LINK_WARNING_CHARSYS", client,
"Server $client has utf8 in set::allowed-nickchars but %me does not. Proceed with caution.",
log_data_string("me", me.name));
}
/* We compare the character sets to see if we should warn opers about any mismatch... */
if (strcmp(value, charsys_get_current_languages()))

View file

@ -100,7 +100,7 @@ CMD_FUNC(cmd_svslogin)
{
Client *target;
if (!SASL_SERVER || MyUser(client) || (parc < 3) || !parv[3])
if (MyUser(client) || (parc < 3) || !parv[3])
return;
/* We actually ignore parv[1] since this is a broadcast message.

View file

@ -0,0 +1,68 @@
/*
* IRC - Internet Relay Chat, src/modules/third/noglobalmsg.c
* (C) 2021 Polsaker - All rights reserved.
*
* See file AUTHORS in IRC package for additional names of
* the programmers.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "unrealircd.h"
ModuleHeader MOD_HEADER
= {
"third/noglobalmsg",
"1.0",
"Disables PRIVMSG $*",
"Polsaker",
"unrealircd-5",
};
CMD_OVERRIDE_FUNC(override_privmsg);
MOD_INIT()
{
return MOD_SUCCESS;
}
MOD_LOAD()
{
if (!CommandOverrideAdd(modinfo->handle, "PRIVMSG", override_privmsg))
return MOD_FAILED;
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
CMD_OVERRIDE_FUNC(override_privmsg)
{
char *targetstr, *p;
for (p = NULL, targetstr = strtoken(&p, parv[1], ","); targetstr; targetstr = strtoken(&p, NULL, ","))
{
if (*targetstr == '$')
{
sendnumeric(client, ERR_YOUREBANNEDCREEP, "Why would you want to do that?!");
return;
}
}
CallCommandOverride(ovr, client, recv_mtags, parc, parv);
}

View file

@ -0,0 +1,80 @@
/*
* IRC - Internet Relay Chat, src/modules/third/nosajoinpart.c
* (C) 2021 Polsaker
*
* See file AUTHORS in IRC package for additional names of
* the programmers.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "unrealircd.h"
ModuleHeader MOD_HEADER
= {
"third/nosajoinpart",
"1.0",
"Disables remote SAJOIN/SAPART targeted to local users",
"Polsaker",
"unrealircd-5",
};
CMD_OVERRIDE_FUNC(override_sajp);
MOD_INIT()
{
return MOD_SUCCESS;
}
MOD_LOAD()
{
if (!CommandOverrideAdd(modinfo->handle, "SAJOIN", override_sajp))
return MOD_FAILED;
if (!CommandOverrideAdd(modinfo->handle, "SAPART", override_sajp))
return MOD_FAILED;
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
CMD_OVERRIDE_FUNC(override_sajp)
{
Client *target;
if ((parc < 3) || BadPtr(parv[2]))
{
sendnumeric(client, ERR_NEEDMOREPARAMS, "SAJOIN");
return;
}
if (!(target = find_person(parv[1], NULL)))
{
sendnumeric(client, ERR_NOSUCHNICK, parv[1]);
return;
}
if (MyUser(target) && !MyUser(client))
{
sendnumeric(client, ERR_YOUREBANNEDCREEP, "I don't wanna :(");
return;
}
CallCommandOverride(ovr, client, recv_mtags, parc, parv);
}

View file

@ -0,0 +1,123 @@
/*
* IRC - Internet Relay Chat, src/modules/third/pissquit.c
* (C) 2004-2021 The UnrealIRCd Team, pissnet team
*
* See file AUTHORS in IRC package for additional names of
* the programmers.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "unrealircd.h"
#define MSG_PISSQUIT "PISSQUIT"
CMD_FUNC(cmd_pissquit);
ModuleHeader MOD_HEADER
= {
"third/pissquit",
"0.02",
"command /pissquit: Positively Identify Server to Server QUIT",
"pissnet team",
"unrealircd-5",
};
MOD_INIT()
{
CommandAdd(modinfo->handle, MSG_PISSQUIT, cmd_pissquit, 3, CMD_USER);
return MOD_SUCCESS;
}
MOD_LOAD()
{
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
/*
** cmd_pissquit
** parv[1] = server to disconnect from its uplink
** parv[2] = remote server that server needs to be disconnected from
** parv[parc-1] = comment
*/
CMD_FUNC(cmd_pissquit)
{
char *server, *server_remote;
Client *target, *target_remote;
char *comment = (parc > 3 && parv[parc - 1]) ? parv[parc - 1] : client->name;
/* This permissions check is only intended as a quick filter. The SQUIT
* code will do a proper check later. */
if (!ValidatePermissionsForPath("route:local", client, NULL, NULL, NULL))
{
sendnumeric(client, ERR_NOPRIVILEGES);
return;
}
if ((parc < 3) || BadPtr(parv[1]) || BadPtr(parv[2]))
{
sendnumeric(client, ERR_NEEDMOREPARAMS, MSG_PISSQUIT);
return;
}
server = parv[1];
server_remote = parv[2];
target = find_server_quick(server);
target_remote = find_server_quick(server_remote);
if (target && IsMe(target))
{
sendnotice(client, "ERROR: Unable to %s myself.", MSG_PISSQUIT);
return;
}
if (!target || !target->srvptr)
{
sendnumeric(client, ERR_NOSUCHSERVER, server);
return;
}
if (!target_remote)
{
sendnumeric(client, ERR_NOSUCHSERVER, server_remote);
return;
}
if (target->srvptr != target_remote)
{
sendnotice(client, "ERROR: Cannot disconnect %s (%s) from %s (%s). %s (%s) is connected to %s (%s) instead.",
target->name, target->id,
target_remote->name, target_remote->id,
target->name, target->id,
target->srvptr->name, target->srvptr->id);
return;
}
/* Zeroing out the remote server shouldn't even be necessary since the
* SQUIT code ignores all but parv[1] and parv[argc-1], but it can't
* hurt.
*
* This does exceed the params count registered for the SQUIT command
* but those aren't checked in this code path so yolo.
* */
parv[2] = NULL;
do_cmd(client, recv_mtags, "SQUIT", parc, parv);
}

View file

@ -68,7 +68,7 @@ CMD_FUNC(cmd_tsctl)
gettimeofday(&currenttime_tv, NULL);
sendnotice(client, "*** Server=%s TStime=%lld.%ld",
me.name, (long long)currenttime_tv.tv_sec, (long)currenttime_tv.tv_usec);
sendto_server(client, 0, 0, NULL, ":%s TSCTL alltime", client->id);
sendto_server(client, 0, 0, recv_mtags, ":%s TSCTL alltime", client->id);
return;
}
}

View file

@ -91,7 +91,8 @@ void sendto_wallops(Client *one, Client *from, FORMAT_STRING(const char *pattern
*/
CMD_FUNC(cmd_wallops)
{
const char *message = parc > 1 ? parv[1] : NULL;
char *message;
message = parc > 1 ? parv[1] : NULL;
if (BadPtr(message))
{
@ -105,5 +106,9 @@ CMD_FUNC(cmd_wallops)
return;
}
if (MyUser(client)) {
sendto_one(client, NULL, ":%s WALLOPS :%s", client->name, message);
}
sendto_wallops(client->direction, client, ":%s WALLOPS :%s", client->name, message);
}

View file

@ -7,7 +7,7 @@ echo "Extracting src/version.c..."
if [ -d ../.git ]; then
SUFFIX="-$(git rev-parse --short HEAD)"
fi
id="6.0.0-git$SUFFIX"
id="6.0.0$SUFFIX"
echo "$id"
if test -r version.c
@ -166,38 +166,30 @@ char *unrealcredits[] =
char unreallogo[] =
{
32,95,32,32,32,95,32,32,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,95,32,95,95,95,
95,95,95,95,95,95,95,95,32,32,95,
95,95,95,95,32,32,32,32,32,95,32,
10,124,32,124,32,124,32,124,32,32,32,
32,32,32,32,32,32,32,32,32,32,32,
32,32,32,32,32,32,124,32,124,95,32,
32,32,95,124,32,95,95,95,32,92,47,
32,32,95,95,32,92,32,32,32,124,32,
124,10,124,32,124,32,124,32,124,95,32,
95,95,32,32,95,32,95,95,32,95,95,
95,32,32,95,95,32,95,124,32,124,32,
124,32,124,32,124,32,124,95,47,32,47,
124,32,47,32,32,92,47,32,95,95,124,
32,124,10,124,32,124,32,124,32,124,32,
39,95,32,92,124,32,39,95,95,47,32,
95,32,92,47,32,95,96,32,124,32,124,
32,124,32,124,32,124,32,32,32,32,47,
32,124,32,124,32,32,32,32,47,32,95,
96,32,124,10,124,32,124,95,124,32,124,
32,124,32,124,32,124,32,124,32,124,32,
32,95,95,47,32,40,95,124,32,124,32,
124,95,124,32,124,95,124,32,124,92,32,
92,32,124,32,92,95,95,47,92,32,40,
95,124,32,124,10,32,92,95,95,95,47,
124,95,124,32,124,95,124,95,124,32,32,
92,95,95,95,124,92,95,95,44,95,124,
95,124,92,95,95,95,47,92,95,124,32,
92,95,124,32,92,95,95,95,95,47,92,
95,95,44,95,124,10,0,85,110,114,
101,97,108,73,82,67,100,0};
32,95,95,95,95,95,32,95,32,32,32,
32,32,32,32,32,32,95,95,95,95,95,
32,95,95,95,95,95,32,32,32,95,95,
95,95,95,32,32,32,32,95,32,10,124,
32,32,95,95,32,40,95,41,32,32,32,
32,32,32,32,124,95,32,32,32,95,124,
32,32,95,95,32,92,32,47,32,95,95,
95,95,124,32,32,124,32,124,10,124,32,
124,95,95,41,32,124,32,95,95,95,32,
95,95,95,32,32,124,32,124,32,124,32,
124,95,95,41,32,124,32,124,32,32,32,
32,32,95,95,124,32,124,10,124,32,32,
95,95,95,47,32,47,32,95,95,47,32,
95,95,124,32,124,32,124,32,124,32,32,
95,32,32,47,124,32,124,32,32,32,32,
47,32,95,96,32,124,10,124,32,124,32,
32,32,124,32,92,95,95,32,92,95,95,
32,92,95,124,32,124,95,124,32,124,32,
92,32,92,124,32,124,95,95,95,124,32,
40,95,124,32,124,10,124,95,124,32,32,
32,124,95,124,95,95,95,47,95,95,95,
47,95,95,95,95,95,124,95,124,32,32,
92,95,92,92,95,95,95,95,95,92,95,
95,44,95,124,10};
char *dalinfotext[] =
{

View file

@ -6,7 +6,7 @@
[Setup]
AppName=UnrealIRCd 6
AppVerName=UnrealIRCd 6.0.0-git
AppVerName=UnrealIRCd 6.0.0
AppPublisher=UnrealIRCd Team
AppPublisherURL=https://www.unrealircd.org
AppSupportURL=https://www.unrealircd.org
@ -66,6 +66,7 @@ Source: "extras\tls.cnf"; DestDir: "{app}\bin"; Flags: ignoreversion
Source: "src\modules\*.dll"; DestDir: "{app}\modules"; Flags: ignoreversion
Source: "src\modules\chanmodes\*.dll"; DestDir: "{app}\modules\chanmodes"; Flags: ignoreversion
Source: "src\modules\usermodes\*.dll"; DestDir: "{app}\modules\usermodes"; Flags: ignoreversion
Source: "src\modules\snomasks\*.dll"; DestDir: "{app}\modules\snomasks"; Flags: ignoreversion
Source: "src\modules\extbans\*.dll"; DestDir: "{app}\modules\extbans"; Flags: ignoreversion
Source: "src\modules\third\*.dll"; DestDir: "{app}\modules\third"; Flags: ignoreversion skipifsourcedoesntexist
@ -156,7 +157,7 @@ if CurStep = ssPostInstall then
end;
//*********************************************************************************
// Checks if TLS cert file exists
// Checks if SSL/TLS cert file exists
//*********************************************************************************
procedure CurPageChanged(CurPage: Integer);