milter 1.0.0 → 3.0.0

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.
package/src/milter.cc DELETED
@@ -1,722 +0,0 @@
1
- /**
2
- * node bindings for milter
3
- */
4
-
5
- #include <string.h>
6
- #include <node/uv.h>
7
- #include <node.h>
8
- #include <v8.h>
9
- #include <arpa/inet.h>
10
- #include "libmilter/mfapi.h"
11
- #include "forward.h"
12
- #include "events.h"
13
- #include "envelope.h"
14
-
15
- using namespace v8;
16
- using namespace node;
17
-
18
-
19
- /** globals *******************************************************************/
20
-
21
-
22
- /**
23
- * the name the milter registers with to the MTA.
24
- */
25
- static const char *g_name = "node-bindings";
26
-
27
-
28
- /**
29
- * the libmilter implementation and other application globals.
30
- */
31
- bindings_t app;
32
-
33
-
34
- /** demultiplexer *************************************************************/
35
-
36
-
37
- /**
38
- * all queued events reach node.js from this point; this task is queued on the
39
- * libuv side, in a loop, via uv_async_send
40
- */
41
- void trigger_event (uv_async_t *h)
42
- {
43
- bindings *local = (bindings *)h->data;
44
- Isolate *isolate = Isolate::GetCurrent();
45
- Locker locker (isolate);
46
- HandleScope scope (isolate);
47
- MilterEvent *ev;
48
-
49
- // grab the queue lock
50
- if (pthread_mutex_lock(&local->lck_queue))
51
- {
52
- fprintf(stderr, "trigger_event: queue lock failed\n");
53
- return;
54
- }
55
-
56
- // dequeue one event
57
- ev = local->first;
58
- if (NULL == ev)
59
- {
60
- pthread_mutex_unlock(&local->lck_queue);
61
- fprintf(stderr, "trigger_event: spurious wakeup\n");
62
- return;
63
- }
64
- local->first = ev->Next();
65
- if (NULL == local->first)
66
- local->last = NULL;
67
- ev->Detatch();
68
-
69
- if (!ev->Lock())
70
- {
71
- fprintf(stderr, "trigger_event: event lock failed\n");
72
-
73
- if (pthread_mutex_unlock(&local->lck_queue))
74
- {
75
- fprintf(stderr, "trigger_event: queue unlocked failed\n");
76
- }
77
- return;
78
- }
79
-
80
- // XXX: for top speed, move queue unlock to this point (with or without event lock success)
81
- if (pthread_mutex_unlock(&local->lck_queue))
82
- {
83
- fprintf(stderr, "trigger_event: queue unlock failed\n");
84
- }
85
-
86
- // launch the appropriate node.js callback for the given event
87
- ev->Fire(isolate, local);
88
- }
89
-
90
-
91
- /** multiplexer ***************************************************************/
92
-
93
-
94
- /**
95
- * queue an event from the libmilter side.
96
- */
97
- int generate_event (SMFICTX *context, bindings_t *local, MilterEvent *event)
98
- {
99
- int retval;
100
-
101
- // lock the queue
102
- if (pthread_mutex_lock(&local->lck_queue))
103
- {
104
- fprintf(stderr, "generate_event: queue lock failed\n");
105
- return SMFIS_TEMPFAIL;
106
- }
107
-
108
- // lock the event
109
- if (!event->Lock())
110
- {
111
- if (pthread_mutex_unlock(&local->lck_queue))
112
- {
113
- fprintf(stderr, "generate_event: queue unlock failed\n");
114
- // TODO: handle error?
115
- }
116
-
117
- fprintf(stderr, "generate_event: event lock failed\n");
118
- return SMFIS_TEMPFAIL;
119
- }
120
-
121
- // enqueue the event while holding both locks
122
- if (NULL == local->last)
123
- {
124
- local->first = event;
125
- local->last = event;
126
- }
127
- else
128
- {
129
- local->last->Append(event);
130
- local->last = event;
131
- }
132
-
133
- // unlock the queue to allow other libmilter threads to append events to it
134
- if (pthread_mutex_unlock(&local->lck_queue))
135
- {
136
- // TODO: handle error?
137
- fprintf(stderr, "generate_event: queue unlock failed\n");
138
- }
139
-
140
- // give the event control of the libmilter context
141
- event->SetMilterContext(context);
142
-
143
- for (;;)
144
- {
145
- // let the node loop know we await a result
146
- uv_async_send(&local->trigger);
147
-
148
- // wait on the event's return condition
149
- event->Wait();
150
- // TODO: check error condition
151
- if (event->IsDone()) break;
152
- fprintf(stderr, "generate_event: incomplete task, spurious wakeup\n");
153
- }
154
- // retrieve return code
155
- retval = event->Result();
156
-
157
- if (!event->Unlock())
158
- {
159
- // TODO: handle error?
160
- fprintf(stderr, "generate_event: event unlock failed\n");
161
- }
162
-
163
- return retval;
164
- }
165
-
166
-
167
- /** callbacks provided to libmilter *******************************************/
168
-
169
-
170
- /**
171
- * complicated MTA-to-milter bullshit nobody needs to fiddle with right now
172
- *
173
- * http://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.networkcomm/libmilter_xxfi_negotiate.htm
174
- */
175
- sfsistat fi_negotiate (SMFICTX *context,
176
- unsigned long f0,
177
- unsigned long f1,
178
- unsigned long f2,
179
- unsigned long f3,
180
- unsigned long *pf0,
181
- unsigned long *pf1,
182
- unsigned long *pf2,
183
- unsigned long *pf3)
184
- {
185
- int retval = SMFIS_ALL_OPTS;
186
-
187
- // envelope initializer
188
- // links future events in this thread to the same envelope in node.js
189
- envelope_t *env = new envelope_t(&app);
190
- smfi_setpriv(context, env);
191
-
192
- MilterNegotiate *event = new MilterNegotiate(env, f0, f1, f2, f3, pf0, pf1, pf2, pf3);
193
- #ifdef DEBUG_MILTEREVENT
194
- fprintf(stderr, "negotiate %lu %lu %lu %lu\n", f0, f1, f2, f3);
195
- #endif
196
- retval = generate_event(context, &app, event);
197
- delete event;
198
- return retval;
199
- }
200
-
201
-
202
- /**
203
- * an incoming connection from the MTA has occurred.
204
- */
205
- sfsistat fi_connect (SMFICTX *context, char *host, _SOCK_ADDR *sa)
206
- {
207
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
208
- int retval;
209
-
210
- MilterConnect *event = new MilterConnect(env, host, (sockaddr_in *)sa);
211
- #ifdef DEBUG_MILTEREVENT
212
- fprintf(stderr, "connect \"%s\" \"%s\"\n", event->Host(), event->Address());
213
- #endif
214
- retval = generate_event(context, env->local, event);
215
- delete event;
216
- return retval;
217
- }
218
-
219
-
220
- /**
221
- */
222
- sfsistat fi_unknown (SMFICTX *context, const char *command)
223
- {
224
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
225
- int retval;
226
- MilterUnknown *event = new MilterUnknown(env, command);
227
- #ifdef DEBUG_MILTEREVENT
228
- fprintf(stderr, "unknown \"%s\"\n", command);
229
- #endif
230
- retval = generate_event(context, env->local, event);
231
- delete event;
232
- return retval;
233
- }
234
-
235
-
236
- /**
237
- */
238
- sfsistat fi_helo (SMFICTX *context, char *helo)
239
- {
240
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
241
- int retval;
242
- MilterHELO *event = new MilterHELO(env, helo);
243
- #ifdef DEBUG_MILTEREVENT
244
- fprintf(stderr, "helo \"%s\"\n", helo);
245
- #endif
246
- retval = generate_event(context, env->local, event);
247
- delete event;
248
- return retval;
249
- }
250
-
251
-
252
- /**
253
- * client "MAIL FROM" command
254
- */
255
- sfsistat fi_envfrom (SMFICTX *context, char **argv)
256
- {
257
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
258
- int retval;
259
- MilterMAILFROM *event = new MilterMAILFROM(env, argv);
260
- #ifdef DEBUG_MILTEREVENT
261
- fprintf(stderr, "envfrom \"%s\"\n", argv[0]); // argv[0] is guaranteed
262
- #endif
263
- retval = generate_event(context, env->local, event);
264
- delete event;
265
- return retval;
266
- }
267
-
268
-
269
- /**
270
- * client "RCPT TO" command
271
- */
272
- sfsistat fi_envrcpt (SMFICTX *context, char **argv)
273
- {
274
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
275
- int retval;
276
- MilterRCPTTO *event = new MilterRCPTTO(env, argv);
277
- #ifdef DEBUG_MILTEREVENT
278
- fprintf(stderr, "envrcpt \"%s\"\n", argv[0]); // argv[0] is guaranteed
279
- #endif
280
- retval = generate_event(context, env->local, event);
281
- delete event;
282
- return retval;
283
- }
284
-
285
-
286
- /**
287
- * client "DATA" command
288
- */
289
- sfsistat fi_data (SMFICTX *context)
290
- {
291
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
292
- int retval;
293
- MilterDATA *event = new MilterDATA(env);
294
- #ifdef DEBUG_MILTEREVENT
295
- fprintf(stderr, "data\n");
296
- #endif
297
- retval = generate_event(context, env->local, event);
298
- delete event;
299
- return retval;
300
- }
301
-
302
-
303
- /**
304
- * detected a valid message header
305
- */
306
- sfsistat fi_header (SMFICTX *context, char *name, char *value)
307
- {
308
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
309
- int retval;
310
- MilterHeader *event = new MilterHeader(env, name, value);
311
- #ifdef DEBUG_MILTEREVENT_HEADERS_TOO
312
- fprintf(stderr, "header \"%s\" \"%s\"\n", name, value);
313
- #endif
314
- retval = generate_event(context, env->local, event);
315
- delete event;
316
- return retval;
317
- }
318
-
319
-
320
- /**
321
- * detected CRLFCRLF in data stream
322
- */
323
- sfsistat fi_eoh (SMFICTX *context)
324
- {
325
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
326
- int retval;
327
- MilterEndHeaders *event = new MilterEndHeaders(env);
328
- #ifdef DEBUG_MILTEREVENT
329
- fprintf(stderr, "eoh\n");
330
- #endif
331
- retval = generate_event(context, env->local, event);
332
- delete event;
333
- return retval;
334
- }
335
-
336
-
337
- /**
338
- * nota bene: segment is a byte buffer of unspecified encoding! don't
339
- * assume it isn't utf-8 just because smtp doesn't truly support that yet!
340
- */
341
- sfsistat fi_body (SMFICTX *context, unsigned char *segment, size_t len)
342
- {
343
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
344
- int retval;
345
- MilterMessageData *event = new MilterMessageData(env, segment, len);
346
- #ifdef DEBUG_MILTEREVENT
347
- fprintf(stderr, "message-data (%lu bytes)\n", len);
348
- #endif
349
- retval = generate_event(context, env->local, event);
350
- delete event;
351
- return retval;
352
- }
353
-
354
-
355
- /**
356
- * client "." command
357
- */
358
- sfsistat fi_eom (SMFICTX *context)
359
- {
360
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
361
- int retval;
362
- MilterEndMessage *event = new MilterEndMessage(env);
363
- #ifdef DEBUG_MILTEREVENT
364
- fprintf(stderr, "eom\n");
365
- #endif
366
- retval = generate_event(context, env->local, event);
367
- delete event;
368
- return retval;
369
- }
370
-
371
-
372
- /**
373
- * probably triggered on client "RSET" or any other connection loss
374
- *
375
- * fi_close will still be called afterward, but fi_abort implies the client
376
- * definitely changed their mind about sending mail
377
- */
378
- sfsistat fi_abort (SMFICTX *context)
379
- {
380
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
381
- int retval;
382
- MilterAbort *event = new MilterAbort(env);
383
- #ifdef DEBUG_MILTEREVENT
384
- fprintf(stderr, "abort\n");
385
- #endif
386
- retval = generate_event(context, env->local, event);
387
- delete event;
388
- return retval;
389
- }
390
-
391
-
392
- /**
393
- */
394
- sfsistat fi_close (SMFICTX *context)
395
- {
396
- envelope_t *env = (envelope_t *)smfi_getpriv(context);
397
- int retval;
398
- MilterClose *event = new MilterClose(env);
399
- #ifdef DEBUG_MILTEREVENT
400
- fprintf(stderr, "close\n");
401
- #endif
402
- retval = generate_event(context, env->local, event);
403
- delete event;
404
-
405
- // final teardown sequence
406
- delete env;
407
- smfi_setpriv(context, NULL);
408
-
409
- return retval;
410
- }
411
-
412
-
413
- /**
414
- * run async version of smfi_main, which is blocking
415
- */
416
- void milter_worker (uv_work_t *request)
417
- {
418
- int r;
419
- r = smfi_main();
420
- fprintf(stderr, "milter_worker finishing\n");
421
- // TODO: any concurrency issues here?
422
- app.retval = r;
423
- }
424
-
425
-
426
- /**
427
- * cleanup after smfi_main finally stops.
428
- */
429
- void milter_cleanup (uv_work_t *request, int status)
430
- {
431
- Isolate *isolate = Isolate::GetCurrent();
432
- Locker locker (isolate);
433
- HandleScope scope (isolate);
434
-
435
- fprintf(stderr, "milter_cleanup started\n");
436
-
437
- // immediately stop event delivery
438
- uv_close((uv_handle_t *)&(app.trigger), NULL);
439
-
440
- app.fcall.negotiate.Reset();
441
- app.fcall.connect.Reset();
442
- app.fcall.unknown.Reset();
443
- app.fcall.helo.Reset();
444
- app.fcall.envfrom.Reset();
445
- app.fcall.envrcpt.Reset();
446
- app.fcall.data.Reset();
447
- app.fcall.header.Reset();
448
- app.fcall.eoh.Reset();
449
- app.fcall.body.Reset();
450
- app.fcall.eom.Reset();
451
- app.fcall.abort.Reset();
452
- app.fcall.close.Reset();
453
-
454
- // TODO: call a "end" callback provided during instantiation? unsure how to do this, probably with a persistent function
455
- }
456
-
457
-
458
- /**
459
- */
460
- void milter_start (const FunctionCallbackInfo<Value> &args)
461
- {
462
- Isolate *isolate = Isolate::GetCurrent();
463
- Locker locker (isolate);
464
- HandleScope scope(isolate);
465
-
466
- struct smfiDesc desc;
467
-
468
- desc.xxfi_name =(char *)g_name;
469
- desc.xxfi_version = SMFI_VERSION;
470
- desc.xxfi_flags = 0;
471
- desc.xxfi_negotiate = fi_negotiate;
472
- desc.xxfi_connect = fi_connect;
473
- desc.xxfi_unknown = fi_unknown;
474
- desc.xxfi_helo = fi_helo;
475
- desc.xxfi_envfrom = fi_envfrom;
476
- desc.xxfi_envrcpt = fi_envrcpt;
477
- desc.xxfi_data = fi_data;
478
- desc.xxfi_header = fi_header;
479
- desc.xxfi_eoh = fi_eoh;
480
- desc.xxfi_body = fi_body;
481
- desc.xxfi_eom = fi_eom;
482
- desc.xxfi_abort = fi_abort;
483
- desc.xxfi_close = fi_close;
484
- #if 0
485
- // signal handler is not implemented yet
486
- desc.xxfi_signal = fi_signal;
487
- #endif
488
-
489
- // connect libuv
490
- app.request.data = &app;
491
- app.trigger.data = &app;
492
-
493
- if (args.Length() < 14)
494
- {
495
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
496
- return;
497
- }
498
- if (!args[0]->IsString())
499
- {
500
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Invalid argument: expected string")));
501
- return;
502
- }
503
- if (!args[1]->IsNumber())
504
- {
505
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Invalid argument: expected number")));
506
- return;
507
- }
508
-
509
- desc.xxfi_flags = args[1]->ToNumber()->IntegerValue();
510
-
511
- // ya dats lazy
512
- for (int i = 2; i < 15; i++)
513
- if (!args[i]->IsFunction())
514
- {
515
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Invalid argument: expected function")));
516
- return;
517
- }
518
-
519
- Local<String> connstr = args[0]->ToString();
520
- char *c_connstr = new char[connstr->Utf8Length()+1];
521
- connstr->WriteUtf8(c_connstr);
522
-
523
- app.fcall.negotiate.Reset (isolate, Local<Function>::Cast(args[2]));
524
- app.fcall.connect.Reset (isolate, Local<Function>::Cast(args[3]));
525
- app.fcall.unknown.Reset (isolate, Local<Function>::Cast(args[4]));
526
- app.fcall.helo.Reset (isolate, Local<Function>::Cast(args[5]));
527
- app.fcall.envfrom.Reset (isolate, Local<Function>::Cast(args[6]));
528
- app.fcall.envrcpt.Reset (isolate, Local<Function>::Cast(args[7]));
529
- app.fcall.data.Reset (isolate, Local<Function>::Cast(args[8]));
530
- app.fcall.header.Reset (isolate, Local<Function>::Cast(args[9]));
531
- app.fcall.eoh.Reset (isolate, Local<Function>::Cast(args[10]));
532
- app.fcall.body.Reset (isolate, Local<Function>::Cast(args[11]));
533
- app.fcall.eom.Reset (isolate, Local<Function>::Cast(args[12]));
534
- app.fcall.abort.Reset (isolate, Local<Function>::Cast(args[13]));
535
- app.fcall.close.Reset (isolate, Local<Function>::Cast(args[14]));
536
-
537
- bool ok = false;
538
- if (MI_SUCCESS == smfi_register(desc))
539
- {
540
- if (MI_SUCCESS == smfi_setconn(c_connstr))
541
- {
542
- app.loop = uv_default_loop();
543
- uv_async_init(app.loop, &app.trigger, trigger_event);
544
- uv_queue_work(app.loop, &app.request, milter_worker, milter_cleanup);
545
- ok = true;
546
- }
547
- }
548
- delete c_connstr;
549
-
550
- if (!ok)
551
- {
552
- app.fcall.negotiate.Reset();
553
- app.fcall.connect.Reset();
554
- app.fcall.unknown.Reset();
555
- app.fcall.helo.Reset();
556
- app.fcall.envfrom.Reset();
557
- app.fcall.envrcpt.Reset();
558
- app.fcall.data.Reset();
559
- app.fcall.header.Reset();
560
- app.fcall.eoh.Reset();
561
- app.fcall.body.Reset();
562
- app.fcall.eom.Reset();
563
- app.fcall.abort.Reset();
564
- app.fcall.close.Reset();
565
- // TODO: throw exception?
566
- }
567
-
568
- args.GetReturnValue().Set(Boolean::New(isolate, ok));
569
- }
570
-
571
-
572
- /**
573
- */
574
- void milter_setbacklog (const FunctionCallbackInfo<Value> &args)
575
- {
576
- Isolate *isolate = Isolate::GetCurrent();
577
- HandleScope scope(isolate);
578
- if (args.Length() < 1)
579
- {
580
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
581
- return;
582
- }
583
- if (!args[0]->IsNumber())
584
- {
585
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Invalid argument: expected number")));
586
- return;
587
- }
588
- int n = args[0]->ToNumber()->Value();
589
- int r = smfi_setbacklog(n);
590
- args.GetReturnValue().Set(Number::New(isolate, r));
591
- }
592
-
593
-
594
- /**
595
- */
596
- void milter_setdbg (const FunctionCallbackInfo<Value> &args)
597
- {
598
- Isolate *isolate = Isolate::GetCurrent();
599
- HandleScope scope(isolate);
600
- if (args.Length() < 1)
601
- {
602
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
603
- return;
604
- }
605
- if (!args[0]->IsNumber())
606
- {
607
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Invalid argument: expected number")));
608
- return;
609
- }
610
- int f = args[0]->ToNumber()->Value();
611
- int r = smfi_setdbg(f);
612
- args.GetReturnValue().Set(Number::New(isolate, r));
613
- }
614
-
615
-
616
- /**
617
- */
618
- void milter_settimeout (const FunctionCallbackInfo<Value> &args)
619
- {
620
- Isolate *isolate = Isolate::GetCurrent();
621
- HandleScope scope(isolate);
622
- if (args.Length() < 1)
623
- {
624
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
625
- return;
626
- }
627
- if (!args[0]->IsNumber())
628
- {
629
- isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Invalid argument: expected number")));
630
- return;
631
- }
632
- int timeo = args[0]->ToNumber()->Value();
633
- int r = smfi_settimeout(timeo);
634
- args.GetReturnValue().Set(Number::New(isolate, r));
635
- }
636
-
637
-
638
- /**
639
- */
640
- void milter_stop (const FunctionCallbackInfo<Value> &args)
641
- {
642
- Isolate *isolate = Isolate::GetCurrent();
643
- HandleScope scope(isolate);
644
- int r = smfi_stop();
645
- args.GetReturnValue().Set(Number::New(isolate, r));
646
- }
647
-
648
-
649
- /**
650
- */
651
- void milter_version (const FunctionCallbackInfo<Value> &args)
652
- {
653
- Isolate *isolate = Isolate::GetCurrent();
654
- HandleScope scope (isolate);
655
- unsigned int major, minor, patchlevel;
656
-
657
- smfi_version(&major, &minor, &patchlevel);
658
-
659
- Local<Array> r = Array::New(isolate);
660
- r->Set(0, Number::New(isolate, major));
661
- r->Set(1, Number::New(isolate, minor));
662
- r->Set(2, Number::New(isolate, patchlevel));
663
- args.GetReturnValue().Set(r);
664
- }
665
-
666
-
667
- /**
668
- * module initialization
669
- */
670
- void init (Handle<Object> target, Handle<Value> module, Handle<Context> context)
671
- {
672
- Isolate *isolate = Isolate::GetCurrent();
673
-
674
- // return values from envelope functions
675
- target->Set(String::NewFromUtf8(isolate, "MI_SUCCESS", String::kInternalizedString), Number::New(isolate, MI_SUCCESS));
676
- target->Set(String::NewFromUtf8(isolate, "MI_FAILURE", String::kInternalizedString), Number::New(isolate, MI_FAILURE));
677
-
678
- // macro contexts/locations
679
- target->Set(String::NewFromUtf8(isolate, "SMFIM_CONNECT", String::kInternalizedString), Number::New(isolate, SMFIM_CONNECT));
680
- target->Set(String::NewFromUtf8(isolate, "SMFIM_HELO", String::kInternalizedString), Number::New(isolate, SMFIM_HELO));
681
- target->Set(String::NewFromUtf8(isolate, "SMFIM_ENVFROM", String::kInternalizedString), Number::New(isolate, SMFIM_ENVFROM));
682
- target->Set(String::NewFromUtf8(isolate, "SMFIM_ENVRCPT", String::kInternalizedString), Number::New(isolate, SMFIM_ENVRCPT));
683
- target->Set(String::NewFromUtf8(isolate, "SMFIM_DATA", String::kInternalizedString), Number::New(isolate, SMFIM_DATA));
684
- target->Set(String::NewFromUtf8(isolate, "SMFIM_EOM", String::kInternalizedString), Number::New(isolate, SMFIM_EOM));
685
- target->Set(String::NewFromUtf8(isolate, "SMFIM_EOH", String::kInternalizedString), Number::New(isolate, SMFIM_EOH));
686
-
687
- // negotiate flags
688
- target->Set(String::NewFromUtf8(isolate, "SMFIF_NONE", String::kInternalizedString), Number::New(isolate, SMFIF_NONE));
689
- target->Set(String::NewFromUtf8(isolate, "SMFIF_ADDHDRS", String::kInternalizedString), Number::New(isolate, SMFIF_ADDHDRS));
690
- target->Set(String::NewFromUtf8(isolate, "SMFIF_CHGBODY", String::kInternalizedString), Number::New(isolate, SMFIF_CHGBODY));
691
- target->Set(String::NewFromUtf8(isolate, "SMFIF_MODBODY", String::kInternalizedString), Number::New(isolate, SMFIF_MODBODY));
692
- target->Set(String::NewFromUtf8(isolate, "SMFIF_ADDRCPT", String::kInternalizedString), Number::New(isolate, SMFIF_ADDRCPT));
693
- target->Set(String::NewFromUtf8(isolate, "SMFIF_DELRCPT", String::kInternalizedString), Number::New(isolate, SMFIF_DELRCPT));
694
- target->Set(String::NewFromUtf8(isolate, "SMFIF_CHGHDRS", String::kInternalizedString), Number::New(isolate, SMFIF_CHGHDRS));
695
- target->Set(String::NewFromUtf8(isolate, "SMFIF_QUARANTINE", String::kInternalizedString), Number::New(isolate, SMFIF_QUARANTINE));
696
- target->Set(String::NewFromUtf8(isolate, "SMFIF_CHGFROM", String::kInternalizedString), Number::New(isolate, SMFIF_CHGFROM));
697
- target->Set(String::NewFromUtf8(isolate, "SMFIF_ADDRCPT_PAR", String::kInternalizedString), Number::New(isolate, SMFIF_ADDRCPT_PAR));
698
- target->Set(String::NewFromUtf8(isolate, "SMFIF_SETSYMLIST", String::kInternalizedString), Number::New(isolate, SMFIF_SETSYMLIST));
699
-
700
- // normal callback return values
701
- target->Set(String::NewFromUtf8(isolate, "SMFIS_CONTINUE", String::kInternalizedString), Number::New(isolate, SMFIS_CONTINUE));
702
- target->Set(String::NewFromUtf8(isolate, "SMFIS_REJECT", String::kInternalizedString), Number::New(isolate, SMFIS_REJECT));
703
- target->Set(String::NewFromUtf8(isolate, "SMFIS_DISCARD", String::kInternalizedString), Number::New(isolate, SMFIS_DISCARD));
704
- target->Set(String::NewFromUtf8(isolate, "SMFIS_ACCEPT", String::kInternalizedString), Number::New(isolate, SMFIS_ACCEPT));
705
- target->Set(String::NewFromUtf8(isolate, "SMFIS_TEMPFAIL", String::kInternalizedString), Number::New(isolate, SMFIS_TEMPFAIL));
706
- target->Set(String::NewFromUtf8(isolate, "SMFIS_NOREPLY", String::kInternalizedString), Number::New(isolate, SMFIS_NOREPLY));
707
- target->Set(String::NewFromUtf8(isolate, "SMFIS_SKIP", String::kInternalizedString), Number::New(isolate, SMFIS_SKIP));
708
-
709
- // callback return val for negotiate only
710
- target->Set(String::NewFromUtf8(isolate, "SMFIS_ALL_OPTS", String::kInternalizedString), Number::New(isolate, SMFIS_ALL_OPTS));
711
-
712
- Envelope::Init(target);
713
-
714
- NODE_SET_METHOD(target, "start", milter_start);
715
- NODE_SET_METHOD(target, "setbacklog", milter_setbacklog);
716
- NODE_SET_METHOD(target, "setdbg", milter_setdbg);
717
- NODE_SET_METHOD(target, "settimeout", milter_settimeout);
718
- NODE_SET_METHOD(target, "stop", milter_stop);
719
- NODE_SET_METHOD(target, "version", milter_version);
720
- }
721
-
722
- NODE_MODULE_CONTEXT_AWARE(milter, init)