214
225
jsess->status = JABBER_DISCONNECTED;
227
zabbix_log(LOG_LEVEL_DEBUG, "%s: End of %s()", __module_name, __function_name);
219
static int on_stream (jabber_session_p sess, int type, iks *node)
232
static int on_stream(jabber_session_p sess, int type, iks *node)
234
const char *__function_name = "on_stream";
239
zabbix_log(LOG_LEVEL_DEBUG, "%s: In %s()", __module_name, __function_name);
225
242
case IKS_NODE_START:
226
if (sess->opt_use_tls && !iks_is_secure (sess->prs)) {
227
iks_start_tls (sess->prs);
230
if (!sess->opt_use_sasl) {
231
x = iks_make_auth (sess->acc, sess->pass, iks_find_attrib (node, "id"));
232
iks_insert_attrib (x, "id", "auth");
233
iks_send (sess->prs, x);
238
244
case IKS_NODE_NORMAL:
239
if (strcmp ("stream:features", iks_name (node)) == 0) {
240
sess->features = iks_stream_features (node);
241
if (sess->opt_use_sasl) {
242
if (sess->opt_use_tls && !iks_is_secure (sess->prs)) break;
243
if (sess->status == JABBER_AUTHORIZED) {
244
if (sess->features & IKS_STREAM_BIND) {
245
x = iks_make_resource_bind (sess->acc);
246
iks_send (sess->prs, x);
245
if (0 == strcmp("stream:features", iks_name(node)))
247
sess->features = iks_stream_features(node);
249
if (IKS_STREAM_STARTTLS == (sess->features & IKS_STREAM_STARTTLS))
250
iks_start_tls (sess->prs);
253
if (sess->status == JABBER_AUTHORIZED)
255
if (IKS_STREAM_BIND == (sess->features & IKS_STREAM_BIND))
257
x = iks_make_resource_bind(sess->acc);
258
iks_send(sess->prs, x);
249
if (sess->features & IKS_STREAM_SESSION) {
261
if (IKS_STREAM_SESSION == (sess->features & IKS_STREAM_SESSION))
250
263
x = iks_make_session ();
251
iks_insert_attrib (x, "id", "auth");
252
iks_send (sess->prs, x);
264
iks_insert_attrib(x, "id", "auth");
265
iks_send(sess->prs, x);
256
if (sess->features & IKS_STREAM_SASL_MD5)
257
iks_start_sasl (sess->prs, IKS_SASL_DIGEST_MD5, sess->acc->user, sess->pass);
258
else if (sess->features & IKS_STREAM_SASL_PLAIN)
259
iks_start_sasl (sess->prs, IKS_SASL_PLAIN, sess->acc->user, sess->pass);
271
if (IKS_STREAM_SASL_MD5 == (sess->features & IKS_STREAM_SASL_MD5))
272
iks_start_sasl(sess->prs, IKS_SASL_DIGEST_MD5, sess->acc->user, sess->pass);
273
else if (IKS_STREAM_SASL_PLAIN == (sess->features & IKS_STREAM_SASL_PLAIN))
274
iks_start_sasl(sess->prs, IKS_SASL_PLAIN, sess->acc->user, sess->pass);
262
} else if (strcmp ("failure", iks_name (node)) == 0) {
263
zabbix_log (LOG_LEVEL_WARNING, "JABBER: sasl authentication failed");
264
} else if (strcmp ("success", iks_name (node)) == 0) {
265
zabbix_log (LOG_LEVEL_DEBUG, "JABBER: authorized");
278
else if (strcmp("failure", iks_name(node)) == 0)
280
zbx_snprintf(jabber_error, jabber_error_len, "sasl authentication failed");
281
jsess->status = JABBER_ERROR;
284
else if (strcmp("success", iks_name(node)) == 0)
286
zabbix_log(LOG_LEVEL_DEBUG, "%s: authorized",
266
288
sess->status = JABBER_AUTHORIZED;
267
iks_send_header (sess->prs, sess->acc->server);
269
pak = iks_packet (node);
270
iks_filter_packet (sess->my_filter, pak);
289
iks_send_header(sess->prs, sess->acc->server);
293
pak = iks_packet(node);
294
iks_filter_packet(sess->my_filter, pak);
295
if (JABBER_READY == jsess->status)
274
299
case IKS_NODE_STOP:
275
zabbix_log (LOG_LEVEL_WARNING, "JABBER: server disconnected");
300
zbx_snprintf(jabber_error, jabber_error_len, "server disconnected");
301
jsess->status = JABBER_ERROR;
278
304
case IKS_NODE_ERROR:
279
zabbix_log (LOG_LEVEL_WARNING, "JABBER: stream error");
305
zbx_snprintf(jabber_error, jabber_error_len, "stream error");
280
306
jsess->status = JABBER_ERROR;
283
if (node) iks_delete (node);
313
zabbix_log(LOG_LEVEL_DEBUG, "%s: End of %s()", __module_name, __function_name);
287
318
static int on_error (void *user_data, ikspak *pak)
289
zabbix_log (LOG_LEVEL_WARNING, "JABBER: authorization failed");
320
zbx_snprintf(jabber_error, jabber_error_len, "authorization failed");
291
322
jsess->status = JABBER_ERROR;
292
324
return IKS_FILTER_EAT;
296
328
static void on_log (jabber_session_p sess, const char *data, size_t size, int is_incoming)
298
zabbix_log(LOG_LEVEL_DEBUG, "%s%s [%s]\n", iks_is_secure (sess->prs) ? "Sec" : "", is_incoming ? "RECV" : "SEND", data);
330
zabbix_log(LOG_LEVEL_DEBUG, "%s: %s%s: %s",
331
__module_name, iks_is_secure (sess->prs) ? "Sec" : "", is_incoming ? "RECV" : "SEND", data);
317
350
******************************************************************************/
318
static int connect_jabber(const char *jabber_id, const char *password, int use_sasl, int port, char *error, int len)
351
static int connect_jabber(const char *jabber_id, const char *password, int use_sasl, int port)
322
int iks_error = IKS_OK;
353
const char *__function_name = "connect_jabber";
355
int iks_error, timeout, ret = FAIL;
324
zabbix_log(LOG_LEVEL_DEBUG, "JABBER: connecting as %s", jabber_id);
357
zabbix_log(LOG_LEVEL_DEBUG, "%s: In %s('%s')",
358
__module_name, __function_name, jabber_id);
328
362
jsess = zbx_malloc(jsess, sizeof (jabber_session_t));
329
363
memset (jsess, 0, sizeof (jabber_session_t));
365
else if (JABBER_DISCONNECTED != jsess->status)
333
366
disconnect_jabber();
336
jsess->pass = strdup(password);
337
jsess->opt_use_sasl = use_sasl;
339
if ( !(jsess->prs = iks_stream_new (IKS_NS_CLIENT, jsess, (iksStreamHook *) on_stream)) )
368
if (NULL == (jsess->prs = iks_stream_new(IKS_NS_CLIENT, jsess, (iksStreamHook *)on_stream)))
341
zbx_snprintf(error, len, "Cannot create iksemel parser [%s]", strerror(errno));
370
zbx_snprintf(jabber_error, jabber_error_len, "Cannot create iksemel parser: %s",
346
iks_set_log_hook (jsess->prs, (iksLogHook *) on_log);
376
iks_set_log_hook (jsess->prs, (iksLogHook *)on_log);
347
377
#endif /* DEBUG */
349
jsess->acc = iks_id_new (iks_parser_stack (jsess->prs), jabber_id);
379
jsess->acc = iks_id_new(iks_parser_stack(jsess->prs), jabber_id);
351
381
if (NULL == jsess->acc->resource) {
352
382
/* user gave no resource name, use the default */
353
buf = zbx_dsprintf (buf, "%s@%s/%s", jsess->acc->user, jsess->acc->server, "ZABBIX");
354
jsess->acc = iks_id_new (iks_parser_stack (jsess->prs), buf);
383
buf = zbx_dsprintf(buf, "%s@%s/%s", jsess->acc->user, jsess->acc->server, "ZABBIX");
384
jsess->acc = iks_id_new(iks_parser_stack (jsess->prs), buf);
358
if( !(jsess->my_filter = iks_filter_new ()) )
388
jsess->pass = strdup(password);
389
jsess->opt_use_sasl = use_sasl;
391
if (NULL == (jsess->my_filter = iks_filter_new()))
360
zbx_snprintf(error, len, "Cannot create filter [%s]", strerror(errno));
393
zbx_snprintf(jabber_error, jabber_error_len, "Cannot create filter: %s",
364
iks_filter_add_rule (jsess->my_filter, (iksFilterHook *) on_result, jsess,
398
iks_filter_add_rule(jsess->my_filter, (iksFilterHook *)on_result, jsess,
365
399
IKS_RULE_TYPE, IKS_PAK_IQ,
366
400
IKS_RULE_SUBTYPE, IKS_TYPE_RESULT,
367
401
IKS_RULE_ID, "auth",
370
iks_filter_add_rule (jsess->my_filter, on_error, jsess,
404
iks_filter_add_rule(jsess->my_filter, on_error, jsess,
371
405
IKS_RULE_TYPE, IKS_PAK_IQ,
372
406
IKS_RULE_SUBTYPE, IKS_TYPE_ERROR,
373
407
IKS_RULE_ID, "auth",
376
switch (iks_error = iks_connect_with(jsess->prs, jsess->acc->server, port, jsess->acc->server, &zbx_iks_transport) ) {
410
switch (iks_connect_with(jsess->prs, jsess->acc->server, port, jsess->acc->server, &zbx_iks_transport))
411
/* switch (iks_connect_via(jsess->prs, jsess->acc->server, port, jsess->acc->server))*/
379
415
case IKS_NET_NODNS:
380
zbx_snprintf(error, len, "Hostname lookup failed");
416
zbx_snprintf(jabber_error, jabber_error_len, "Hostname lookup failed");
382
418
case IKS_NET_NOCONN:
383
zbx_snprintf(error, len, "Connection failed: %s", strerror_from_system(errno));
419
zbx_snprintf(jabber_error, jabber_error_len, "Connection failed: %s",
420
strerror_from_system(errno));
386
zbx_snprintf(error, len, "Connection error: %s", strerror_from_system(errno));
423
zbx_snprintf(jabber_error, jabber_error_len, "Connection error: %s",
424
strerror_from_system(errno));
390
while (jsess->status != JABBER_READY) {
391
switch (iks_error = iks_recv (jsess->prs, 5)) {
395
case IKS_NET_TLSFAIL:
396
zbx_snprintf(error, len, "tls handshake failed");
399
zbx_snprintf(error, len, "receiving error [%i][%i]", iks_error, errno);
429
while (JABBER_READY != jsess->status && JABBER_ERROR != jsess->status) {
430
iks_error = iks_recv(jsess->prs, 1);
432
if (IKS_HOOK == iks_error)
435
if (IKS_NET_TLSFAIL == iks_error)
437
zbx_snprintf(jabber_error, jabber_error_len, "tls handshake failed");
441
if (IKS_OK != iks_error)
443
zbx_snprintf(jabber_error, jabber_error_len, "receiving error [%i][%i]",
452
if (JABBER_READY == jsess->status)
456
zabbix_log(LOG_LEVEL_DEBUG, "%s: End of %s():%s",
457
__module_name, __function_name,
458
zbx_result_string(ret));
411
463
/******************************************************************************
426
478
******************************************************************************/
427
int send_jabber(char *username, char *passwd, char *sendto, char *message, char *error, int max_error_len)
479
int send_jabber(char *username, char *passwd, char *sendto, char *subject, char *message, char *error, int max_error_len)
431
int iks_error = IKS_OK;
481
const char *__function_name = "send_jabber";
483
int ret = FAIL, iks_error = IKS_OK;
435
zabbix_log( LOG_LEVEL_DEBUG, "JABBER: sending message");
487
zabbix_log(LOG_LEVEL_DEBUG, "%s: In %s()",
488
__module_name, __function_name);
439
if (NULL == jsess || jsess->status == JABBER_DISCONNECTED || jsess->status == JABBER_ERROR) {
440
if (SUCCEED != connect_jabber(username, passwd, 1, IKS_JABBER_PORT, error, max_error_len))
442
zabbix_log(LOG_LEVEL_WARNING, "JABBER: %s", error);
447
zabbix_log( LOG_LEVEL_DEBUG, "JABBER: sending");
448
if( (x = iks_make_msg(IKS_TYPE_NONE, sendto, message)) )
492
jabber_error = error;
493
jabber_error_len = max_error_len;
495
if (SUCCEED != connect_jabber(username, passwd, 1, IKS_JABBER_PORT))
498
zabbix_log(LOG_LEVEL_DEBUG, "%s: sending",
501
if (NULL != (x = iks_make_msg(IKS_TYPE_NONE, sendto, message)))
503
iks_insert_cdata(iks_insert(x, "subject"), subject, 0);
450
504
iks_insert_attrib(x, "from", username);
451
if ( IKS_OK == (iks_error = iks_send (jsess->prs, x)) )
505
if (IKS_OK == (iks_error = iks_send(jsess->prs, x)))
453
zabbix_log( LOG_LEVEL_DEBUG, "JABBER: message sent");
507
zabbix_log(LOG_LEVEL_DEBUG, "%s: message sent",
458
513
jsess->status = JABBER_ERROR;
460
zbx_snprintf(error, max_error_len, "JABBER: Cannot send message: %s", strerror_from_system(errno));
461
zabbix_log(LOG_LEVEL_WARNING, "%s", error);
515
zbx_snprintf(error, max_error_len, "Cannot send message: %s",
516
strerror_from_system(errno));
467
zbx_snprintf(error, max_error_len, "JABBER: Cannot create message");
468
zabbix_log(LOG_LEVEL_WARNING, "%s", error);
521
zbx_snprintf(error, max_error_len, "Cannot create message");
524
if (NULL != jsess && JABBER_DISCONNECTED != jsess->status)
528
jabber_error_len = 0;
531
zabbix_log(LOG_LEVEL_WARNING, "%s: [%s] %s",
536
zabbix_log(LOG_LEVEL_DEBUG, "%s: End of %s():%s",
537
__module_name, __function_name,
538
zbx_result_string(ret));