* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
+ * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
* E-mail:
* <brain@chatspike.net>
* <Craig@chatspike.net>
#include "inspstring.h"
#include "connection.h"
#include <string>
+#ifdef THREADED_DNS
+#include <pthread.h>
+#endif
#ifndef __USERS_H__
#define __USERS_H__
-
-#define STATUS_OP 4
-#define STATUS_HOP 2
-#define STATUS_VOICE 1
-#define STATUS_NORMAL 0
-#define CC_ALLOW 0
-#define CC_DENY 1
+#include "hashcomp.h"
+#include "cull_list.h"
+
+enum ChanStatus {
+ STATUS_OP = 4,
+ STATUS_HOP = 2,
+ STATUS_VOICE = 1,
+ STATUS_NORMAL = 0
+};
+
+enum ClassTypes {
+ CC_ALLOW = 0,
+ CC_DENY = 1
+};
/** Holds a channel name to which a user has been invited.
*/
class Invited : public classbase
{
public:
- char channel[CHANMAX];
+ irc::string channel;
};
int flood;
/** Host mask for this line
*/
- char host[MAXBUF];
+ std::string host;
/** Number of seconds between pings for this line
*/
int pingtime;
/** (Optional) Password for this line
*/
- char pass[MAXBUF];
+ std::string pass;
/** Threshold value for flood disconnect
*/
/** Maximum size of recvq for users in this class (bytes)
*/
long recvqmax;
+
+ /** Local max when connecting by this connection class
+ */
+ long maxlocal;
+
+ /** Global max when connecting by this connection class
+ */
+ long maxglobal;
- ConnectClass()
+ ConnectClass() : registration_timeout(0), flood(0), host(""), pingtime(0), pass(""), threshold(0), sendqmax(0), recvqmax(0)
{
- registration_timeout = 0;
- flood = 0;
- pingtime = 0;
- threshold = 0;
- sendqmax = 0;
- recvqmax = 0;
- strlcpy(host,"",MAXBUF);
- strlcpy(pass,"",MAXBUF);
}
};
/** The host displayed to non-opers (used for cloaking etc).
* This usually matches the value of userrec::host.
*/
- char dhost[160];
+ char dhost[64];
/** The users full name.
*/
* an optional + character.
*/
char modes[54];
+
+ /** 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'.
+ */
+ char modebits;
- ucrec chans[MAXCHANS];
+ std::vector<ucrec*> chans;
/** The server the user is connected to.
*/
* This is stored even if the <connect> block doesnt need a password, so that
* modules may check it.
*/
- char password[MAXBUF];
+ char password[64];
/** User's receive queue.
* Lines from the IRCd awaiting processing are stored here.
time_t reset_due;
long threshold;
+ /** IPV4 ip address
+ */
+ in_addr ip4;
+
/* Write error string
*/
std::string WriteError;
userrec();
- virtual ~userrec() { }
-
/** Returns the full displayed host of the user
* This member function returns the hostname of the user as seen by other users
* on the server, in nick!ident&at;host form.
/** Returns true if a user is invited to a channel.
*/
- virtual bool IsInvited(char* channel);
+ virtual bool IsInvited(irc::string &channel);
/** Adds a channel to a users invite list (invites them to a channel)
*/
- virtual void InviteTo(char* channel);
+ virtual void InviteTo(irc::string &channel);
/** Removes a channel from a users invite list.
* This member function is called on successfully joining an invite only channel
* to which the user has previously been invited, to clear the invitation.
*/
- virtual void RemoveInvite(char* channel);
+ virtual void RemoveInvite(irc::string &channel);
/** Returns true or false for if a user can execute a privilaged oper command.
* This is done by looking up their oper type from userrec::oper, then referencing
* this to their oper classes and checking the commands they can execute.
*/
- bool HasPermission(char* command);
+ bool HasPermission(const std::string &command);
/** Calls read() to read some data for this user using their fd.
*/
* RFC-specified limit per line) then the method will return false and the
* text will not be inserted.
*/
- bool AddBuffer(std::string a);
+ bool AddBuffer(const std::string &a);
/** This method returns true if the buffer contains at least one carriage return
* character (e.g. one complete line may be read)
* The WriteErrors of clients are checked at a more ideal time (in the mainloop) and
* errored clients purged.
*/
- void SetWriteError(std::string error);
+ void SetWriteError(const std::string &error);
/** Returns the write error which last occured on this connection or an empty string
* if none occured.
*/
- std::string GetWriteError();
+ const char* GetWriteError();
/** Adds to the user's write buffer.
* You may add any amount of text up to this users sendq value, if you exceed the
* sendq value, SetWriteError() will be called to set the users error string to
* "SendQ exceeded", and further buffer adds will be dropped.
*/
- void AddWriteBuf(std::string data);
+ void AddWriteBuf(const std::string &data);
/** Flushes as much of the user's buffer to the file descriptor as possible.
* This function may not always flush the entire buffer, rather instead as much of it
*/
InvitedList* GetInviteList();
+ void MakeHost(char* nhost);
+
+ char* MakeWildHost();
+
/** Shuts down and closes the user's socket
*/
void CloseSocket();
+
+ virtual ~userrec();
+
+#ifdef THREADED_DNS
+ pthread_t dnsthread;
+#endif
};
-/** A lightweight userrec used by WHOWAS
- */
-class WhoWasUser
+class WhoWasGroup
{
public:
- char nick[NICKMAX];
- char ident[IDENTMAX+1];
- char dhost[160];
- char host[160];
- char fullname[MAXGECOS+1];
- char server[256];
+ char* host;
+ char* dhost;
+ char* ident;
+ char* server;
+ char* gecos;
time_t signon;
+
+ WhoWasGroup(userrec* user);
+ ~WhoWasGroup();
};
+typedef std::deque<WhoWasGroup*> whowas_set;
+typedef std::map<irc::string,whowas_set*> whowas_users;
+
+void AddOper(userrec* user);
+void DeleteOper(userrec* user);
+void kill_link(userrec *user,const char* r);
+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 FullConnectUser(userrec* user, CullList* Goners);
+userrec* ReHashNick(char* Old, char* New);
+void force_nickchange(userrec* user,const char* newnick);
+
+/* Configuration callbacks */
+bool InitTypes(const char* tag);
+bool InitClasses(const char* tag);
+bool DoType(const char* tag, char** entries, void** values, int* types);
+bool DoClass(const char* tag, char** entries, void** values, int* types);
+bool DoneClassesAndTypes(const char* tag);
+
#endif