* ---------------------------------------------------
*/
+#ifndef __USERS_H__
+#define __USERS_H__
+
+#include <string>
#include "inspircd_config.h"
+#include "socket.h"
#include "channels.h"
#include "inspstring.h"
#include "connection.h"
-#include <string>
-#ifdef THREADED_DNS
-#include <pthread.h>
-#endif
-
-#ifndef __USERS_H__
-#define __USERS_H__
-
#include "hashcomp.h"
+#include "dns.h"
#include "cull_list.h"
enum ChanStatus {
CC_DENY = 1
};
+/** RFC1459 channel modes
+ * */
+enum UserModes {
+ UM_SERVERNOTICE = 's'-65,
+ UM_WALLOPS = 'w'-65,
+ UM_INVISIBLE = 'i'-65,
+ UM_OPERATOR = 'o'-65,
+};
+
+enum RegistrationState {
+ REG_NONE = 0, /* Has sent nothing */
+ REG_USER = 1, /* Has sent USER */
+ REG_NICK = 2, /* Has sent NICK */
+ REG_NICKUSER = 3, /* Bitwise combination of REG_NICK and REG_USER */
+ REG_ALL = 7 /* REG_NICKUSER plus next bit along */
+};
+
/** Holds a channel name to which a user has been invited.
*/
class Invited : public classbase
};
+
+/** Derived from Resolver, and performs user forward/reverse lookups.
+ */
+class UserResolver : public Resolver
+{
+ private:
+ /** User this class is 'attached' to.
+ */
+ userrec* bound_user;
+ int bound_fd;
+ public:
+ UserResolver(userrec* user, std::string to_resolve, bool forward);
+
+ void OnLookupComplete(const std::string &result);
+ void OnError(ResolverError e);
+};
+
+
/** Holds information relevent to <connect allow> and <connect deny> tags in the config file.
*/
class ConnectClass : public classbase
*/
InvitedList invites;
public:
+ /** Resolvers for looking up this users hostname
+ */
+ UserResolver* res_forward;
+ UserResolver* res_reverse;
+ std::string stored_host;
+
+ void StartDNSLookup();
/** The users nickname.
* An invalid nickname indicates an unregistered connection prior to the NICK command.
/** The host displayed to non-opers (used for cloaking etc).
* This usually matches the value of userrec::host.
*/
- char dhost[64];
+ char dhost[65];
/** The users full name.
*/
char fullname[MAXGECOS+1];
- /** The user's mode string.
- * This may contain any of the following RFC characters: o, w, s, i
- * Your module may define other mode characters as it sees fit.
- * it is limited to length 54, as there can only be a maximum of 52
- * user modes (26 upper, 26 lower case) a null terminating char, and
- * an optional + character.
+ /** The user's mode list.
+ * This is NOT a null terminated string! In the 1.1 version of InspIRCd
+ * this is an array of values in a similar way to channel modes.
+ * A value of 1 in field (modeletter-65) indicates that the mode is
+ * set, for example, to work out if mode +s is set, we check the field
+ * userrec::modes['s'-65] != 0.
+ * The following RFC characters o, w, s, i have constants defined via an
+ * enum, such as UM_SERVERNOTICE and UM_OPETATOR.
*/
- char modes[54];
+ char modes[64];
- /** This contains a bitmask of the RFC modes +swi,
- * which can be used for fast lookup when iterating all the users.
- * It is maintained by the mode parser and matches the character
- * modes stored in 'modes'.
+ /** What snomasks are set on this user.
+ * This functions the same as the above modes.
*/
- char modebits;
-
+ char snomasks[64];
+
UserChanList chans;
/** The server the user is connected to.
*/
- char* server;
+ const char* server;
/** The user's away message.
* If this string is empty, the user is not marked as away.
/** IPV4 ip address
*/
- in_addr ip4;
+ insp_inaddr ip4;
/* Write error string
*/
* e.g. through a module, then this method will ignore it and return the true hostname.
*/
virtual char* GetFullRealHost();
+
+ /*
+ * Create a displayable mode string for this users umodes
+ */
+ const char* FormatNoticeMasks();
+
+ bool userrec::ProcessNoticeMasks(const char *sm);
+
+ bool IsNoticeMaskSet(unsigned char sm);
+
+ void SetNoticeMask(unsigned char sm, bool value);
+
+ /*
+ * Create a displayable mode string for this users umodes
+ */
+ const char* FormatModes();
+
+ bool IsModeSet(unsigned char m);
+
+ void SetMode(unsigned char m, bool value);
/** Returns true if a user is invited to a channel.
*/
/** Default destructor
*/
virtual ~userrec();
-
-#ifdef THREADED_DNS
- /** Thread used for threaded lookups
- */
- pthread_t dnsthread;
-#endif
};
/** Used to hold WHOWAS information
*/
-class WhoWasGroup
+class WhoWasGroup : public classbase
{
public:
char* host;
char* dhost;
char* ident;
- char* server;
+ const char* server;
char* gecos;
time_t signon;
void kill_link_silent(userrec *user,const char* r);
void AddWhoWas(userrec* u);
void MaintainWhoWas(time_t TIME);
-void AddClient(int socket, int port, bool iscached, in_addr ip4);
+void AddClient(int socket, int port, bool iscached, insp_inaddr ip4);
void FullConnectUser(userrec* user, CullList* Goners);
-userrec* ReHashNick(char* Old, char* New);
+userrec* ReHashNick(const char* Old, const char* New);
void force_nickchange(userrec* user,const char* newnick);
/* Configuration callbacks */
bool DoClass(const char* tag, char** entries, void** values, int* types);
bool DoneClassesAndTypes(const char* tag);
+long FindMatchingGlobal(userrec* user);
+long FindMatchingLocal(userrec* user);
+
#endif