📄 conference.h
字号:
/* --------------------------------------------------------------------------
*
* License
*
* The contents of this file are subject to the Jabber Open Source License
* Version 1.0 (the "License"). You may not copy or use this file, in either
* source code or executable form, except in compliance with the License. You
* may obtain a copy of the License at http://www.jabber.com/license/ or at
* http://www.opensource.org/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* Copyrights
*
* Portions created by or assigned to Jabber.com, Inc. are
* Copyright (c) 1999-2000 Jabber.com, Inc. All Rights Reserved. Contact
* information for Jabber.com, Inc. is available at http://www.jabber.com/.
*
* Portions Copyright (c) 1998-1999 Jeremie Miller.
*
* Acknowledgements
*
* Special thanks to the Jabber Open Source Contributors for their
* suggestions and support of Jabber.
*
* --------------------------------------------------------------------------*/
#include <jabberd.h>
#include "hash.h"
#define NAME "MU-Conference"
#undef VERSION
#define VERSION "0.5.3-20030504"
#define FZONE funcstr(__FILE__,__FUNCTION__,__LINE__)
/* Namespace Defines for Conference namespaces */
#define NS_MUC "http://jabber.org/protocol/muc"
#define NS_MUC_ADMIN "http://jabber.org/protocol/muc#admin"
#define NS_MUC_OWNER "http://jabber.org/protocol/muc#owner"
#define NS_MUC_USER "http://jabber.org/protocol/muc#user"
#ifndef NS_DISCO
#define NS_DISCO "http://jabber.org/protocol/disco"
#define NS_DISCO_INFO "http://jabber.org/protocol/disco#info"
#define NS_DISCO_ITEMS "http://jabber.org/protocol/disco#items"
#endif
#ifndef NS_GROUPCHAT
#define NS_GROUPCHAT "gc-1.0"
#endif
#ifndef NS_NEGOTIATE
#define NS_NEGOTIATE "jabber:iq:negotiate"
#endif
#ifndef NS_X_CONFERENCE
#define NS_X_CONFERENCE "jabber:x:conference"
#endif
/* Status code defines */
#ifndef NS_DATA
#define NS_DATA "jabber:x:data"
#endif
/* Status code defines */
#define STATUS_MUC_SHOWN_JID "100"
#define STATUS_MUC_HIDDEN_JID "101"
#define STATUS_MUC_CREATED "201"
#define STATUS_MUC_BANNED "301"
#define STATUS_MUC_NICKCHANGE "303"
#define STATUS_MUC_KICKED "307"
/* Error message defines */
#define TERROR_MUC_PASSWORD (terror){401,"Password required to join this room."}
#define TERROR_MUC_BANNED (terror){403,"You have been banned from this room."}
#define TERROR_MUC_VOICE (terror){403,"You do not have permission to talk in this room."}
#define TERROR_MUC_PRIVMSG (terror){403,"Private messages are not allowed in this room."}
#define TERROR_MUC_ROOM (terror){403,"Room creation is disabled."}
#define TERROR_MUC_CONFIG (terror){405,"You are disallowed access to room configuration"}
#define TERROR_MUC_INVITED (terror){407,"Invitation required to join this room."}
#define TERROR_MUC_FULL (terror){408,"Room is full."}
#define TERROR_MUC_NICK (terror){409,"Please choose a different nickname."}
#define TERROR_MUC_NICKREG (terror){409,"Reserved Nick - Please choose a different nickname."}
#define SEND_ALL 0
#define SEND_LEGACY 1
/* Log Types */
#define LOG_TEXT 0
#define LOG_XML 1
#define LOG_XHTML 2
/* Role List */
typedef struct cnu_struct *cnu, _cnu;
/* conference instance */
typedef struct cni_struct
{
instance i;
xdbcache xdbc; /* Interface with xdb */
htable rooms; /* Hash of all rooms available */
htable extbrowse; /* Hash of external rooms to report via server browse */
xmlnode config; /* config data, mostly for public right now */
int maxhash; /* Maximum hash size */
int public; /* if we're public or not */
int history; /* max history items */
mtq q;
int start; /* startup time */
char *day; /* To keep track of log rotation information */
htable sadmin; /* Server admin, able to override admin locks */
char *logdir; /* Directory where to store logs */
int loader; /* Used to delay loading from xdb */
int roomlock; /* Stop dynamic room creation */
int dynamic; /* Only allows dynamic rooms to be created */
} *cni, _cni;
/* conference room */
typedef struct cnr_struct
{
pool p;
cni master; /* Reference to cni struct for service */
jid id; /* room id */
jid creator; /* room creator */
htable owner; /* Owners of the room */
char *name; /* friendly name of the room */
char *description; /* Short description of the room */
htable remote; /* users associated w/ the room, key is remote jid */
htable local; /* users associated w/ the room, key is local jid */
htable roster; /* room roster, key is bare remote jid */
htable admin; /* users associated w/ the room, key is remote jid */
htable member; /* members invited, key is remote jid */
htable outcast; /* users banned, key is remote jid */
htable moderator; /* users with voice ability, key is local jid */
htable participant; /* users with voice ability, key is local jid */
int last; /* last time there was any traffic to the room */
int private; /* if private is allowed in this room */
int public; /* Is this room publicly searchable */
int subjectlock; /* Is changing subject locked to admins? */
int maxusers; /* Maximum allowed users, 0 = unlimited */
int persistant; /* Will this room avoid autocleanup */
int moderated; /* Is this room moderated */
int defaulttype; /* Do users default to members in moderated rooms? */
int visible; /* Are real jid's visible to non-admins */
int invitation; /* Do users require an invite to enter */
int invites; /* Can users send invitations in an invitation-only room */
int locked; /* Stops any users connecting - used for create+config (Creation via IQ) */
int privmsg; /* Are private messages between users forbidden? */
int legacy; /* Are all clients considered legacy? */
char *secret; /* if there's a secret */
xmlnode topic; /* <t i='time(NULL)' from='nick'>Topic Here</t> */
xmlnode *history; /* an array of history messages (vattrib cnu='') */
int hlast; /* last history message */
int packets; /* total packets to this room */
char *note_leave, *note_join, *note_rename;
/* notices */
int count; /* # of users in the room */
FILE *logfile; /* for logging of this room */
int logformat; /* For log format */
} *cnr, _cnr;
/* conference user */
struct cnu_struct
{
cnr room;
pool p;
jid realid, localid; /* remote and local jids */
xmlnode nick; /* <n>nickname</n> */
xmlnode presence; /* cached presence */
int last; /* last activity to/from user */
int private; /* private flag */
int packets; /* number of packets from this dude */
int legacy; /* To denote gc clients */
int leaving; /* To flag user is leaving the room */
};
/* Roles and Associations */
typedef struct trole_struct
{
int code;
char msg[64];
} trole;
typedef struct taffil_struct
{
int code;
char msg[64];
} taffil;
#define TAFFIL_OWNER (taffil){3, "owner"}
#define TAFFIL_ADMIN (taffil){2, "admin"}
#define TAFFIL_MEMBER (taffil){1, "member"}
#define TAFFIL_NONE (taffil){0, "none"}
#define TAFFIL_OUTCAST (taffil){-1, "outcast"}
#define TROLE_MODERATOR (trole){3, "moderator"}
#define TROLE_PARTICIPANT (trole){2, "participant"}
#define TROLE_VISITOR (trole){1, "visitor"}
#define TROLE_NONE (trole){0, "none"}
/* Functions in conference_room.c */
void con_room_log(cnr room, char *nick, char *message); /* Log messages */
void con_room_log_new(cnr room); /* New Log */
void con_room_log_close(cnr room); /* Close logfile */
void con_room_send_invite(cnu sender, xmlnode node); /* Send invites */
cnr con_room_new(cni c, jid roomid, jid owner, char *name, char *secret, int private, int xdata, int persist);
/* Set up a new room */
void con_room_sendwalk(const char *key, void *data, void *arg);
/* Used to send to all members of a room */
void con_room_leaveall(const char *key, void *data, void *arg);
/* used to send destroyed presence to users */
void con_room_process(cnr room, cnu from, jpacket jp); /* process a packet to a room from a participant */
void con_room_outsider(cnr room, cnu from, jpacket jp); /* process a packet to a room from a non-participant */
cnu con_room_usernick(cnr room, char *nick); /* resolves to to a user based on nickname */
void con_room_show_config(cnr room, xmlnode msg); /* Results for iq:negotiate request */
void con_room_send(cnr room, xmlnode x, int legacy); /* sends a raw packet from="room@host" to all participants */
void con_room_cleanup(cnr room); /* Clean up room hashes */
void con_room_zap(cnr room); /* kills a room */
/* Functions in conference_user.c */
cnu con_user_new(cnr room, jid id); /* new generic user */
void con_user_nick(cnu user, char *nick, xmlnode data); /* broadcast nick change */
void con_user_enter(cnu user, char *nick, int created); /* put user in room and announce */
void con_user_send(cnu to, cnu from, xmlnode x); /* send a packet to a user from other user */
void con_user_zap(cnu user, xmlnode data); /* clean up the user */
void con_user_process(cnu to, cnu from, jpacket jp); /* process packets betweeen users */
/* Functions in utils.c */
xmlnode add_extended_presence(cnu from, cnu to, xmlnode presence, char *status, char *reason, char *actor);
/* Adds extended presence info to a presence packet */
void dbg_xhash(xht h, const char *key, void *data, void *arg);
int is_sadmin(cni master, jid user); /* Check if user is server admin */
int is_owner(cnr room, jid user); /* Check if user is room owner */
int is_admin(cnr room, jid user); /* Check if user is room admin */
int is_member(cnr room, jid user); /* Check if user is invited to the room */
int is_outcast(cnr room, jid user); /* Check if user is banned from the room */
int is_moderator(cnr room, jid user); /* Check if user is room admin */
int is_participant(cnr room, jid user); /* Check if user has voice */
int is_visitor(cnr room, jid user); /* Check if user is a visitor */
int in_room(cnr room, jid user); /* Check if user in the room */
int is_legacy(cnu user); /* Check if user is using a legacy client */
int is_leaving(cnr room, jid user); /* Check if user is leaving */
int is_registered(cni master, char *user, char *nick); /* Check if the nick has been reserved */
void con_send_alert(cnu user, char *text, char *subject, char *status);
/* Sends alert message to user */
void con_send_room_status(cnr room, char *status); /* For sending status messages */
char *linesplit(char **entry); /* Splitting '/n' delimited string */
char *funcstr(char *file, char *function, int line); /* Custom log_debug define */
char *itoa(int number, char *result); /* Reverse of atoi command */
int minuteget(time_t tin); /* Get current minute */
char *timeget(time_t tin); /* Get current time */
char *dateget(time_t tin); /* Get current date */
void update_presence(cnu user); /* Send presence update for a user */
void insert_item_error(xmlnode node, char *code, char *msg);
/* Insert error message into item */
int add_roster(cnr room, jid userid); /* Add full jid to room roster */
int remove_roster(cnr room, jid userid); /* Remove full jid from room roster */
xmlnode get_roster(cnr room, jid userid); /* Get all full jids for a user */
char *extractAction(char *origin, pool p); /* extract action from /me string */
int isPrime(unsigned long n); /* Check Primeness for hash functions */
jid jid_fix(jid id); /* Check and fix case of jids */
/* Functions in xdata.c */
xmlnode add_xdata_boolean(char *label, char *var, int data);
xmlnode add_xdata_text(char *label, int type, char *var, char *data);
xmlnode add_xdata_desc(char *label);
void add_xdata_add_rid(const char *key, void *data, void *arg);
void xdata_handler(cnr room, cnu user, jpacket packet);
void xdata_room_config(cnr room, cnu user, int new, xmlnode query);
/* Sends room configuration details */
/* Functions in admin.c */
void con_get_banlist(const char *key, void *data, void *arg);
void adm_user_kick(cnu user, cnu target, char *reason);
void con_parse_item(cnu sender, jpacket jp);
/* Functions in roles.c */
taffil affiliation_level(cnr room, jid user); /* Returns current role level */
trole role_level(cnr room, jid user); /* Returns current role level */
int add_affiliate(htable hash, jid userid, xmlnode details);
int remove_affiliate(htable hash, jid userid);
xmlnode revoke_affiliate(cnr room, htable hash, jid userid);
void change_affiliate(char *role, cnu sender, jid user, char *reason, jid by);
void add_role(htable hash, cnu user);
void revoke_role(htable hash, cnu user);
void change_role(char *role, cnu sender, jid user, char *reason);
/* Functions in xdb.c */
int xdb_room_lists_set(cnr room); /* Save room lists */
void xdb_room_set(cnr room); /* Set room config to xdb */
void xdb_rooms_get(cni master); /* Get room config from xdb */
void xdb_room_clear(cnr room); /* Clear room config from xdb */
int set_data(cni master, char *nick, char *jabberid, xmlnode node, int remove);
/* Store data */
xmlnode get_data_bynick(cni master, char *nick); /* Retrieved stored data */
xmlnode get_data_byjid(cni master, char *jabberid); /* Retrieved stored data */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -