From a59aa88e1c9380ae5568fbb17b8e1668e241db20 Mon Sep 17 00:00:00 2001 From: Dmitry Shirokov Date: Wed, 8 Mar 2017 10:46:52 +1100 Subject: [PATCH] A check for gzip format --- index.js | 4 ++++ lib/is-gzip.js | 9 +++++++++ test/databases/GeoIP2-City-Test.mmdb.gz | Bin 0 -> 9393 bytes test/index.js | 9 +++++++++ test/is-gzip.js | 21 +++++++++++++++++++++ 5 files changed, 43 insertions(+) create mode 100644 lib/is-gzip.js create mode 100644 test/databases/GeoIP2-City-Test.mmdb.gz create mode 100644 test/is-gzip.js diff --git a/index.js b/index.js index 8e33bbd0..2a5d5a74 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ var assert = require('assert'); var fs = require('fs'); var Reader = require('./lib/reader'); var ip = require('./lib/ip'); +var isGzip = require('./lib/is-gzip'); var utils = require('./lib/utils'); exports.Reader = Reader; @@ -15,6 +16,9 @@ exports.open = function(filepath, opts, cb) { fs.readFile(filepath, function(err, database) { if (err) return cb(err); + if (isGzip(database)) { + return cb(new Error('Looks like you are passing in a file in gzip format, please use mmdb database instead.')); + } var reader = new Reader(database, opts); if (opts && !!opts.watchForUpdates) { fs.watch(filepath, function() { diff --git a/lib/is-gzip.js b/lib/is-gzip.js new file mode 100644 index 00000000..dd648231 --- /dev/null +++ b/lib/is-gzip.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = function(buf) { + if (!buf || buf.length < 3) { + return false; + } + + return buf[0] === 0x1f && buf[1] === 0x8b && buf[2] === 0x08; +}; diff --git a/test/databases/GeoIP2-City-Test.mmdb.gz b/test/databases/GeoIP2-City-Test.mmdb.gz new file mode 100644 index 0000000000000000000000000000000000000000..1c76907137da6d0e1555dad7f3a05dccd194cbeb GIT binary patch literal 9393 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 HWMuyj|GF7) literal 0 HcmV?d00001 diff --git a/test/index.js b/test/index.js index 441f8ed6..ddfc9214 100644 --- a/test/index.js +++ b/test/index.js @@ -84,6 +84,15 @@ describe('index', function() { }, /Callback function must be provided/); }); + it('should return an error when gzip file attempted', function(done) { + var dbPath = path.join(__dirname, 'databases/GeoIP2-City-Test.mmdb.gz'); + maxmind.open(dbPath, function(err) { + assert.equal(err.message, + 'Looks like you are passing in a file in gzip format, please use mmdb database instead.'); + done(); + }); + }); + it('should check for an error when cannot read database on update', function(done) { var counter = 0; var cb = function(err, reader) { diff --git a/test/is-gzip.js b/test/is-gzip.js new file mode 100644 index 00000000..d2c74fda --- /dev/null +++ b/test/is-gzip.js @@ -0,0 +1,21 @@ +'use strict'; + +var assert = require('assert'); +var isGzip = require('../lib/is-gzip'); + +describe('lib/is-gzip', function() { + it('should return false for short buffers', function() { + assert.equal(isGzip(new Buffer([1, 2])), false); + }); + + it('should return false for string buffer', function() { + assert.equal(isGzip(new Buffer('kraken')), false); + }); + + it('should return false for string buffer', function() { + // gzipped "kraken" string + // shell: `echo "kraken" | gzip | base64` + var buffer = new Buffer('H4sIAGBDv1gAA8suSsxOzeMCAKjj9U8HAAAA', 'base64'); + assert.equal(isGzip(buffer), true); + }); +});