globops + autodrop: /GLOBOPS oper broadcast and pre-registration scanner drop
This commit is contained in:
parent
ab4d87488b
commit
512185d6df
4 changed files with 89 additions and 0 deletions
|
|
@ -120,6 +120,11 @@ amu_target = both
|
|||
# --- chanlog (m_chanlog): mirror the oper server-notice stream into a channel so
|
||||
# staff can watch it in a normal window. Set the channel (create/keep it opped):
|
||||
# chanlog = #snotices
|
||||
# --- globops (m_globops): no config — adds the oper command /GLOBOPS <message>,
|
||||
# broadcasting to all opers (like the server-notice stream).
|
||||
# --- autodrop (m_autodrop): silently drop a not-yet-registered client that sends
|
||||
# any of these commands (HTTP scanners blurt GET/POST before NICK/USER):
|
||||
# autodrop_commands = GET POST HEAD CONNECT PUT DELETE OPTIONS TRACE PATCH
|
||||
# --- hidelist (m_hidelist): list modes (+b/+e/+I/…) are viewable by members by
|
||||
# default; this restricts a given list to a minimum rank. Repeatable,
|
||||
# `hidelist = <modechar> <rank>` (rank: owner|admin|op|halfop|voice). Opers see
|
||||
|
|
|
|||
45
src/modules/autodrop.rs
Normal file
45
src/modules/autodrop.rs
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
//! autodrop — silently drop a not-yet-registered client that sends one of the
|
||||
//! configured commands. HTTP scanners and other junk open a connection and blurt
|
||||
//! `GET` / `POST` / `CONNECT` before ever sending NICK/USER; a real IRC client
|
||||
//! never does. Config, space-separated (repeatable):
|
||||
//!
|
||||
//! ```text
|
||||
//! autodrop_commands = GET POST HEAD CONNECT PUT DELETE OPTIONS TRACE PATCH
|
||||
//! ```
|
||||
//!
|
||||
//! Reference: InspIRCd's `m_autodrop`. Original native Rust.
|
||||
|
||||
use crate::module::{ModResult, Module};
|
||||
use crate::server::Server;
|
||||
use crate::Uid;
|
||||
|
||||
pub struct AutoDrop;
|
||||
|
||||
impl Module for AutoDrop {
|
||||
fn name(&self) -> &'static str {
|
||||
"autodrop"
|
||||
}
|
||||
|
||||
fn on_pre_command(
|
||||
&mut self,
|
||||
s: &mut Server,
|
||||
uid: Uid,
|
||||
cmd: &str,
|
||||
_params: &[String],
|
||||
) -> ModResult {
|
||||
// only before registration — a registered client's commands are its own
|
||||
if s.users.get(&uid).map(|u| u.registered).unwrap_or(true) {
|
||||
return ModResult::Passthru;
|
||||
}
|
||||
let hit = s
|
||||
.conf_all("autodrop_commands")
|
||||
.iter()
|
||||
.any(|line| line.split_whitespace().any(|w| w.eq_ignore_ascii_case(cmd)));
|
||||
if hit {
|
||||
s.send(uid, "ERROR :Closing link (dropped)".to_string());
|
||||
s.remove_user(uid, "Autodropped");
|
||||
return ModResult::Deny;
|
||||
}
|
||||
ModResult::Passthru
|
||||
}
|
||||
}
|
||||
35
src/modules/globops.rs
Normal file
35
src/modules/globops.rs
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
//! globops — `GLOBOPS <message>` lets an oper send a message to all opers (the
|
||||
//! server-notice stream, echoIRCd's equivalent of InspIRCd's `+g` snomask).
|
||||
//! Reference: InspIRCd's `m_globops`. Original native Rust.
|
||||
|
||||
use crate::command::{CmdResult, Command};
|
||||
use crate::numeric::ERR_NOPRIVILEGES;
|
||||
use crate::server::Server;
|
||||
use crate::Uid;
|
||||
|
||||
pub fn commands() -> Vec<Box<dyn Command>> {
|
||||
vec![Box::new(GlobopsCmd)]
|
||||
}
|
||||
|
||||
struct GlobopsCmd;
|
||||
impl Command for GlobopsCmd {
|
||||
fn name(&self) -> &'static str {
|
||||
"GLOBOPS"
|
||||
}
|
||||
fn min_params(&self) -> usize {
|
||||
1
|
||||
}
|
||||
fn handle(&self, s: &mut Server, uid: Uid, params: &[String]) -> CmdResult {
|
||||
if !s.is_oper(uid) {
|
||||
s.numeric(
|
||||
uid,
|
||||
ERR_NOPRIVILEGES,
|
||||
":Permission Denied- You're not an IRC operator",
|
||||
);
|
||||
return CmdResult::Fail;
|
||||
}
|
||||
let nick = s.users.get(&uid).map(|u| u.nick.clone()).unwrap_or_default();
|
||||
s.snotice(&format!("GLOBOPS from {nick}: {}", params.join(" ")));
|
||||
CmdResult::Ok
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@
|
|||
pub mod account_registration;
|
||||
pub mod antimixedutf8;
|
||||
pub mod antirandom;
|
||||
pub mod autodrop;
|
||||
pub mod autoop;
|
||||
pub mod banredirect;
|
||||
pub mod blockamsg;
|
||||
|
|
@ -29,6 +30,7 @@ pub mod filehost;
|
|||
pub mod filter;
|
||||
pub mod flood;
|
||||
pub mod geoip;
|
||||
pub mod globops;
|
||||
pub mod hashident;
|
||||
pub mod hidelist;
|
||||
pub mod hidewhois;
|
||||
|
|
@ -93,6 +95,7 @@ pub fn default_modules() -> Vec<Box<dyn Module>> {
|
|||
Box::new(dccallow::DccAllow),
|
||||
Box::new(solvemsg::SolveMsg),
|
||||
Box::new(autoop::AutoOp),
|
||||
Box::new(autodrop::AutoDrop),
|
||||
]
|
||||
}
|
||||
|
||||
|
|
@ -127,5 +130,6 @@ pub fn module_commands() -> Vec<Box<dyn Command>> {
|
|||
.chain(customtitle::commands())
|
||||
.chain(dccallow::commands())
|
||||
.chain(geoip::commands())
|
||||
.chain(globops::commands())
|
||||
.collect()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue