Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Module request: /nick that preserves prefix #258

Open
Kagee opened this issue Apr 28, 2021 · 3 comments
Open

Module request: /nick that preserves prefix #258

Kagee opened this issue Apr 28, 2021 · 3 comments

Comments

@Kagee
Copy link

Kagee commented Apr 28, 2021

I asked this on #inspircd and it was suggested that i post a request here:

We limit users to a specific nick prefix (Foo-Nick) by using the sqlauth module and then by disabling the /NICK command so users can't change nicks (and thus prefix) after join. Is it possible to write a module that would allow nick change via /NICK if the nick retains the same prefix, either wrapping or overriding the /NICK command.

@SadieCat
Copy link
Member

SadieCat commented Apr 29, 2021

How are you requiring the prefix? with <sqlauth:allowpattern>?

@Kagee
Copy link
Author

Kagee commented Apr 30, 2021

Sorry for the late reply, no, we do not use allowpattern.
<sqlauth dbid="userdb" query="SELECT nickmask FROM users WHERE '$nick' LIKE nickmask ESCAPE '\\' AND password='$sha256pass' LIMIT 1">

Where the table is as follows

CREATE TABLE users (id integer PRIMARY KEY, nickmask varchar(60), password varchar(256), last_updated datetime DEFAULT CURRENT_TIMESTAMP);
INSERT INTO "users" VALUES(1,'SomeTeam-_%','<some hash>','2017-10-30 10:17:46');

Thus users that has a nick prefix of "SomeTeam-" can login with the password for that prefix.

We are currently on Inspircd 2, but moving to 3 these days.

@Kagee
Copy link
Author

Kagee commented Aug 29, 2021

I wrote this as a solution to my own problem, i would love any feedback on my module- or C++-skills 😄

/*
 * InspIRCd -- Internet Relay Chat Daemon
 *
 *   Copyright (C) 2021 Anders Einar Hilden <hildenae@gmail.com>
 *
 * This file is part of InspIRCd.  InspIRCd 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, version 2.
 *
 * 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, see <http://www.gnu.org/licenses/>.
 */

/// $ModAuthor: Anders Einar Hilden
/// $ModAuthorMail: hildenae@gmail.com
/// $ModConfig: <nicklockprefix separator="-">
/// $ModDepends: core 3
/// $ModDesc: Block nick changes that would change a users nick prefix.
//      Prefix is defined as everything before the first separator.

#include "inspircd.h"

class ModuleNickLockPrefix : public Module {
  std::string separator;

public:
  ModResult OnUserPreNick(LocalUser *user,
                          const std::string &newnick) CXX11_OVERRIDE {

    if ((IS_LOCAL(user)) && (user->nick != user->uuid)) {
      std::size_t sepold = user->nick.find(separator);
      std::size_t sepnew = newnick.find(separator);
      std::string prefix = user->nick.substr(0, sepold + 1);

      // changing nick to Prefix- or shorter
      if (newnick.length() <= sepold + 1 ||
          // changing to another prefix
          newnick.compare(0, sepnew, user->nick, 0, sepold) != 0) {

        ServerInstance->Logs->Log(
            MODNAME, LOG_DEFAULT,
            InspIRCd::Format("User %s was prevented from changing nick to %s",
                             user->nick.c_str(), newnick.c_str()));

        user->WriteNotice(InspIRCd::Format(
            "*** You are not allowed to change your nick to %s, your new nick "
            "must start with %s",
            newnick.c_str(), prefix.c_str()));
        return MOD_RES_DENY;
      }
    }
    return MOD_RES_PASSTHRU;
  }

  void ReadConfig(ConfigStatus &) CXX11_OVERRIDE {
    ConfigTag *tag = ServerInstance->Config->ConfValue("nicklockprefix");
    separator = tag->getString("separator", "-");
  }

  Version GetVersion() CXX11_OVERRIDE {
    return Version("Block nick changes that would change a users nick prefix");
  }
};

MODULE_INIT(ModuleNickLockPrefix)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

2 participants