mirror of
https://github.com/anope/anope.git
synced 2026-07-09 09:23:13 +02:00
Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 73714420d1 | |||
| ea96f2ad40 | |||
| 7083c424c2 | |||
| de16238e01 | |||
| a668c8b520 | |||
| 96ccfe4cbe | |||
| ee160842b3 | |||
| 98c840eb02 | |||
| 7d5ca5c90b | |||
| f40719787f | |||
| e5602f956d | |||
| e704fa6266 | |||
| bafcba023c | |||
| 6d34054b78 | |||
| cc37e6d69a | |||
| 4b48fc98d3 | |||
| 6da4a148fa | |||
| 63ad540e55 | |||
| a1165eea94 | |||
| bfca74f6b3 | |||
| 3acf74483c | |||
| a3ec8329f4 | |||
| 31bc597c81 | |||
| 2de0dddb1c | |||
| 41ea346551 | |||
| 439ad3e736 | |||
| 8105607257 | |||
| ccc088d946 | |||
| 8bb83f6b1a | |||
| da99a53dfa | |||
| a9e9ac32a0 | |||
| 05e6df23a2 | |||
| 3f9fc23270 | |||
| afe87bf693 | |||
| 0c5bf51378 | |||
| d41764bfd6 |
+1
-1
@@ -14,6 +14,6 @@ Version | Supported
|
|||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
Please do not report security vulnerabilities on GitHub. Instead, email the details to team@anope.org or get the attention of a developer in our development IRC channel at irc.anope.org #anope-devel and PM them the details.
|
Please do not report security vulnerabilities on GitHub. Instead, email the details to team@anope.org or get the attention of a developer in our development IRC channel at irc.teranova.net #anope-devel and PM them the details.
|
||||||
|
|
||||||
We will triage your issue as soon as possible and try to release a fixed version within a week of receiving your report.
|
We will triage your issue as soon as possible and try to release a fixed version within a week of receiving your report.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Anope is an open source set of IRC Services. It is highly modular, with a vast n
|
|||||||
|
|
||||||
* [Website](https://anope.org)
|
* [Website](https://anope.org)
|
||||||
* [GitHub](https://github.com/anope)
|
* [GitHub](https://github.com/anope)
|
||||||
* IRC \#anope on irc.anope.org
|
* IRC \#anope on irc.teranova.net
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ Copy conf/example.conf to conf/services.conf
|
|||||||
$ cp conf/example.conf conf/services.conf
|
$ cp conf/example.conf conf/services.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
Edit services.conf, configuring the uplink, serverinfo, and protocol module configurations. Example link blocks for popular IRCds are included in the the example.conf documentation. The [Anope wiki](https://wiki.anope.org) is also a good source of information. Our support channel is located at #anope on [irc.anope.org](irc://irc.anope.org/#anope).
|
Edit services.conf, configuring the uplink, serverinfo, and protocol module configurations. Example link blocks for popular IRCds are included in the the example.conf documentation. The [Anope wiki](https://wiki.anope.org) is also a good source of information. Our support channel is located at #anope on [irc.teranova.net](ircs://irc.teranova.net/anope).
|
||||||
|
|
||||||
Note that the example configuration file includes other example configuration files. If you want to modify the other example configuration files, copy them (e.g. `modules.example.conf` to `modules.conf`) and modify the `include` directive in `services.conf` to include the new file.
|
Note that the example configuration file includes other example configuration files. If you want to modify the other example configuration files, copy them (e.g. `modules.example.conf` to `modules.conf`) and modify the `include` directive in `services.conf` to include the new file.
|
||||||
|
|
||||||
|
|||||||
@@ -109,10 +109,9 @@ module
|
|||||||
/*
|
/*
|
||||||
* The length of time before a channel registration expires.
|
* The length of time before a channel registration expires.
|
||||||
*
|
*
|
||||||
* This directive is optional, but recommended.
|
* This directive is optional. If not set, the default is never.
|
||||||
* If not set, the default is 14 days.
|
|
||||||
*/
|
*/
|
||||||
expire = 14d
|
#expire = 90d
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The maximum number of entries on a channel's access list.
|
* The maximum number of entries on a channel's access list.
|
||||||
|
|||||||
+6
-16
@@ -259,7 +259,7 @@ serverinfo
|
|||||||
* - hybrid
|
* - hybrid
|
||||||
* - inspircd12
|
* - inspircd12
|
||||||
* - inspircd20
|
* - inspircd20
|
||||||
* - inspircd3
|
* - inspircd3 (for 3.x and 4.x)
|
||||||
* - ngircd
|
* - ngircd
|
||||||
* - plexus
|
* - plexus
|
||||||
* - ratbox
|
* - ratbox
|
||||||
@@ -458,12 +458,6 @@ options
|
|||||||
*/
|
*/
|
||||||
readtimeout = 5s
|
readtimeout = 5s
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the interval between sending warning messages for program errors via
|
|
||||||
* WALLOPS/GLOBOPS.
|
|
||||||
*/
|
|
||||||
warningtimeout = 4h
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets the (maximum) frequency at which the timeout list is checked. This,
|
* Sets the (maximum) frequency at which the timeout list is checked. This,
|
||||||
* combined with readtimeout above, determines how accurately timed events,
|
* combined with readtimeout above, determines how accurately timed events,
|
||||||
@@ -953,7 +947,7 @@ mail
|
|||||||
* If set, this option enables the mail commands in Services. You may choose
|
* If set, this option enables the mail commands in Services. You may choose
|
||||||
* to disable it if you have no Sendmail-compatible mailer installed. Whilst
|
* to disable it if you have no Sendmail-compatible mailer installed. Whilst
|
||||||
* this directive (and entire block) is optional, it is required if
|
* this directive (and entire block) is optional, it is required if
|
||||||
* nickserv:registration is set to yes.
|
* nickserv:registration is set to mail.
|
||||||
*/
|
*/
|
||||||
usemail = yes
|
usemail = yes
|
||||||
|
|
||||||
@@ -1153,11 +1147,6 @@ module
|
|||||||
* This is only useful with very large databases, with hundreds
|
* This is only useful with very large databases, with hundreds
|
||||||
* of thousands of objects, that have a noticeable delay from
|
* of thousands of objects, that have a noticeable delay from
|
||||||
* writing databases.
|
* writing databases.
|
||||||
*
|
|
||||||
* If your database is large enough cause a noticeable delay when
|
|
||||||
* saving you should consider a more powerful alternative such
|
|
||||||
* as db_sql or db_redis, which incrementally update their
|
|
||||||
* databases asynchronously in real time.
|
|
||||||
*/
|
*/
|
||||||
fork = no
|
fork = no
|
||||||
}
|
}
|
||||||
@@ -1195,9 +1184,10 @@ module
|
|||||||
|
|
||||||
/* Whether or not to import data from another database module in to SQL on startup.
|
/* Whether or not to import data from another database module in to SQL on startup.
|
||||||
* If you enable this, be sure that the database services is configured to use is
|
* If you enable this, be sure that the database services is configured to use is
|
||||||
* empty and that another database module to import from is loaded before db_sql.
|
* empty and that another database module to import from is loaded BEFORE db_sql.
|
||||||
* After you enable this and do a database import you should disable it for
|
* After you enable this and do a database import you MUST disable it for
|
||||||
* subsequent restarts.
|
* subsequent restarts. If you want to keep writing a flatfile database after the
|
||||||
|
* SQL import is done you should load db_flatfile AFTER this module.
|
||||||
*
|
*
|
||||||
* Note that you can not import databases using db_sql_live. If you want to import
|
* Note that you can not import databases using db_sql_live. If you want to import
|
||||||
* databases and use db_sql_live you should import them using db_sql, then shut down
|
* databases and use db_sql_live you should import them using db_sql, then shut down
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ serverinfo
|
|||||||
* - hybrid
|
* - hybrid
|
||||||
* - inspircd12
|
* - inspircd12
|
||||||
* - inspircd20
|
* - inspircd20
|
||||||
* - inspircd3
|
* - inspircd3 (for 3.x and 4.x)
|
||||||
* - ngircd
|
* - ngircd
|
||||||
* - plexus
|
* - plexus
|
||||||
* - ratbox
|
* - ratbox
|
||||||
@@ -371,12 +371,6 @@ options
|
|||||||
*/
|
*/
|
||||||
readtimeout = 5s
|
readtimeout = 5s
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the interval between sending warning messages for program errors via
|
|
||||||
* WALLOPS/GLOBOPS.
|
|
||||||
*/
|
|
||||||
warningtimeout = 4h
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If set, Services will only show /stats o to IRC Operators. This directive
|
* If set, Services will only show /stats o to IRC Operators. This directive
|
||||||
* is optional.
|
* is optional.
|
||||||
|
|||||||
+35
-1
@@ -1,6 +1,40 @@
|
|||||||
|
Anope Version 2.0.17
|
||||||
|
--------------------
|
||||||
|
Fixed importing large flatfile databases into SQL.
|
||||||
|
Fixed marking channels as permanent.
|
||||||
|
Fixed serialising unset boolean extension items.
|
||||||
|
Fixed the documentation about how to import SQL databases.
|
||||||
|
Fixed the documentation of options:usemail.
|
||||||
|
Fixed the location of the geoipupdate CSV files.
|
||||||
|
Fixed translating memo emails.
|
||||||
|
Fixed unnecessary SQL updates caused by dereferencing user accounts.
|
||||||
|
Increased the size of the chanstats letter and word count columns.
|
||||||
|
Updated the location of the Anope IRC channels.
|
||||||
|
|
||||||
Anope Version 2.0.16-git
|
Anope Version 2.0.16-git
|
||||||
------------------------
|
------------------------
|
||||||
No significant changes.
|
Added a workaround for users matching expired sqlines.
|
||||||
|
Fixed a copy/paste error in webcpanel.
|
||||||
|
Fixed a crash in db_flatfile caused by trying to serialize data without a type.
|
||||||
|
Fixed duplicate messages when synconset/syncongroup is set.
|
||||||
|
Fixed expiring channel suspensions.
|
||||||
|
Fixed expiring forbids.
|
||||||
|
Fixed expiring nick suspensions.
|
||||||
|
Fixed feature detection on InspIRCd.
|
||||||
|
Fixed InspIRCd account cloaks causing CHGHOST spam when a user also has a services vhost.
|
||||||
|
Fixed joining users to channels with a key set on InspIRCd.
|
||||||
|
Fixed logging users out fully when their nick gets suspended.
|
||||||
|
Fixed marking boolean columns in SQL as TEXT instead of INT.
|
||||||
|
Fixed matching extbans on InspIRCd and implement missing matchers.
|
||||||
|
Fixed operserv/sqline expiry on UnrealIRCd
|
||||||
|
Fixed respecting --noexpire in cs_suspend and ns_suspend.
|
||||||
|
Fixed sending emails to nicks ending with a backslash.
|
||||||
|
Fixed sending SVSTOPIC when topiclock is loaded on InspIRCd.
|
||||||
|
Fixed some SQL tables taking up too much space on disk.
|
||||||
|
Fixed the default config for channel suspensions.
|
||||||
|
Fixed the TIME message on InspIRCd.
|
||||||
|
Fixed trying to escape SQL data when not connected to MySQL.
|
||||||
|
Fixed {ldap,sql}_authentication creating zombie accounts on expiry.
|
||||||
|
|
||||||
Anope Version 2.0.15
|
Anope Version 2.0.15
|
||||||
--------------------
|
--------------------
|
||||||
|
|||||||
+6
-2
@@ -1,5 +1,9 @@
|
|||||||
Anope Version 2.0.16-git
|
Anope Version 2.0.17
|
||||||
------------------------
|
--------------------
|
||||||
|
No significant changes.
|
||||||
|
|
||||||
|
Anope Version 2.0.16
|
||||||
|
--------------------
|
||||||
No significant changes.
|
No significant changes.
|
||||||
|
|
||||||
Anope Version 2.0.15
|
Anope Version 2.0.15
|
||||||
|
|||||||
+1
-1
@@ -90,4 +90,4 @@ Anope DefCon
|
|||||||
6) Support
|
6) Support
|
||||||
|
|
||||||
You might get DefCon support by posting on our online forum, or maybe on
|
You might get DefCon support by posting on our online forum, or maybe on
|
||||||
our #anope channel at /server irc.anope.org.
|
our #anope channel at /server irc.teranova.net.
|
||||||
|
|||||||
+1
-1
@@ -60,7 +60,7 @@ Note: You should also read the README and FAQ files!
|
|||||||
most likely not work!
|
most likely not work!
|
||||||
|
|
||||||
If you need help, you should visit https://forum.anope.org/ or #anope on
|
If you need help, you should visit https://forum.anope.org/ or #anope on
|
||||||
irc.anope.org. Provide *complete* error output, along with other relevant
|
irc.teranova.net. Provide *complete* error output, along with other relevant
|
||||||
information eg. OS, compiler and C++ library versions.
|
information eg. OS, compiler and C++ library versions.
|
||||||
See the README file for more information.
|
See the README file for more information.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -64,7 +64,7 @@ Note : Vous devrez également lire les fichiers README et FAQ !
|
|||||||
recommandée, et Anope ne fonctionnera probablement pas !
|
recommandée, et Anope ne fonctionnera probablement pas !
|
||||||
|
|
||||||
Si vous avez besoin d'aide, vous pouvez aller sur le site
|
Si vous avez besoin d'aide, vous pouvez aller sur le site
|
||||||
https://forum.anope.org/ ou le canal #anope sur irc.anope.org.
|
https://forum.anope.org/ ou le canal #anope sur irc.teranova.net.
|
||||||
Fournissez *l'essemble* des erreurs qui apparaîssent, en plus de
|
Fournissez *l'essemble* des erreurs qui apparaîssent, en plus de
|
||||||
toutes informations utiles, comme les versions de votre OS, du
|
toutes informations utiles, comme les versions de votre OS, du
|
||||||
compilateur utilisé et de la librairie C++. Lisez le fichier README
|
compilateur utilisé et de la librairie C++. Lisez le fichier README
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ Anope Multi Language Support
|
|||||||
Then execute:
|
Then execute:
|
||||||
dpkg-reconfigure locales
|
dpkg-reconfigure locales
|
||||||
|
|
||||||
|
If you have already built Anope you will need to delete the build directory and rebuild from scratch.
|
||||||
|
|
||||||
Building Anope on Windows with gettext support is explained in docs/WIN32.txt
|
Building Anope on Windows with gettext support is explained in docs/WIN32.txt
|
||||||
|
|
||||||
2) Adding a new language
|
2) Adding a new language
|
||||||
|
|||||||
+1
-1
@@ -111,7 +111,7 @@ Anope Modules
|
|||||||
Use modules at your own risk, and make sure you get them from a
|
Use modules at your own risk, and make sure you get them from a
|
||||||
reputable source. You might get module support by contacting the module
|
reputable source. You might get module support by contacting the module
|
||||||
author, posting on our online forum, or maybe on our #anope channel
|
author, posting on our online forum, or maybe on our #anope channel
|
||||||
at /server irc.anope.org.
|
at /server irc.teranova.net.
|
||||||
|
|
||||||
7) Information for Developers
|
7) Information for Developers
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -245,7 +245,7 @@ Table of Contents
|
|||||||
|
|
||||||
If you read the documentation carefully, and didn't find the answer to
|
If you read the documentation carefully, and didn't find the answer to
|
||||||
your question, feel free to post on the website forums or join our irc
|
your question, feel free to post on the website forums or join our irc
|
||||||
channel (irc.anope.org #anope). Once you join our Support channel be as
|
channel (irc.teranova.net #anope). Once you join our Support channel be as
|
||||||
precise as possible when asking a question, because we have no extraordinary
|
precise as possible when asking a question, because we have no extraordinary
|
||||||
powers and can't guess things if they aren't provided.
|
powers and can't guess things if they aren't provided.
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,8 @@ class SerializableExtensibleItem<bool> : public PrimitiveExtensibleItem<bool>
|
|||||||
|
|
||||||
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const anope_override
|
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const anope_override
|
||||||
{
|
{
|
||||||
data[this->name] << true;
|
data.SetType(this->name, Serialize::Data::DT_INT);
|
||||||
|
data[this->name] << this->HasExt(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) anope_override
|
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) anope_override
|
||||||
|
|||||||
@@ -51,17 +51,16 @@ struct KickerDataImpl : KickerData
|
|||||||
if (kd == NULL)
|
if (kd == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
data["kickerdata:amsgs"] << kd->amsgs;
|
data.SetType("kickerdata:amsgs", Serialize::Data::DT_INT); data["kickerdata:amsgs"] << kd->amsgs;
|
||||||
data["kickerdata:badwords"] << kd->badwords;
|
data.SetType("kickerdata:badwords", Serialize::Data::DT_INT); data["kickerdata:badwords"] << kd->badwords;
|
||||||
data["kickerdata:bolds"] << kd->bolds;
|
data.SetType("kickerdata:bolds", Serialize::Data::DT_INT); data["kickerdata:bolds"] << kd->bolds;
|
||||||
data["kickerdata:caps"] << kd->caps;
|
data.SetType("kickerdata:caps", Serialize::Data::DT_INT); data["kickerdata:caps"] << kd->caps;
|
||||||
data["kickerdata:colors"] << kd->colors;
|
data.SetType("kickerdata:colors", Serialize::Data::DT_INT); data["kickerdata:colors"] << kd->colors;
|
||||||
data["kickerdata:flood"] << kd->flood;
|
data.SetType("kickerdata:flood", Serialize::Data::DT_INT); data["kickerdata:flood"] << kd->flood;
|
||||||
data["kickerdata:italics"] << kd->italics;
|
data.SetType("kickerdata:italics", Serialize::Data::DT_INT); data["kickerdata:italics"] << kd->italics;
|
||||||
data["kickerdata:repeat"] << kd->repeat;
|
data.SetType("kickerdata:repeat", Serialize::Data::DT_INT); data["kickerdata:repeat"] << kd->repeat;
|
||||||
data["kickerdata:reverses"] << kd->reverses;
|
data.SetType("kickerdata:reverses", Serialize::Data::DT_INT); data["kickerdata:reverses"] << kd->reverses;
|
||||||
data["kickerdata:underlines"] << kd->underlines;
|
data.SetType("kickerdata:underlines", Serialize::Data::DT_INT); data["kickerdata:underlines"] << kd->underlines;
|
||||||
|
|
||||||
data.SetType("capsmin", Serialize::Data::DT_INT); data["capsmin"] << kd->capsmin;
|
data.SetType("capsmin", Serialize::Data::DT_INT); data["capsmin"] << kd->capsmin;
|
||||||
data.SetType("capspercent", Serialize::Data::DT_INT); data["capspercent"] << kd->capspercent;
|
data.SetType("capspercent", Serialize::Data::DT_INT); data["capspercent"] << kd->capspercent;
|
||||||
data.SetType("floodlines", Serialize::Data::DT_INT); data["floodlines"] << kd->floodlines;
|
data.SetType("floodlines", Serialize::Data::DT_INT); data["floodlines"] << kd->floodlines;
|
||||||
|
|||||||
@@ -510,12 +510,13 @@ class CommandCSSetPersist : public Command
|
|||||||
/* Set the perm mode */
|
/* Set the perm mode */
|
||||||
if (cm)
|
if (cm)
|
||||||
{
|
{
|
||||||
if (ci->c && !ci->c->HasMode("PERM"))
|
|
||||||
ci->c->SetMode(NULL, cm);
|
|
||||||
/* Add it to the channels mlock */
|
/* Add it to the channels mlock */
|
||||||
ModeLocks *ml = ci->Require<ModeLocks>("modelocks");
|
ModeLocks *ml = ci->Require<ModeLocks>("modelocks");
|
||||||
if (ml)
|
if (ml)
|
||||||
ml->SetMLock(cm, true, "", source.GetNick());
|
ml->SetMLock(cm, true, "", source.GetNick());
|
||||||
|
|
||||||
|
if (ci->c && !ci->c->HasMode("PERM"))
|
||||||
|
ci->c->SetMode(NULL, cm);
|
||||||
}
|
}
|
||||||
/* No botserv bot, no channel mode, give them ChanServ.
|
/* No botserv bot, no channel mode, give them ChanServ.
|
||||||
* Yes, this works fine with no BotServ.
|
* Yes, this works fine with no BotServ.
|
||||||
@@ -553,12 +554,13 @@ class CommandCSSetPersist : public Command
|
|||||||
/* Unset perm mode */
|
/* Unset perm mode */
|
||||||
if (cm)
|
if (cm)
|
||||||
{
|
{
|
||||||
if (ci->c && ci->c->HasMode("PERM"))
|
|
||||||
ci->c->RemoveMode(NULL, cm);
|
|
||||||
/* Remove from mlock */
|
/* Remove from mlock */
|
||||||
ModeLocks *ml = ci->GetExt<ModeLocks>("modelocks");
|
ModeLocks *ml = ci->GetExt<ModeLocks>("modelocks");
|
||||||
if (ml)
|
if (ml)
|
||||||
ml->RemoveMLock(cm, true);
|
ml->RemoveMLock(cm, true);
|
||||||
|
|
||||||
|
if (ci->c && ci->c->HasMode("PERM"))
|
||||||
|
ci->c->RemoveMode(NULL, cm);
|
||||||
}
|
}
|
||||||
/* No channel mode, no BotServ, but using ChanServ as the botserv bot
|
/* No channel mode, no BotServ, but using ChanServ as the botserv bot
|
||||||
* which was assigned when persist was set on
|
* which was assigned when persist was set on
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ class Greet : public Module
|
|||||||
* to has synced, or we'll get greet-floods when the net
|
* to has synced, or we'll get greet-floods when the net
|
||||||
* recovers from a netsplit. -GD
|
* recovers from a netsplit. -GD
|
||||||
*/
|
*/
|
||||||
if (!c->ci || !c->ci->bi || !user->server->IsSynced() || !user->Account())
|
if (!c->ci || !c->ci->bi || !user->server->IsSynced() || !user->IsIdentified())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Anope::string *greet = ns_greet.Get(user->Account());
|
Anope::string *greet = ns_greet.Get(user->Account());
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class CommandNSIdentify : public Command
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (u->Account() && na && u->Account() == na->nc)
|
if (u->IsIdentified() && na && u->Account() == na->nc)
|
||||||
{
|
{
|
||||||
source.Reply(_("You are already identified."));
|
source.Reply(_("You are already identified."));
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1286,7 +1286,7 @@ class NSSet : public Module
|
|||||||
if (chan->ci)
|
if (chan->ci)
|
||||||
{
|
{
|
||||||
/* Only give modes if autoop is set */
|
/* Only give modes if autoop is set */
|
||||||
give_modes &= !user->Account() || autoop.HasExt(user->Account());
|
give_modes &= !user->IsIdentified() || autoop.HasExt(user->Account());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1321,13 +1321,13 @@ class NSSet : public Module
|
|||||||
|
|
||||||
void OnUserModeSet(const MessageSource &setter, User *u, const Anope::string &mname) anope_override
|
void OnUserModeSet(const MessageSource &setter, User *u, const Anope::string &mname) anope_override
|
||||||
{
|
{
|
||||||
if (u->Account() && setter.GetUser() == u)
|
if (u->IsIdentified() && setter.GetUser() == u)
|
||||||
u->Account()->last_modes = u->GetModeList();
|
u->Account()->last_modes = u->GetModeList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnUserModeUnset(const MessageSource &setter, User *u, const Anope::string &mname) anope_override
|
void OnUserModeUnset(const MessageSource &setter, User *u, const Anope::string &mname) anope_override
|
||||||
{
|
{
|
||||||
if (u->Account() && setter.GetUser() == u)
|
if (u->IsIdentified() && setter.GetUser() == u)
|
||||||
u->Account()->last_modes = u->GetModeList();
|
u->Account()->last_modes = u->GetModeList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class CommandNSStatus : public Command
|
|||||||
else if (u2->IsIdentified() && na && na->nc == u2->Account()) /* Nick is identified */
|
else if (u2->IsIdentified() && na && na->nc == u2->Account()) /* Nick is identified */
|
||||||
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 3, u2->Account()->display.c_str());
|
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 3, u2->Account()->display.c_str());
|
||||||
else if (u2->IsRecognized()) /* Nick is recognised, but NOT identified */
|
else if (u2->IsRecognized()) /* Nick is recognised, but NOT identified */
|
||||||
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 2, u2->Account() ? u2->Account()->display.c_str() : "");
|
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 2, u2->IsIdentified() ? u2->Account()->display.c_str() : "");
|
||||||
else if (!na) /* Nick is online, but NOT a registered */
|
else if (!na) /* Nick is online, but NOT a registered */
|
||||||
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 0, "");
|
source.Reply("STATUS %s %d %s", nickbuf.c_str(), 0, "");
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -127,6 +127,8 @@ class CommandNSSuspend : public Command
|
|||||||
User *u2 = User::Find(na2->nick, true);
|
User *u2 = User::Find(na2->nick, true);
|
||||||
if (u2)
|
if (u2)
|
||||||
{
|
{
|
||||||
|
IRCD->SendLogout(u2);
|
||||||
|
u2->RemoveMode(source.service, "REGISTERED");
|
||||||
u2->Logout();
|
u2->Logout();
|
||||||
if (nickserv)
|
if (nickserv)
|
||||||
nickserv->Collide(u2, na2);
|
nickserv->Collide(u2, na2);
|
||||||
|
|||||||
@@ -324,6 +324,8 @@ class DBFlatFile : public Module, public Pipe
|
|||||||
{
|
{
|
||||||
Serializable *base = *it;
|
Serializable *base = *it;
|
||||||
Serialize::Type *s_type = base->GetSerializableType();
|
Serialize::Type *s_type = base->GetSerializableType();
|
||||||
|
if (!s_type)
|
||||||
|
continue;
|
||||||
|
|
||||||
data.fs = databases[s_type->GetOwner()];
|
data.fs = databases[s_type->GetOwner()];
|
||||||
if (!data.fs || !data.fs->is_open())
|
if (!data.fs || !data.fs->is_open())
|
||||||
|
|||||||
@@ -159,6 +159,14 @@ class DBSQL : public Module, public Pipe
|
|||||||
this->import = block->Get<bool>("import");
|
this->import = block->Get<bool>("import");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnPostInit() anope_override
|
||||||
|
{
|
||||||
|
// If we are importing from flatfile we need to force a socket engine
|
||||||
|
// flush to ensure it actually gets written to the database before we
|
||||||
|
// connect to the uplink.
|
||||||
|
SocketEngine::Process();
|
||||||
|
}
|
||||||
|
|
||||||
void OnShutdown() anope_override
|
void OnShutdown() anope_override
|
||||||
{
|
{
|
||||||
this->shutting_down = true;
|
this->shutting_down = true;
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ class OnIdentifyInterface : public LDAPInterface
|
|||||||
{
|
{
|
||||||
User *u = User::Find(uid);
|
User *u = User::Find(uid);
|
||||||
|
|
||||||
if (!u || !u->Account() || r.empty())
|
if (!u || !u->IsIdentified() || r.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class IdentifyInterface : public LDAPInterface
|
|||||||
|
|
||||||
void OnResult(const LDAPResult &r) anope_override
|
void OnResult(const LDAPResult &r) anope_override
|
||||||
{
|
{
|
||||||
if (!u || !u->Account())
|
if (!u || !u->IsIdentified())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
NickCore *nc = u->Account();
|
NickCore *nc = u->Account();
|
||||||
|
|||||||
@@ -339,9 +339,14 @@ Result MySQLService::RunQuery(const Query &query)
|
|||||||
{
|
{
|
||||||
this->Lock.Lock();
|
this->Lock.Lock();
|
||||||
|
|
||||||
Anope::string real_query = this->BuildQuery(query);
|
if (!this->CheckConnection())
|
||||||
|
{
|
||||||
|
this->Lock.Unlock();
|
||||||
|
return MySQLResult(query, query.query, mysql_error(this->sql));
|
||||||
|
}
|
||||||
|
|
||||||
if (this->CheckConnection() && !mysql_real_query(this->sql, real_query.c_str(), real_query.length()))
|
Anope::string real_query = this->BuildQuery(query);
|
||||||
|
if (!mysql_real_query(this->sql, real_query.c_str(), real_query.length()))
|
||||||
{
|
{
|
||||||
MYSQL_RES *res = mysql_store_result(this->sql);
|
MYSQL_RES *res = mysql_store_result(this->sql);
|
||||||
unsigned int id = mysql_insert_id(this->sql);
|
unsigned int id = mysql_insert_id(this->sql);
|
||||||
@@ -395,11 +400,11 @@ std::vector<Query> MySQLService::CreateTable(const Anope::string &table, const D
|
|||||||
|
|
||||||
query_text += ", `" + it->first + "` ";
|
query_text += ", `" + it->first + "` ";
|
||||||
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
||||||
query_text += "int(11)";
|
query_text += "int";
|
||||||
else
|
else
|
||||||
query_text += "text";
|
query_text += "text";
|
||||||
}
|
}
|
||||||
query_text += ", PRIMARY KEY (`id`), KEY `timestamp_idx` (`timestamp`))";
|
query_text += ", PRIMARY KEY (`id`), KEY `timestamp_idx` (`timestamp`)) ROW_FORMAT=DYNAMIC";
|
||||||
queries.push_back(query_text);
|
queries.push_back(query_text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -412,7 +417,7 @@ std::vector<Query> MySQLService::CreateTable(const Anope::string &table, const D
|
|||||||
|
|
||||||
Anope::string query_text = "ALTER TABLE `" + table + "` ADD `" + it->first + "` ";
|
Anope::string query_text = "ALTER TABLE `" + table + "` ADD `" + it->first + "` ";
|
||||||
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
if (data.GetType(it->first) == Serialize::Data::DT_INT)
|
||||||
query_text += "int(11)";
|
query_text += "int";
|
||||||
else
|
else
|
||||||
query_text += "text";
|
query_text += "text";
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class SQLOperResult : public SQL::Interface
|
|||||||
{
|
{
|
||||||
SQLOperResultDeleter d(this);
|
SQLOperResultDeleter d(this);
|
||||||
|
|
||||||
if (!user || !user->Account())
|
if (!user || !user->IsIdentified())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (r.Rows() == 0)
|
if (r.Rows() == 0)
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ void IRC2SQL::OnUserConnect(User *u, bool &exempt)
|
|||||||
query.SetValue("ident", u->GetIdent());
|
query.SetValue("ident", u->GetIdent());
|
||||||
query.SetValue("vident", u->GetVIdent());
|
query.SetValue("vident", u->GetVIdent());
|
||||||
query.SetValue("secure", u->HasMode("SSL") || u->HasExt("ssl") ? "Y" : "N");
|
query.SetValue("secure", u->HasMode("SSL") || u->HasExt("ssl") ? "Y" : "N");
|
||||||
query.SetValue("account", u->Account() ? u->Account()->display : "");
|
query.SetValue("account", u->IsIdentified() ? u->Account()->display : "");
|
||||||
query.SetValue("fingerprint", u->fingerprint);
|
query.SetValue("fingerprint", u->fingerprint);
|
||||||
query.SetValue("signon", u->signon);
|
query.SetValue("signon", u->signon);
|
||||||
query.SetValue("server", u->server->GetName());
|
query.SetValue("server", u->server->GetName());
|
||||||
@@ -176,7 +176,7 @@ void IRC2SQL::OnUserLogin(User *u)
|
|||||||
{
|
{
|
||||||
query = "UPDATE `" + prefix + "user` SET account=@account@ WHERE nick=@nick@";
|
query = "UPDATE `" + prefix + "user` SET account=@account@ WHERE nick=@nick@";
|
||||||
query.SetValue("nick", u->nick);
|
query.SetValue("nick", u->nick);
|
||||||
query.SetValue("account", u->Account() ? u->Account()->display : "");
|
query.SetValue("account", u->IsIdentified() ? u->Account()->display : "");
|
||||||
this->RunQuery(query);
|
this->RunQuery(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ class MChanstats : public Module
|
|||||||
|
|
||||||
const Anope::string GetDisplay(User *u)
|
const Anope::string GetDisplay(User *u)
|
||||||
{
|
{
|
||||||
if (u && u->Account() && ns_stats.HasExt(u->Account()))
|
if (u && u->IsIdentified() && ns_stats.HasExt(u->Account()))
|
||||||
return u->Account()->display;
|
return u->Account()->display;
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
@@ -277,8 +277,8 @@ class MChanstats : public Module
|
|||||||
"`chan` varchar(64) NOT NULL DEFAULT '',"
|
"`chan` varchar(64) NOT NULL DEFAULT '',"
|
||||||
"`nick` varchar(64) NOT NULL DEFAULT '',"
|
"`nick` varchar(64) NOT NULL DEFAULT '',"
|
||||||
"`type` ENUM('total', 'monthly', 'weekly', 'daily') NOT NULL,"
|
"`type` ENUM('total', 'monthly', 'weekly', 'daily') NOT NULL,"
|
||||||
"`letters` int(10) unsigned NOT NULL DEFAULT '0',"
|
"`letters` bigint unsigned NOT NULL DEFAULT '0',"
|
||||||
"`words` int(10) unsigned NOT NULL DEFAULT '0',"
|
"`words` bigint unsigned NOT NULL DEFAULT '0',"
|
||||||
"`line` int(10) unsigned NOT NULL DEFAULT '0',"
|
"`line` int(10) unsigned NOT NULL DEFAULT '0',"
|
||||||
"`actions` int(10) unsigned NOT NULL DEFAULT '0',"
|
"`actions` int(10) unsigned NOT NULL DEFAULT '0',"
|
||||||
"`smileys_happy` int(10) unsigned NOT NULL DEFAULT '0',"
|
"`smileys_happy` int(10) unsigned NOT NULL DEFAULT '0',"
|
||||||
@@ -527,7 +527,7 @@ class MChanstats : public Module
|
|||||||
|
|
||||||
void OnTopicUpdated(User *source, Channel *c, const Anope::string &user, const Anope::string &topic) anope_override
|
void OnTopicUpdated(User *source, Channel *c, const Anope::string &user, const Anope::string &topic) anope_override
|
||||||
{
|
{
|
||||||
if (!source || !source->Account() || !c->ci || !cs_stats.HasExt(c->ci))
|
if (!source || !source->IsIdentified() || !c->ci || !cs_stats.HasExt(c->ci))
|
||||||
return;
|
return;
|
||||||
query = "CALL " + prefix + "chanstats_proc_update(@channel@, @nick@, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);";
|
query = "CALL " + prefix + "chanstats_proc_update(@channel@, @nick@, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);";
|
||||||
query.SetValue("channel", c->name);
|
query.SetValue("channel", c->name);
|
||||||
@@ -550,7 +550,7 @@ class MChanstats : public Module
|
|||||||
private:
|
private:
|
||||||
void OnModeChange(Channel *c, User *u)
|
void OnModeChange(Channel *c, User *u)
|
||||||
{
|
{
|
||||||
if (!u || !u->Account() || !c->ci || !cs_stats.HasExt(c->ci))
|
if (!u || !u->IsIdentified() || !c->ci || !cs_stats.HasExt(c->ci))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
query = "CALL " + prefix + "chanstats_proc_update(@channel@, @nick@, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);";
|
query = "CALL " + prefix + "chanstats_proc_update(@channel@, @nick@, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);";
|
||||||
|
|||||||
+1
-1
@@ -167,7 +167,7 @@ class Fantasy : public Module
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Command requires registered users only
|
// Command requires registered users only
|
||||||
if (!cmd->AllowUnregistered() && !u->Account())
|
if (!cmd->AllowUnregistered() && !u->IsIdentified())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (params.size() < cmd->min_params)
|
if (params.size() < cmd->min_params)
|
||||||
|
|||||||
+1
-1
@@ -68,7 +68,7 @@ class DNSBLResolver : public Request
|
|||||||
if (!blacklist.replies.empty() && !reply)
|
if (!blacklist.replies.empty() && !reply)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (reply && reply->allow_account && user->Account())
|
if (reply && reply->allow_account && user->IsIdentified())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Anope::string reason = this->blacklist.reason, addr = user->ip.addr();
|
Anope::string reason = this->blacklist.reason, addr = user->ip.addr();
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ class MyXMLRPCEvent : public XMLRPCEvent
|
|||||||
request.reply("ip", u->ip.addr());
|
request.reply("ip", u->ip.addr());
|
||||||
request.reply("timestamp", stringify(u->timestamp));
|
request.reply("timestamp", stringify(u->timestamp));
|
||||||
request.reply("signon", stringify(u->signon));
|
request.reply("signon", stringify(u->signon));
|
||||||
if (u->Account())
|
if (u->IsIdentified())
|
||||||
{
|
{
|
||||||
request.reply("account", iface->Sanitize(u->Account()->display));
|
request.reply("account", iface->Sanitize(u->Account()->display));
|
||||||
if (u->Account()->o)
|
if (u->Account()->o)
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ namespace InspIRCdExtban
|
|||||||
{
|
{
|
||||||
const Anope::string &mask = e->GetMask();
|
const Anope::string &mask = e->GetMask();
|
||||||
Anope::string real_mask = mask.substr(2);
|
Anope::string real_mask = mask.substr(2);
|
||||||
return !u->Account() && Entry("BAN", real_mask).Matches(u);
|
return !u->IsIdentified() && Entry("BAN", real_mask).Matches(u);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -394,9 +394,12 @@ class InspIRCd3Proto : public IRCDProto
|
|||||||
SendAddLine("Z", x->GetHost(), timeleft, x->by, x->GetReason());
|
SendAddLine("Z", x->GetHost(), timeleft, x->by, x->GetReason());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &other) anope_override
|
void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &key) anope_override
|
||||||
{
|
{
|
||||||
UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan;
|
if (key.empty())
|
||||||
|
UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan;
|
||||||
|
else
|
||||||
|
UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan << " :" << key;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string ¶m) anope_override
|
void SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string ¶m) anope_override
|
||||||
@@ -442,6 +445,7 @@ class InspIRCd3Proto : public IRCDProto
|
|||||||
if (na->nc->HasExt("UNCONFIRMED"))
|
if (na->nc->HasExt("UNCONFIRMED"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
IRCD->SendVhost(u, na->GetVhostIdent(), na->GetVhostHost());
|
||||||
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountid :" << na->nc->GetId();
|
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountid :" << na->nc->GetId();
|
||||||
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountname :" << na->nc->display;
|
UplinkSocket::Message(Me) << "METADATA " << u->GetUID() << " accountname :" << na->nc->display;
|
||||||
}
|
}
|
||||||
@@ -695,7 +699,7 @@ namespace InspIRCdExtban
|
|||||||
{
|
{
|
||||||
const Anope::string &mask = e->GetMask();
|
const Anope::string &mask = e->GetMask();
|
||||||
Anope::string real_mask = mask.substr(2);
|
Anope::string real_mask = mask.substr(2);
|
||||||
return !u->Account() && Entry("BAN", real_mask).Matches(u);
|
return !u->IsIdentified() && Entry("BAN", real_mask).Matches(u);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1682,7 +1686,7 @@ struct IRCDMessageIJoin : IRCDMessage
|
|||||||
time_t chants = Anope::CurTime;
|
time_t chants = Anope::CurTime;
|
||||||
if (params.size() >= 4)
|
if (params.size() >= 4)
|
||||||
{
|
{
|
||||||
chants = params[2].is_pos_number_only() ? convertTo<unsigned>(params[2]) : 0;
|
chants = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0;
|
||||||
for (unsigned i = 0; i < params[3].length(); ++i)
|
for (unsigned i = 0; i < params[3].length(); ++i)
|
||||||
user.first.AddMode(params[3][i]);
|
user.first.AddMode(params[3][i]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -537,7 +537,7 @@ namespace UnrealExtban
|
|||||||
const Anope::string &mask = e->GetMask();
|
const Anope::string &mask = e->GetMask();
|
||||||
Anope::string real_mask = mask.substr(3);
|
Anope::string real_mask = mask.substr(3);
|
||||||
|
|
||||||
return u->Account() && Anope::Match(u->Account()->display, real_mask);
|
return u->IsIdentified() && Anope::Match(u->Account()->display, real_mask);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -559,10 +559,10 @@ namespace UnrealExtban
|
|||||||
const Anope::string &mask = e->GetMask();
|
const Anope::string &mask = e->GetMask();
|
||||||
Anope::string real_mask = mask.substr(3);
|
Anope::string real_mask = mask.substr(3);
|
||||||
|
|
||||||
if (real_mask == "0" && !u->Account()) /* ~a:0 is special and matches all unauthenticated users */
|
if (real_mask == "0" && !u->IsIdentified()) /* ~a:0 is special and matches all unauthenticated users */
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return u->Account() && Anope::Match(u->Account()->display, real_mask);
|
return u->IsIdentified() && Anope::Match(u->Account()->display, real_mask);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -378,8 +378,11 @@ class ChanServCore : public Module, public ChanServService
|
|||||||
return EVENT_CONTINUE;
|
return EVENT_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnPostInit() anope_override
|
void OnUplinkSync(Server* s) anope_override
|
||||||
{
|
{
|
||||||
|
// We need to do this when the uplink is synced as we may not know if
|
||||||
|
// the mode exists before then on some IRCds (e.g. InspIRCd).
|
||||||
|
|
||||||
if (!persist)
|
if (!persist)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class MemoServCore : public Module, public MemoServService
|
|||||||
bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m)
|
bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m)
|
||||||
{
|
{
|
||||||
Anope::string subject = Language::Translate(nc, Config->GetBlock("mail")->Get<const Anope::string>("memo_subject").c_str()),
|
Anope::string subject = Language::Translate(nc, Config->GetBlock("mail")->Get<const Anope::string>("memo_subject").c_str()),
|
||||||
message = Language::Translate(Config->GetBlock("mail")->Get<const Anope::string>("memo_message").c_str());
|
message = Language::Translate(nc, Config->GetBlock("mail")->Get<const Anope::string>("memo_message").c_str());
|
||||||
|
|
||||||
subject = subject.replace_all_cs("%n", nc->display);
|
subject = subject.replace_all_cs("%n", nc->display);
|
||||||
subject = subject.replace_all_cs("%s", m->sender);
|
subject = subject.replace_all_cs("%s", m->sender);
|
||||||
@@ -100,7 +100,7 @@ class MemoServCore : public Module, public MemoServService
|
|||||||
|
|
||||||
if (ci->AccessFor(cu->user).HasPriv("MEMO"))
|
if (ci->AccessFor(cu->user).HasPriv("MEMO"))
|
||||||
{
|
{
|
||||||
if (cu->user->Account() && cu->user->Account()->HasExt("MEMO_RECEIVE"))
|
if (cu->user->IsIdentified() && cu->user->Account()->HasExt("MEMO_RECEIVE"))
|
||||||
cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, ci->name.c_str(), Config->StrictPrivmsg.c_str(), MemoServ->nick.c_str(), ci->name.c_str(), mi->memos->size());
|
cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, ci->name.c_str(), Config->StrictPrivmsg.c_str(), MemoServ->nick.c_str(), ci->name.c_str(), mi->memos->size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -399,7 +399,7 @@ class NickServCore : public Module, public NickServService
|
|||||||
const NickAlias *na = NickAlias::Find(u->nick);
|
const NickAlias *na = NickAlias::Find(u->nick);
|
||||||
|
|
||||||
const Anope::string &unregistered_notice = Config->GetModule(this)->Get<const Anope::string>("unregistered_notice");
|
const Anope::string &unregistered_notice = Config->GetModule(this)->Get<const Anope::string>("unregistered_notice");
|
||||||
if (!Config->GetModule("nickserv")->Get<bool>("nonicknameownership") && !unregistered_notice.empty() && !na && !u->Account())
|
if (!Config->GetModule("nickserv")->Get<bool>("nonicknameownership") && !unregistered_notice.empty() && !na && !u->IsIdentified())
|
||||||
u->SendMessage(NickServ, unregistered_notice.replace_all_cs("%n", u->nick));
|
u->SendMessage(NickServ, unregistered_notice.replace_all_cs("%n", u->nick));
|
||||||
else if (na && !u->IsIdentified(true))
|
else if (na && !u->IsIdentified(true))
|
||||||
this->Validate(u);
|
this->Validate(u);
|
||||||
|
|||||||
@@ -174,7 +174,6 @@ Conf::Conf() : Block("")
|
|||||||
ValidateNotEmpty("serverinfo", "motd", serverinfo->Get<const Anope::string>("motd"));
|
ValidateNotEmpty("serverinfo", "motd", serverinfo->Get<const Anope::string>("motd"));
|
||||||
|
|
||||||
ValidateNotZero("options", "readtimeout", options->Get<time_t>("readtimeout"));
|
ValidateNotZero("options", "readtimeout", options->Get<time_t>("readtimeout"));
|
||||||
ValidateNotZero("options", "warningtimeout", options->Get<time_t>("warningtimeout"));
|
|
||||||
|
|
||||||
ValidateNotZero("networkinfo", "nicklen", networkinfo->Get<unsigned>("nicklen"));
|
ValidateNotZero("networkinfo", "nicklen", networkinfo->Get<unsigned>("nicklen"));
|
||||||
ValidateNotZero("networkinfo", "userlen", networkinfo->Get<unsigned>("userlen"));
|
ValidateNotZero("networkinfo", "userlen", networkinfo->Get<unsigned>("userlen"));
|
||||||
|
|||||||
+2
-2
@@ -329,7 +329,7 @@ void Anope::Init(int ac, char **av)
|
|||||||
Log(LOG_TERMINAL) << "-v, --version";
|
Log(LOG_TERMINAL) << "-v, --version";
|
||||||
Log(LOG_TERMINAL) << "";
|
Log(LOG_TERMINAL) << "";
|
||||||
Log(LOG_TERMINAL) << "Further support is available from https://www.anope.org/";
|
Log(LOG_TERMINAL) << "Further support is available from https://www.anope.org/";
|
||||||
Log(LOG_TERMINAL) << "Or visit us on IRC at irc.anope.org #anope";
|
Log(LOG_TERMINAL) << "Or visit us on IRC at irc.teranova.net #anope";
|
||||||
throw CoreException();
|
throw CoreException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,7 +482,7 @@ void Anope::Init(int ac, char **av)
|
|||||||
Log(LOG_TERMINAL) << "*** Support resources: Read through the services.conf self-contained";
|
Log(LOG_TERMINAL) << "*** Support resources: Read through the services.conf self-contained";
|
||||||
Log(LOG_TERMINAL) << "*** documentation. Read the documentation files found in the 'docs'";
|
Log(LOG_TERMINAL) << "*** documentation. Read the documentation files found in the 'docs'";
|
||||||
Log(LOG_TERMINAL) << "*** folder. Visit our portal located at https://www.anope.org/. Join";
|
Log(LOG_TERMINAL) << "*** folder. Visit our portal located at https://www.anope.org/. Join";
|
||||||
Log(LOG_TERMINAL) << "*** our support channel on /server irc.anope.org channel #anope.";
|
Log(LOG_TERMINAL) << "*** our support channel on /server irc.teranova.net channel #anope.";
|
||||||
throw CoreException("Configuration file failed to validate");
|
throw CoreException("Configuration file failed to validate");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -62,7 +62,7 @@ const char *Language::Translate(const char *string)
|
|||||||
|
|
||||||
const char *Language::Translate(User *u, const char *string)
|
const char *Language::Translate(User *u, const char *string)
|
||||||
{
|
{
|
||||||
if (u && u->Account())
|
if (u && u->IsIdentified())
|
||||||
return Translate(u->Account(), string);
|
return Translate(u->Account(), string);
|
||||||
else
|
else
|
||||||
return Translate("", string);
|
return Translate("", string);
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ void Mail::Message::Run()
|
|||||||
if (this->dont_quote_addresses)
|
if (this->dont_quote_addresses)
|
||||||
fprintf(pipe, "To: %s <%s>\r\n", mail_to.c_str(), addr.c_str());
|
fprintf(pipe, "To: %s <%s>\r\n", mail_to.c_str(), addr.c_str());
|
||||||
else
|
else
|
||||||
fprintf(pipe, "To: \"%s\" <%s>\r\n", mail_to.c_str(), addr.c_str());
|
fprintf(pipe, "To: \"%s\" <%s>\r\n", mail_to.replace_all_cs("\\", "\\\\").c_str(), addr.c_str());
|
||||||
fprintf(pipe, "Subject: %s\r\n", subject.c_str());
|
fprintf(pipe, "Subject: %s\r\n", subject.c_str());
|
||||||
fprintf(pipe, "Content-Type: %s\r\n", content_type.c_str());
|
fprintf(pipe, "Content-Type: %s\r\n", content_type.c_str());
|
||||||
fprintf(pipe, "Content-Transfer-Encoding: 8bit\r\n");
|
fprintf(pipe, "Content-Transfer-Encoding: 8bit\r\n");
|
||||||
|
|||||||
+1
-1
@@ -114,7 +114,7 @@ void MemoInfo::Del(unsigned index)
|
|||||||
bool MemoInfo::HasIgnore(User *u)
|
bool MemoInfo::HasIgnore(User *u)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < this->ignores.size(); ++i)
|
for (unsigned i = 0; i < this->ignores.size(); ++i)
|
||||||
if (u->nick.equals_ci(this->ignores[i]) || (u->Account() && u->Account()->display.equals_ci(this->ignores[i])) || Anope::Match(u->GetMask(), Anope::string(this->ignores[i])))
|
if (u->nick.equals_ci(this->ignores[i]) || (u->IsIdentified() && u->Account()->display.equals_ci(this->ignores[i])) || Anope::Match(u->GetMask(), Anope::string(this->ignores[i])))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ die="yes"
|
|||||||
###########################
|
###########################
|
||||||
|
|
||||||
# The GeoIP data is created by MaxMind, available from www.maxmind.com.
|
# The GeoIP data is created by MaxMind, available from www.maxmind.com.
|
||||||
geoip_country_source="https://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip"
|
geoip_country_source="https://mirrors-cdn.liferay.com/geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip"
|
||||||
geoip_city_source="https://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip"
|
geoip_city_source="https://mirrors-cdn.liferay.com/geolite.maxmind.com/download/geoip/database/GeoLiteCity-latest.tar.xz"
|
||||||
geoip_region_source="https://www.maxmind.com/download/geoip/misc/region_codes.csv"
|
geoip_region_source="https://www.maxmind.com/download/geoip/misc/region_codes.csv"
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
@@ -65,17 +65,17 @@ elif test $geoip_database = "city"; then
|
|||||||
download "$geoip_city_source" "City Database:"
|
download "$geoip_city_source" "City Database:"
|
||||||
download "$geoip_region_source" "Region Database:"
|
download "$geoip_region_source" "Region Database:"
|
||||||
echo "Unpacking..."
|
echo "Unpacking..."
|
||||||
unzip -jo GeoLiteCity-latest.zip
|
tar -xf GeoLiteCity-latest.tar.xz --strip-components 1
|
||||||
rm GeoLiteCity-latest.zip
|
rm GeoLiteCity-latest.tar.xz
|
||||||
echo "Converting to utf-8..."
|
echo "Converting to utf-8..."
|
||||||
iconv -f ISO-8859-1 -t UTF-8 GeoLiteCity-Blocks.csv -o $prefix"geoip_city_blocks.csv"
|
iconv -f ISO-8859-1 -t UTF-8 GeoLiteCity-Blocks.csv -o $prefix"geoip_city_blocks.csv"
|
||||||
iconv -f ISO-8859-1 -t UTF-8 GeoLiteCity-Location.csv -o $prefix"geoip_city_location.csv"
|
iconv -f ISO-8859-1 -t UTF-8 GeoLiteCity-Location.csv -o $prefix"geoip_city_location.csv"
|
||||||
iconv -f ISO-8859-1 -t UTF-8 region.csv -o $prefix"geoip_city_region.csv"
|
iconv -f ISO-8859-1 -t UTF-8 region_codes.csv -o $prefix"geoip_city_region.csv"
|
||||||
rm GeoLiteCity-Blocks.csv GeoLiteCity-Location.csv region.csv
|
rm GeoLiteCity-Blocks.csv GeoLiteCity-Location.csv region_codes.csv
|
||||||
echo "Importing..."
|
echo "Importing..."
|
||||||
mysqlimport --columns=start,end,locID --ignore-lines=2 $PARAMS $prefix"geoip_city_blocks.csv"
|
mysqlimport --columns=start,end,locID --ignore-lines=2 $PARAMS $prefix"geoip_city_blocks.csv"
|
||||||
mysqlimport --columns=locID,country,region,city,@x,latitude,longitude,@x,areaCode --ignore-lines=2 $PARAMS $prefix"geoip_city_location.csv"
|
mysqlimport --columns=locID,country,region,city,@x,latitude,longitude,@x,areaCode --ignore-lines=2 $PARAMS $prefix"geoip_city_location.csv"
|
||||||
mysqlimport --columns=country,region,regionname $PARAMS $prefix"geoip_city_region.csv"
|
mysqlimport --columns=country,region,regionname $PARAMS $prefix"geoip_city_region.csv"
|
||||||
rm $prefix"geoip_city_blocks.csv" $prefix"geoip_city_location.csv" $prefix"geoip_city_region.csv" $prefix"geoip_country6.csv"
|
rm $prefix"geoip_city_blocks.csv" $prefix"geoip_city_location.csv" $prefix"geoip_city_region.csv"
|
||||||
echo "Done..."
|
echo "Done..."
|
||||||
fi
|
fi
|
||||||
|
|||||||
+2
-2
@@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
VERSION_MAJOR=2
|
VERSION_MAJOR=2
|
||||||
VERSION_MINOR=0
|
VERSION_MINOR=0
|
||||||
VERSION_PATCH=16
|
VERSION_PATCH=17
|
||||||
VERSION_EXTRA="-git"
|
VERSION_EXTRA=""
|
||||||
|
|||||||
Reference in New Issue
Block a user