postfix_status_line 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/README.md +20 -0
- data/ext/postfix_status_line_core.c +135 -26
- data/lib/postfix_status_line/version.rb +1 -1
- data/lib/postfix_status_line.rb +10 -0
- metadata +2 -3
- data/test.txt +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94a439a7c52803281aed989326452482635a1a51
|
4
|
+
data.tar.gz: 879309fe801021f6ca9405d3f999b3787f1a0626
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92907958f1605d908366b9d032f8a8b98ded4175f5b6dfdc35dd5f08f0829b2df2586d76d2e5fa50c4e8e2d8fcf0d9815294e6f0733dda30ab5f28ada1ee7cfd
|
7
|
+
data.tar.gz: c58b95c85fe2b700e4c69027cb5c99205db1e8dda75a02a992dfabb1b049ce5428f271f4dd52e82e6e5819f5cc4401610496516960a96846cbbb16e1544be5be
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -63,6 +63,26 @@ PostfixStatusLine.parse(status_line, hash: true, sha_algorithm: 256)
|
|
63
63
|
PostfixStatusLine.parse(status_line, parse_time: true)
|
64
64
|
```
|
65
65
|
|
66
|
+
### Parse Header Checks Warning
|
67
|
+
|
68
|
+
see http://www.postfix.org/header_checks.5.html
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
warning = "Mar 4 14:44:19 P788 postfix/cleanup[7426]: E80A9DF6F7E: warning: header Subject: test from local; from=<sugawara@P788.local> to=<sgwr_dts@yahoo.co.jp>"
|
72
|
+
|
73
|
+
PostfixStatusLine.parse_header_checks_warning(warning)
|
74
|
+
# => {
|
75
|
+
# "time"=>"Mar 4 14:44:19",
|
76
|
+
# "hostname"=>"P788",
|
77
|
+
# "process"=>"postfix/cleanup[7426]",
|
78
|
+
# "queue_id"=>"E80A9DF6F7E",
|
79
|
+
# "to"=>"********@yahoo.co.jp",
|
80
|
+
# "domain"=>"yahoo.co.jp",
|
81
|
+
# "from"=>"********@P788.local",
|
82
|
+
# "Subject"=>"test from local;"
|
83
|
+
# }
|
84
|
+
```
|
85
|
+
|
66
86
|
## Benchmark (on EC2/t2.micro)
|
67
87
|
|
68
88
|
### Script
|
@@ -273,6 +273,52 @@ static void split_line2(char *str, bool mask, VALUE hash, bool include_hash, cha
|
|
273
273
|
}
|
274
274
|
}
|
275
275
|
|
276
|
+
static void put_header(char *str, VALUE hash, bool mask) {
|
277
|
+
if (strncmp(str, "warning: header ", 16) != 0) {
|
278
|
+
return;
|
279
|
+
}
|
280
|
+
|
281
|
+
str += 16;
|
282
|
+
char *value = strchr(str, ':');
|
283
|
+
|
284
|
+
if (value == NULL || *(value + 1) == '\0') {
|
285
|
+
return;
|
286
|
+
}
|
287
|
+
|
288
|
+
if (mask) {
|
289
|
+
mask_email(value);
|
290
|
+
}
|
291
|
+
|
292
|
+
*value = '\0';
|
293
|
+
value += 2;
|
294
|
+
|
295
|
+
VALUE v_key = rb_str_new2(str);
|
296
|
+
VALUE v_value = rb_str_new2(value);
|
297
|
+
rb_hash_aset(hash, v_key, v_value);
|
298
|
+
}
|
299
|
+
|
300
|
+
static void split_line3(char *str, bool mask, VALUE hash, bool include_hash, char *salt, size_t salt_len, DIGEST_SHA digest_sha_func) {
|
301
|
+
char *ptr = str;
|
302
|
+
size_t len = strlen(str);
|
303
|
+
int i;
|
304
|
+
|
305
|
+
for (i = (int) len - 1; i >= 0; i--) {
|
306
|
+
if (ptr[i] == ' ') {
|
307
|
+
char *chunk = ptr + i + 1;
|
308
|
+
|
309
|
+
if (strncmp(chunk, "to=", 3) == 0) {
|
310
|
+
put_attr(chunk, hash, mask, include_hash, salt, salt_len, digest_sha_func);
|
311
|
+
ptr[i] = '\0';
|
312
|
+
} else if (strncmp(chunk, "from=", 5) == 0) {
|
313
|
+
put_attr(chunk, hash, mask, include_hash, salt, salt_len, digest_sha_func);
|
314
|
+
ptr[i] = '\0';
|
315
|
+
put_header(ptr, hash, mask);
|
316
|
+
break;
|
317
|
+
}
|
318
|
+
}
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
276
322
|
static int get_year() {
|
277
323
|
time_t now = time(NULL);
|
278
324
|
|
@@ -315,78 +361,82 @@ static void put_epoch(char *time_str, VALUE hash) {
|
|
315
361
|
rb_hash_aset(hash, rb_str_new2("epoch"), LONG2NUM(ts));
|
316
362
|
}
|
317
363
|
|
318
|
-
static
|
364
|
+
static bool parse_init(
|
365
|
+
VALUE v_str, VALUE v_mask, VALUE v_parse_time, VALUE v_hash, VALUE v_salt, VALUE v_sha_algo,
|
366
|
+
char **str, size_t *len, bool *mask, bool *parse_time, bool *include_hash, char **salt, size_t *salt_len, int *sha_algo, DIGEST_SHA *digest_sha_func) {
|
319
367
|
Check_Type(v_str, T_STRING);
|
368
|
+
*str = RSTRING_PTR(v_str);
|
369
|
+
*len = RSTRING_LEN(v_str);
|
320
370
|
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
if (len < 1) {
|
325
|
-
return Qnil;
|
371
|
+
if (*len < 1) {
|
372
|
+
return false;
|
326
373
|
}
|
327
374
|
|
328
|
-
|
329
|
-
|
375
|
+
*mask = rb_value_to_bool(v_mask);
|
376
|
+
*parse_time = rb_value_to_bool(v_parse_time);
|
330
377
|
|
331
|
-
|
332
|
-
|
333
|
-
|
378
|
+
*include_hash = false;
|
379
|
+
*salt = NULL;
|
380
|
+
*salt_len = -1;
|
334
381
|
|
335
382
|
if (rb_value_to_bool(v_hash)) {
|
336
383
|
#ifdef HAVE_OPENSSL_SHA_H
|
337
|
-
include_hash = true;
|
384
|
+
*include_hash = true;
|
338
385
|
|
339
386
|
if (!NIL_P(v_salt)) {
|
340
387
|
Check_Type(v_salt, T_STRING);
|
341
|
-
salt = RSTRING_PTR(v_salt);
|
342
|
-
salt_len = RSTRING_LEN(v_salt);
|
388
|
+
*salt = RSTRING_PTR(v_salt);
|
389
|
+
*salt_len = RSTRING_LEN(v_salt);
|
343
390
|
}
|
344
391
|
#else
|
345
392
|
rb_raise(rb_eArgError, "OpenSSL is not linked");
|
346
393
|
#endif // HAVE_OPENSSL_SHA_H
|
347
394
|
}
|
348
395
|
|
349
|
-
|
396
|
+
*sha_algo = 512;
|
350
397
|
|
351
398
|
if (!NIL_P(v_sha_algo)) {
|
352
399
|
#ifdef HAVE_OPENSSL_SHA_H
|
353
|
-
sha_algo = NUM2INT(v_sha_algo);
|
400
|
+
*sha_algo = NUM2INT(v_sha_algo);
|
354
401
|
#else
|
355
402
|
rb_raise(rb_eArgError, "OpenSSL is not linked");
|
356
403
|
#endif // HAVE_OPENSSL_SHA_H
|
357
404
|
}
|
358
405
|
|
359
|
-
|
406
|
+
*digest_sha_func = NULL;
|
360
407
|
|
361
408
|
#ifdef HAVE_OPENSSL_SHA_H
|
362
|
-
switch (sha_algo) {
|
409
|
+
switch (*sha_algo) {
|
363
410
|
case 1:
|
364
|
-
digest_sha_func = digest_sha1;
|
411
|
+
*digest_sha_func = digest_sha1;
|
365
412
|
break;
|
366
413
|
case 224:
|
367
|
-
digest_sha_func = digest_sha224;
|
414
|
+
*digest_sha_func = digest_sha224;
|
368
415
|
break;
|
369
416
|
case 256:
|
370
|
-
digest_sha_func = digest_sha256;
|
417
|
+
*digest_sha_func = digest_sha256;
|
371
418
|
break;
|
372
419
|
case 384:
|
373
|
-
digest_sha_func = digest_sha384;
|
420
|
+
*digest_sha_func = digest_sha384;
|
374
421
|
break;
|
375
422
|
case 512:
|
376
|
-
digest_sha_func = digest_sha512;
|
423
|
+
*digest_sha_func = digest_sha512;
|
377
424
|
break;
|
378
425
|
default:
|
379
426
|
rb_raise(rb_eArgError, "Invalid SHA algorithm");
|
380
427
|
}
|
381
428
|
#endif // HAVE_OPENSSL_SHA_H
|
382
429
|
|
383
|
-
|
430
|
+
return true;
|
431
|
+
}
|
432
|
+
|
433
|
+
static VALUE pre_parse(char *str, size_t len, char *buf, bool parse_time, char **attrs) {
|
384
434
|
strncpy(buf, str, len);
|
385
435
|
buf[len] = '\0';
|
386
436
|
|
387
|
-
char *tm, *hostname, *process, *queue_id
|
437
|
+
char *tm, *hostname, *process, *queue_id;
|
388
438
|
|
389
|
-
if (!split_line1(buf, &tm, &hostname, &process, &queue_id,
|
439
|
+
if (!split_line1(buf, &tm, &hostname, &process, &queue_id, attrs)) {
|
390
440
|
return Qnil;
|
391
441
|
}
|
392
442
|
|
@@ -400,13 +450,72 @@ static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask,
|
|
400
450
|
put_epoch(tm, hash);
|
401
451
|
}
|
402
452
|
|
453
|
+
return hash;
|
454
|
+
}
|
455
|
+
|
456
|
+
static VALUE rb_postfix_status_line_parse(VALUE self, VALUE v_str, VALUE v_mask, VALUE v_hash, VALUE v_salt, VALUE v_parse_time, VALUE v_sha_algo) {
|
457
|
+
char *str;
|
458
|
+
size_t len;
|
459
|
+
bool mask;
|
460
|
+
bool parse_time;
|
461
|
+
bool include_hash;
|
462
|
+
char *salt;
|
463
|
+
size_t salt_len;
|
464
|
+
int sha_algo;
|
465
|
+
DIGEST_SHA digest_sha_func;
|
466
|
+
|
467
|
+
if (!parse_init(v_str, v_mask, v_parse_time, v_hash, v_salt, v_sha_algo,
|
468
|
+
&str, &len, &mask, &parse_time, &include_hash, &salt, &salt_len, &sha_algo, &digest_sha_func)) {
|
469
|
+
return Qnil;
|
470
|
+
}
|
471
|
+
|
472
|
+
char buf[len + 1];
|
473
|
+
char *attrs;
|
474
|
+
|
475
|
+
VALUE hash = pre_parse(str, len, buf, parse_time, &attrs);
|
476
|
+
|
477
|
+
if (NIL_P(hash)) {
|
478
|
+
return Qnil;
|
479
|
+
}
|
480
|
+
|
403
481
|
split_line2(attrs, mask, hash, include_hash, salt, salt_len, digest_sha_func);
|
404
482
|
|
405
483
|
return hash;
|
406
484
|
}
|
407
485
|
|
486
|
+
static VALUE rb_postfix_status_line_parse_header_checks_warning(VALUE self, VALUE v_str, VALUE v_mask, VALUE v_hash, VALUE v_salt, VALUE v_parse_time, VALUE v_sha_algo) {
|
487
|
+
char *str;
|
488
|
+
size_t len;
|
489
|
+
bool mask;
|
490
|
+
bool parse_time;
|
491
|
+
bool include_hash;
|
492
|
+
char *salt;
|
493
|
+
size_t salt_len;
|
494
|
+
int sha_algo;
|
495
|
+
DIGEST_SHA digest_sha_func;
|
496
|
+
|
497
|
+
if (!parse_init(v_str, v_mask, v_parse_time, v_hash, v_salt, v_sha_algo,
|
498
|
+
&str, &len, &mask, &parse_time, &include_hash, &salt, &salt_len, &sha_algo, &digest_sha_func)) {
|
499
|
+
return Qnil;
|
500
|
+
}
|
501
|
+
|
502
|
+
char buf[len + 1];
|
503
|
+
char *attrs;
|
504
|
+
|
505
|
+
VALUE hash = pre_parse(str, len, buf, parse_time, &attrs);
|
506
|
+
|
507
|
+
if (NIL_P(hash)) {
|
508
|
+
return Qnil;
|
509
|
+
}
|
510
|
+
|
511
|
+
split_line3(attrs, mask, hash, include_hash, salt, salt_len, digest_sha_func);
|
512
|
+
|
513
|
+
return hash;
|
514
|
+
}
|
515
|
+
|
408
516
|
void Init_postfix_status_line_core() {
|
409
517
|
VALUE rb_mPostfixStatusLine = rb_define_module("PostfixStatusLine");
|
410
518
|
VALUE rb_mPostfixStatusLineCore = rb_define_module_under(rb_mPostfixStatusLine, "Core");
|
411
519
|
rb_define_module_function(rb_mPostfixStatusLineCore, "parse", rb_postfix_status_line_parse, 6);
|
520
|
+
rb_define_module_function(rb_mPostfixStatusLineCore, "parse_header_checks_warning", rb_postfix_status_line_parse_header_checks_warning, 6);
|
412
521
|
}
|
data/lib/postfix_status_line.rb
CHANGED
@@ -13,4 +13,14 @@ module PostfixStatusLine
|
|
13
13
|
PostfixStatusLine::Core.parse(str, mask, hash, salt, parse_time, sha_algo)
|
14
14
|
end
|
15
15
|
module_function :parse
|
16
|
+
|
17
|
+
def parse_header_checks_warning(str, options = {})
|
18
|
+
mask = options.has_key?(:mask) ? options[:mask] : true
|
19
|
+
hash = options[:hash]
|
20
|
+
salt = options[:salt]
|
21
|
+
parse_time = options[:parse_time]
|
22
|
+
sha_algo = options[:sha_algorithm]
|
23
|
+
PostfixStatusLine::Core.parse_header_checks_warning(str, mask, hash, salt, parse_time, sha_algo)
|
24
|
+
end
|
25
|
+
module_function :parse_header_checks_warning
|
16
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postfix_status_line
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -90,7 +90,6 @@ files:
|
|
90
90
|
- lib/postfix_status_line.rb
|
91
91
|
- lib/postfix_status_line/version.rb
|
92
92
|
- postfix_status_line.gemspec
|
93
|
-
- test.txt
|
94
93
|
homepage: https://github.com/winebarrel/postfix_status_line
|
95
94
|
licenses:
|
96
95
|
- MIT
|
data/test.txt
DELETED
File without changes
|