Commits

jdhore committed 65db6ca

Actually add +p umode and expiry code. It currently does nothing though.

  • Participants
  • Parent commits 0d7b5f2

Comments (0)

Files changed (9)

File help/opers/umode

        * +l     - Can see oper locops (local wallops).
        * +s     - Can see server notices (see /quote help snomask).
        * +z     - Can see operwalls.
+	   * +p		- Override -- implicit operator access in all channels.
          +B     - Marks you as a bot in /whois.
          +C     - Prevents you from receiving CTCPs other than ACTION.
          +D     - Deaf - ignores all channel messages.

File include/channel.h

 	unsigned int flags;
 
 	unsigned long bants;
+	unsigned long override_ts;
 };
 
 #define BANLEN 195
 	int caps;
 	int nocaps;
 	int mems;
+	int override;
 	struct Client *client;
 };
 
 #define MODE_FREEINVITE 0x0800  /* allow free use of /invite */
 #define MODE_FREETARGET 0x1000  /* can be forwarded to without authorization */
 #define MODE_DISFORWARD 0x2000  /* disable channel forwarding */
+#define MODE_NOOPERKICK 0x4000  /* disallow kicking opers aka immune */
 #define MODE_NOCTCP     0x8000  /* Block CTCPs directed to this channel */
 #define MODE_NONOTICE	0x16000	/* Block notices directed to this channel */
 #define MODE_NOACTION	0x32000 /* Block CTCP ACTION directed to this channel */
 
 /* channel visible */
 #define ShowChannel(v,c)        (PubChannel(c) || IsMember((v),(c)))
+/* user visible in channel */
+#define ShowInChannel(v,t,c)    ((PubChannel(c) && !IsInvisible(t)) || IsMember((v),(c)))
 
 #define IsMember(who, chan) ((who && who->user && \
                 find_channel_membership(chan, who)) ? 1 : 0)

File include/chmode.h

 extern void chm_ban(struct Client *source_p, struct Channel *chptr,
 	   int alevel, int parc, int *parn,
 	   const char **parv, int *errors, int dir, char c, long mode_type);
+extern void chm_hidden(struct Client *source_p, struct Channel *chptr,
+       int alevel, int parc, int *parn,
+       const char **parv, int *errors, int dir, char c, long mode_type);
 extern void chm_staff(struct Client *source_p, struct Channel *chptr,
 	   int alevel, int parc, int *parn,
 	   const char **parv, int *errors, int dir, char c, long mode_type);

File include/client.h

 	struct ev_entry *event;			/* used for associated events */
 
 	struct PrivilegeSet *privset;		/* privset... */
+
+	struct rb_event_t *override_timeout_event;
 };
 
 struct PreClient
 #define UMODE_ADMIN        0x2000	/* Admin on server */
 #define UMODE_SSLCLIENT    0x4000	/* using SSL */
 
+/* oper-controlled privledge umodes. */
+#define UMODE_OVERRIDE		0x20000
+
+/* umode/oper mode macros */
+#define IsOper(x)      ((x)->umodes & UMODE_OPER)
+#define IsAdmin(x)     ((x)->umodes & UMODE_ADMIN)
+#define IsHelper(x)        ((x)->umodes & UMODE_HELPER)
+#define IsAnyOper(x)       ((x)->umodes & (UMODE_OPER|UMODE_HELPER))
+
+#define IsOverride(x)      ((x)->umodes & UMODE_OVERRIDE)
+
 /* overflow flags */
 /* EARLIER FLAGS ARE IN s_newconf.h */
 #define FLAGS2_EXEMPTRESV	0x00400000

File include/s_newconf.h

 #define IsOperSpy(x)            (HasPrivilege((x), "oper:spy"))
 #define IsOperInvis(x)          (HasPrivilege((x), "oper:hidden"))
 #define IsOperRemoteBan(x)	(HasPrivilege((x), "oper:remoteban"))
