New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

browser-language

Package Overview
Dependencies
Maintainers
1
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

browser-language - npm Package Compare versions

Comparing version 1.3.0 to 1.4.0

8

History.md

@@ -0,1 +1,9 @@

v1.4.0 / 2015-09-13
==================
* Rename cookie option `age` to `maxAge`
* Add `encryptionSecret` (options)
* Add `encryptionOptions` (options)
* Install `cookie-encryption`@1.4.0
v1.3.0 / 2015-08-08

@@ -2,0 +10,0 @@ ==================

99

index.js

@@ -6,3 +6,3 @@ 'use strict';

* @subpackage main
* @version 1.3.0
* @version 1.4.0
* @author hex7c0 <hex7c0@gmail.com>

@@ -16,2 +16,3 @@ * @copyright hex7c0 2014

*/
var headerRegex = /([a-z]{2})/ig;
var all = {

@@ -133,3 +134,3 @@ 'ab': 'Abkhazian',

path: my.path,
maxAge: my.age,
maxAge: my.maxAge,
httpOnly: my.httpOnly,

@@ -142,2 +143,31 @@ secure: my.secure,

/**
* detect browser language
*
* @param {String} ll - default language as fallback
* @param {String} header - accept-language header
* @param {Object} lang - languages dictionary
* @returns {String}
*/
function detect(ll, header, lang) {
if (header) { // check
var language = header.match(headerRegex); // grep languages header
language = language.filter(function(elem, pos, self) { // remove duplicate
return self.indexOf(elem.toLowerCase()) === pos;
});
var tmp;
for (var i = 0, ii = language.length; i < ii; ++i) { // detect righ language
if ((tmp = lang[language[i]])) {
return tmp;
}
}
}
return ll; // return default
}
/**
* setting options

@@ -159,3 +189,3 @@ *

path: String(options.path || '/'),
age: Number(options.age) || 1000 * 3600 * 24 * 365,
maxAge: Number(options.maxAge) || 1000 * 3600 * 24 * 365,
httpOnly: Boolean(options.httpOnly),

@@ -176,3 +206,2 @@ secure: Boolean(options.secure),

process.env.lang = lang._default;
// return

@@ -184,2 +213,46 @@ var cookie = 'cookies';

if (typeof options.encryptionSecret === 'string') {
var vault = require('cookie-encryption');
var encryptionOptions = opt.encryptionOptions || Object.create(null);
vault = vault(options.encryptionSecret, {
cookie: my.cookie,
cipher: encryptionOptions.cipher,
encoding: encryptionOptions.encoding,
extra: encryptionOptions.extra,
domain: encryptionOptions.domain || my.domain,
path: encryptionOptions.path || my.path,
maxAge: encryptionOptions.maxAge || my.maxAge,
httpOnly: encryptionOptions.httpOnly || my.httpOnly,
secure: encryptionOptions.secure || my.secure,
signed: encryptionOptions.signed || my.signed
});
/**
* detect language and (if accepted) build it. Store information on cookie
*
* @function browser
* @param {Object} req - client request
* @param {Object} res - response to client
* @param {next} next - continue routes
*/
return function browser(req, res, next) {
var biscotto;
try {
biscotto = vault.read(req);
} catch (e) { // fails to decrpy
biscotto = undefined;
}
if (biscotto && lang[biscotto]) { // lookup
req[cookie][my.cookie] = biscotto;
return next();
}
var ll = detect(lang._default, req.headers['accept-language'], lang);
req[cookie][my.cookie] = vault.write(req, ll); // populate req[cookie] by module
return next();
};
}
/**

@@ -201,20 +274,6 @@ * detect language and (if accepted) build it. Store information on cookie

}
var ll = lang._default;
var search = req.headers['accept-language'];
if (search) { // check
var language = search.match(/([a-z]{2,2})/ig);
// remove duplicate
language = language.filter(function(elem, pos, self) {
return self.indexOf(elem.toLowerCase()) === pos;
});
for (var i = 0, ii = language.length; i < ii; ++i) {
search = lang[language[i]];
if (search) {
ll = search;
break;
}
}
}
var ll = detect(lang._default, req.headers['accept-language'], lang);
biscotto[my.cookie] = set(my, res, ll);
return next();

@@ -221,0 +280,0 @@ };

@@ -7,3 +7,3 @@ "use strict";

path: my.path,
maxAge: my.age,
maxAge: my.maxAge,
httpOnly: my.httpOnly,

@@ -15,2 +15,13 @@ secure: my.secure,

function detect(ll, header, lang) {
if (header) {
var language = header.match(headerRegex);
language = language.filter(function(elem, pos, self) {
return self.indexOf(elem.toLowerCase()) === pos;
});
for (var tmp, i = 0, ii = language.length; ii > i; ++i) if (tmp = lang[language[i]]) return tmp;
}
return ll;
}
function language(opt) {

@@ -21,3 +32,3 @@ var options = opt || Object.create(null), include = __dirname + "/min/lib/dictionary.js", lang = options.dictionary || require(include).LANG, my = {

path: String(options.path || "/"),
age: Number(options.age) || 31536e6,
maxAge: Number(options.maxAge) || 31536e6,
httpOnly: Boolean(options.httpOnly),

@@ -30,16 +41,31 @@ secure: Boolean(options.secure),

var cookie = "cookies";
return my.signed && (cookie = "signedCookies"), function(req, res, next) {
if (my.signed && (cookie = "signedCookies"), "string" == typeof options.encryptionSecret) {
var vault = require("cookie-encryption"), encryptionOptions = opt.encryptionOptions || Object.create(null);
return vault = vault(options.encryptionSecret, {
cookie: my.cookie,
cipher: encryptionOptions.cipher,
encoding: encryptionOptions.encoding,
extra: encryptionOptions.extra,
domain: encryptionOptions.domain || my.domain,
path: encryptionOptions.path || my.path,
maxAge: encryptionOptions.maxAge || my.maxAge,
httpOnly: encryptionOptions.httpOnly || my.httpOnly,
secure: encryptionOptions.secure || my.secure,
signed: encryptionOptions.signed || my.signed
}), function(req, res, next) {
var biscotto;
try {
biscotto = vault.read(req);
} catch (e) {
biscotto = void 0;
}
if (biscotto && lang[biscotto]) return req[cookie][my.cookie] = biscotto, next();
var ll = detect(lang._default, req.headers["accept-language"], lang);
return req[cookie][my.cookie] = vault.write(req, ll), next();
};
}
return function(req, res, next) {
var biscotto = req[cookie];
if (void 0 === biscotto) biscotto = Object.create(null); else if (lang[biscotto[my.cookie]]) return next();
var ll = lang._default, search = req.headers["accept-language"];
if (search) {
var language = search.match(/([a-z]{2,2})/gi);
language = language.filter(function(elem, pos, self) {
return self.indexOf(elem.toLowerCase()) === pos;
});
for (var i = 0, ii = language.length; ii > i; ++i) if (search = lang[language[i]]) {
ll = search;
break;
}
}
var ll = detect(lang._default, req.headers["accept-language"], lang);
return biscotto[my.cookie] = set(my, res, ll), next();

@@ -49,3 +75,3 @@ };

var all = {
var headerRegex = /([a-z]{2})/gi, all = {
ab: "Abkhazian",

@@ -52,0 +78,0 @@ af: "Afrikaans",

{
"version": "1.3.0",
"version": "1.4.0",
"name": "browser-language",

@@ -31,2 +31,3 @@ "description": "grab browser language and store on cookie",

"dependencies": {
"cookie-encryption": "1.4.0"
},

@@ -40,6 +41,6 @@ "devDependencies": {

"grunt-contrib-jshint": "~0.11",
"grunt-endline": "~0.2",
"grunt-endline": "~0.3",
"istanbul": "~0.3",
"mocha": "~2.2",
"supertest": "~1.0"
"mocha": "~2.3",
"supertest": "~1.1"
},

@@ -46,0 +47,0 @@ "engines": {

@@ -51,2 +51,4 @@ # [browser-language](http://supergiovane.tk/#/browser-language)

Check [Cookie options](http://expressjs.com/api.html#res.cookie)
### language(options)

@@ -64,6 +66,7 @@

- `path` - **String** Path of cookie *(default "/")*
- `age` - **Number** Age of cookie in millisecond *(default "1 year")*
- `maxAge` - **Number** Age of cookie in millisecond *(default "1 year")*
- `httpOnly` - **Boolean** Flag for http only cookie *(default "false")*
- `secure` - **Boolean** Flag for using cookie over TLS/SSL *(default "false")*
- `signed` - **Boolean** Will use the secret passed to cookieParser(secret) to sign the value *(default "false")*
- `encryption` - **Object** Configuration for [cookie-encryption](https://github.com/hex7c0/cookie-encryption) *(defaut "deactivated")*

@@ -70,0 +73,0 @@ `dictionary` object with correct value to be added, otherwise using a default dictionary inside *./lib/dictionary.js*

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc