Google Authenticator - Version 0.47

Version Description

  • Google chart API replaced with jquery-qrcode
  • QR codes now contain a heading saying WordPress (Feature request by Flemming Mahler)
  • Danish translation & updated .pot file.
  • Plugin now logs login attempts recognized as Man-in-the-middle attacks.
Download this release

Release Info

Developer Henrik.Schack
Plugin Icon wp plugin Google Authenticator
Version 0.47
Comparing to
See all releases

Code changes from version 0.46 to 0.47

google-authenticator.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: Google Authenticator
4
  Plugin URI: http://henrik.schack.dk/google-authenticator-for-wordpress
5
  Description: Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry app as One Time Password generator.
6
  Author: Henrik Schack
7
- Version: 0.46
8
  Author URI: http://henrik.schack.dk/
9
  Compatibility: WordPress 3.8
10
  Text Domain: google-authenticator
@@ -22,6 +22,7 @@ Domain Path: /lang
22
  Thanks to Ian Dunn for fixing some depricated function calls.
23
  Thanks to Kimmo Suominen for fixing the iPhone description issue.
24
  Thanks to Alex Concha for some security tips.
 
25
 
26
  ----------------------------------------------------------------------------
27
 
@@ -64,17 +65,21 @@ function init() {
64
  add_action( 'login_footer', array( $this, 'loginfooter' ) );
65
  add_filter( 'authenticate', array( $this, 'check_otp' ), 50, 3 );
66
 
67
- if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
68
  add_action( 'wp_ajax_GoogleAuthenticator_action', array( $this, 'ajax_callback' ) );
 
69
 
70
  add_action( 'personal_options_update', array( $this, 'personal_options_update' ) );
71
  add_action( 'profile_personal_options', array( $this, 'profile_personal_options' ) );
72
  add_action( 'edit_user_profile', array( $this, 'edit_user_profile' ) );
73
  add_action( 'edit_user_profile_update', array( $this, 'edit_user_profile_update' ) );
74
 
 
 
75
  load_plugin_textdomain( 'google-authenticator', false, basename( dirname( __FILE__ ) ) . '/lang' );
76
  }
77
 
 
78
  /**
79
  * Check the verification code entered by the user.
80
  */
@@ -122,11 +127,12 @@ function verify( $secretkey, $thistry, $relaxedmode, $lasttimeslot ) {
122
  // meaning current login attempt has to be in the future compared to
123
  // last successful login.
124
  if ( $lasttimeslot >= ($tm+$i) ) {
 
125
  return false;
126
  }
127
  // Return timeslot in which login happened.
128
  return $tm+$i;
129
- }
130
  }
131
  return false;
132
  }
@@ -145,6 +151,14 @@ function create_secret() {
145
  return $secret;
146
  }
147
 
 
 
 
 
 
 
 
 
148
 
