+ /* Only opers can change other users modes */
+ if ((source != dest) && (!IS_OPER(source)))
+ return MODEACTION_DENY;
+
+ /* Set the array fields */
+ if (adding)
+ {
+ /* Fix for bug #310 reported by Smartys */
+ if (!dest->modes[UM_SNOMASK])
+ dest->snomasks.reset();
+
+ parameter = dest->ProcessNoticeMasks(parameter.c_str());
+ dest->modes[UM_SNOMASK] = true;
+ return MODEACTION_ALLOW;
+ }
+ else
+ {
+ if (dest->modes[UM_SNOMASK] != false)
+ {
+ dest->modes[UM_SNOMASK] = false;
+ return MODEACTION_ALLOW;
+ }
+ }
+
+ /* Allow the change */
+ return MODEACTION_DENY;