fingerprintjs-rails 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,19 +1,23 @@
1
1
  /*
2
- * fingerprintJS 0.4.2 - Fast browser fingerprint library
2
+ * fingerprintJS 0.5.0 - Fast browser fingerprint library
3
3
  * https://github.com/Valve/fingerprintjs
4
4
  * Copyright (c) 2013 Valentin Vasilyev (iamvalentin@gmail.com)
5
5
  * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
6
6
  */
7
- /*jslint browser: true, indent: 2 */
8
- (function(scope) {
7
+ /*jslint browser: true, indent: 2, maxerr: 50, maxlen: 120 */
8
+ (function (scope) {
9
9
  'use strict';
10
10
 
11
- var Fingerprint = function(options){
12
- var nativeForEach = Array.prototype.forEach;
13
- var nativeMap = Array.prototype.map;
14
- this.each = function(obj, iterator, context) {
15
- if(obj === null) return;
16
- if(nativeForEach && obj.forEach === nativeForEach) {
11
+ var Fingerprint = function (options) {
12
+ var nativeForEach, nativeMap;
13
+ nativeForEach = Array.prototype.forEach;
14
+ nativeMap = Array.prototype.map;
15
+
16
+ this.each = function (obj, iterator, context) {
17
+ if (obj === null) {
18
+ return;
19
+ }
20
+ if (nativeForEach && obj.forEach === nativeForEach) {
17
21
  obj.forEach(iterator, context);
18
22
  } else if (obj.length === +obj.length) {
19
23
  for (var i = 0, l = obj.length; i < l; i++) {
@@ -27,6 +31,7 @@
27
31
  }
28
32
  }
29
33
  };
34
+
30
35
  this.map = function(obj, iterator, context) {
31
36
  var results = [];
32
37
  // Not using strict equality so that this acts as a
@@ -38,21 +43,29 @@
38
43
  });
39
44
  return results;
40
45
  };
41
- if(typeof options == 'object'){
46
+
47
+ if (typeof options == 'object'){
42
48
  this.hasher = options.hasher;
49
+ this.screen_resolution = options.screen_resolution;
43
50
  this.canvas = options.canvas;
51
+ this.ie_activex = options.ie_activex;
44
52
  } else if(typeof options == 'function'){
45
53
  this.hasher = options;
46
54
  }
47
55
  };
48
56
 
49
57
  Fingerprint.prototype = {
50
-
51
58
  get: function(){
52
59
  var keys = [];
53
60
  keys.push(navigator.userAgent);
54
61
  keys.push(navigator.language);
55
62
  keys.push(screen.colorDepth);
63
+ if (this.screen_resolution) {
64
+ var resolution = this.getScreenResolution();
65
+ if (typeof resolution !== 'undefined'){ // headless browsers, such as phantomjs
66
+ keys.push(this.getScreenResolution().join('x'));
67
+ }
68
+ }
56
69
  keys.push(new Date().getTimezoneOffset());
57
70
  keys.push(this.hasSessionStorage());
58
71
  keys.push(this.hasLocalStorage());
@@ -62,13 +75,7 @@
62
75
  keys.push(navigator.cpuClass);
63
76
  keys.push(navigator.platform);
64
77
  keys.push(navigator.doNotTrack);
65
- var pluginsString = this.map(navigator.plugins, function(p){
66
- var mimeTypes = this.map(p, function(mt){
67
- return [mt.type, mt.suffixes].join('~');
68
- }).join(',');
69
- return [p.name, p.description, mimeTypes].join('::');
70
- }, this).join(';');
71
- keys.push(pluginsString);
78
+ keys.push(this.getPluginsString());
72
79
  if(this.canvas && this.isCanvasSupported()){
73
80
  keys.push(this.getCanvasFingerprint());
74
81
  }
@@ -145,7 +152,7 @@
145
152
  },
146
153
 
147
154
  // https://bugzilla.mozilla.org/show_bug.cgi?id=781447
148
- hasLocalStorage: function(){
155
+ hasLocalStorage: function () {
149
156
  try{
150
157
  return !!scope.localStorage;
151
158
  } catch(e) {
@@ -153,7 +160,7 @@
153
160
  }
154
161
  },
155
162
 
156
- hasSessionStorage: function(){
163
+ hasSessionStorage: function () {
157
164
  try{
158
165
  return !!scope.sessionStorage;
159
166
  } catch(e) {
@@ -161,12 +168,72 @@
161
168
  }
162
169
  },
163
170
 
164
- isCanvasSupported: function(){
171
+ isCanvasSupported: function () {
165
172
  var elem = document.createElement('canvas');
166
173
  return !!(elem.getContext && elem.getContext('2d'));
167
174
  },
168
175
 
169
- getCanvasFingerprint: function(){
176
+ isIE: function () {
177
+ if(navigator.appName === 'Microsoft Internet Explorer') {
178
+ return true;
179
+ } else if(navigator.appName === 'Netscape' && /Trident/.test(navigator.userAgent)){// IE 11
180
+ return true;
181
+ }
182
+ return false;
183
+ },
184
+
185
+ getPluginsString: function () {
186
+ if(this.isIE()){
187
+ return this.getIEPluginsString();
188
+ } else {
189
+ return this.getRegularPluginsString();
190
+ }
191
+ },
192
+
193
+ getRegularPluginsString: function () {
194
+ return this.map(navigator.plugins, function (p) {
195
+ var mimeTypes = this.map(p, function(mt){
196
+ return [mt.type, mt.suffixes].join('~');
197
+ }).join(',');
198
+ return [p.name, p.description, mimeTypes].join('::');
199
+ }, this).join(';');
200
+ },
201
+
202
+ getIEPluginsString: function () {
203
+ var names = ['ShockwaveFlash.ShockwaveFlash',//flash plugin
204
+ 'AcroPDF.PDF', // Adobe PDF reader 7+
205
+ 'PDF.PdfCtrl', // Adobe PDF reader 6 and earlier, brrr
206
+ 'QuickTime.QuickTime', // QuickTime
207
+ // 5 versions of real players
208
+ 'rmocx.RealPlayer G2 Control',
209
+ 'rmocx.RealPlayer G2 Control.1',
210
+ 'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)',
211
+ 'RealVideo.RealVideo(tm) ActiveX Control (32-bit)',
212
+ 'RealPlayer',
213
+ 'SWCtl.SWCtl', // ShockWave player
214
+ 'WMPlayer.OCX', // Windows media player
215
+ 'AgControl.AgControl', // Silverlight
216
+ 'Skype.Detection'];
217
+ if(this.ie_activex && scope.ActiveXObject){
218
+ // starting to detect plugins in IE
219
+ return this.map(names, function(name){
220
+ try{
221
+ new ActiveXObject(name);
222
+ return name;
223
+ } catch(e){
224
+ return null;
225
+ }
226
+ }).join(';');
227
+ } else {
228
+ return ""; // behavior prior version 0.5.0, not breaking backwards compat.
229
+ }
230
+ },
231
+
232
+ getScreenResolution: function () {
233
+ return [screen.height, screen.width];
234
+ },
235
+
236
+ getCanvasFingerprint: function () {
170
237
  var canvas = document.createElement('canvas');
171
238
  var ctx = canvas.getContext('2d');
172
239
  // https://www.browserleaks.com/canvas#how-does-it-work
@@ -184,6 +251,7 @@
184
251
  }
185
252
  };
186
253
 
254
+
187
255
  if (typeof module === 'object' && typeof exports === 'object') {
188
256
  module.exports = Fingerprint;
189
257
  }
@@ -1 +1 @@
1
- !function(t){"use strict";var e=function(t){var e=Array.prototype.forEach,a=Array.prototype.map;this.each=function(t,a,n){if(null!==t)if(e&&t.forEach===e)t.forEach(a,n);else if(t.length===+t.length){for(var r=0,o=t.length;o>r;r++)if(a.call(n,t[r],r,t)==={})return}else for(var i in t)if(t.hasOwnProperty(i)&&a.call(n,t[i],i,t)==={})return},this.map=function(t,e,n){var r=[];return null==t?r:a&&t.map===a?t.map(e,n):(this.each(t,function(t,a,o){r[r.length]=e.call(n,t,a,o)}),r)},"object"==typeof t?(this.hasher=t.hasher,this.canvas=t.canvas):"function"==typeof t&&(this.hasher=t)};e.prototype={get:function(){var t=[];t.push(navigator.userAgent),t.push(navigator.language),t.push(screen.colorDepth),t.push((new Date).getTimezoneOffset()),t.push(this.hasSessionStorage()),t.push(this.hasLocalStorage()),t.push(!!window.indexedDB),t.push(typeof document.body.addBehavior),t.push(typeof window.openDatabase),t.push(navigator.cpuClass),t.push(navigator.platform),t.push(navigator.doNotTrack);var e=this.map(navigator.plugins,function(t){var e=this.map(t,function(t){return[t.type,t.suffixes].join("~")}).join(",");return[t.name,t.description,e].join("::")},this).join(";");return t.push(e),this.canvas&&this.isCanvasSupported()&&t.push(this.getCanvasFingerprint()),this.hasher?this.hasher(t.join("###"),31):this.murmurhash3_32_gc(t.join("###"),31)},murmurhash3_32_gc:function(t,e){var a,n,r,o,i,s,h,c;for(a=3&t.length,n=t.length-a,r=e,i=3432918353,s=461845907,c=0;n>c;)h=255&t.charCodeAt(c)|(255&t.charCodeAt(++c))<<8|(255&t.charCodeAt(++c))<<16|(255&t.charCodeAt(++c))<<24,++c,h=4294967295&(65535&h)*i+((65535&(h>>>16)*i)<<16),h=h<<15|h>>>17,h=4294967295&(65535&h)*s+((65535&(h>>>16)*s)<<16),r^=h,r=r<<13|r>>>19,o=4294967295&5*(65535&r)+((65535&5*(r>>>16))<<16),r=(65535&o)+27492+((65535&(o>>>16)+58964)<<16);switch(h=0,a){case 3:h^=(255&t.charCodeAt(c+2))<<16;case 2:h^=(255&t.charCodeAt(c+1))<<8;case 1:h^=255&t.charCodeAt(c),h=4294967295&(65535&h)*i+((65535&(h>>>16)*i)<<16),h=h<<15|h>>>17,h=4294967295&(65535&h)*s+((65535&(h>>>16)*s)<<16),r^=h}return r^=t.length,r^=r>>>16,r=4294967295&2246822507*(65535&r)+((65535&2246822507*(r>>>16))<<16),r^=r>>>13,r=4294967295&3266489909*(65535&r)+((65535&3266489909*(r>>>16))<<16),r^=r>>>16,r>>>0},hasLocalStorage:function(){try{return!!t.localStorage}catch(e){return!0}},hasSessionStorage:function(){try{return!!t.sessionStorage}catch(e){return!0}},isCanvasSupported:function(){var t=document.createElement("canvas");return!(!t.getContext||!t.getContext("2d"))},getCanvasFingerprint:function(){var t=document.createElement("canvas"),e=t.getContext("2d"),a="http://valve.github.io";return e.textBaseline="top",e.font="14px 'Arial'",e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.fillText(a,2,15),e.fillStyle="rgba(102, 204, 0, 0.7)",e.fillText(a,4,17),t.toDataURL()}},"object"==typeof module&&"object"==typeof exports&&(module.exports=e),t.Fingerprint=e}(window);
1
+ !function(t){"use strict";var e=function(t){var e,n;e=Array.prototype.forEach,n=Array.prototype.map,this.each=function(t,n,r){if(null!==t)if(e&&t.forEach===e)t.forEach(n,r);else if(t.length===+t.length){for(var i=0,a=t.length;a>i;i++)if(n.call(r,t[i],i,t)==={})return}else for(var o in t)if(t.hasOwnProperty(o)&&n.call(r,t[o],o,t)==={})return},this.map=function(t,e,r){var i=[];return null==t?i:n&&t.map===n?t.map(e,r):(this.each(t,function(t,n,a){i[i.length]=e.call(r,t,n,a)}),i)},"object"==typeof t?(this.hasher=t.hasher,this.screen_resolution=t.screen_resolution,this.canvas=t.canvas,this.ie_activex=t.ie_activex):"function"==typeof t&&(this.hasher=t)};e.prototype={get:function(){var t=[];if(t.push(navigator.userAgent),t.push(navigator.language),t.push(screen.colorDepth),this.screen_resolution){var e=this.getScreenResolution();"undefined"!=typeof e&&t.push(this.getScreenResolution().join("x"))}return t.push((new Date).getTimezoneOffset()),t.push(this.hasSessionStorage()),t.push(this.hasLocalStorage()),t.push(!!window.indexedDB),t.push(typeof document.body.addBehavior),t.push(typeof window.openDatabase),t.push(navigator.cpuClass),t.push(navigator.platform),t.push(navigator.doNotTrack),t.push(this.getPluginsString()),this.canvas&&this.isCanvasSupported()&&t.push(this.getCanvasFingerprint()),this.hasher?this.hasher(t.join("###"),31):this.murmurhash3_32_gc(t.join("###"),31)},murmurhash3_32_gc:function(t,e){var n,r,i,a,o,s,c,h;for(n=3&t.length,r=t.length-n,i=e,o=3432918353,s=461845907,h=0;r>h;)c=255&t.charCodeAt(h)|(255&t.charCodeAt(++h))<<8|(255&t.charCodeAt(++h))<<16|(255&t.charCodeAt(++h))<<24,++h,c=4294967295&(65535&c)*o+((65535&(c>>>16)*o)<<16),c=c<<15|c>>>17,c=4294967295&(65535&c)*s+((65535&(c>>>16)*s)<<16),i^=c,i=i<<13|i>>>19,a=4294967295&5*(65535&i)+((65535&5*(i>>>16))<<16),i=(65535&a)+27492+((65535&(a>>>16)+58964)<<16);switch(c=0,n){case 3:c^=(255&t.charCodeAt(h+2))<<16;case 2:c^=(255&t.charCodeAt(h+1))<<8;case 1:c^=255&t.charCodeAt(h),c=4294967295&(65535&c)*o+((65535&(c>>>16)*o)<<16),c=c<<15|c>>>17,c=4294967295&(65535&c)*s+((65535&(c>>>16)*s)<<16),i^=c}return i^=t.length,i^=i>>>16,i=4294967295&2246822507*(65535&i)+((65535&2246822507*(i>>>16))<<16),i^=i>>>13,i=4294967295&3266489909*(65535&i)+((65535&3266489909*(i>>>16))<<16),i^=i>>>16,i>>>0},hasLocalStorage:function(){try{return!!t.localStorage}catch(e){return!0}},hasSessionStorage:function(){try{return!!t.sessionStorage}catch(e){return!0}},isCanvasSupported:function(){var t=document.createElement("canvas");return!(!t.getContext||!t.getContext("2d"))},isIE:function(){return"Microsoft Internet Explorer"===navigator.appName?!0:"Netscape"===navigator.appName&&/Trident/.test(navigator.userAgent)?!0:!1},getPluginsString:function(){return this.isIE()?this.getIEPluginsString():this.getRegularPluginsString()},getRegularPluginsString:function(){return this.map(navigator.plugins,function(t){var e=this.map(t,function(t){return[t.type,t.suffixes].join("~")}).join(",");return[t.name,t.description,e].join("::")},this).join(";")},getIEPluginsString:function(){var e=["ShockwaveFlash.ShockwaveFlash","AcroPDF.PDF","PDF.PdfCtrl","QuickTime.QuickTime","rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","RealPlayer","SWCtl.SWCtl","WMPlayer.OCX","AgControl.AgControl","Skype.Detection"];return this.ie_activex&&t.ActiveXObject?this.map(e,function(t){try{return new ActiveXObject(t),t}catch(e){return null}}).join(";"):""},getScreenResolution:function(){return[screen.height,screen.width]},getCanvasFingerprint:function(){var t=document.createElement("canvas"),e=t.getContext("2d"),n="http://valve.github.io";return e.textBaseline="top",e.font="14px 'Arial'",e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.fillText(n,2,15),e.fillStyle="rgba(102, 204, 0, 0.7)",e.fillText(n,4,17),t.toDataURL()}},"object"==typeof module&&"object"==typeof exports&&(module.exports=e),t.Fingerprint=e}(window);
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = "fingerprintjs-rails"
7
- gem.version = "0.4.2"
7
+ gem.version = "0.5.0"
8
8
  gem.authors = ["Valentin Vasilyev"]
9
9
  gem.email = ["iamvalentin@gmail.com"]
10
10
  gem.description = "fingerprintjs for rails asset pipeline"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fingerprintjs-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-27 00:00:00.000000000 Z
12
+ date: 2013-10-15 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: fingerprintjs for rails asset pipeline
15
15
  email: