/* NickServ-related structures. * * IRC Services is copyright (c) 1996-2007 Andrew Church. * E-mail: * Parts written by Andrew Kempe and others. * This program is free but copyrighted software; see the file COPYING for * details. */ #ifndef NICKSERV_H #define NICKSERV_H #ifndef MEMOSERV_H # include "../memoserv/memoserv.h" #endif /*************************************************************************/ /*************************************************************************/ /* User-configurable settings: */ /* Maximum number of tries to randomly select a new NickGroupInfo ID before * giving up. Assuming a sufficiently random random-number generator and a * database of one million nicknames, the default setting of 1000 gives * odds of approximately 10^3600 to 1 against an accidental failure. */ #define NEWNICKGROUP_TRIES 1000 /* Number of DROPEMAIL commands to buffer for DROPEMAIL-CONFIRM. */ #define DROPEMAIL_BUFSIZE 4 /*************************************************************************/ /*************************************************************************/ /* Data structure for a single nickname. */ struct nickinfo_ { NickInfo *next, *prev; int modified; int locked; char nick[NICKMAX]; int16 status; /* See NS_* below */ char *last_usermask; /* Last user@host mask (uses fakehost if avail.) */ char *last_realmask; /* Last user@realhost (not fakehost) mask seen */ char *last_realname; char *last_quit; time_t time_registered; time_t last_seen; uint32 nickgroup; /* ID of nick group for this nick */ uint32 id_stamp; /* Services stamp of user who last ID'd for nick */ /* Online-only information: */ User *user; /* User using this nick, NULL if not online */ int16 authstat; /* Authorization status; see NA_* below */ int bad_passwords; /* # of bad passwords for nick since last good one */ }; /*************************************************************************/ /* Data for a group of nicks. */ struct nickgroupinfo_ { NickGroupInfo *next, *prev; int modified; int locked; uint32 id; nickname_t *nicks; /* Array of nicks */ uint16 nicks_count; /* Number of nicks in this nick group */ uint16 mainnick; /* Index of "main" nick (for chan access lists etc) */ char pass[PASSMAX]; char *url; char *email; char *info; SuspendInfo *suspendinfo; /* Suspension info (non-NULL => suspended) */ int32 authcode; /* Authentication code (used by mail-auth module) */ time_t authset; /* Time authentication code was set */ int16 authreason; /* Reason auth. code was set; see NICKAUTH_* below */ int16 os_priv; /* OperServ privilege level; see NP_* below */ int32 flags; /* See NF_* below */ int16 language; /* Language selected by nickname owner (LANG_*) */ int16 timezone; /* Offset from UTC, in minutes */ int16 channelmax; /* Maximum number of registered channels allowed */ char **access; /* Array of access masks */ int16 access_count; /* # of entries */ char **ajoin; /* Array of autojoin channel */ int16 ajoin_count; /* # of entries */ char **ignore; /* Array of memo ignore entries */ int16 ignore_count; /* # of entries */ MemoInfo memos; /* Online-only info: */ channame_t *channels; /* Array of names of channels currently registered */ int16 channels_count; /* Number of channels currently registered */ User **id_users; /* Users who have identified for this group (array) */ int id_users_count; time_t last_sendauth; /* Time of last SENDAUTH (mail-auth module) */ time_t last_sendpass; /* Time of last SENDPASS (sendpass module) */ int bad_auths; /* Number of bad AUTH commands for this group */ }; /*************************************************************************/ /* Nickname status flags: */ #define NS_VERBOTEN 0x0002 /* Nick may not be registered or used */ #define NS_NOEXPIRE 0x0004 /* Nick never expires */ #define NS_PERMANENT 0x0006 /* All permanent flags */ /* The following flags are temporary: */ #define NS_KILL_HELD 0x8000 /* Nick is being held after a kill */ #define NS_GUESTED 0x4000 /* SVSNICK has been sent but nick has not * yet changed. An enforcer will be * introduced when it does change. */ #define NS_TEMPORARY 0xC000 /* All temporary flags */ /* Nickname authorization flags: */ #define NA_IDENTIFIED 0x0001 /* User has IDENTIFY'd */ #define NA_IDENT_NOMAIL 0x0002 /* User has identified, but hasn't set an * E-mail address and one is required * (in this case we don't allow privs * except for SET EMAIL on the nick) */ #define NA_RECOGNIZED 0x0004 /* User is recognized as nick owner */ /* Nickgroup setting flags: */ #define NF_KILLPROTECT 0x00000001 /* Kill others who take this nick */ #define NF_SECURE 0x00000002 /* Don't recognize unless IDENTIFY'd */ #define NF_MEMO_HARDMAX 0x00000008 /* Don't allow user to change memo limit */ #define NF_MEMO_SIGNON 0x00000010 /* Notify of memos at signon and un-away */ #define NF_MEMO_RECEIVE 0x00000020 /* Notify of new memos when sent */ #define NF_PRIVATE 0x00000040 /* Don't show in LIST to non-servadmins */ #define NF_HIDE_EMAIL 0x00000080 /* Don't show E-mail in INFO */ #define NF_HIDE_MASK 0x00000100 /* Don't show last seen address in INFO */ #define NF_HIDE_QUIT 0x00000200 /* Don't show last quit message in INFO */ #define NF_KILL_QUICK 0x00000400 /* Kill in 20 seconds instead of 60 */ #define NF_KILL_IMMED 0x00000800 /* Kill immediately instead of in 60 sec */ #define NF_MEMO_FWD 0x00001000 /* Forward memos to E-mail address */ #define NF_MEMO_FWDCOPY 0x00002000 /* Save copy of forwarded memos */ #define NF_ALLFLAGS 0x00003FFB /* All flags */ /* Nickgroup OperServ privilege levels: */ #define NP_SERVOPER 0x1000 #define NP_SERVADMIN 0x2000 /* Maximum number of nicks we can record for a nick group: */ #define MAX_NICKCOUNT 32767 /* Maximum number of access entries: */ #define MAX_NICK_ACCESS 32767 /* Maximum number of channels we can record: */ #define MAX_CHANNELCOUNT 32767 /* Value indicating "no limit" */ #define CHANMAX_UNLIMITED -2 /* Value indicating "default limit" (as set in configuration file) */ #define CHANMAX_DEFAULT -1 /* Value indicating "no time zone set, use local default" */ #define TIMEZONE_DEFAULT 0x7FFF /* Used when we can't retrieve the NickGroupInfo record for a nick, to * prevent the nick from being registered. */ #define NICKGROUPINFO_INVALID ((NickGroupInfo *)PTR_INVALID) /* Authentication code reasons: */ #define NICKAUTH_MIN NICKAUTH_REGISTER #define NICKAUTH_REGISTER 1 /* Newly registered */ #define NICKAUTH_SET_EMAIL 2 /* E-mail address changed */ #define NICKAUTH_SETAUTH 3 /* SETAUTH command used */ #define NICKAUTH_MAX NICKAUTH_SETAUTH /*************************************************************************/ /* Macros for checking whether a user is recognized or has identified for * their nickname, by either User or NickInfo structure. */ #define user_recognized(u) nick_recognized((u)->ni) #define user_identified(u) nick_identified((u)->ni) #define user_id_or_rec(u) nick_id_or_rec((u)->ni) #define user_ident_nomail(u) nick_ident_nomail((u)->ni) #define nick_recognized(ni) ((ni) && ((ni)->authstat & NA_RECOGNIZED)) #define nick_identified(ni) ((ni) && ((ni)->authstat & NA_IDENTIFIED)) #define nick_id_or_rec(ni) \ ((ni) && ((ni)->authstat & (NA_IDENTIFIED|NA_RECOGNIZED))) #define nick_ident_nomail(ni) ((ni) && ((ni)->authstat & NA_IDENT_NOMAIL)) /* Does the given user have a valid NickGroupInfo? */ #define valid_ngi(u) ((u) && ((u)->ngi) && ((u)->ngi != NICKGROUPINFO_INVALID)) /* Macro to retrieve the main nick for a given NickGroupInfo. */ #define ngi_mainnick(ngi) ((ngi)->nicks[(ngi)->mainnick]) /*************************************************************************/ /*************************************************************************/ /* Prototypes for imported/exported functions and variables. */ /* Imported from database module: */ E NickInfo *add_nickinfo(NickInfo *ni); E void del_nickinfo(NickInfo *ni); E NickInfo *get_nickinfo(const char *nick); E void put_nickinfo(NickInfo *ni); E NickInfo *first_nickinfo(void); E NickInfo *next_nickinfo(void); E NickGroupInfo *add_nickgroupinfo(NickGroupInfo *ngi); E void del_nickgroupinfo(NickGroupInfo *ngi); E NickGroupInfo *get_nickgroupinfo(uint32 id); E void put_nickgroupinfo(NickGroupInfo *ngi); E NickGroupInfo *first_nickgroupinfo(void); E NickGroupInfo *next_nickgroupinfo(void); E int open_nick_db(const char *dbname); E int sync_nick_db(const char *dbname); E int close_nick_db(const char *dbname); /* Exports: */ E char *s_NickServ; #ifdef STANDALONE_NICKSERV /* see util.c */ # define E2 static #else # define E2 extern #endif E2 NickInfo *new_nickinfo(void); E2 void free_nickinfo(NickInfo *ni); E2 NickGroupInfo *new_nickgroupinfo(const char *seed); E2 void free_nickgroupinfo(NickGroupInfo *ngi); #undef E2 E int check_expire_nick(NickInfo *ni); E NickInfo *get_nickinfo_noexpire(const char *nick); #define get_ngi(ni) _get_ngi((ni), __FILE__, __LINE__) #define check_ngi(ni) (get_ngi((ni)) != NULL) // Check for presence of NGI only #define get_ngi_id(id) _get_ngi_id((id), __FILE__, __LINE__) #define check_ngi_id(id) (get_ngi_id((id)) != NULL) E NickGroupInfo *_get_ngi(NickInfo *ni, const char *file, int line); E NickGroupInfo *_get_ngi_id(uint32 id, const char *file, int line); E int has_identified_nick(const User *u, uint32 group); /*************************************************************************/ #endif /* NICKSERV_H */