vpn.email.server.gfw
Version:
Vpn.Email over firewall mode
101 lines (100 loc) • 4.4 kB
JavaScript
/*!
* Copyright 2017 Vpn.Email network security technology Canada Inc. All Rights Reserved.
*
* Vpn.Email network technolog Canada Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
"use strict";
const Stream = require("stream");
const HttpHeader = require("./httpProxy");
class blockRequestData extends Stream.Transform {
constructor(allowedAddress, timeout) {
super();
this.allowedAddress = allowedAddress;
this.temp = Buffer.allocUnsafe(0);
this.startTime = new Date().getTime();
this.timeOut = null;
this.first = true;
this.last = null;
if (timeout) {
this.timeOut = setTimeout(() => {
this.unpipe();
}, timeout);
}
}
_transform(chunk, encode, cb) {
this.temp = Buffer.concat([this.temp, chunk]);
const httpHeader = new HttpHeader.httpProxy(this.temp);
if (httpHeader._parts.length < 2) {
return cb();
}
// have not http format request
if (!httpHeader.isHttpRequest) {
console.log('*************** SKIP nuformat data **********************');
console.log(httpHeader.buffer.toString('utf8'));
console.log('****************** this.last *******************');
console.log(this.last.toString('utf8'));
httpHeader._parts.shift();
this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8');
console.log('****************** next Buffer *******************');
console.log(this.temp.toString('utf8'));
console.log('*************************************');
return this._transform(Buffer.allocUnsafe(0), encode, cb);
}
if (!this.allowedAddress) {
return cb(new Error('404'));
}
if (!httpHeader.isGet && !httpHeader.isPost) {
console.log('unknow httpHeader');
console.log('************* unknow httpHeader **********');
console.log(httpHeader._parts[0]);
console.log('***************************************');
httpHeader._parts.shift();
this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8');
return this._transform(Buffer.allocUnsafe(0), encode, cb);
}
if (this.timeOut) {
clearTimeout(this.timeOut);
this.timeOut = null;
}
if (httpHeader.isGet) {
const ret = Buffer.from(httpHeader.Url.path.substr(1), 'base64');
this.last = Buffer.from(httpHeader._parts[0] + `\r\n\r\n`, 'utf8');
httpHeader._parts.shift();
this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8');
this.push(ret);
return this._transform(Buffer.allocUnsafe(0), encode, cb);
}
if (httpHeader._parts.length < 3) {
return cb();
}
const ret = Buffer.from(httpHeader.PostBody, 'base64');
if (!ret) {
console.log('***************** POST get data ERROR ********************');
console.log(this.last.toString('utf8'));
console.log('*************************************');
console.log(httpHeader.buffer.toString('utf8'));
console.log('****************** new Buffer *******************');
httpHeader._parts.shift();
httpHeader._parts.shift();
this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8');
return this._transform(Buffer.allocUnsafe(0), encode, cb);
}
this.push(ret);
httpHeader._parts.shift();
httpHeader._parts.shift();
this.temp = Buffer.from(httpHeader._parts.join('\r\n\r\n'), 'utf8');
return this._transform(Buffer.allocUnsafe(0), encode, cb);
}
}
exports.blockRequestData = blockRequestData;