PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/plugins/irc/irc-server.h

#
C Header | 305 lines | 254 code | 21 blank | 30 comment | 0 complexity | a53d8ea468dcf34c740153f48261d167 MD5 | raw file
Possible License(s): GPL-3.0
  1. /*
  2. * Copyright (C) 2003-2012 Sebastien Helleu <flashcode@flashtux.org>
  3. *
  4. * This file is part of WeeChat, the extensible chat client.
  5. *
  6. * WeeChat is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * WeeChat is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with WeeChat. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef __WEECHAT_IRC_SERVER_H
  20. #define __WEECHAT_IRC_SERVER_H 1
  21. #include <sys/time.h>
  22. #include <regex.h>
  23. #ifdef HAVE_GNUTLS
  24. #include <gnutls/gnutls.h>
  25. #endif
  26. #ifndef NI_MAXHOST
  27. #define NI_MAXHOST 256
  28. #endif
  29. enum t_irc_server_option
  30. {
  31. IRC_SERVER_OPTION_ADDRESSES = 0, /* server addresses (IP/name with port) */
  32. IRC_SERVER_OPTION_PROXY, /* proxy used for server (optional) */
  33. IRC_SERVER_OPTION_IPV6, /* use IPv6 protocol */
  34. IRC_SERVER_OPTION_SSL, /* SSL protocol */
  35. IRC_SERVER_OPTION_SSL_CERT, /* client ssl certificate file */
  36. IRC_SERVER_OPTION_SSL_PRIORITIES, /* gnutls priorities */
  37. IRC_SERVER_OPTION_SSL_DHKEY_SIZE, /* Diffie Hellman key size */
  38. IRC_SERVER_OPTION_SSL_VERIFY, /* check if the connection is trusted */
  39. IRC_SERVER_OPTION_PASSWORD, /* password for server */
  40. IRC_SERVER_OPTION_CAPABILITIES, /* client capabilities to enable */
  41. IRC_SERVER_OPTION_SASL_MECHANISM,/* mechanism for SASL authentication */
  42. IRC_SERVER_OPTION_SASL_USERNAME, /* username for SASL authentication */
  43. IRC_SERVER_OPTION_SASL_PASSWORD, /* password for SASL authentication */
  44. IRC_SERVER_OPTION_SASL_TIMEOUT, /* timeout for SASL authentication */
  45. IRC_SERVER_OPTION_AUTOCONNECT, /* autoconnect to server at startup */
  46. IRC_SERVER_OPTION_AUTORECONNECT, /* autoreconnect when disconnected */
  47. IRC_SERVER_OPTION_AUTORECONNECT_DELAY, /* delay before trying again reco */
  48. IRC_SERVER_OPTION_NICKS, /* nicknames (comma separated list) */
  49. IRC_SERVER_OPTION_USERNAME, /* user name */
  50. IRC_SERVER_OPTION_REALNAME, /* real name */
  51. IRC_SERVER_OPTION_LOCAL_HOSTNAME,/* custom local hostname */
  52. IRC_SERVER_OPTION_COMMAND, /* command to run once connected */
  53. IRC_SERVER_OPTION_COMMAND_DELAY, /* delay after execution of command */
  54. IRC_SERVER_OPTION_AUTOJOIN, /* channels to automatically join */
  55. IRC_SERVER_OPTION_AUTOREJOIN, /* auto rejoin channels when kicked */
  56. IRC_SERVER_OPTION_AUTOREJOIN_DELAY, /* delay before auto rejoin */
  57. IRC_SERVER_OPTION_CONNECTION_TIMEOUT, /* timeout for connection */
  58. IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH, /* anti-flood (high priority) */
  59. IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW, /* anti-flood (low priority) */
  60. IRC_SERVER_OPTION_AWAY_CHECK, /* delay between away checks */
  61. IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS, /* max nicks for away check */
  62. IRC_SERVER_OPTION_DEFAULT_MSG_PART, /* default part message */
  63. IRC_SERVER_OPTION_DEFAULT_MSG_QUIT, /* default quit message */
  64. IRC_SERVER_OPTION_NOTIFY, /* notify list */
  65. /* number of server options */
  66. IRC_SERVER_NUM_OPTIONS,
  67. };
  68. #define IRC_SERVER_OPTION_BOOLEAN(__server, __index) \
  69. ((!weechat_config_option_is_null(__server->options[__index])) ? \
  70. weechat_config_boolean(__server->options[__index]) : \
  71. ((!weechat_config_option_is_null(irc_config_server_default[__index])) ? \
  72. weechat_config_boolean(irc_config_server_default[__index]) \
  73. : weechat_config_boolean_default(irc_config_server_default[__index])))
  74. #define IRC_SERVER_OPTION_INTEGER(__server, __index) \
  75. ((!weechat_config_option_is_null(__server->options[__index])) ? \
  76. weechat_config_integer(__server->options[__index]) : \
  77. ((!weechat_config_option_is_null(irc_config_server_default[__index])) ? \
  78. weechat_config_integer(irc_config_server_default[__index]) \
  79. : weechat_config_integer_default(irc_config_server_default[__index])))
  80. #define IRC_SERVER_OPTION_STRING(__server, __index) \
  81. ((!weechat_config_option_is_null(__server->options[__index])) ? \
  82. weechat_config_string(__server->options[__index]) : \
  83. ((!weechat_config_option_is_null(irc_config_server_default[__index])) ? \
  84. weechat_config_string(irc_config_server_default[__index]) \
  85. : weechat_config_string_default(irc_config_server_default[__index])))
  86. #define IRC_SERVER_DEFAULT_PORT 6667
  87. #define IRC_SERVER_DEFAULT_NICKS "weechat1,weechat2,weechat3,weechat4,weechat5"
  88. /* number of queues for sending messages */
  89. #define IRC_SERVER_NUM_OUTQUEUES_PRIO 2
  90. /* flags for irc_server_sendf() */
  91. #define IRC_SERVER_SEND_OUTQ_PRIO_HIGH 1
  92. #define IRC_SERVER_SEND_OUTQ_PRIO_LOW 2
  93. #define IRC_SERVER_SEND_RETURN_HASHTABLE 4
  94. /* casemapping (string comparisons for nicks/channels) */
  95. enum t_irc_server_casemapping
  96. {
  97. IRC_SERVER_CASEMAPPING_RFC1459 = 0, /* A-Z [ \ ] ^ ==> a-z { | } ~ */
  98. IRC_SERVER_CASEMAPPING_STRICT_RFC1459, /* A-Z [ \ ] ==> a-z { | } */
  99. IRC_SERVER_CASEMAPPING_ASCII, /* A-Z ==> a-z */
  100. /* number of casemapping */
  101. IRC_SERVER_NUM_CASEMAPPING,
  102. };
  103. /* output queue of messages to server (for sending slowly to server) */
  104. struct t_irc_outqueue
  105. {
  106. char *command; /* IRC command */
  107. char *message_before_mod; /* msg before any modifier */
  108. char *message_after_mod; /* msg after modifier(s) */
  109. int modified; /* msg was modified by modifier(s) */
  110. char *tags; /* tags (used by Relay plugin) */
  111. struct t_irc_redirect *redirect; /* command redirection */
  112. struct t_irc_outqueue *next_outqueue; /* link to next msg in queue */
  113. struct t_irc_outqueue *prev_outqueue; /* link to prev msg in queue */
  114. };
  115. struct t_irc_server
  116. {
  117. /* user choices */
  118. char *name; /* internal name of server */
  119. struct t_config_option *options[IRC_SERVER_NUM_OPTIONS];
  120. /* internal vars */
  121. int temp_server; /* temporary server (not saved) */
  122. int reloading_from_config; /* 1 if reloading from config file */
  123. int reloaded_from_config; /* 1 if reloaded from config file */
  124. int addresses_count; /* number of addresses */
  125. char **addresses_array; /* addresses (after split) */
  126. int *ports_array; /* ports for addresses */
  127. int index_current_address; /* current address index in array */
  128. char *current_address; /* current address */
  129. char *current_ip; /* current IP address */
  130. int current_port; /* current port */
  131. int sock; /* socket for server (IPv4 or IPv6) */
  132. struct t_hook *hook_connect; /* connection hook */
  133. struct t_hook *hook_fd; /* hook for server socket */
  134. struct t_hook *hook_timer_connection; /* timer for connection */
  135. struct t_hook *hook_timer_sasl; /* timer for SASL authentication */
  136. int is_connected; /* 1 if WeeChat is connected to server */
  137. int ssl_connected; /* = 1 if connected with SSL */
  138. #ifdef HAVE_GNUTLS
  139. gnutls_session_t gnutls_sess; /* gnutls session (only if SSL is used) */
  140. gnutls_x509_crt_t tls_cert; /* certificate used if ssl_cert is set */
  141. gnutls_x509_privkey_t tls_cert_key; /* key used if ssl_cert is set */
  142. #endif
  143. char *unterminated_message; /* beginning of a message in input buf */
  144. int nicks_count; /* number of nicknames */
  145. char **nicks_array; /* nicknames (after split) */
  146. int nick_first_tried; /* first nick tried in list of nicks */
  147. /* when (re-)connecting to server */
  148. char *nick; /* current nickname */
  149. char *nick_modes; /* nick modes */
  150. char *isupport; /* copy of message 005 (ISUPPORT) */
  151. char *prefix_modes; /* prefix modes from msg 005 (eg "ohv") */
  152. char *prefix_chars; /* prefix chars from msg 005 (eg "@%+") */
  153. int nick_max_length; /* max lenth of nick (from msg 005) */
  154. int casemapping; /* casemapping from msg 005 */
  155. char *chantypes; /* chantypes from msg 005 (eg "&#") */
  156. int reconnect_delay; /* current reconnect delay (growing) */
  157. time_t reconnect_start; /* this time + delay = reconnect time */
  158. time_t command_time; /* this time + command_delay = time to */
  159. /* autojoin channels */
  160. int reconnect_join; /* 1 if channels opened to rejoin */
  161. int disable_autojoin; /* 1 if user asked to not autojoin chans */
  162. int is_away; /* 1 is user is marked as away */
  163. char *away_message; /* away message, NULL if not away */
  164. time_t away_time; /* time() when user marking as away */
  165. int lag; /* lag (in milliseconds) */
  166. struct timeval lag_check_time; /* last time lag was checked (ping sent) */
  167. time_t lag_next_check; /* time for next check */
  168. time_t lag_last_refresh; /* last refresh of lag item */
  169. regex_t *cmd_list_regexp; /* compiled Regular Expression for /list */
  170. time_t last_user_message; /* time of last user message (anti flood)*/
  171. time_t last_away_check; /* time of last away check on server */
  172. struct t_irc_outqueue *outqueue[2]; /* queue for outgoing messages */
  173. /* with 2 priorities (high/low) */
  174. struct t_irc_outqueue *last_outqueue[2]; /* last outgoing message */
  175. struct t_irc_redirect *redirects; /* command redirections */
  176. struct t_irc_redirect *last_redirect; /* last command redirection */
  177. struct t_irc_notify *notify_list; /* list of notify */
  178. struct t_irc_notify *last_notify; /* last notify */
  179. struct t_hashtable *manual_joins; /* manual joins pending */
  180. struct t_gui_buffer *buffer; /* GUI buffer allocated for server */
  181. char *buffer_as_string; /* used to return buffer info */
  182. struct t_irc_channel *channels; /* opened channels on server */
  183. struct t_irc_channel *last_channel; /* last opened channel on server */
  184. struct t_irc_server *prev_server; /* link to previous server */
  185. struct t_irc_server *next_server; /* link to next server */
  186. };
  187. /* IRC messages */
  188. struct t_irc_message
  189. {
  190. struct t_irc_server *server; /* server pointer for received msg */
  191. char *data; /* message content */
  192. struct t_irc_message *next_message; /* link to next message */
  193. };
  194. extern struct t_irc_server *irc_servers;
  195. #ifdef HAVE_GNUTLS
  196. extern const int gnutls_cert_type_prio[];
  197. extern const int gnutls_prot_prio[];
  198. #endif
  199. extern struct t_irc_message *irc_recv_msgq, *irc_msgq_last_msg;
  200. extern char *irc_server_option_string[];
  201. extern char *irc_server_option_default[];
  202. extern int irc_server_valid (struct t_irc_server *server);
  203. extern struct t_irc_server *irc_server_search (const char *server_name);
  204. extern struct t_irc_server *irc_server_casesearch (const char *server_name);
  205. extern int irc_server_search_option (const char *option_name);
  206. extern int irc_server_search_casemapping (const char *casemapping);
  207. extern int irc_server_strcasecmp (struct t_irc_server *server,
  208. const char *string1, const char *string2);
  209. extern int irc_server_strncasecmp (struct t_irc_server *server,
  210. const char *string1, const char *string2,
  211. int max);
  212. extern int irc_server_sasl_enabled (struct t_irc_server *server);
  213. extern char *irc_server_get_name_without_port (const char *name);
  214. extern void irc_server_set_addresses (struct t_irc_server *server,
  215. const char *addresses);
  216. extern void irc_server_set_nicks (struct t_irc_server *server, const char *nicks);
  217. extern void irc_server_set_nick (struct t_irc_server *server, const char *nick);
  218. extern int irc_server_get_nick_index (struct t_irc_server *server);
  219. extern const char *irc_server_get_isupport_value (struct t_irc_server *server,
  220. const char *feature);
  221. extern void irc_server_set_prefix_modes_chars (struct t_irc_server *server,
  222. const char *prefix);
  223. extern const char *irc_server_get_prefix_modes (struct t_irc_server *server);
  224. extern const char *irc_server_get_prefix_chars (struct t_irc_server *server);
  225. extern int irc_server_get_prefix_mode_index (struct t_irc_server *server,
  226. char mode);
  227. extern int irc_server_get_prefix_char_index (struct t_irc_server *server,
  228. char prefix_char);
  229. extern char irc_server_get_prefix_mode_for_char (struct t_irc_server *server,
  230. char prefix_char);
  231. extern char irc_server_get_prefix_char_for_mode (struct t_irc_server *server,
  232. char mode);
  233. extern struct t_irc_server *irc_server_alloc (const char *name);
  234. extern struct t_irc_server *irc_server_alloc_with_url (const char *irc_url);
  235. extern void irc_server_apply_command_line_options (struct t_irc_server *server,
  236. int argc, char **argv);
  237. extern void irc_server_free_all ();
  238. extern struct t_irc_server *irc_server_copy (struct t_irc_server *server,
  239. const char *new_name);
  240. extern int irc_server_rename (struct t_irc_server *server, const char *new_name);
  241. extern void irc_server_send_signal (struct t_irc_server *server,
  242. const char *signal, const char *command,
  243. const char *full_message,
  244. const char *tags);
  245. extern void irc_server_set_send_default_tags (const char *tags);
  246. extern struct t_hashtable *irc_server_sendf (struct t_irc_server *server,
  247. int flags,
  248. const char *tags,
  249. const char *format, ...);
  250. extern void irc_server_set_buffer_title (struct t_irc_server *server);
  251. extern struct t_gui_buffer *irc_server_create_buffer (struct t_irc_server *server);
  252. extern int irc_server_connect (struct t_irc_server *server);
  253. extern void irc_server_auto_connect (int auto_connect);
  254. extern void irc_server_autojoin_channels ();
  255. extern int irc_server_recv_cb (void *data, int fd);
  256. extern int irc_server_timer_sasl_cb (void *data, int remaining_calls);
  257. extern int irc_server_timer_cb (void *data, int remaining_calls);
  258. extern void irc_server_outqueue_free_all (struct t_irc_server *server,
  259. int priority);
  260. extern int irc_server_get_channel_count (struct t_irc_server *server);
  261. extern int irc_server_get_pv_count (struct t_irc_server *server);
  262. extern void irc_server_set_away (struct t_irc_server *server, const char *nick,
  263. int is_away);
  264. extern void irc_server_remove_away (struct t_irc_server *server);
  265. extern void irc_server_check_away (struct t_irc_server *server);
  266. extern void irc_server_switch_address (struct t_irc_server *server,
  267. int connection);
  268. extern void irc_server_disconnect (struct t_irc_server *server,
  269. int switch_address, int reconnect);
  270. extern void irc_server_disconnect_all ();
  271. extern void irc_server_free (struct t_irc_server *server);
  272. extern int irc_server_xfer_send_ready_cb (void *data, const char *signal,
  273. const char *type_data, void *signal_data);
  274. extern int irc_server_xfer_resume_ready_cb (void *data, const char *signal,
  275. const char *type_data, void *signal_data);
  276. extern int irc_server_xfer_send_accept_resume_cb (void *data, const char *signal,
  277. const char *type_data,
  278. void *signal_data);
  279. extern struct t_hdata *irc_server_hdata_server_cb (void *data,
  280. const char *hdata_name);
  281. extern int irc_server_add_to_infolist (struct t_infolist *infolist,
  282. struct t_irc_server *server);
  283. extern void irc_server_print_log ();
  284. #endif /* __WEECHAT_IRC_SERVER_H */