+#define IsOperOverride(x)       HasPrivilege(x, "oper:override")
 #define IsOperMassNotice(x)	(HasPrivilege((x), "oper:mass_notice"))
 
 extern struct oper_conf *make_oper_conf(void);
 
 extern const char *get_oper_privs(int flags);
 
+struct mode_table
+{
+   const char *name;
+   int mode;
+};
+
+struct oper_flags
+{
+   int flag;
+   const char *name;
+   char has;
+   char hasnt;
+};
+
 struct server_conf
 {
 	char *name;

File modules/m_privs.c

 	NULL
 };
 
-/* XXX this is a copy, not so nice */
-struct mode_table
-{
-	const char *name;
-	int mode;
-};
-
 /* there is no such table like this anywhere else */
 static struct mode_table auth_client_table[] = {
 	{"resv_exempt",		FLAGS2_EXEMPTRESV	},

File src/client.c

 	}
 
 	rb_free(client_p->localClient->auth_user);
+
+	if(client_p->localClient->override_timeout_event)
+	{
+		rb_event_delete(client_p->localClient->override_timeout_event);
+	}
+
 	rb_free(client_p->localClient->challenge);
 	rb_free(client_p->localClient->fullcaps);
 	rb_free(client_p->localClient->opername);

File src/newconf.c

 #endif
 }
 
-struct mode_table
-{
-	const char *name;
-	int mode;
-};
-
 /* *INDENT-OFF* */
 static struct mode_table umode_table[] = {
 	{"callerid",	UMODE_CALLERID	},
 	{"servnotice",	UMODE_SERVNOTICE},
 	{"wallop",	UMODE_WALLOP	},
 	{"operwall",	UMODE_OPERWALL	},
+	{"override",	UMODE_OVERRIDE	},
 	{"noctcp",	UMODE_NOCTCP	},
 	{"noinvite",	UMODE_NOINVITE	},
 	{"bot",		UMODE_BOT	},

File src/s_user.c

 	0,			/* m */
 	0,			/* n */
 	UMODE_OPER,		/* o */
-	0,			/* p */
+	UMODE_OVERRIDE,		/* p */
 	0,			/* q */
 	0,			/* r */
 	UMODE_SERVNOTICE,	/* s */
 }
 
 static void
+expire_umode_p(void *data)
+{
+	struct Client *source_p = data;
+	char *parv[4] = {source_p->name, source_p->name, "-p", NULL};
+	source_p->localClient->override_timeout_event = NULL;
+	user_mode(source_p, source_p, 3, parv);
+}
+
+static void
 show_other_user_mode(struct Client *source_p, struct Client *target_p)
 {
 	int i;
 		source_p->umodes &= ~UMODE_ADMIN;
 	}
 
+	if(MyConnect(source_p) && (source_p->umodes & UMODE_OVERRIDE) && (!IsOperOverride(source_p)))
+	{
+		sendto_one_notice(source_p, ":*** You need oper and the override flag for +p");
+		source_p->umodes &= ~UMODE_OVERRIDE;
+	}
+
 	/* let modules providing usermodes know that we've changed our usermode --nenolod */
 	hdata.client = source_p;
 	hdata.oldumodes = setflags;
 		sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK),
 			construct_snobuf(source_p->snomask));
 
+	if(ConfigFileEntry.expire_override_time && MyClient(source_p) && (source_p->umodes & ~setflags) & UMODE_OVERRIDE)
+	{
+		source_p->localClient->override_timeout_event =
+			rb_event_addonce("expire_override", expire_umode_p, source_p, ConfigFileEntry.expire_override_time);
+	}
+	else if(MyClient(source_p) && source_p->localClient->override_timeout_event && (setflags & ~source_p->umodes) & UMODE_OVERRIDE)
+	{
+		rb_event_delete(source_p->localClient->override_timeout_event);
+		source_p->localClient->override_timeout_event = NULL;
+	}
+
 	return (0);
 }