149
  /**
150
  * Add verification code field to login form.
@@ -291,14 +305,14 @@ function profile_personal_options() {
291
  echo "<td>\n";
292
  echo "<input name=\"GA_secret\" id=\"GA_secret\" value=\"{$GA_secret}\" readonly=\"readonly\" type=\"text\" size=\"25\" />";
293
  echo "<input name=\"GA_newsecret\" id=\"GA_newsecret\" value=\"".__("Create new secret",'google-authenticator')."\" type=\"button\" class=\"button\" />";
294
- echo "<input name=\"show_qr\" id=\"show_qr\" value=\"".__("Show/Hide QR code",'google-authenticator')."\" type=\"button\" class=\"button\" onclick=\"ShowQRCodeAfterWarning();\" />";
295
  echo "</td>\n";
296
  echo "</tr>\n";
297
 
298
  echo "<tr>\n";
299
  echo "<th></th>\n";
300
  echo "<td><div id=\"GA_QR_INFO\" style=\"display: none\" >";
301
- echo "<img id=\"GA_QRCODE\" src=\"\" alt=\"QR Code\"/>";
302
 
303
  echo '<span class="description"><br/> ' . __( 'Scan this with the Google Authenticator app.', 'google-authenticator' ) . '</span>';
304
  echo "</div></td>\n";
@@ -316,44 +330,41 @@ function profile_personal_options() {
316
  echo "<td>\n";
317
  echo "<input name=\"GA_password\" id=\"GA_password\" readonly=\"readonly\" value=\"".$GA_password."\" type=\"text\" size=\"25\" />";
318
  echo "<input name=\"GA_createpassword\" id=\"GA_createpassword\" value=\"".__("Create new password",'google-authenticator')."\" type=\"button\" class=\"button\" />";
319
- echo "<span class=\"description\" id=\"GA_passworddesc\">".__(' Password is not stored in cleartext, this is your only chance to see it.','google-authenticator')."</span>\n";
320
  echo "</td>\n";
321
  echo "</tr>\n";
322
  }
323
-
324
 
325
  echo "</tbody></table>\n";
326
  echo "<script type=\"text/javascript\">\n";
327
  echo "var GAnonce='".wp_create_nonce('GoogleAuthenticatoraction')."';\n";
328
 
329
- echo "var qrcodewarningtext = '";
330
- echo __( "WARNING:\\n\\nShowing the QR code will use the Google Chart API to do so.\\nIf you do not trust Google, please press Cancel and enter the code manually.",'google-authenticator' );
331
- echo "';\n";
332
-
333
  echo <<<ENDOFJS
334
- var pwdata;
335
  jQuery('#GA_newsecret').bind('click', function() {
 
 
336
  var data=new Object();
337
  data['action'] = 'GoogleAuthenticator_action';
338
  data['nonce'] = GAnonce;
339
  jQuery.post(ajaxurl, data, function(response) {
340
  jQuery('#GA_secret').val(response['new-secret']);
341
- chl=escape("otpauth://totp/"+jQuery('#GA_description').val()+"?secret="+jQuery('#GA_secret').val());
342
- qrcodeurl="https://chart.googleapis.com/chart?cht=qr&chs=300x300&chld=H|0&chl="+chl;
343
- jQuery('#GA_QRCODE').attr('src',qrcodeurl);
344
- jQuery('#GA_QR_INFO').show('slow');
345
  });
346
  });
347
 
 
348
  jQuery('#GA_description').bind('focus blur change keyup', function() {
349
- // Only update QRCode if it's already visible
350
  if (jQuery('#GA_QR_INFO').is(':visible')) {
351
- chl=escape("otpauth://totp/"+jQuery('#GA_description').val()+"?secret="+jQuery('#GA_secret').val());
352
- qrcodeurl="https://chart.googleapis.com/chart?cht=qr&chs=300x300&chld=H|0&chl="+chl;
353
- jQuery('#GA_QRCODE').attr('src',qrcodeurl);
354
  }
355
  });
356
 
 
357
  jQuery('#GA_createpassword').bind('click',function() {
358
  var data=new Object();
359
  data['action'] = 'GoogleAuthenticator_action';
@@ -385,16 +396,14 @@ function profile_personal_options() {
385
  }
386
  }
387
 
388
- function ShowQRCodeAfterWarning() {
389
  if (jQuery('#GA_QR_INFO').is(':hidden')) {
390
- if ( confirm(qrcodewarningtext) ) {
391
- chl=escape("otpauth://totp/"+jQuery('#GA_description').val()+"?secret="+jQuery('#GA_secret').val());
392
- qrcodeurl="https://chart.googleapis.com/chart?cht=qr&chs=300x300&chld=H|0&chl="+chl;
393
- jQuery('#GA_QRCODE').attr('src',qrcodeurl);
394
- jQuery('#GA_QR_INFO').show('slow');
395
- }
396
  } else {
397
  jQuery('#GA_QR_INFO').hide('slow');
 
398
  }
399
  }
400
  </script>
@@ -516,10 +525,10 @@ function edit_user_profile_update() {
516
  function ajax_callback() {
517
  global $user_id;
518
 
519
- // Some AJAX security
520
  check_ajax_referer( 'GoogleAuthenticatoraction', 'nonce' );
521
 
522
- // Create new secret, using the users password hash as input for further hashing
523
  $secret = $this->create_secret();
524
 
525
  $result = array( 'new-secret' => $secret );
4
  Plugin URI: http://henrik.schack.dk/google-authenticator-for-wordpress
5
  Description: Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry app as One Time Password generator.
6
  Author: Henrik Schack
7
+ Version: 0.47
8
  Author URI: http://henrik.schack.dk/
9
  Compatibility: WordPress 3.8
10
  Text Domain: google-authenticator
22
  Thanks to Ian Dunn for fixing some depricated function calls.
23
  Thanks to Kimmo Suominen for fixing the iPhone description issue.
24
  Thanks to Alex Concha for some security tips.
25
+ Thanks to S�bastien Prunier for his Spanish and French translations.
26
 
27
  ----------------------------------------------------------------------------
28
 
65
  add_action( 'login_footer', array( $this, 'loginfooter' ) );
66
  add_filter( 'authenticate', array( $this, 'check_otp' ), 50, 3 );
67
 
68
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
69
  add_action( 'wp_ajax_GoogleAuthenticator_action', array( $this, 'ajax_callback' ) );
70
+ }
71
 
72
  add_action( 'personal_options_update', array( $this, 'personal_options_update' ) );
73
  add_action( 'profile_personal_options', array( $this, 'profile_personal_options' ) );
74
  add_action( 'edit_user_profile', array( $this, 'edit_user_profile' ) );
75
  add_action( 'edit_user_profile_update', array( $this, 'edit_user_profile_update' ) );
76
 
77
+ add_action('admin_enqueue_scripts', array($this, 'add_qrcode_script'));
78
+
79
  load_plugin_textdomain( 'google-authenticator', false, basename( dirname( __FILE__ ) ) . '/lang' );
80
  }
81
 
82
+
83
  /**
84
  * Check the verification code entered by the user.
85
  */
127
  // meaning current login attempt has to be in the future compared to
128
  // last successful login.
129
  if ( $lasttimeslot >= ($tm+$i) ) {
130
+ error_log("Google Authenticator plugin: Man-in-the-middle attack detected (Could also be 2 legit login attempts within the same 30 second period)");
131
  return false;
132
  }
133
  // Return timeslot in which login happened.
134
  return $tm+$i;
135
+ }
136
  }
137
  return false;
138
  }
151
  return $secret;
152
  }
153
 
154
+ /**
155
+ * Add the script to generate QR codes.
156
+ */
157
+ function add_qrcode_script() {
158
+ wp_enqueue_script('jquery');
159
+ wp_register_script('qrcode_script', plugins_url('jquery.qrcode.min.js', __FILE__),array("jquery"));
160
+ wp_enqueue_script('qrcode_script');
161
+ }
162
 
