/* deal with key - if we need one use the provided one if set, otherwise
* the existing one, but if there is no existing one clear +k */
if (IsKey(cp)) {
- if (key) {
+ /* Sanitise the provided key - this might invalidate it.. */
+ if (key)
+ clean_key(key);
+
+ if (key && *key) {
/* Free old key, if any */
if (cp->key)
freesstring(cp->key);
* Set or clear a key on the channel
*/
-void localdosetmode_key (modechanges *changes, const char *key, short dir) {
+void localdosetmode_key (modechanges *changes, char *key, short dir) {
int i,j;
sstring *keysstr;
localsetmodeflush(changes,0);
if (dir==MCB_ADD) {
+ /* Sanitise the key. If this nullifies it then we give up */
+ clean_key(key);
+ if (!*key)
+ return;
+
/* Get a copy of the key for use later */
keysstr=getsstring(key, KEYLEN);
freesstring(changes->cp->key);
changes->cp->key=getsstring(key, KEYLEN);
/* That's it, we're done */
+ freesstring(keysstr);
return;
} else {
/* There was a command to delete key.. we need to flush
void localsettopic(nick *np, channel *cp, char *topic) {
unsigned long *lp;
char source[10];
+ time_t now=getnettime();
if (np==NULL || (lp=getnumerichandlefromchanhash(cp->users,np->numeric))==NULL) {
/* User isn't on channel, hack mode */
}
cp->topic=getsstring(topic,TOPICLEN);
- cp->topictime=getnettime();
+
+ /* Update the topic time iff the old time was in the past. This
+ * means if we are bouncing a topic with a TS 1sec newer than ours
+ * we won't use an old timestamp */
+ if (cp->topictime < now) {
+ cp->topictime=now;
+ }
if (connected) {
irc_send("%s T %s %u %u :%s",source,cp->index->name->content,cp->timestamp,cp->topictime,(cp->topic)?cp->topic->content:"");