diff options
author | Robby- <robby@chat.be> | 2013-09-29 05:02:22 +0200 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-09-29 15:42:22 -0400 |
commit | 32a57150ecddc75b1bfd2efc185575b76431cbff (patch) | |
tree | b1c99df49444ee138578432cd213fec6c0135406 /modules/commands/ns_cert.cpp | |
parent | 2a5e8f1890ecc3a390d814cf24cbc9451a938840 (diff) |
ns_access: Allow LIST by Services Operators on suspended nicks. Change wording.
ns_ajoin: Fix the number of command parameters. Check for nick suspension. Do not allow just any Services Operator to access other users' AJOIN, require nickserv/ajoin. Change wording.
ns_cert: Add ability for Services Operators to modify other users' certificate lists.
Diffstat (limited to 'modules/commands/ns_cert.cpp')
-rw-r--r-- | modules/commands/ns_cert.cpp | 118 |
1 files changed, 51 insertions, 67 deletions
diff --git a/modules/commands/ns_cert.cpp b/modules/commands/ns_cert.cpp index a4a335fa0..5bb3487b1 100644 --- a/modules/commands/ns_cert.cpp +++ b/modules/commands/ns_cert.cpp @@ -134,48 +134,13 @@ struct NSCertListImpl : NSCertList class CommandNSCert : public Command { private: - void DoServAdminList(CommandSource &source, const NickCore *nc) - { - NSCertList *cl = nc->GetExt<NSCertList>("certificates"); - - if (!cl || !cl->GetCertCount()) - { - source.Reply(_("Certificate list for \002%s\002 is empty."), nc->display.c_str()); - return; - } - - if (nc->HasExt("NS_SUSPENDED")) - { - source.Reply(NICK_X_SUSPENDED, nc->display.c_str()); - return; - } - - ListFormatter list(source.GetAccount()); - list.AddColumn(_("Certificate")); - - for (unsigned i = 0; i < cl->GetCertCount(); ++i) - { - const Anope::string &fingerprint = cl->GetCert(i); - ListFormatter::ListEntry entry; - entry["Certificate"] = fingerprint; - list.AddEntry(entry); - } - - source.Reply(_("Certificate list for \002%s\002:"), nc->display.c_str()); - - std::vector<Anope::string> replies; - list.Process(replies); - for (unsigned i = 0; i < replies.size(); ++i) - source.Reply(replies[i]); - } - void DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask) { NSCertList *cl = nc->Require<NSCertList>("certificates"); if (cl->GetCertCount() >= Config->GetModule(this->owner)->Get<unsigned>("accessmax")) { - source.Reply(_("Sorry, you can only have %d certificate entries for a nickname."), Config->GetModule(this->owner)->Get<unsigned>("accessmax")); + source.Reply(_("Sorry, the maximum of %d certificate entries has been reached."), Config->GetModule(this->owner)->Get<unsigned>("accessmax")); return; } @@ -194,12 +159,12 @@ class CommandNSCert : public Command if (cl->FindCert(mask)) { - source.Reply(_("Fingerprint \002%s\002 already present on your certificate list."), mask.c_str()); + source.Reply(_("Fingerprint \002%s\002 already present on %s's certificate list."), mask.c_str(), nc->display.c_str()); return; } cl->AddCert(mask); - source.Reply(_("\002%s\002 added to your certificate list."), mask.c_str()); + source.Reply(_("\002%s\002 added to %s's certificate list."), mask.c_str(), nc->display.c_str()); } void DoDel(CommandSource &source, NickCore *nc, const Anope::string &mask) @@ -221,11 +186,11 @@ class CommandNSCert : public Command if (!cl->FindCert(mask)) { - source.Reply(_("\002%s\002 not found on your certificate list."), mask.c_str()); + source.Reply(_("\002%s\002 not found on %s's certificate list."), mask.c_str(), nc->display.c_str()); return; } - source.Reply(_("\002%s\002 deleted from your certificate list."), mask.c_str()); + source.Reply(_("\002%s\002 deleted from %s's certificate list."), mask.c_str(), nc->display.c_str()); cl->EraseCert(mask); cl->Check(); } @@ -236,51 +201,69 @@ class CommandNSCert : public Command if (!cl || !cl->GetCertCount()) { - source.Reply(_("Your certificate list is empty.")); + source.Reply(_("%s's certificate list is empty."), nc->display.c_str()); return; } - ListFormatter list(source.GetAccount()); - list.AddColumn(_("Certificate")); - + source.Reply(_("Certificate list for %s:"), nc->display.c_str()); for (unsigned i = 0; i < cl->GetCertCount(); ++i) { - ListFormatter::ListEntry entry; - entry["Certificate"] = cl->GetCert(i); - list.AddEntry(entry); + Anope::string fingerprint = cl->GetCert(i); + source.Reply(" %s", fingerprint.c_str()); } - - source.Reply(_("Certificate list:")); - std::vector<Anope::string> replies; - list.Process(replies); - for (unsigned i = 0; i < replies.size(); ++i) - source.Reply(replies[i]); } public: - CommandNSCert(Module *creator) : Command(creator, "nickserv/cert", 1, 2) + CommandNSCert(Module *creator) : Command(creator, "nickserv/cert", 1, 3) { this->SetDesc(_("Modify the nickname client certificate list")); - this->SetSyntax(_("ADD \037fingerprint\037")); - this->SetSyntax(_("DEL \037fingerprint\037")); - this->SetSyntax("LIST"); + this->SetSyntax(_("ADD [\037nickname\037] \037fingerprint\037")); + this->SetSyntax(_("DEL [\037nickname\037] \037fingerprint\037")); + this->SetSyntax(_("LIST [\037nickname\037]")); } void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { const Anope::string &cmd = params[0]; - const Anope::string &mask = params.size() > 1 ? params[1] : ""; + Anope::string nick, mask; - const NickAlias *na; - if (cmd.equals_ci("LIST") && source.IsServicesOper() && !mask.empty() && (na = NickAlias::Find(mask))) - return this->DoServAdminList(source, na->nc); + if (cmd.equals_ci("LIST")) + nick = params.size() > 1 ? params[1] : ""; + else + { + nick = params.size() == 3 ? params[1] : ""; + mask = params.size() > 1 ? params[params.size() - 1] : ""; + } - NickCore *nc = source.nc; + NickCore *nc; + if (!nick.empty()) + { + const NickAlias *na = NickAlias::Find(nick); + if (na == NULL) + { + source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); + return; + } + else if (na->nc != source.GetAccount() && !source.HasPriv("nickserv/access")) + { + source.Reply(ACCESS_DENIED); + return; + } + else if (Config->GetModule("nickserv")->Get<bool>("secureadmins", "yes") && source.GetAccount() != na->nc && na->nc->IsServicesOper() && !cmd.equals_ci("LIST")) + { + source.Reply(_("You may view but not modify the certificate list of other Services Operators.")); + return; + } - if (source.nc->HasExt("NS_SUSPENDED")) - source.Reply(NICK_X_SUSPENDED, source.nc->display.c_str()); - else if (cmd.equals_ci("LIST")) + nc = na->nc; + } + else + nc = source.nc; + + if (cmd.equals_ci("LIST")) return this->DoList(source, nc); + else if (nc->HasExt("NS_SUSPENDED")) + source.Reply(NICK_X_SUSPENDED, nc->display.c_str()); else if (Anope::ReadOnly) source.Reply(READ_ONLY_MODE); else if (cmd.equals_ci("ADD")) @@ -288,7 +271,7 @@ class CommandNSCert : public Command else if (cmd.equals_ci("DEL")) return this->DoDel(source, nc, mask); else - this->OnSyntaxError(source, cmd); + this->OnSyntaxError(source, ""); } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override @@ -298,7 +281,8 @@ class CommandNSCert : public Command source.Reply(_("Modifies or displays the certificate list for your nick.\n" "If you connect to IRC and provide a client certificate with a\n" "matching fingerprint in the cert list, your nick will be\n" - "automatically identified to services.\n" + "automatically identified to services. Services Operators\n" + "may provide a nick to modify other users' certificate lists.\n" " \n")); source.Reply(_("Examples:\n" " \n" |