163
  /**
164
  * Add verification code field to login form.
305
  echo "<td>\n";
306
  echo "<input name=\"GA_secret\" id=\"GA_secret\" value=\"{$GA_secret}\" readonly=\"readonly\" type=\"text\" size=\"25\" />";
307
  echo "<input name=\"GA_newsecret\" id=\"GA_newsecret\" value=\"".__("Create new secret",'google-authenticator')."\" type=\"button\" class=\"button\" />";
308
+ echo "<input name=\"show_qr\" id=\"show_qr\" value=\"".__("Show/Hide QR code",'google-authenticator')."\" type=\"button\" class=\"button\" onclick=\"ShowOrHideQRCode();\" />";
309
  echo "</td>\n";
310
  echo "</tr>\n";
311
 
312
  echo "<tr>\n";
313
  echo "<th></th>\n";
314
  echo "<td><div id=\"GA_QR_INFO\" style=\"display: none\" >";
315
+ echo "<div id=\"GA_QRCODE\"/></div>";
316
 
317
  echo '<span class="description"><br/> ' . __( 'Scan this with the Google Authenticator app.', 'google-authenticator' ) . '</span>';
318
  echo "</div></td>\n";
330
  echo "<td>\n";
331
  echo "<input name=\"GA_password\" id=\"GA_password\" readonly=\"readonly\" value=\"".$GA_password."\" type=\"text\" size=\"25\" />";
332
  echo "<input name=\"GA_createpassword\" id=\"GA_createpassword\" value=\"".__("Create new password",'google-authenticator')."\" type=\"button\" class=\"button\" />";
333
+ echo "<span class=\"description\" id=\"GA_passworddesc\"> ".__(' Password is not stored in cleartext, this is your only chance to see it.','google-authenticator')."</span>\n";
334
  echo "</td>\n";
335
  echo "</tr>\n";
336
  }
 
337
 
338
  echo "</tbody></table>\n";
339
  echo "<script type=\"text/javascript\">\n";
340
  echo "var GAnonce='".wp_create_nonce('GoogleAuthenticatoraction')."';\n";
341
 
 
 
 
 
342
  echo <<<ENDOFJS
343
+ //Create new secret and display it
344
  jQuery('#GA_newsecret').bind('click', function() {
345
+ // Remove existing QRCode
346
+ jQuery('#GA_QRCODE').html("");
347
  var data=new Object();
348
  data['action'] = 'GoogleAuthenticator_action';
349
  data['nonce'] = GAnonce;
350
  jQuery.post(ajaxurl, data, function(response) {
351
  jQuery('#GA_secret').val(response['new-secret']);
352
+ var qrcode="otpauth://totp/WordPress:"+escape(jQuery('#GA_description').val())+"?secret="+jQuery('#GA_secret').val()+"&issuer=WordPress";
353
+ jQuery('#GA_QRCODE').qrcode(qrcode);
354
+ jQuery('#GA_QR_INFO').show('slow');
 
355
  });
356
  });
357
 
358
+ // If the user starts modifying the description, hide the qrcode
359
  jQuery('#GA_description').bind('focus blur change keyup', function() {
360
+ // Only remove QR Code if it's visible
361
  if (jQuery('#GA_QR_INFO').is(':visible')) {
362
+ jQuery('#GA_QR_INFO').hide('slow');
363
+ jQuery('#GA_QRCODE').html("");
 
364
  }
365
  });
366
 
367
+ // Create new app password
368
  jQuery('#GA_createpassword').bind('click',function() {
369
  var data=new Object();
370
  data['action'] = 'GoogleAuthenticator_action';
396
  }
397
  }
398
 
399
+ function ShowOrHideQRCode() {
400
  if (jQuery('#GA_QR_INFO').is(':hidden')) {
401
+ var qrcode="otpauth://totp/WordPress:"+escape(jQuery('#GA_description').val())+"?secret="+jQuery('#GA_secret').val()+"&issuer=WordPress";
402
+ jQuery('#GA_QRCODE').qrcode(qrcode);
403
+ jQuery('#GA_QR_INFO').show('slow');
 
 
 
404
  } else {
405
  jQuery('#GA_QR_INFO').hide('slow');
406
+ jQuery('#GA_QRCODE').html("");
407
  }
408
  }
409
  </script>
525
  function ajax_callback() {
526
  global $user_id;
527
 
528
+ // Some AJAX security.
529
  check_ajax_referer( 'GoogleAuthenticatoraction', 'nonce' );
530
 
531
+ // Create new secret.
532
  $secret = $this->create_secret();
533
 
534
  $result = array( 'new-secret' => $secret );
jquery.qrcode.min.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
2
+ write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
3
+ for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
4
+ 7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
5
+ 0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
6
+ setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
7
+ j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
8
+ b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
9
+ c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
10
+ 0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
11
+ (d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
12
+ 78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
13
+ j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
14
+ a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
15
+ a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
16
+ 2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
17
+ LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
18
+ this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
19
+ [4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
20
+ 116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
21
+ 43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
22
+ 3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
23
+ 55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
24
+ 45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
25
+ (a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
26
+ correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
27
+ j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
28
+ d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery);
lang/google-authenticator-da_DK.mo ADDED
Binary file
lang/google-authenticator-da_DK.po ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Google Authenticator\n"
4
+ "POT-Creation-Date: 2014-01-11 08:17+0100\n"
5
+ "PO-Revision-Date: 2014-01-11 08:20+0100\n"
6
+ "Last-Translator: Henrik Schack <henrik@schack.dk>\n"
7
+ "Language-Team: \n"
8
+ "Language: da\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.3\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "X-Poedit-SourceCharset: UTF-8\n"
15
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
16
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
17
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
18
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+
21
+ #: google-authenticator.php:166
22
+ msgid ""
23
+ "If you don't have Google Authenticator enabled for your WordPress account, "
24
+ "leave this field empty."
25
+ msgstr ""
26
+ "Hvis ikke du har aktiveret Google Authenticator for din konto, så lad være "
27
+ "med at skrive noget her."
28
+
29
+ #: google-authenticator.php:166
30
+ msgid "Google Authenticator code"
31
+ msgstr "Google Authenticator kode"
32
+
33
+ #: google-authenticator.php:231
34
+ msgid "<strong>ERROR</strong>: The Google Authenticator password is incorrect."
35
+ msgstr "<strong>ERROR</strong>: Google Authenticator kodeordet er forkert."
36
+
37
+ #: google-authenticator.php:234
38
+ msgid ""
39
+ "<strong>ERROR</strong>: The Google Authenticator code is incorrect or has "
40
+ "expired."
41
+ msgstr ""
42
+ "<strong>ERROR</strong>: Google Authenticator koden er forkert eller udløbet."
43
+
44
+ #: google-authenticator.php:274
45
+ msgid "WordPressBlog"
46
+ msgstr "WordPressBlog"
47
+
48
+ #: google-authenticator.php:277 google-authenticator.php:469
49
+ msgid "Google Authenticator Settings"
50
+ msgstr "Google Authenticator indstillinger"
51
+
52
+ #: google-authenticator.php:282 google-authenticator.php:481
53
+ msgid "Active"
54
+ msgstr "Aktiv"
55
+
56
+ #: google-authenticator.php:290
57
+ msgid "Relaxed mode"
58
+ msgstr "Afslappet tilstand"
59
+
60
+ #: google-authenticator.php:292
61
+ msgid ""
62
+ " Relaxed mode allows for more time drifting on your phone clock (&#177;4 "
63
+ "min)."
64
+ msgstr ""
65
+ "Afslappet tilstand tillader mere upræcis tid på din telefon (&#177;4 min)."
66
+
67
+ #: google-authenticator.php:297
68
+ msgid "Description"
69
+ msgstr "Beskrivelse"
70
+
71
+ #: google-authenticator.php:298
72
+ msgid ""
73
+ " Description that you'll see in the Google Authenticator app on your phone."
74
+ msgstr "Beskrivelsen du vil se i Google Authenticator app'en på din telefon."
75
+
76
+ #: google-authenticator.php:302
77
+ msgid "Secret"
78
+ msgstr "Hemmelig kode"
79
+
80
+ #: google-authenticator.php:305
81
+ msgid "Create new secret"
82
+ msgstr "Opret ny hemmelig kode"
83
+
84
+ #: google-authenticator.php:306
85
+ msgid "Show/Hide QR code"
86
+ msgstr "Vis/Gem QR kode"
87
+
88
+ #: google-authenticator.php:315
89
+ msgid "Scan this with the Google Authenticator app."
90
+ msgstr "Scan dette med Google Authenticator app'en."
91
+
92
+ #: google-authenticator.php:320
93
+ msgid "Enable App password"
94
+ msgstr "Aktiver app kodeord"
95
+
96
+ #: google-authenticator.php:322
97
+ msgid " Enabling an App password will decrease your overall login security."
98
+ msgstr ""
99
+ "Aktiverer du app kodeords featuren, påvirker det din sikkerhed generelt."
100
+
101
+ #: google-authenticator.php:330
102
+ msgid "Create new password"
103
+ msgstr "Opret nyt kodeord"
104
+
105
+ #: google-authenticator.php:331
106
+ msgid ""
107
+ " Password is not stored in cleartext, this is your only chance to see it."
108
+ msgstr ""
109
+ "Kodeordet gemmes ikke i klartekst, dette er din eneste chance for at se det."
110
+
111
+ #: google-authenticator.php:474
112
+ msgid "Hide settings from user"
113
+ msgstr "Skjul indstillinger for bruger"
lang/google-authenticator-es_ES.mo ADDED
Binary file
lang/google-authenticator-es_ES.po ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2010 Google Authenticator
2
+ # This file is distributed under the same license as the Google Authenticator package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Google Authenticator 0.37\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n"
7
+ "POT-Creation-Date: 2011-08-21 14:25:45+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2014-01-11 10:07+0100\n"
12
+ "Last-Translator: \n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "X-Generator: Poedit 1.6.3\n"
15
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
+ "Language: es_ES\n"
17
+
18
+ #: google-authenticator.php:131
19
+ msgid ""
20
+ "If you don't have Google Authenticator enabled for your WordPress account, "
21
+ "leave this field empty."
22
+ msgstr ""
23
+ "Si no tiene Google Authenticator habilitado en su cuenta de WordPress, deje "
24
+ "este campo vacío."
25
+
26
+ #: google-authenticator.php:131
27
+ msgid "Google Authenticator code"
28
+ msgstr "Código Google Authenticator"
29
+
30
+ #: google-authenticator.php:176
31
+ msgid "<strong>ERROR</strong>: The Google Authenticator password is incorrect."
32
+ msgstr "<strong>ERROR</strong>: El codigo es incorrecto."
33
+
34
+ #: google-authenticator.php:179
35
+ msgid ""
36
+ "<strong>ERROR</strong>: The Google Authenticator code is incorrect or has "
37
+ "expired."
38
+ msgstr "<strong>ERROR</strong>: El código es incorrecto o caducado."
39
+
40
+ #: google-authenticator.php:215
41
+ msgid "WordPress Blog"
42
+ msgstr "Blog de WordPress"
43
+
44
+ #: google-authenticator.php:218 google-authenticator.php:392
45
+ msgid "Google Authenticator Settings"
46
+ msgstr "Opciones Google Authenticator"
47
+
48
+ #: google-authenticator.php:223 google-authenticator.php:396
49
+ msgid "Active"
50
+ msgstr "Activar"
51
+
52
+ #: google-authenticator.php:235
53
+ msgid "Relaxed mode"
54
+ msgstr "Modo relajado"
55
+
56
+ #: google-authenticator.php:237
57
+ msgid ""
58
+ " Relaxed mode allows for more time drifting on your phone clock (&#177;4 "
59
+ "min)."
60
+ msgstr ""
61
+ "El modo relajado permite tener más tiempo de reloj en su teléfono (&#177;4 "
62
+ "min)."
63
+
64
+ #: google-authenticator.php:242
65
+ msgid "Description"
66
+ msgstr "Descripción"
67
+
68
+ #: google-authenticator.php:243
69
+ msgid ""
70
+ " Description that you'll see in the Google Authenticator app on your phone."
71
+ msgstr ""
72
+ "Descripción que se verá en la aplicación Google Authenticator en su teléfono."
73
+
74
+ #: google-authenticator.php:247
75
+ msgid "Secret"
76
+ msgstr "Secreto"
77
+
78
+ #: google-authenticator.php:250
79
+ msgid "Create new secret"
80
+ msgstr "Crear nueva clave secreta"
81
+
82
+ #: google-authenticator.php:251
83
+ msgid "Show/Hide QR code"
84
+ msgstr "Mostar/Esconder QR Code"
85
+
86
+ #: google-authenticator.php:259
87
+ msgid "Scan this with the Google Authenticator app."
88
+ msgstr "Escanear esto con la aplicación Google Authenticator."
89
+
90
+ #: google-authenticator.php:264
91
+ msgid "Enable App password"
92
+ msgstr "Permitir contraseña de aplicación"
93
+
94
+ #: google-authenticator.php:266
95
+ msgid " Enabling an App password will decrease your overall login security."
96
+ msgstr "Permitir una contraseña de aplicación disminuirá su seguridad global."
97
+
98
+ #: google-authenticator.php:274
99
+ msgid "Create new password"
100
+ msgstr "Crear nueva contraseña"
101
+
102
+ #: google-authenticator.php:275
103
+ msgid ""
104
+ " Password is not stored in cleartext, this is your only chance to see it."
105
+ msgstr ""
106
+ "La contraseña no está almacenada en formato de texto, es su única "
107
+ "oportunidad de verla."
108
+
109
+ #. Plugin Name of the plugin/theme
110
+ msgid "Google Authenticator"
111
+ msgstr ""
112
+
113
+ #. Plugin URI of the plugin/theme
114
+ msgid "http://henrik.schack.dk/google-authenticator-for-wordpress"
115
+ msgstr ""
116
+
117
+ #. Description of the plugin/theme
118
+ msgid ""
119
+ "Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry "
120
+ "app as One Time Password generator."
121
+ msgstr ""
122
+ "La autentificación en dos pasos por wordpress utiliza una app Android/iPhone/"
123
+ "Blackberry como 'One Time Password generator.'"
124
+
125
+ #. Author of the plugin/theme
126
+ msgid "Henrik Schack"
127
+ msgstr ""
128
+
129
+ #. Author URI of the plugin/theme
130
+ msgid "http://henrik.schack.dk/"
131
+ msgstr ""
lang/google-authenticator-fr_FR.mo ADDED
Binary file
lang/google-authenticator-fr_FR.po ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2010 Google Authenticator
2
+ # This file is distributed under the same license as the Google Authenticator package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Google Authenticator 0.37\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n"
7
+ "POT-Creation-Date: 2011-08-21 14:25:45+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2014-01-11 10:15+0100\n"
12
+ "Last-Translator: \n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "X-Generator: Poedit 1.6.3\n"
15
+ "Plural-Forms: nplurals=2; plural=(n > 1);\n"
16
+ "Language: fr_FR\n"
17
+
18
+ #: google-authenticator.php:131
19
+ msgid ""
20
+ "If you don't have Google Authenticator enabled for your WordPress account, "
21
+ "leave this field empty."
22
+ msgstr ""
23
+ "Si vous n'avez pas activé Google ASuthenticator pour votre compte wordpress, "
24
+ "laissez ce champ vide."
25
+
26
+ #: google-authenticator.php:131
27
+ msgid "Google Authenticator code"
28
+ msgstr "Code Google Authenticator"
29
+
30
+ #: google-authenticator.php:176
31
+ msgid "<strong>ERROR</strong>: The Google Authenticator password is incorrect."
32
+ msgstr "<strong>ERREUR</strong>: Le code Google Authenticator est incorrect."
33
+
34
+ #: google-authenticator.php:179
35
+ msgid ""
36
+ "<strong>ERROR</strong>: The Google Authenticator code is incorrect or has "
37
+ "expired."
38
+ msgstr ""
39
+ "<strong>ERREUR</strong>: Le code Google Authenticator est incorrect ou "
40
+ "périmé."
41
+
42
+ #: google-authenticator.php:215
43
+ msgid "WordPress Blog"
44
+ msgstr "Blog WordPress"
45
+
46
+ #: google-authenticator.php:218 google-authenticator.php:392
47
+ msgid "Google Authenticator Settings"
48
+ msgstr "Réglages Google Authenticator"
49
+
50
+ #: google-authenticator.php:223 google-authenticator.php:396
51
+ msgid "Active"
52
+ msgstr "Activer"
53
+
54
+ #: google-authenticator.php:235
55
+ msgid "Relaxed mode"
56
+ msgstr "Mode relax"
57
+
58
+ #: google-authenticator.php:237
59
+ msgid ""
60
+ " Relaxed mode allows for more time drifting on your phone clock (&#177;4 "
61
+ "min)."
62
+ msgstr ""
63
+ "Le mode relax vous permet d'avoir plus de temps de latence sur le chrono de "
64
+ "votre téléphone (&#177;4 min)."
65
+
66
+ #: google-authenticator.php:242
67
+ msgid "Description"
68
+ msgstr "Description"
69
+
70
+ #: google-authenticator.php:243
71
+ msgid ""
72
+ " Description that you'll see in the Google Authenticator app on your phone."
73
+ msgstr ""
74
+ "Voici la description que vous verrez dans l'app Gogogle Authentiator de "
75
+ "votre téléphone."
76
+
77
+ #: google-authenticator.php:247
78
+ msgid "Secret"
79
+ msgstr "Code secret"
80
+
81
+ #: google-authenticator.php:250
82
+ msgid "Create new secret"
83
+ msgstr "Créer nouveau code secret"
84
+
85
+ #: google-authenticator.php:251
86
+ msgid "Show/Hide QR code"
87
+ msgstr "Montrer/Cacher le QR Code"
88
+
89
+ #: google-authenticator.php:259
90
+ msgid "Scan this with the Google Authenticator app."
91
+ msgstr "Scanner ceci avec votre app Google Authenticator"
92
+
93
+ #: google-authenticator.php:264
94
+ msgid "Enable App password"
95
+ msgstr "Autoriser mot de passe de l'app"
96
+
97
+ #: google-authenticator.php:266
98
+ msgid " Enabling an App password will decrease your overall login security."
99
+ msgstr ""
100
+ "Autoriser un mot de passe d'app réduira votre sécurité globale de connexion."
101
+
102
+ #: google-authenticator.php:274
103
+ msgid "Create new password"
104
+ msgstr "Créer nouveau mot de passe"
105
+
106
+ #: google-authenticator.php:275
107
+ msgid ""
108
+ " Password is not stored in cleartext, this is your only chance to see it."
109
+ msgstr ""
110
+ "Le mot de passe n'est pas stocké en texte clair, c'est votre seule "
111
+ "opportunité de le voir."
112
+
113
+ #. Plugin Name of the plugin/theme
114
+ msgid "Google Authenticator"
115
+ msgstr "Google Authenticator"
116
+
117
+ #. Plugin URI of the plugin/theme
118
+ msgid "http://henrik.schack.dk/google-authenticator-for-wordpress"
119
+ msgstr ""
120
+
121
+ #. Description of the plugin/theme
122
+ msgid ""
123
+ "Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry "
124
+ "app as One Time Password generator."
125
+ msgstr ""
126
+
127
+ #. Author of the plugin/theme
128
+ msgid "Henrik Schack"
129
+ msgstr ""
130
+
131
+ #. Author URI of the plugin/theme
132
+ msgid "http://henrik.schack.dk/"
133
+ msgstr ""
lang/google-authenticator.pot CHANGED
@@ -1,101 +1,96 @@
1
- # Copyright (C) 2010 Google Authenticator
2
  # This file is distributed under the same license as the Google Authenticator package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Google Authenticator 0.37\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n"
7
- "POT-Creation-Date: 2011-08-21 14:25:45+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
- #: google-authenticator.php:131
16
- msgid ""
17
- "If you don't have Google Authenticator enabled for your WordPress account, "
18
- "leave this field empty."
19
  msgstr ""
20
 
21
- #: google-authenticator.php:131
22
  msgid "Google Authenticator code"
23
  msgstr ""
24
 
25
- #: google-authenticator.php:176
26
  msgid "<strong>ERROR</strong>: The Google Authenticator password is incorrect."
27
  msgstr ""
28
 
29
- #: google-authenticator.php:179
30
- msgid ""
31
- "<strong>ERROR</strong>: The Google Authenticator code is incorrect or has "
32
- "expired."
33
  msgstr ""
34
 
35
- #: google-authenticator.php:215
36
- msgid "WordPress Blog"
37
  msgstr ""
38
 
39
- #: google-authenticator.php:218 google-authenticator.php:392
40
  msgid "Google Authenticator Settings"
41
  msgstr ""
42
 
43
- #: google-authenticator.php:223 google-authenticator.php:396
44
  msgid "Active"
45
  msgstr ""
46
 
47
- #: google-authenticator.php:235
48
  msgid "Relaxed mode"
49
  msgstr ""
50
 
51
- #: google-authenticator.php:237
52
- msgid ""
53
- " Relaxed mode allows for more time drifting on your phone clock (&#177;4 "
54
- "min)."
55
  msgstr ""
56
 
57
- #: google-authenticator.php:242
58
  msgid "Description"
59
  msgstr ""
60
 
61
- #: google-authenticator.php:243
62
- msgid ""
63
- " Description that you'll see in the Google Authenticator app on your phone."
64
  msgstr ""
65
 
66
- #: google-authenticator.php:247
67
  msgid "Secret"
68
  msgstr ""
69
 
70
- #: google-authenticator.php:250
71
  msgid "Create new secret"
72
  msgstr ""
73
 
74
- #: google-authenticator.php:251
75
  msgid "Show/Hide QR code"
76
  msgstr ""
77
 
78
- #: google-authenticator.php:259
79
  msgid "Scan this with the Google Authenticator app."
80
  msgstr ""
81
 
82
- #: google-authenticator.php:264
83
  msgid "Enable App password"
84
  msgstr ""
85
 
86
- #: google-authenticator.php:266
87
  msgid " Enabling an App password will decrease your overall login security."
88
  msgstr ""
89
 
90
- #: google-authenticator.php:274
91
  msgid "Create new password"
92
  msgstr ""
93
 
94
- #: google-authenticator.php:275
95
- msgid ""
96
- " Password is not stored in cleartext, this is your only chance to see it."
97
  msgstr ""
98
 
 
 
 
99
  #. Plugin Name of the plugin/theme
100
  msgid "Google Authenticator"
101
  msgstr ""
@@ -105,9 +100,7 @@ msgid "http://henrik.schack.dk/google-authenticator-for-wordpress"
105
  msgstr ""
106
 
107
  #. Description of the plugin/theme
108
- msgid ""
109
- "Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry "
110
- "app as One Time Password generator."
111
  msgstr ""
112
 
113
  #. Author of the plugin/theme
1
+ # Copyright (C) 2014 Google Authenticator
2
  # This file is distributed under the same license as the Google Authenticator package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Google Authenticator 0.47\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n"
7
+ "POT-Creation-Date: 2014-01-11 07:14:22+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2014-MO-DA HO:MI+ZONE\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: google-authenticator.php:166
16
+ msgid "If you don't have Google Authenticator enabled for your WordPress account, leave this field empty."
 
 
17
  msgstr ""
18
 
19
+ #: google-authenticator.php:166
20
  msgid "Google Authenticator code"
21
  msgstr ""
22
 
23
+ #: google-authenticator.php:231
24
  msgid "<strong>ERROR</strong>: The Google Authenticator password is incorrect."
25
  msgstr ""
26
 
27
+ #: google-authenticator.php:234
28
+ msgid "<strong>ERROR</strong>: The Google Authenticator code is incorrect or has expired."
 
 
29
  msgstr ""
30
 
31
+ #: google-authenticator.php:274
32
+ msgid "WordPressBlog"
33
  msgstr ""
34
 
35
+ #: google-authenticator.php:277 google-authenticator.php:469
36
  msgid "Google Authenticator Settings"
37
  msgstr ""
38
 
39
+ #: google-authenticator.php:282 google-authenticator.php:481
40
  msgid "Active"
41
  msgstr ""
42
 
43
+ #: google-authenticator.php:290
44
  msgid "Relaxed mode"
45
  msgstr ""
46
 
47
+ #: google-authenticator.php:292
48
+ msgid " Relaxed mode allows for more time drifting on your phone clock (&#177;4 min)."
 
 
49
  msgstr ""
50
 
51
+ #: google-authenticator.php:297
52
  msgid "Description"
53
  msgstr ""
54
 
55
+ #: google-authenticator.php:298
56
+ msgid " Description that you'll see in the Google Authenticator app on your phone."
 
57
  msgstr ""
58
 
59
+ #: google-authenticator.php:302
60
  msgid "Secret"
61
  msgstr ""
62
 
63
+ #: google-authenticator.php:305
64
  msgid "Create new secret"
65
  msgstr ""
66
 
67
+ #: google-authenticator.php:306
68
  msgid "Show/Hide QR code"
69
  msgstr ""
70
 
71
+ #: google-authenticator.php:315
72
  msgid "Scan this with the Google Authenticator app."
73
  msgstr ""
74
 
75
+ #: google-authenticator.php:320
76
  msgid "Enable App password"
77
  msgstr ""
78
 
79
+ #: google-authenticator.php:322
80
  msgid " Enabling an App password will decrease your overall login security."
81
  msgstr ""
82
 
83
+ #: google-authenticator.php:330
84
  msgid "Create new password"
85
  msgstr ""
86
 
87
+ #: google-authenticator.php:331
88
+ msgid " Password is not stored in cleartext, this is your only chance to see it."
 
89
  msgstr ""
90
 
91
+ #: google-authenticator.php:474
92
+ msgid "Hide settings from user"
93
+ msgstr ""
94
  #. Plugin Name of the plugin/theme
95
  msgid "Google Authenticator"
96
  msgstr ""
100
  msgstr ""
101
 
102
  #. Description of the plugin/theme
103
+ msgid "Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry app as One Time Password generator."
 
 
104
  msgstr ""
105
 
106
  #. Author of the plugin/theme
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: Henrik.Schack
3
  Donate Link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=henrik%40schack%2edk&lc=US&item_name=Google%20Authenticator&item_number=Google%20Authenticator&no_shipping=0&no_note=1&tax=0&bn=PP%2dDonationsBF&charset=UTF%2d8
4
  Tags: authentication,otp,password,security,login,android,iphone,blackberry
5
  Requires at least: 3.8
6
- Tested up to: 3.8
7
- Stable tag: 0.46
8
 
9
  Google Authenticator for your WordPress blog.
10
 
@@ -40,10 +40,8 @@ No, you'll have to delete the existing account from the Google Authenticator app
40
 
41
  = I am unable to log in using this plugin, what's wrong ? =
42
 
43
- The Google Authenticator verification codes are time based, so it's crucial that the clock in your phone is accurate and in sync with the clock on the server where your WordPress installation is hosted.
44
-
45
  If you have an Android phone, you can use an app like [ClockSync](https://market.android.com/details?id=ru.org.amip.ClockSync) to set your clock in case your Cell provider doesn't provide accurate time information
46
-
47
  Another option is to enable "relaxed mode" in the settings for the plugin, this will enable more valid codes by allowing up to a 4 min. timedrift in each direction.
48
 
49
  = I have several users on my WordPress installation, is that a supported configuration ? =
@@ -52,11 +50,25 @@ Yes, each user has his own Google Authenticator settings.
52
 
53
  = During installation I forgot the thing about making sure my webhost is capable of providing accurate time information, I'm now unable to login, please help. =
54
 
55
- If you have SSH or FTP access to your webhosting account, you can manually delete the plugin from your WordPress installation,
56
  just delete the wp-content/plugins/google-authenticator directory, and you'll be able to login using username/password again.
57
 
58
  = I don't own a Smartphone, isn't there another way to generate these secret codes ? =
59
- Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/ Github project here : https://github.com/gbraad/html5-google-authenticator
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
 
61
 
62
  == Screenshots ==
@@ -68,12 +80,18 @@ Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/ Github proj
68
 
69
  == Changelog ==
70
 
71
- = 0.46 =
 
 
 
 
 
 
72
  * Man-in-the-middle attack protection added.
73
  * Show warning before displaying the QR code.
74
  * FAQ updated.
75
 
76
- = 0.45 =
77
  * Spaces in the description field should now work on iPhones.
78
  * Some depricated function calls replaced.
79
  * Code inputfield easier to use for .jp users now.
@@ -82,7 +100,7 @@ Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/ Github proj
82
  * PHP notices occurring during app password login removed.
83
 
84
 
85
- = 0.44 =
86
  * Installation/FAQ section updated.
87
  * Simplified Chinese translation by Kaijia Feng added.
88
  * Tabindex on loginpage removed, no longer needed, was used by older WordPress installations.
@@ -91,39 +109,39 @@ Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/ Github proj
91
  * Compatibility with Ryan Hellyer's plugin http://geek.ryanhellyer.net/products/deactivate-google-authenticator/
92
  * Must enter all 6 code digits.
93
 
94
- = 0.43 =
95
  * It's now possible for an admin to hide the Google Authenticaator settings on a per-user basis. (Feature request by : Skate-O)
96
 
97
- = 0.42 =
98
  * Autocomplete disabled on code input field. (Feature request by : hiphopsmurf)
99
 
100
- = 0.41 =
101
  * Italian translation by Aldo Latino added.
102
 
103
- = 0.40 =
104
  * Bugfix, typo corrected and PHP notices removed. Thanks to Dion Hulse for his patch.
105
 
106
- = 0.39 =
107
  * Bugfix, Description was not saved to WordPress database when updating profile. Thanks to xxdesmus for noticing this.
108
 
109
- = 0.38 =
110
  * Usability fix, input field for codes changed from password to text type.
111
 
112
- = 0.37 =
113
  * The plugin now supports "relaxed mode" when authenticating. If selected, codes from 4 minutes before and 4 minutes after will work. 30 seconds before and after is still the default setting.
114
 
115
- = 0.36 =
116
  * Bugfix, now an App password can only be used for XMLRPC/APP-Request logins.
117
 
118
- = 0.35 =
119
  * Initial WordPress app support added (XMLRPC).
120
 
121
- = 0.30 =
122
  * Code cleanup
123
  * Changed generation of secret key, to no longer have requirement of SHA256 on the server
124
  * German translation
125
 
126
- = 0.20 =
127
  * Initial release
128
 
129
 
@@ -131,7 +149,7 @@ Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/ Github proj
131
 
132
  Thanks to:
133
 
134
- [Tobias B�thge](http://tobias.baethge.com/) for his code rewrite and German translation.
135
 
136
  [Pascal de Bruijn](http://blog.pcode.nl/) for his "relaxed mode" idea.
137
 
@@ -143,4 +161,8 @@ Thanks to:
143
 
144
  [Kaijia Feng](http://www.kaijia.me/) for his Simplified Chinese translation.
145
 
146
- [Alex Concha](http://www.buayacorp.com/) for his security tips.
 
 
 
 
3
  Donate Link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=henrik%40schack%2edk&lc=US&item_name=Google%20Authenticator&item_number=Google%20Authenticator&no_shipping=0&no_note=1&tax=0&bn=PP%2dDonationsBF&charset=UTF%2d8
4
  Tags: authentication,otp,password,security,login,android,iphone,blackberry
5
  Requires at least: 3.8
6
+ Tested up to: 3.8.1
7
+ Stable tag: 0.47
8
 
9
  Google Authenticator for your WordPress blog.
10
 
40
 
41
  = I am unable to log in using this plugin, what's wrong ? =
42
 
43
+ The Google Authenticator verification codes are time based, so it's crucial that the clock in your phone is accurate and in sync with the clock on the server where your WordPress installation is hosted.
 
44
  If you have an Android phone, you can use an app like [ClockSync](https://market.android.com/details?id=ru.org.amip.ClockSync) to set your clock in case your Cell provider doesn't provide accurate time information
 
45
  Another option is to enable "relaxed mode" in the settings for the plugin, this will enable more valid codes by allowing up to a 4 min. timedrift in each direction.
46
 
47
  = I have several users on my WordPress installation, is that a supported configuration ? =
50
 
51
  = During installation I forgot the thing about making sure my webhost is capable of providing accurate time information, I'm now unable to login, please help. =
52
 
53
+ If you have SSH or FTP access to your webhosting account, you can manually delete the plugin from your WordPress installation,
54
  just delete the wp-content/plugins/google-authenticator directory, and you'll be able to login using username/password again.
55
 
56
  = I don't own a Smartphone, isn't there another way to generate these secret codes ? =
57
+
58
+ Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/
59
+ Github project here : https://github.com/gbraad/html5-google-authenticator
60
+
61
+ = Can I create backupcodes ? =
62
+
63
+ No, but if you're using an Android smartphone you can replace the Google Authenticator app with [Authenticator Plus](https://play.google.com/store/apps/details?id=com.mufri.authenticatorplus).
64
+ It's a really nice app that can import your existing settings, sync between devices and backup/restore using your sd-card.
65
+ It's not a free app, but it's well worth the money.
66
+
67
+ = Any known incompatabilities ? =
68
+
69
+ Yes, the Man-in-the-middle attack/replay detection code isn't compatible with the test/setup mode in the "Stop spammer registration plugin",
70
+ please remember to remove the "Check credentials on all login attempts" checkmark before installing my plugin.
71
+
72
 
73
 
74
  == Screenshots ==
80
 
81
  == Changelog ==
82
 
83
+ = 0.47 =
84
+ * Google chart API replaced with jquery-qrcode
85
+ * QR codes now contain a heading saying WordPress (Feature request by Flemming Mahler)
86
+ * Danish translation & updated .pot file.
87
+ * Plugin now logs login attempts recognized as Man-in-the-middle attacks.
88
+
89
+ = 0.46 =
90
  * Man-in-the-middle attack protection added.
91
  * Show warning before displaying the QR code.
92
  * FAQ updated.
93
 
94
+ = 0.45 =
95
  * Spaces in the description field should now work on iPhones.
96
  * Some depricated function calls replaced.
97
  * Code inputfield easier to use for .jp users now.
100
  * PHP notices occurring during app password login removed.
101
 
102
 
103
+ = 0.44 =
104
  * Installation/FAQ section updated.
105
  * Simplified Chinese translation by Kaijia Feng added.
106
  * Tabindex on loginpage removed, no longer needed, was used by older WordPress installations.
109
  * Compatibility with Ryan Hellyer's plugin http://geek.ryanhellyer.net/products/deactivate-google-authenticator/
110
  * Must enter all 6 code digits.
111
 
112
+ = 0.43 =
113
  * It's now possible for an admin to hide the Google Authenticaator settings on a per-user basis. (Feature request by : Skate-O)
114
 
115
+ = 0.42 =
116
  * Autocomplete disabled on code input field. (Feature request by : hiphopsmurf)
117
 
118
+ = 0.41 =
119
  * Italian translation by Aldo Latino added.
120
 
121
+ = 0.40 =
122
  * Bugfix, typo corrected and PHP notices removed. Thanks to Dion Hulse for his patch.
123
 
124
+ = 0.39 =
125
  * Bugfix, Description was not saved to WordPress database when updating profile. Thanks to xxdesmus for noticing this.
126
 
127
+ = 0.38 =
128
  * Usability fix, input field for codes changed from password to text type.
129
 
130
+ = 0.37 =
131
  * The plugin now supports "relaxed mode" when authenticating. If selected, codes from 4 minutes before and 4 minutes after will work. 30 seconds before and after is still the default setting.
132
 
133
+ = 0.36 =
134
  * Bugfix, now an App password can only be used for XMLRPC/APP-Request logins.
135
 
136
+ = 0.35 =
137
  * Initial WordPress app support added (XMLRPC).
138
 
139
+ = 0.30 =
140
  * Code cleanup
141
  * Changed generation of secret key, to no longer have requirement of SHA256 on the server
142
  * German translation
143
 
144
+ = 0.20 =
145
  * Initial release
146
 
147
 
149
 
150
  Thanks to:
151
 
152
+ [Tobias Bäthge](http://tobias.baethge.com/) for his code rewrite and German translation.
153
 
154
  [Pascal de Bruijn](http://blog.pcode.nl/) for his "relaxed mode" idea.
155
 
161
 
162
  [Kaijia Feng](http://www.kaijia.me/) for his Simplified Chinese translation.
163
 
164
+ [Alex Concha](http://www.buayacorp.com/) for his security tips.
165
+
166
+ [Jerome Etienne](http://jetienne.com/) for his jquery-qrcode plugin.
167
+
168
+ [Sébastien Prunier](http://orizhial.com/) for his Spanish and French translation.
screenshot-5.jpg ADDED
Binary file