reimplemented fakeident support WGN5
authorpk910 <philipp@zoelle1.de>
Thu, 3 Nov 2011 20:26:57 +0000 (21:26 +0100)
committerpk910 <philipp@zoelle1.de>
Thu, 3 Nov 2011 21:33:36 +0000 (22:33 +0100)
include/s_user.h
include/struct.h
ircd/m_account.c
ircd/m_fakehost.c
ircd/m_hidehost.c
ircd/s_user.c

index 7b1fc1800cd3733d8fb4d394ce8b282035e58f93..970e45bc358c517326c424a21d456bf0f3ed3806 100644 (file)
@@ -80,6 +80,11 @@ extern int whisper(struct Client* source, const char* nick,
 extern void send_user_info(struct Client* to, char* names, int rpl,
                            InfoFormatter fmt);
 
+#define HIDE_HOSTMASK_FLAG_HIDDENHOST 0x01
+#define HIDE_HOSTMASK_FLAG_ACCOUNT    0x02
+#define HIDE_HOSTMASK_FLAG_FAKEHOST   0x04
+#define HIDE_HOSTMASK_FLAG_FAKEIDENT  0x08
+
 extern int hide_hostmask(struct Client *cptr, unsigned int flags);
 extern int apply_fakehost(struct Client *cptr);
 extern int set_user_mode(struct Client *cptr, struct Client *sptr,
index 45fb6ec687e9dcee18ea65391f50811c6ea4dd7b..7120269b7822f90a806d5191cc4fd8a080159a0b 100644 (file)
@@ -85,7 +85,7 @@ struct User {
   char               realhost[HOSTLEN + 1];   /**< actual hostname */
   char               fakehost[HOSTLEN + 1];   /**< fakehost */
   char               account[ACCOUNTLEN + 1]; /**< IRC account name */
-  time_t            acc_create;              /**< IRC account timestamp */
+  time_t                acc_create;              /**< IRC account timestamp */
   time_t             lastmsg_time;            /**< time last PRIVMSG was sent */
   unsigned int       lastmsg_num;             /**< number of prev msg that matched */
   char               *lastmsg;                /**< last message */
index b7aa229c2499de0697eba196ea115909c97b9bac..e617c84c7915a90a850142b8f899e30dd5fe7516 100644 (file)
@@ -145,7 +145,7 @@ int ms_account(struct Client* cptr, struct Client* sptr, int parc,
   has_fakehost = HasHiddenHost(acptr);
   ircd_strncpy(cli_user(acptr)->account, parv[2], ACCOUNTLEN);
   if(has_fakehost) SetAccount(acptr);
-  else hide_hostmask(acptr, FLAG_ACCOUNT);
+  else hide_hostmask(acptr, HIDE_HOSTMASK_FLAG_ACCOUNT);
 
   for(chan = (cli_user(acptr))->channel; chan; chan = chan->next_channel) {
     ClearBanValid(chan);
index 5aa559e59a80c907a240287ab34f7b10b628dd96..793be4158cd7e376f49827498348c6236723329e 100644 (file)
@@ -113,7 +113,7 @@ int i;
 
   /* Assign and propagate the fakehost */
   ircd_strncpy(cli_user(cptr)->fakehost, parv[1], HOSTLEN);
-  hide_hostmask(cptr, FLAG_FAKEHOST);
+  hide_hostmask(cptr, HIDE_HOSTMASK_FLAG_FAKEHOST);
   
        /*for(i = HighestFd; i >= 0; i--) {
         if((another = LocalClientArray[i]) && IsServer(another)) {
@@ -137,7 +137,7 @@ int i;
 
   /* Assign and propagate the fakehost */
   ircd_strncpy(cli_user(acptr)->fakehost, parv[2], HOSTLEN);
-  hide_hostmask(acptr, FLAG_FAKEHOST);
+  hide_hostmask(acptr, HIDE_HOSTMASK_FLAG_FAKEHOST);
        /*
        for(i = HighestFd; i >= 0; i--) {
         if((another = LocalClientArray[i]) && IsServer(another)) {
@@ -252,7 +252,7 @@ int ms_fakehost(struct Client *cptr, struct Client *sptr, int parc, char *parv[]
 
     /* Set fakehost and propagate the changed host. */
     ircd_strncpy(cli_user(target)->fakehost, parv[2], HOSTLEN);
-    hide_hostmask(target, FLAG_FAKEHOST);
+    hide_hostmask(target, HIDE_HOSTMASK_FLAG_FAKEHOST);
 
     /* Borrowed from send_umode_out().
      * I found no better way to do this. However, maybe someone has the time to check out
@@ -295,14 +295,14 @@ int ms_fakehost2(struct Client *cptr, struct Client *sptr, int parc, char *parv[
     }
 
     /* Ignore the assignment if it changes nothing. */
-    if(IsFakeHost(target) && strcmp(cli_user(target)->fakehost, parv[3]) == 0 && strcmp(cli_user(target)->fakeuser, parv[2]) == 0) {
+    if(IsFakeHost(target) && IsFakeIdent(target) && strcmp(cli_user(target)->fakehost, parv[3]) == 0 && strcmp(cli_user(target)->fakeuser, parv[2]) == 0) {
         return 0;
     }
 
     /* Set fakehost and propagate the changed host. */
     ircd_strncpy(cli_user(target)->fakehost, parv[3], HOSTLEN);
     ircd_strncpy(cli_user(target)->fakeuser, parv[2], USERLEN);
-    hide_hostmask(target, FLAG_FAKEHOST | FLAG_FAKEIDENT);
+    hide_hostmask(target, HIDE_HOSTMASK_FLAG_FAKEHOST | HIDE_HOSTMASK_FLAG_FAKEIDENT);
 
     sendcmdto_serv_butone(sptr, CMD_FAKEHOST2, cptr, "%C %s %s", target, cli_user(target)->fakeuser, cli_user(target)->fakehost);
 
@@ -334,7 +334,7 @@ int ms_fakehost_old(struct Client* cptr, struct Client* sptr, int parc, char* pa
 
     /* Assign and propagate the fakehost */
     ircd_strncpy(cli_user(target)->fakehost, parv[2], HOSTLEN);
-    hide_hostmask(target, FLAG_FAKEHOST);
+    hide_hostmask(target, HIDE_HOSTMASK_FLAG_FAKEHOST);
 
     sendcmdto_serv_butone(sptr, CMD_FAKEHOST_OLD, cptr, "%C %s", target,
                           cli_user(target)->fakehost);
index 7694a36c7842d9cd67e04d8135381aabeefcd216..8fd9a6070ea07af7ab4bc6b4cf3c84dba51eb2f2 100644 (file)
@@ -114,7 +114,7 @@ int ms_hidehost(struct Client *cptr, struct Client *sptr, int parc, char *parv[]
     /* Set +x and propagate the changed modes. */
     propagate = !!HasPriv(acptr, PRIV_PROPAGATE);
     setflags = cli_flags(acptr);
-    hide_hostmask(acptr, FLAG_HIDDENHOST);
+    hide_hostmask(acptr, HIDE_HOSTMASK_FLAG_HIDDENHOST);
     send_umode_out(acptr, acptr, &setflags, propagate);
 
     return 0;
index 942c44c96a7b291db160290f3d67164bb82f014d..53cebf2602df7e646dd136b4238b39635972a014 100644 (file)
@@ -485,7 +485,7 @@ int register_user(struct Client *cptr, struct Client *sptr)
    * account assignment causes a numeric reply during registration.
    */
   if (HasHiddenHost(sptr))
-    hide_hostmask(sptr, FLAG_HIDDENHOST);
+    hide_hostmask(sptr, HIDE_HOSTMASK_FLAG_HIDDENHOST);
   if (IsInvisible(sptr))
     ++UserStats.inv_clients;
   if (IsOper(sptr))
@@ -979,35 +979,47 @@ hide_hostmask(struct Client *cptr, unsigned int flag)
   struct Membership *chan;
   char buf[HOSTLEN];
 
-  switch (flag) {
-  case FLAG_HIDDENHOST:
+  if (flag & HIDE_HOSTMASK_FLAG_HIDDENHOST) {
     /* Local users cannot set +x unless FEAT_HOST_HIDING is true. */
     if (MyConnect(cptr) && !feature_bool(FEAT_HOST_HIDING))
       return 0;
-    break;
-  case FLAG_ACCOUNT:
-  case FLAG_FAKEHOST:
-  case FLAG_FAKEIDENT:
+  }
+  if (flag & (HIDE_HOSTMASK_FLAG_ACCOUNT | HIDE_HOSTMASK_FLAG_FAKEHOST | HIDE_HOSTMASK_FLAG_FAKEIDENT)) {
     /* Invalidate all bans against the user so we check them again */
     for (chan = (cli_user(cptr))->channel; chan;
          chan = chan->next_channel)
       ClearBanValid(chan);
-    break;
-  default:
-    /* default: no special handling */
-    break;
   }
 
   /* Set flags and stop if no fakehost has to be applied. */
-  SetFlag(cptr, flag);
+  if(flag & HIDE_HOSTMASK_FLAG_HIDDENHOST)
+    SetFlag(cptr, FLAG_HIDDENHOST);
+  if(flag & HIDE_HOSTMASK_FLAG_ACCOUNT)
+    SetFlag(cptr, FLAG_ACCOUNT);
+  if(flag & HIDE_HOSTMASK_FLAG_FAKEHOST)
+    SetFlag(cptr, FLAG_FAKEHOST);
+  if(flag & HIDE_HOSTMASK_FLAG_FAKEIDENT)
+    SetFlag(cptr, FLAG_FAKEIDENT);
+  
   if(!HasHiddenHost(cptr))
     return 0;
 
   /* Generate new fakehost. */
-  if(IsFakeHost(cptr)) ircd_strncpy(buf, cli_user(cptr)->fakehost, HOSTLEN);
-  else if (IsAccount(cptr)) ircd_snprintf(0, buf, HOSTLEN, "%s.%s", cli_user(cptr)->account, feature_str(FEAT_HIDDEN_HOST));
-  else return 0;
-  if(strncmp(buf, cli_user(cptr)->host, HOSTLEN) == 0 && (!IsFakeIdent(cptr) || strncmp(cli_user(cptr)->fakeuser, cli_user(cptr)->username, USERLEN) == 0)) return 0;
+  unsigned int reregister = 0;
+  if(IsFakeHost(cptr) || IsAccount(cptr)) {
+    if(IsFakeHost(cptr))
+      ircd_strncpy(buf, cli_user(cptr)->fakehost, HOSTLEN);
+    else
+      ircd_snprintf(0, buf, HOSTLEN, "%s.%s", cli_user(cptr)->account, feature_str(FEAT_HIDDEN_HOST));
+    if(strncmp(buf, cli_user(cptr)->host, HOSTLEN))
+      reregister |= HIDE_HOSTMASK_FLAG_FAKEHOST;
+  }
+  if(IsFakeIdent(cptr)) {
+    if(strncmp(cli_user(cptr)->fakeuser, cli_user(cptr)->username, USERLEN))
+      reregister |= HIDE_HOSTMASK_FLAG_FAKEIDENT;
+  }
+  
+  if (!reregister) return 0;
 
   /* Remove all "valid" marks on the bans. This forces them to be
    * rechecked if the ban is accessed again.
@@ -1018,20 +1030,17 @@ hide_hostmask(struct Client *cptr, unsigned int flag)
 
   /* Quit user and set the previously generated fakehost. */
   sendcmdto_common_channels_butone(cptr, CMD_QUIT, cptr, ":Registered");
-  ircd_strncpy(cli_user(cptr)->host, buf, HOSTLEN);
-
-  /* spoof also the username if username is passed */
-  if(IsFakeIdent(cptr)) {
-    if(strncmp(cli_user(cptr)->username, cli_user(cptr)->fakeuser, USERLEN) != 0) {
-      ircd_strncpy(cli_username(cptr), cli_user(cptr)->fakeuser, USERLEN);
-      ircd_strncpy(cli_user(cptr)->username, cli_user(cptr)->fakeuser, USERLEN);
-    }
-    /* ok, the client is now fully hidden, so let them know -- hikari */
-    if (MyConnect(cptr))
+  if(reregister & HIDE_HOSTMASK_FLAG_FAKEHOST)
+    ircd_strncpy(cli_user(cptr)->host, buf, HOSTLEN);
+  if(reregister & HIDE_HOSTMASK_FLAG_FAKEIDENT)
+    ircd_strncpy(cli_user(cptr)->username, cli_user(cptr)->fakeuser, USERLEN);
+  
+
+  /* ok, the client is now fully hidden, so let them know -- hikari */
+  if(MyConnect(cptr)) {
+    if (IsFakeIdent(cptr))
       send_reply(cptr, RPL_HOSTUSERHIDDEN, cli_user(cptr)->username, cli_user(cptr)->host);
-  } else {
-    /* ok, the client is now fully hidden, so let them know -- hikari */
-    if (MyConnect(cptr))
+    else
       send_reply(cptr, RPL_HOSTHIDDEN, cli_user(cptr)->host);
   }