Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env node
- /**
- * Capture and react to alerts generated by Q-See cameras over SMTP
- *
- * Author: Dave Eddy <dave@daveeddy.com>
- * Date: March 11, 2017
- * License: MIT
- */
- var f = require('util').format;
- var fs = require('fs');
- var path = require('path');
- var assert = require('assert-plus');
- var mkdirp = require('mkdirp');
- var MailParser = require('mailparser').MailParser;
- var SMTPServer = require('smtp-server').SMTPServer;
- var ATTACHMENT_RE = /^[a-zA-Z0-9_-]+\.(jpg|png)$/;
- var ATTACHMENT_DIR = path.join(__dirname, 'data');
- var USERNAME = 'foo@example.com';
- var PASSWORD = 'bar';
- var HOST = '0.0.0.0';
- var PORT = 10465;
- var connections = {};
- var server = new SMTPServer({
- secure: false,
- disabledCommands: ['STARTTLS'],
- authOptional: true,
- onAuth: onAuth,
- onConnect: onConnect,
- onData: onData,
- onClose: onClose
- });
- server.listen(PORT, HOST, onconnected);
- function log() {
- var s = f.apply(null, arguments);
- console.log('[%s] %s', new Date().toISOString(), s);
- }
- function onconnected() {
- log('Listening on smtp://%s:%d', HOST, PORT);
- }
- function onConnect(session, cb) {
- log('[%s] Connection from %s', session.id, session.remoteAddress);
- connections[session.id] = session;
- cb();
- }
- function onAuth(auth, session, cb) {
- var msg;
- // find the session
- if (!connections[session.id]) {
- msg = f('[%s] Unexpected auth from user "%s" (%s)',
- session.id, auth.username, session.remoteAddress);
- log(msg);
- cb(new Error(msg));
- return;
- }
- // check username and password
- if (auth.username !== USERNAME || auth.password !== PASSWORD) {
- msg = f('[%s] Auth failure for user "%s" (%s)',
- session.id, auth.username, session.remoteAddress);
- log(msg);
- cb(new Error(msg));
- return;
- }
- log('[%s] Successfully authed user "%s" (%s)',
- session.id, auth.username, session.remoteAddress);
- cb(null, {user: auth.username});
- }
- function onData(stream, session, cb) {
- // find the session
- if (!connections[session.id]) {
- msg = f('[%s] Unexpected auth from user "%s" (%s)',
- session.id, auth.username, session.remoteAddress);
- log(msg);
- cb(new Error(msg));
- return;
- }
- var parser = new MailParser();
- var dname = path.join(ATTACHMENT_DIR, Date.now().toString());
- // callback object
- var ret = {
- attachments: {
- dir: dname,
- files: []
- }
- };
- parser.on('headers', function (headers) {
- ret.subject = headers.get('subject');
- ret.date = headers.get('date');
- ret.from = headers.get('from').text;
- ret.to = headers.get('to').text;
- });
- parser.on('data', function (data) {
- switch (data.type) {
- case 'attachment':
- if (!ATTACHMENT_RE.test(data.filename)) {
- log('filename failed regex match: "%s"',
- data.filename);
- data.release();
- return;
- }
- mkdirp.sync(dname);
- var fname = path.join(dname, data.filename);
- var ws = fs.createWriteStream(fname);
- data.content.pipe(ws);
- ws.on('close', function () {
- ret.attachments.files.push(fname);
- data.release();
- });
- break;
- case 'text':
- ret.rawBody = data.text;
- /*
- * attempt to parse the email body, exmaple output:
- *
- * Device ID: 0, Device Name: EDVR
- *
- *
- * Channel ID: 1, Camera Name:CAMERA01
- * Alarm Type:Motion Alarm, Time:2017-3-11 12:59:33
- */
- ret.data = {};
- data.text.split('\n').forEach(function (line) {
- if (line.trim() === '') {
- return;
- }
- line.split(', ').forEach(function (s) {
- var match = s.match(/([^:]+):(.*)$/);
- if (!match) {
- return;
- }
- var key = match[1];
- var value = match[2].trim();
- ret.data[key] = value;
- });
- });
- break;
- default:
- log('unexpected data.type "%s"', data.type);
- break;
- }
- });
- parser.on('end', function () {
- if (ret.attachments.files.length === 0) {
- delete ret.attachments;
- }
- console.log(JSON.stringify(ret, null, 2));
- cb();
- });
- stream.pipe(parser);
- }
- function onClose(session) {
- // find the session
- if (!connections[session.id]) {
- msg = f('[%s] Unexpected close (%s)',
- session.id, session.remoteAddress);
- log(msg);
- cb(new Error(msg));
- return;
- }
- log('[%s] Connection closed', session.id);
- delete connections[session];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement