From 3b64f761680a7e83f6fc64e90aab9c0923e1cff6 Mon Sep 17 00:00:00 2001 From: "Anthony G. Basile" Date: Wed, 11 Jul 2018 14:19:36 -0400 Subject: Initial commit google-authenticator --- plugins/google-authenticator/base32.php | 82 +++ .../google-authenticator/google-authenticator.php | 549 +++++++++++++++++++++ plugins/google-authenticator/jquery.qrcode.min.js | 28 ++ .../lang/google-authenticator-da_DK.mo | Bin 0 -> 2736 bytes .../lang/google-authenticator-da_DK.po | 113 +++++ .../lang/google-authenticator-de_DE.mo | Bin 0 -> 2565 bytes .../lang/google-authenticator-de_DE.po | 119 +++++ .../lang/google-authenticator-es_ES.mo | Bin 0 -> 2749 bytes .../lang/google-authenticator-es_ES.po | 131 +++++ .../lang/google-authenticator-fr_FR.mo | Bin 0 -> 2635 bytes .../lang/google-authenticator-fr_FR.po | 133 +++++ .../lang/google-authenticator-it_IT.mo | Bin 0 -> 3324 bytes .../lang/google-authenticator-it_IT.po | 143 ++++++ .../lang/google-authenticator-zh_CN.mo | Bin 0 -> 3026 bytes .../lang/google-authenticator-zh_CN.po | 126 +++++ .../lang/google-authenticator.pot | 112 +++++ plugins/google-authenticator/readme.txt | 170 +++++++ plugins/google-authenticator/screenshot-1.jpg | Bin 0 -> 28821 bytes plugins/google-authenticator/screenshot-2.jpg | Bin 0 -> 101559 bytes plugins/google-authenticator/screenshot-3.jpg | Bin 0 -> 148800 bytes plugins/google-authenticator/screenshot-4.jpg | Bin 0 -> 64993 bytes plugins/google-authenticator/screenshot-5.jpg | Bin 0 -> 24141 bytes 22 files changed, 1706 insertions(+) create mode 100644 plugins/google-authenticator/base32.php create mode 100644 plugins/google-authenticator/google-authenticator.php create mode 100644 plugins/google-authenticator/jquery.qrcode.min.js create mode 100644 plugins/google-authenticator/lang/google-authenticator-da_DK.mo create mode 100644 plugins/google-authenticator/lang/google-authenticator-da_DK.po create mode 100644 plugins/google-authenticator/lang/google-authenticator-de_DE.mo create mode 100644 plugins/google-authenticator/lang/google-authenticator-de_DE.po create mode 100644 plugins/google-authenticator/lang/google-authenticator-es_ES.mo create mode 100644 plugins/google-authenticator/lang/google-authenticator-es_ES.po create mode 100644 plugins/google-authenticator/lang/google-authenticator-fr_FR.mo create mode 100644 plugins/google-authenticator/lang/google-authenticator-fr_FR.po create mode 100644 plugins/google-authenticator/lang/google-authenticator-it_IT.mo create mode 100644 plugins/google-authenticator/lang/google-authenticator-it_IT.po create mode 100644 plugins/google-authenticator/lang/google-authenticator-zh_CN.mo create mode 100644 plugins/google-authenticator/lang/google-authenticator-zh_CN.po create mode 100644 plugins/google-authenticator/lang/google-authenticator.pot create mode 100644 plugins/google-authenticator/readme.txt create mode 100644 plugins/google-authenticator/screenshot-1.jpg create mode 100644 plugins/google-authenticator/screenshot-2.jpg create mode 100644 plugins/google-authenticator/screenshot-3.jpg create mode 100644 plugins/google-authenticator/screenshot-4.jpg create mode 100644 plugins/google-authenticator/screenshot-5.jpg diff --git a/plugins/google-authenticator/base32.php b/plugins/google-authenticator/base32.php new file mode 100644 index 00000000..91bd93e9 --- /dev/null +++ b/plugins/google-authenticator/base32.php @@ -0,0 +1,82 @@ +'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7', + 'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15', + 'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23', + 'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31' + ); + + /** + * Use padding false when encoding for urls + * + * @return base32 encoded string + * @author Bryan Ruiz + **/ + public static function encode($input, $padding = true) { + if(empty($input)) return ""; + $input = str_split($input); + $binaryString = ""; + for($i = 0; $i < count($input); $i++) { + $binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT); + } + $fiveBitBinaryArray = str_split($binaryString, 5); + $base32 = ""; + $i=0; + while($i < count($fiveBitBinaryArray)) { + $base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)]; + $i++; + } + if($padding && ($x = strlen($binaryString) % 40) != 0) { + if($x == 8) $base32 .= str_repeat(self::$map[32], 6); + else if($x == 16) $base32 .= str_repeat(self::$map[32], 4); + else if($x == 24) $base32 .= str_repeat(self::$map[32], 3); + else if($x == 32) $base32 .= self::$map[32]; + } + return $base32; + } + + public static function decode($input) { + if(empty($input)) return; + $paddingCharCount = substr_count($input, self::$map[32]); + $allowedValues = array(6,4,3,1,0); + if(!in_array($paddingCharCount, $allowedValues)) return false; + for($i=0; $i<4; $i++){ + if($paddingCharCount == $allowedValues[$i] && + substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false; + } + $input = str_replace('=','', $input); + $input = str_split($input); + $binaryString = ""; + for($i=0; $i < count($input); $i = $i+8) { + $x = ""; + if(!in_array($input[$i], self::$map)) return false; + for($j=0; $j < 8; $j++) { + $x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT); + } + $eightBits = str_split($x, 8); + for($z = 0; $z < count($eightBits); $z++) { + $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:""; + } + } + return $binaryString; + } +} \ No newline at end of file diff --git a/plugins/google-authenticator/google-authenticator.php b/plugins/google-authenticator/google-authenticator.php new file mode 100644 index 00000000..a2c46d85 --- /dev/null +++ b/plugins/google-authenticator/google-authenticator.php @@ -0,0 +1,549 @@ += ($tm+$i) ) { + error_log("Google Authenticator plugin: Man-in-the-middle attack detected (Could also be 2 legit login attempts within the same 30 second period)"); + return false; + } + // Return timeslot in which login happened. + return $tm+$i; + } + } + return false; +} + +/** + * Create a new random secret for the Google Authenticator app. + * 16 characters, randomly chosen from the allowed Base32 characters + * equals 10 bytes = 80 bits, as 256^10 = 32^16 = 2^80 + */ +function create_secret() { + $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; // allowed characters in Base32 + $secret = ''; + for ( $i = 0; $i < 16; $i++ ) { + $secret .= substr( $chars, wp_rand( 0, strlen( $chars ) - 1 ), 1 ); + } + return $secret; +} + +/** + * Add the script to generate QR codes. + */ +function add_qrcode_script() { + wp_enqueue_script('jquery'); + wp_register_script('qrcode_script', plugins_url('jquery.qrcode.min.js', __FILE__),array("jquery")); + wp_enqueue_script('qrcode_script'); +} + +/** + * Add verification code field to login form. + */ +function loginform() { + echo "\t

\n"; + echo "\t\t\n"; + echo "\t

\n"; +} + +/** + * Disable autocomplete on Google Authenticator code input field. + */ +function loginfooter() { + echo "\n\n"; +} + +/** + * Login form handling. + * Check Google Authenticator verification code, if user has been setup to do so. + * @param wordpressuser + * @return user/loginstatus + */ +function check_otp( $user, $username = '', $password = '' ) { + // Store result of loginprocess, so far. + $userstate = $user; + + // Get information on user, we need this in case an app password has been enabled, + // since the $user var only contain an error at this point in the login flow. + if ( get_user_by( 'email', $username ) === false ) { + $user = get_user_by( 'login', $username ); + } else { + $user = get_user_by( 'email', $username ); + } + + // Does the user have the Google Authenticator enabled ? + if ( isset( $user->ID ) && trim(get_user_option( 'googleauthenticator_enabled', $user->ID ) ) == 'enabled' ) { + + // Get the users secret + $GA_secret = trim( get_user_option( 'googleauthenticator_secret', $user->ID ) ); + + // Figure out if user is using relaxed mode ? + $GA_relaxedmode = trim( get_user_option( 'googleauthenticator_relaxedmode', $user->ID ) ); + + // Get the verification code entered by the user trying to login + if ( !empty( $_POST['googleotp'] )) { // Prevent PHP notices when using app password login + $otp = trim( $_POST[ 'googleotp' ] ); + } else { + $otp = ''; + } + // When was the last successful login performed ? + $lasttimeslot = trim( get_user_option( 'googleauthenticator_lasttimeslot', $user->ID ) ); + // Valid code ? + if ( $timeslot = $this->verify( $GA_secret, $otp, $GA_relaxedmode, $lasttimeslot ) ) { + // Store the timeslot in which login was successful. + update_user_option( $user->ID, 'googleauthenticator_lasttimeslot', $timeslot, true ); + return $userstate; + } else { + // No, lets see if an app password is enabled, and this is an XMLRPC / APP login ? + if ( trim( get_user_option( 'googleauthenticator_pwdenabled', $user->ID ) ) == 'enabled' && ( defined('XMLRPC_REQUEST') || defined('APP_REQUEST') ) ) { + $GA_passwords = json_decode( get_user_option( 'googleauthenticator_passwords', $user->ID ) ); + $passwordhash = trim($GA_passwords->{'password'} ); + $usersha1 = sha1( strtoupper( str_replace( ' ', '', $password ) ) ); + if ( $passwordhash == $usersha1 ) { // ToDo: Remove after some time when users have migrated to new format + return new WP_User( $user->ID ); + // Try the new version based on thee wp_hash_password function + } elseif (wp_check_password( strtoupper( str_replace( ' ', '', $password ) ), $passwordhash)) { + return new WP_User( $user->ID ); + } else { + // Wrong XMLRPC/APP password ! + return new WP_Error( 'invalid_google_authenticator_password', __( 'ERROR: The Google Authenticator password is incorrect.', 'google-authenticator' ) ); + } + } else { + return new WP_Error( 'invalid_google_authenticator_token', __( 'ERROR: The Google Authenticator code is incorrect or has expired.', 'google-authenticator' ) ); + } + } + } + // Google Authenticator isn't enabled for this account, + // just resume normal authentication. + return $userstate; +} + + +/** + * Extend personal profile page with Google Authenticator settings. + */ +function profile_personal_options() { + global $user_id, $is_profile_page; + + // If editing of Google Authenticator settings has been disabled, just return + $GA_hidefromuser = trim( get_user_option( 'googleauthenticator_hidefromuser', $user_id ) ); + if ( $GA_hidefromuser == 'enabled') return; + + $GA_secret = trim( get_user_option( 'googleauthenticator_secret', $user_id ) ); + $GA_enabled = trim( get_user_option( 'googleauthenticator_enabled', $user_id ) ); + $GA_relaxedmode = trim( get_user_option( 'googleauthenticator_relaxedmode', $user_id ) ); + $GA_description = trim( get_user_option( 'googleauthenticator_description', $user_id ) ); + $GA_pwdenabled = trim( get_user_option( 'googleauthenticator_pwdenabled', $user_id ) ); + $GA_password = trim( get_user_option( 'googleauthenticator_passwords', $user_id ) ); + + // We dont store the generated app password in cleartext so there is no point in trying + // to show the user anything except from the fact that a password exists. + if ( $GA_password != '' ) { + $GA_password = "XXXX XXXX XXXX XXXX"; + } + + // In case the user has no secret ready (new install), we create one. + if ( '' == $GA_secret ) { + $GA_secret = $this->create_secret(); + } + + // Use "WordPress Blog" as default description + if ( '' == $GA_description ) { + $GA_description = __( 'WordPressBlog', 'google-authenticator' ); + } + + echo "

".__( 'Google Authenticator Settings', 'google-authenticator' )."

\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ( $is_profile_page || IS_PROFILE_PAGE ) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + echo "
".__( 'Active', 'google-authenticator' )."\n"; + echo "\n"; + echo "
".__( 'Relaxed mode', 'google-authenticator' )."\n"; + echo "".__(' Relaxed mode allows for more time drifting on your phone clock (±4 min).','google-authenticator')."\n"; + echo "
".__(' Description that you\'ll see in the Google Authenticator app on your phone.','google-authenticator')."
\n"; + echo ""; + echo ""; + echo ""; + echo "
"; + echo "
"; + + echo '
' . __( 'Scan this with the Google Authenticator app.', 'google-authenticator' ) . '
'; + echo "
".__( 'Enable App password', 'google-authenticator' )."\n"; + echo "".__(' Enabling an App password will decrease your overall login security.','google-authenticator')."\n"; + echo "
\n"; + echo ""; + echo ""; + echo " ".__(' Password is not stored in cleartext, this is your only chance to see it.','google-authenticator')."\n"; + echo "
\n"; + echo " +ENDOFJS; +} + +/** + * Form handling of Google Authenticator options added to personal profile page (user editing his own profile) + */ +function personal_options_update() { + global $user_id; + + // If editing of Google Authenticator settings has been disabled, just return + $GA_hidefromuser = trim( get_user_option( 'googleauthenticator_hidefromuser', $user_id ) ); + if ( $GA_hidefromuser == 'enabled') return; + + + $GA_enabled = ! empty( $_POST['GA_enabled'] ); + $GA_description = trim( sanitize_text_field($_POST['GA_description'] ) ); + $GA_relaxedmode = ! empty( $_POST['GA_relaxedmode'] ); + $GA_secret = trim( $_POST['GA_secret'] ); + $GA_pwdenabled = ! empty( $_POST['GA_pwdenabled'] ); + $GA_password = str_replace(' ', '', trim( $_POST['GA_password'] ) ); + + if ( ! $GA_enabled ) { + $GA_enabled = 'disabled'; + } else { + $GA_enabled = 'enabled'; + } + + if ( ! $GA_relaxedmode ) { + $GA_relaxedmode = 'disabled'; + } else { + $GA_relaxedmode = 'enabled'; + } + + + if ( ! $GA_pwdenabled ) { + $GA_pwdenabled = 'disabled'; + } else { + $GA_pwdenabled = 'enabled'; + } + + // Only store password if a new one has been generated. + if (strtoupper($GA_password) != 'XXXXXXXXXXXXXXXX' ) { + // Store the password in a format that can be expanded easily later on if needed. + $GA_password = array( 'appname' => 'Default', 'password' => wp_hash_password( $GA_password ) ); + update_user_option( $user_id, 'googleauthenticator_passwords', json_encode( $GA_password ), true ); + } + + update_user_option( $user_id, 'googleauthenticator_enabled', $GA_enabled, true ); + update_user_option( $user_id, 'googleauthenticator_description', $GA_description, true ); + update_user_option( $user_id, 'googleauthenticator_relaxedmode', $GA_relaxedmode, true ); + update_user_option( $user_id, 'googleauthenticator_secret', $GA_secret, true ); + update_user_option( $user_id, 'googleauthenticator_pwdenabled', $GA_pwdenabled, true ); + +} + +/** + * Extend profile page with ability to enable/disable Google Authenticator authentication requirement. + * Used by an administrator when editing other users. + */ +function edit_user_profile() { + global $user_id; + $GA_enabled = trim( get_user_option( 'googleauthenticator_enabled', $user_id ) ); + $GA_hidefromuser = trim( get_user_option( 'googleauthenticator_hidefromuser', $user_id ) ); + echo "

".__('Google Authenticator Settings','google-authenticator')."

\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "
".__('Hide settings from user','google-authenticator')."\n"; + echo "
\n"; + echo "
".__('Active','google-authenticator')."\n"; + echo "
\n"; + echo "
\n"; +} + +/** + * Form handling of Google Authenticator options on edit profile page (admin user editing other user) + */ +function edit_user_profile_update() { + global $user_id; + + $GA_enabled = ! empty( $_POST['GA_enabled'] ); + $GA_hidefromuser = ! empty( $_POST['GA_hidefromuser'] ); + + if ( ! $GA_enabled ) { + $GA_enabled = 'disabled'; + } else { + $GA_enabled = 'enabled'; + } + + if ( ! $GA_hidefromuser ) { + $GA_hidefromuser = 'disabled'; + } else { + $GA_hidefromuser = 'enabled'; + } + + update_user_option( $user_id, 'googleauthenticator_enabled', $GA_enabled, true ); + update_user_option( $user_id, 'googleauthenticator_hidefromuser', $GA_hidefromuser, true ); + +} + + +/** +* AJAX callback function used to generate new secret +*/ +function ajax_callback() { + global $user_id; + + // Some AJAX security. + check_ajax_referer( 'GoogleAuthenticatoraction', 'nonce' ); + + // Create new secret. + $secret = $this->create_secret(); + + $result = array( 'new-secret' => $secret ); + header( 'Content-Type: application/json' ); + echo json_encode( $result ); + + // die() is required to return a proper result + die(); +} + +} // end class + +$google_authenticator = new GoogleAuthenticator; +?> diff --git a/plugins/google-authenticator/jquery.qrcode.min.js b/plugins/google-authenticator/jquery.qrcode.min.js new file mode 100644 index 00000000..fe9680e6 --- /dev/null +++ b/plugins/google-authenticator/jquery.qrcode.min.js @@ -0,0 +1,28 @@ +(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;da||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=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]= +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=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= +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- +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;0g;g++)if(null==this.modules[b][i-g]){var n=!1;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, +c),b=new t,e=0;e8*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= +0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=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:"+ +a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)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:"+ +a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=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++;5a)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), +LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<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()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>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, +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").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").css("height",b+"px").appendTo(c);for(i=0;i").css("width", +d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); diff --git a/plugins/google-authenticator/lang/google-authenticator-da_DK.mo b/plugins/google-authenticator/lang/google-authenticator-da_DK.mo new file mode 100644 index 00000000..d4b4b1fd Binary files /dev/null and b/plugins/google-authenticator/lang/google-authenticator-da_DK.mo differ diff --git a/plugins/google-authenticator/lang/google-authenticator-da_DK.po b/plugins/google-authenticator/lang/google-authenticator-da_DK.po new file mode 100644 index 00000000..28fe9911 --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator-da_DK.po @@ -0,0 +1,113 @@ +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator\n" +"POT-Creation-Date: 2014-01-11 08:17+0100\n" +"PO-Revision-Date: 2014-01-11 08:20+0100\n" +"Last-Translator: Henrik Schack \n" +"Language-Team: \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.3\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: google-authenticator.php:166 +msgid "" +"If you don't have Google Authenticator enabled for your WordPress account, " +"leave this field empty." +msgstr "" +"Hvis ikke du har aktiveret Google Authenticator for din konto, sÃ¥ lad være " +"med at skrive noget her." + +#: google-authenticator.php:166 +msgid "Google Authenticator code" +msgstr "Google Authenticator kode" + +#: google-authenticator.php:231 +msgid "ERROR: The Google Authenticator password is incorrect." +msgstr "ERROR: Google Authenticator kodeordet er forkert." + +#: google-authenticator.php:234 +msgid "" +"ERROR: The Google Authenticator code is incorrect or has " +"expired." +msgstr "" +"ERROR: Google Authenticator koden er forkert eller udløbet." + +#: google-authenticator.php:274 +msgid "WordPressBlog" +msgstr "WordPressBlog" + +#: google-authenticator.php:277 google-authenticator.php:469 +msgid "Google Authenticator Settings" +msgstr "Google Authenticator indstillinger" + +#: google-authenticator.php:282 google-authenticator.php:481 +msgid "Active" +msgstr "Aktiv" + +#: google-authenticator.php:290 +msgid "Relaxed mode" +msgstr "Afslappet tilstand" + +#: google-authenticator.php:292 +msgid "" +" Relaxed mode allows for more time drifting on your phone clock (±4 " +"min)." +msgstr "" +"Afslappet tilstand tillader mere upræcis tid pÃ¥ din telefon (±4 min)." + +#: google-authenticator.php:297 +msgid "Description" +msgstr "Beskrivelse" + +#: google-authenticator.php:298 +msgid "" +" Description that you'll see in the Google Authenticator app on your phone." +msgstr "Beskrivelsen du vil se i Google Authenticator app'en pÃ¥ din telefon." + +#: google-authenticator.php:302 +msgid "Secret" +msgstr "Hemmelig kode" + +#: google-authenticator.php:305 +msgid "Create new secret" +msgstr "Opret ny hemmelig kode" + +#: google-authenticator.php:306 +msgid "Show/Hide QR code" +msgstr "Vis/Gem QR kode" + +#: google-authenticator.php:315 +msgid "Scan this with the Google Authenticator app." +msgstr "Scan dette med Google Authenticator app'en." + +#: google-authenticator.php:320 +msgid "Enable App password" +msgstr "Aktiver app kodeord" + +#: google-authenticator.php:322 +msgid " Enabling an App password will decrease your overall login security." +msgstr "" +"Aktiverer du app kodeords featuren, pÃ¥virker det din sikkerhed generelt." + +#: google-authenticator.php:330 +msgid "Create new password" +msgstr "Opret nyt kodeord" + +#: google-authenticator.php:331 +msgid "" +" Password is not stored in cleartext, this is your only chance to see it." +msgstr "" +"Kodeordet gemmes ikke i klartekst, dette er din eneste chance for at se det." + +#: google-authenticator.php:474 +msgid "Hide settings from user" +msgstr "Skjul indstillinger for bruger" diff --git a/plugins/google-authenticator/lang/google-authenticator-de_DE.mo b/plugins/google-authenticator/lang/google-authenticator-de_DE.mo new file mode 100644 index 00000000..3ac64c79 Binary files /dev/null and b/plugins/google-authenticator/lang/google-authenticator-de_DE.mo differ diff --git a/plugins/google-authenticator/lang/google-authenticator-de_DE.po b/plugins/google-authenticator/lang/google-authenticator-de_DE.po new file mode 100644 index 00000000..66afca41 --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator-de_DE.po @@ -0,0 +1,119 @@ +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator 0.30\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n" +"POT-Creation-Date: 2011-05-17 19:38:36+00:00\n" +"PO-Revision-Date: 2011-06-25 16:20+0100\n" +"Last-Translator: Tobias Bäthge \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: \n" +"X-Poedit-Country: \n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;\n" +"X-Poedit-Basepath: \n" +"X-Poedit-Bookmarks: \n" +"X-Poedit-SearchPath-0: .\n" +"X-Textdomain-Support: yes" + +#: google-authenticator.php:118 +#@ google-authenticator +msgid "Google Authenticator code" +msgstr ""Google Authenticator"-Code" + +#: google-authenticator.php:172 +#: google-authenticator.php:267 +#@ google-authenticator +msgid "Active" +msgstr "Aktivieren" + +#: google-authenticator.php:184 +#@ google-authenticator +msgid "Description" +msgstr "Beschreibung" + +#: google-authenticator.php:189 +#@ google-authenticator +msgid "Secret" +msgstr "Geheimschlüssel" + +#: google-authenticator.php:192 +#@ google-authenticator +msgid "Create new secret" +msgstr "Neuen Geheimschlüssel erzeugen" + +#: google-authenticator.php:193 +#@ google-authenticator +msgid "Show/Hide QR code" +msgstr "QR-Code anzeigen/verstecken" + +#. translators: plugin header field 'Name' +#: google-authenticator.php:0 +#@ google-authenticator +msgid "Google Authenticator" +msgstr "Google Authenticator" + +#. translators: plugin header field 'PluginURI' +#: google-authenticator.php:0 +#@ google-authenticator +msgid "http://henrik.schack.dk/google-authenticator-for-wordpress" +msgstr "http://henrik.schack.dk/google-authenticator-for-wordpress" + +#. translators: plugin header field 'Author' +#: google-authenticator.php:0 +#@ google-authenticator +msgid "Henrik Schack" +msgstr "Henrik Schack" + +#. translators: plugin header field 'AuthorURI' +#: google-authenticator.php:0 +#@ google-authenticator +msgid "http://henrik.schack.dk/" +msgstr "http://henrik.schack.dk/" + +#. translators: plugin header field 'Version' +#: google-authenticator.php:0 +#@ google-authenticator +msgid "0.30" +msgstr "0.30" + +#: google-authenticator.php:143 +#@ google-authenticator +msgid "ERROR: The Google Authenticator code is incorrect or has expired." +msgstr "FEHLER: Der eingegebene "Google Authenticator"-Code ist falsch oder abgelaufen." + +#: google-authenticator.php:165 +#@ google-authenticator +msgid "WordPress Blog" +msgstr "WordPress-Blog" + +#: google-authenticator.php:167 +#: google-authenticator.php:263 +#@ google-authenticator +msgid "Google Authenticator Settings" +msgstr "Einstellungen zu Google Authenticator" + +#: google-authenticator.php:201 +#@ google-authenticator +msgid "Scan this with the Google Authenticator app." +msgstr "Scanne diesen QR-Code mit der "Google Authenticator"-App deines Smartphones." + +#: google-authenticator.php:118 +#@ google-authenticator +msgid "If you don't have Google Authenticator enabled for your WordPress account, leave this field empty." +msgstr "Falls die Nutzung von "Google Authenticator" für dieses WordPress-Konto nicht aktiviert ist, dieses Feld leer lassen." + +#: google-authenticator.php:185 +#@ google-authenticator +msgid " Description that you'll see in the Google Authenticator app on your phone." +msgstr "Beschreibung, die in der "Google Authenticator"-App auf dem Smartphone angezeigt wird." + +#. translators: plugin header field 'Description' +#: google-authenticator.php:0 +#@ google-authenticator +msgid "Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry app as One Time Password generator." +msgstr "Zwei-Faktor-Authentifizierung für WordPress mit der "Google Authenticator"-App für Android/iPhone/Blackberry" + diff --git a/plugins/google-authenticator/lang/google-authenticator-es_ES.mo b/plugins/google-authenticator/lang/google-authenticator-es_ES.mo new file mode 100644 index 00000000..5bf1304b Binary files /dev/null and b/plugins/google-authenticator/lang/google-authenticator-es_ES.mo differ diff --git a/plugins/google-authenticator/lang/google-authenticator-es_ES.po b/plugins/google-authenticator/lang/google-authenticator-es_ES.po new file mode 100644 index 00000000..ce9ab6aa --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator-es_ES.po @@ -0,0 +1,131 @@ +# Copyright (C) 2010 Google Authenticator +# This file is distributed under the same license as the Google Authenticator package. +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator 0.37\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n" +"POT-Creation-Date: 2011-08-21 14:25:45+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2014-01-11 10:07+0100\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"X-Generator: Poedit 1.6.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es_ES\n" + +#: google-authenticator.php:131 +msgid "" +"If you don't have Google Authenticator enabled for your WordPress account, " +"leave this field empty." +msgstr "" +"Si no tiene Google Authenticator habilitado en su cuenta de WordPress, deje " +"este campo vacío." + +#: google-authenticator.php:131 +msgid "Google Authenticator code" +msgstr "Código Google Authenticator" + +#: google-authenticator.php:176 +msgid "ERROR: The Google Authenticator password is incorrect." +msgstr "ERROR: El codigo es incorrecto." + +#: google-authenticator.php:179 +msgid "" +"ERROR: The Google Authenticator code is incorrect or has " +"expired." +msgstr "ERROR: El código es incorrecto o caducado." + +#: google-authenticator.php:215 +msgid "WordPress Blog" +msgstr "Blog de WordPress" + +#: google-authenticator.php:218 google-authenticator.php:392 +msgid "Google Authenticator Settings" +msgstr "Opciones Google Authenticator" + +#: google-authenticator.php:223 google-authenticator.php:396 +msgid "Active" +msgstr "Activar" + +#: google-authenticator.php:235 +msgid "Relaxed mode" +msgstr "Modo relajado" + +#: google-authenticator.php:237 +msgid "" +" Relaxed mode allows for more time drifting on your phone clock (±4 " +"min)." +msgstr "" +"El modo relajado permite tener más tiempo de reloj en su teléfono (±4 " +"min)." + +#: google-authenticator.php:242 +msgid "Description" +msgstr "Descripción" + +#: google-authenticator.php:243 +msgid "" +" Description that you'll see in the Google Authenticator app on your phone." +msgstr "" +"Descripción que se verá en la aplicación Google Authenticator en su teléfono." + +#: google-authenticator.php:247 +msgid "Secret" +msgstr "Secreto" + +#: google-authenticator.php:250 +msgid "Create new secret" +msgstr "Crear nueva clave secreta" + +#: google-authenticator.php:251 +msgid "Show/Hide QR code" +msgstr "Mostar/Esconder QR Code" + +#: google-authenticator.php:259 +msgid "Scan this with the Google Authenticator app." +msgstr "Escanear esto con la aplicación Google Authenticator." + +#: google-authenticator.php:264 +msgid "Enable App password" +msgstr "Permitir contraseña de aplicación" + +#: google-authenticator.php:266 +msgid " Enabling an App password will decrease your overall login security." +msgstr "Permitir una contraseña de aplicación disminuirá su seguridad global." + +#: google-authenticator.php:274 +msgid "Create new password" +msgstr "Crear nueva contraseña" + +#: google-authenticator.php:275 +msgid "" +" Password is not stored in cleartext, this is your only chance to see it." +msgstr "" +"La contraseña no está almacenada en formato de texto, es su única " +"oportunidad de verla." + +#. Plugin Name of the plugin/theme +msgid "Google Authenticator" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "http://henrik.schack.dk/google-authenticator-for-wordpress" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry " +"app as One Time Password generator." +msgstr "" +"La autentificación en dos pasos por wordpress utiliza una app Android/iPhone/" +"Blackberry como 'One Time Password generator.'" + +#. Author of the plugin/theme +msgid "Henrik Schack" +msgstr "" + +#. Author URI of the plugin/theme +msgid "http://henrik.schack.dk/" +msgstr "" diff --git a/plugins/google-authenticator/lang/google-authenticator-fr_FR.mo b/plugins/google-authenticator/lang/google-authenticator-fr_FR.mo new file mode 100644 index 00000000..000ac747 Binary files /dev/null and b/plugins/google-authenticator/lang/google-authenticator-fr_FR.mo differ diff --git a/plugins/google-authenticator/lang/google-authenticator-fr_FR.po b/plugins/google-authenticator/lang/google-authenticator-fr_FR.po new file mode 100644 index 00000000..9dcbd951 --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator-fr_FR.po @@ -0,0 +1,133 @@ +# Copyright (C) 2010 Google Authenticator +# This file is distributed under the same license as the Google Authenticator package. +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator 0.37\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n" +"POT-Creation-Date: 2011-08-21 14:25:45+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2014-01-11 10:15+0100\n" +"Last-Translator: \n" +"Language-Team: LANGUAGE \n" +"X-Generator: Poedit 1.6.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr_FR\n" + +#: google-authenticator.php:131 +msgid "" +"If you don't have Google Authenticator enabled for your WordPress account, " +"leave this field empty." +msgstr "" +"Si vous n'avez pas activé Google ASuthenticator pour votre compte wordpress, " +"laissez ce champ vide." + +#: google-authenticator.php:131 +msgid "Google Authenticator code" +msgstr "Code Google Authenticator" + +#: google-authenticator.php:176 +msgid "ERROR: The Google Authenticator password is incorrect." +msgstr "ERREUR: Le code Google Authenticator est incorrect." + +#: google-authenticator.php:179 +msgid "" +"ERROR: The Google Authenticator code is incorrect or has " +"expired." +msgstr "" +"ERREUR: Le code Google Authenticator est incorrect ou " +"périmé." + +#: google-authenticator.php:215 +msgid "WordPress Blog" +msgstr "Blog WordPress" + +#: google-authenticator.php:218 google-authenticator.php:392 +msgid "Google Authenticator Settings" +msgstr "Réglages Google Authenticator" + +#: google-authenticator.php:223 google-authenticator.php:396 +msgid "Active" +msgstr "Activer" + +#: google-authenticator.php:235 +msgid "Relaxed mode" +msgstr "Mode relax" + +#: google-authenticator.php:237 +msgid "" +" Relaxed mode allows for more time drifting on your phone clock (±4 " +"min)." +msgstr "" +"Le mode relax vous permet d'avoir plus de temps de latence sur le chrono de " +"votre téléphone (±4 min)." + +#: google-authenticator.php:242 +msgid "Description" +msgstr "Description" + +#: google-authenticator.php:243 +msgid "" +" Description that you'll see in the Google Authenticator app on your phone." +msgstr "" +"Voici la description que vous verrez dans l'app Gogogle Authentiator de " +"votre téléphone." + +#: google-authenticator.php:247 +msgid "Secret" +msgstr "Code secret" + +#: google-authenticator.php:250 +msgid "Create new secret" +msgstr "Créer nouveau code secret" + +#: google-authenticator.php:251 +msgid "Show/Hide QR code" +msgstr "Montrer/Cacher le QR Code" + +#: google-authenticator.php:259 +msgid "Scan this with the Google Authenticator app." +msgstr "Scanner ceci avec votre app Google Authenticator" + +#: google-authenticator.php:264 +msgid "Enable App password" +msgstr "Autoriser mot de passe de l'app" + +#: google-authenticator.php:266 +msgid " Enabling an App password will decrease your overall login security." +msgstr "" +"Autoriser un mot de passe d'app réduira votre sécurité globale de connexion." + +#: google-authenticator.php:274 +msgid "Create new password" +msgstr "Créer nouveau mot de passe" + +#: google-authenticator.php:275 +msgid "" +" Password is not stored in cleartext, this is your only chance to see it." +msgstr "" +"Le mot de passe n'est pas stocké en texte clair, c'est votre seule " +"opportunité de le voir." + +#. Plugin Name of the plugin/theme +msgid "Google Authenticator" +msgstr "Google Authenticator" + +#. Plugin URI of the plugin/theme +msgid "http://henrik.schack.dk/google-authenticator-for-wordpress" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry " +"app as One Time Password generator." +msgstr "" + +#. Author of the plugin/theme +msgid "Henrik Schack" +msgstr "" + +#. Author URI of the plugin/theme +msgid "http://henrik.schack.dk/" +msgstr "" diff --git a/plugins/google-authenticator/lang/google-authenticator-it_IT.mo b/plugins/google-authenticator/lang/google-authenticator-it_IT.mo new file mode 100644 index 00000000..dae99aef Binary files /dev/null and b/plugins/google-authenticator/lang/google-authenticator-it_IT.mo differ diff --git a/plugins/google-authenticator/lang/google-authenticator-it_IT.po b/plugins/google-authenticator/lang/google-authenticator-it_IT.po new file mode 100644 index 00000000..361d5810 --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator-it_IT.po @@ -0,0 +1,143 @@ +# Copyright (C) 2010 Google Authenticator +# This file is distributed under the same license as the Google Authenticator package. +# Aldo Latino , 2012, 2014. +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator 0.37\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n" +"POT-Creation-Date: 2014-01-11 07:14:22+00:00\n" +"PO-Revision-Date: 2014-01-12 21:24+0100\n" +"Last-Translator: Aldo Latino \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: google-authenticator.php:166 +msgid "" +"If you don't have Google Authenticator enabled for your WordPress account, " +"leave this field empty." +msgstr "" +"Se Google Authenticator non è attivo per il tuo account WordPress, lascia " +"vuoto questo campo." + +#: google-authenticator.php:166 +msgid "Google Authenticator code" +msgstr "Codice di Google Authenticator" + +#: google-authenticator.php:231 +msgid "ERROR: The Google Authenticator password is incorrect." +msgstr "" +"ERRORE: la password di Google Authenticator non è corretta.." + +#: google-authenticator.php:234 +msgid "" +"ERROR: The Google Authenticator code is incorrect or has " +"expired." +msgstr "" +"ERRORE: Il codice di Google Authenticator non è corretto o " +"è scaduto." + +#: google-authenticator.php:274 +msgid "WordPressBlog" +msgstr "WordPress Blog" + +#: google-authenticator.php:277 google-authenticator.php:469 +msgid "Google Authenticator Settings" +msgstr "Impostazioni di Google Authenticator" + +#: google-authenticator.php:282 google-authenticator.php:481 +msgid "Active" +msgstr "Attivo" + +#: google-authenticator.php:290 +msgid "Relaxed mode" +msgstr "Modalità comoda" + +#: google-authenticator.php:292 +msgid "" +" Relaxed mode allows for more time drifting on your phone clock (±4 " +"min)." +msgstr "" +" La modalità comoda permette uno scostamento di tempo più esteso rispetto " +"all'orologio del telefono (±4 min)." + +#: google-authenticator.php:297 +msgid "Description" +msgstr "Descrizione" + +#: google-authenticator.php:298 +msgid "" +" Description that you'll see in the Google Authenticator app on your phone." +msgstr "" +" La descrizione che si vede nell'app Google Authenticator sul telefono." + +#: google-authenticator.php:302 +msgid "Secret" +msgstr "Chiave segreta" + +#: google-authenticator.php:305 +msgid "Create new secret" +msgstr "Crea una nuova chiave segreta" + +#: google-authenticator.php:306 +msgid "Show/Hide QR code" +msgstr "Mostra/nascondi il codice QR" + +#: google-authenticator.php:315 +msgid "Scan this with the Google Authenticator app." +msgstr "Effettua la scansione con l'app Google Authenticator." + +#: google-authenticator.php:320 +msgid "Enable App password" +msgstr "Abilita la password delle App" + +#: google-authenticator.php:322 +msgid " Enabling an App password will decrease your overall login security." +msgstr "" +" L'abilitazione della password delle App abbasserà il livello di sicurezza " +"generale del login." + +#: google-authenticator.php:330 +msgid "Create new password" +msgstr "Crea una nuova password" + +#: google-authenticator.php:331 +msgid "" +" Password is not stored in cleartext, this is your only chance to see it." +msgstr "" +" La password non è conservata in chiaro: questo l'unico momento in cui la si " +"può vedere." + +#: google-authenticator.php:474 +msgid "Hide settings from user" +msgstr "Nascondi le impostazioni agli utenti" + +#. Plugin Name of the plugin/theme +msgid "Google Authenticator" +msgstr "Google Authenticator" + +#. Plugin URI of the plugin/theme +msgid "http://henrik.schack.dk/google-authenticator-for-wordpress" +msgstr "http://henrik.schack.dk/google-authenticator-for-wordpress" + +#. Description of the plugin/theme +msgid "" +"Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry " +"app as One Time Password generator." +msgstr "" +"Autenticazione a due fattori per WordPress utilizzando un'app su Android/" +"iPhone/Blackberry come generatore di Password usa-e-getta." + +#. Author of the plugin/theme +msgid "Henrik Schack" +msgstr "Henrik Schack" + +#. Author URI of the plugin/theme +msgid "http://henrik.schack.dk/" +msgstr "http://henrik.schack.dk/" + + diff --git a/plugins/google-authenticator/lang/google-authenticator-zh_CN.mo b/plugins/google-authenticator/lang/google-authenticator-zh_CN.mo new file mode 100644 index 00000000..cdf342ea Binary files /dev/null and b/plugins/google-authenticator/lang/google-authenticator-zh_CN.mo differ diff --git a/plugins/google-authenticator/lang/google-authenticator-zh_CN.po b/plugins/google-authenticator/lang/google-authenticator-zh_CN.po new file mode 100644 index 00000000..8b6cb67e --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator-zh_CN.po @@ -0,0 +1,126 @@ +# Copyright (C) 2010 Google Authenticator +# This file is distributed under the same license as the Google Authenticator package. +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator 0.37\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n" +"POT-Creation-Date: 2014-01-11 07:14:22+00:00\n" +"PO-Revision-Date: 2014-01-13 13:48+0800\n" +"Last-Translator: Kaijia Feng \n" +"Language-Team: \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.5\n" + +#: google-authenticator.php:166 +msgid "" +"If you don't have Google Authenticator enabled for your WordPress account, " +"leave this field empty." +msgstr "如果您的å¸å·æ²¡æœ‰å¯ç”¨Google Authenticator身份验è¯åŠŸèƒ½ï¼Œè¯·ä¸å¿…填写此æ ã€‚" + +#: google-authenticator.php:166 +msgid "Google Authenticator code" +msgstr "Google Authenticator验è¯ç " + +#: google-authenticator.php:231 +msgid "ERROR: The Google Authenticator password is incorrect." +msgstr "错误:Google Authenticator验è¯ç æœ‰è¯¯ã€‚" + +#: google-authenticator.php:234 +msgid "" +"ERROR: The Google Authenticator code is incorrect or has " +"expired." +msgstr "错误:Google Authenticator验è¯ç æœ‰è¯¯æˆ–者已ç»å¤±æ•ˆã€‚" + +#: google-authenticator.php:274 +msgid "WordPressBlog" +msgstr "WordPressBlog" + +#: google-authenticator.php:277 google-authenticator.php:469 +msgid "Google Authenticator Settings" +msgstr "Google Authenticator设置" + +#: google-authenticator.php:282 google-authenticator.php:481 +msgid "Active" +msgstr "å¯ç”¨" + +#: google-authenticator.php:290 +msgid "Relaxed mode" +msgstr "宽æ¾æ¨¡å¼" + +#: google-authenticator.php:292 +msgid "" +" Relaxed mode allows for more time drifting on your phone clock (±4 " +"min)." +msgstr " 在宽æ¾æ¨¡å¼ä¸‹ä½ å¯ä»¥æœ‰æ›´é•¿çš„时间输入验è¯ç ï¼ˆ±4分钟)。" + +#: google-authenticator.php:297 +msgid "Description" +msgstr "æè¿°" + +#: google-authenticator.php:298 +msgid "" +" Description that you'll see in the Google Authenticator app on your phone." +msgstr " 在Google Authenticator应用中显示的å¸æˆ·æ述。" + +#: google-authenticator.php:302 +msgid "Secret" +msgstr "密钥" + +#: google-authenticator.php:305 +msgid "Create new secret" +msgstr "创建新密钥" + +#: google-authenticator.php:306 +msgid "Show/Hide QR code" +msgstr "显示/éšè—QRç " + +#: google-authenticator.php:315 +msgid "Scan this with the Google Authenticator app." +msgstr "使用Google Authenticator应用扫æ此图åƒã€‚" + +#: google-authenticator.php:320 +msgid "Enable App password" +msgstr "å¯ç”¨åº”用专用密ç " + +#: google-authenticator.php:322 +msgid " Enabling an App password will decrease your overall login security." +msgstr " å¯ç”¨åº”用专用密ç å°†ä¼šåœ¨æ€»ä½“上é™ä½Žç™»å½•çš„安全性。" + +#: google-authenticator.php:330 +msgid "Create new password" +msgstr "创建新密ç " + +#: google-authenticator.php:331 +msgid "" +" Password is not stored in cleartext, this is your only chance to see it." +msgstr " 密ç å°†ä¸ä¼šæ˜Žæ–‡å‚¨å­˜ï¼Œè¿™å°†æ˜¯ä½ å”¯ä¸€ä¸€æ¬¡çœ‹è§å¯†ç ã€‚" + +#: google-authenticator.php:474 +msgid "Hide settings from user" +msgstr "ä¸å¯¹ç”¨æˆ·æ˜¾ç¤ºè®¾ç½®" + +#. Plugin Name of the plugin/theme +msgid "Google Authenticator" +msgstr "Google Authenticator" + +#. Plugin URI of the plugin/theme +msgid "http://henrik.schack.dk/google-authenticator-for-wordpress" +msgstr "http://henrik.schack.dk/google-authenticator-for-wordpress" + +#. Description of the plugin/theme +msgid "" +"Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry " +"app as One Time Password generator." +msgstr "" +"使用Android/iPhone/Blackberry一次性密ç ç”Ÿæˆåº”用为WordPressæ供两步验è¯ã€‚" + +#. Author of the plugin/theme +msgid "Henrik Schack" +msgstr "Henrik Schack" + +#. Author URI of the plugin/theme +msgid "http://henrik.schack.dk/" +msgstr "http://henrik.schack.dk/" diff --git a/plugins/google-authenticator/lang/google-authenticator.pot b/plugins/google-authenticator/lang/google-authenticator.pot new file mode 100644 index 00000000..c14d5c1b --- /dev/null +++ b/plugins/google-authenticator/lang/google-authenticator.pot @@ -0,0 +1,112 @@ +# Copyright (C) 2014 Google Authenticator +# This file is distributed under the same license as the Google Authenticator package. +msgid "" +msgstr "" +"Project-Id-Version: Google Authenticator 0.47\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/google-authenticator\n" +"POT-Creation-Date: 2014-01-11 07:14:22+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2014-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" + +#: google-authenticator.php:166 +msgid "If you don't have Google Authenticator enabled for your WordPress account, leave this field empty." +msgstr "" + +#: google-authenticator.php:166 +msgid "Google Authenticator code" +msgstr "" + +#: google-authenticator.php:231 +msgid "ERROR: The Google Authenticator password is incorrect." +msgstr "" + +#: google-authenticator.php:234 +msgid "ERROR: The Google Authenticator code is incorrect or has expired." +msgstr "" + +#: google-authenticator.php:274 +msgid "WordPressBlog" +msgstr "" + +#: google-authenticator.php:277 google-authenticator.php:469 +msgid "Google Authenticator Settings" +msgstr "" + +#: google-authenticator.php:282 google-authenticator.php:481 +msgid "Active" +msgstr "" + +#: google-authenticator.php:290 +msgid "Relaxed mode" +msgstr "" + +#: google-authenticator.php:292 +msgid " Relaxed mode allows for more time drifting on your phone clock (±4 min)." +msgstr "" + +#: google-authenticator.php:297 +msgid "Description" +msgstr "" + +#: google-authenticator.php:298 +msgid " Description that you'll see in the Google Authenticator app on your phone." +msgstr "" + +#: google-authenticator.php:302 +msgid "Secret" +msgstr "" + +#: google-authenticator.php:305 +msgid "Create new secret" +msgstr "" + +#: google-authenticator.php:306 +msgid "Show/Hide QR code" +msgstr "" + +#: google-authenticator.php:315 +msgid "Scan this with the Google Authenticator app." +msgstr "" + +#: google-authenticator.php:320 +msgid "Enable App password" +msgstr "" + +#: google-authenticator.php:322 +msgid " Enabling an App password will decrease your overall login security." +msgstr "" + +#: google-authenticator.php:330 +msgid "Create new password" +msgstr "" + +#: google-authenticator.php:331 +msgid " Password is not stored in cleartext, this is your only chance to see it." +msgstr "" + +#: google-authenticator.php:474 +msgid "Hide settings from user" +msgstr "" +#. Plugin Name of the plugin/theme +msgid "Google Authenticator" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "http://henrik.schack.dk/google-authenticator-for-wordpress" +msgstr "" + +#. Description of the plugin/theme +msgid "Two-Factor Authentication for WordPress using the Android/iPhone/Blackberry app as One Time Password generator." +msgstr "" + +#. Author of the plugin/theme +msgid "Henrik Schack" +msgstr "" + +#. Author URI of the plugin/theme +msgid "http://henrik.schack.dk/" +msgstr "" diff --git a/plugins/google-authenticator/readme.txt b/plugins/google-authenticator/readme.txt new file mode 100644 index 00000000..865d784e --- /dev/null +++ b/plugins/google-authenticator/readme.txt @@ -0,0 +1,170 @@ +=== Google Authenticator === +Contributors: Henrik.Schack +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 +Tags: authentication,otp,password,security,login,android,iphone,blackberry +Requires at least: 4.5 +Tested up to: 4.7 +Stable tag: 0.48 + +Google Authenticator for your WordPress blog. + +== Description == + +The Google Authenticator plugin for WordPress gives you two-factor authentication using the Google Authenticator app for Android/iPhone/Blackberry. + +If you are security aware, you may already have the Google Authenticator app installed on your smartphone, using it for two-factor authentication on Gmail/Dropbox/Lastpass/Amazon etc. + +The two-factor authentication requirement can be enabled on a per-user basis. You could enable it for your administrator account, but log in as usual with less privileged accounts. + +If You need to maintain your blog using an Android/iPhone app, or any other software using the XMLRPC interface, you can enable the App password feature in this plugin, +but please note that enabling the App password feature will make your blog less secure. + +== Installation == +1. Make sure your webhost is capable of providing accurate time information for PHP/WordPress, ie. make sure a NTP daemon is running on the server. +2. Install and activate the plugin. +3. Enter a description on the Users -> Profile and Personal options page, in the Google Authenticator section. +4. Scan the generated QR code with your phone, or enter the secret manually, remember to pick the time based one. +You may also want to write down the secret on a piece of paper and store it in a safe place. +5. Remember to hit the **Update profile** button at the bottom of the page before leaving the Personal options page. +6. That's it, your WordPress blog is now a little more secure. + +== Frequently Asked Questions == + += Can I use Google Authenticator for WordPress with the Android/iPhone apps for WordPress? = + +Yes, you can enable the App password feature to make that possible, but notice that the XMLRPC interface isn't protected by two-factor authentication, only a long password. + += I want to update the secret, should I just scan the new QR code after creating a new secret? = + +No, you'll have to delete the existing account from the Google Authenticator app on your smartphone before you scan the new QR code, that is unless you change the description as well. + += I am unable to log in using this plugin, what's wrong ? = + +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. +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 +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. + += I have several users on my WordPress installation, is that a supported configuration ? = + +Yes, each user has his own Google Authenticator settings. + += 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. = + +If you have SSH or FTP access to your webhosting account, you can manually delete the plugin from your WordPress installation, +just delete the wp-content/plugins/google-authenticator directory, and you'll be able to login using username/password again. + += I don't own a Smartphone, isn't there another way to generate these secret codes ? = + +Yes, there is a webbased version here : http://gauth.apps.gbraad.nl/ +Github project here : https://github.com/gbraad/html5-google-authenticator + += Can I create backupcodes ? = + +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). +It's a really nice app that can import your existing settings, sync between devices and backup/restore using your sd-card. +It's not a free app, but it's well worth the money. + += Any known incompatabilities ? = + +Yes, the Man-in-the-middle attack/replay detection code isn't compatible with the test/setup mode in the "Stop spammer registration plugin", +please remember to remove the "Check credentials on all login attempts" checkmark before installing my plugin. + + + +== Screenshots == + +1. The enhanced log-in box. +2. Google Authenticator section on the Profile and Personal options page. +3. QR code on the Profile and Personal options page. +4. Google Authenticator app on Android + +== Changelog == += 0.48 = +* Security fix / compatability with WordPress 4.5 + += 0.47 = +* 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. + += 0.46 = +* Man-in-the-middle attack protection added. +* Show warning before displaying the QR code. +* FAQ updated. + += 0.45 = +* Spaces in the description field should now work on iPhones. +* Some depricated function calls replaced. +* Code inputfield easier to use for .jp users now. +* Sanitize description field input. +* App password hash function switched to one that doesn't have rainbow tables available. +* PHP notices occurring during app password login removed. + + += 0.44 = +* Installation/FAQ section updated. +* Simplified Chinese translation by Kaijia Feng added. +* Tabindex on loginpage removed, no longer needed, was used by older WordPress installations. +* Inputfield renamed to "googleotp". +* Defaultdescription changed to "WordPressBlog" to avoid trouble for iPhone users. +* Compatibility with Ryan Hellyer's plugin http://geek.ryanhellyer.net/products/deactivate-google-authenticator/ +* Must enter all 6 code digits. + += 0.43 = +* It's now possible for an admin to hide the Google Authenticaator settings on a per-user basis. (Feature request by : Skate-O) + += 0.42 = +* Autocomplete disabled on code input field. (Feature request by : hiphopsmurf) + += 0.41 = +* Italian translation by Aldo Latino added. + += 0.40 = +* Bugfix, typo corrected and PHP notices removed. Thanks to Dion Hulse for his patch. + += 0.39 = +* Bugfix, Description was not saved to WordPress database when updating profile. Thanks to xxdesmus for noticing this. + += 0.38 = +* Usability fix, input field for codes changed from password to text type. + += 0.37 = +* 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. + += 0.36 = +* Bugfix, now an App password can only be used for XMLRPC/APP-Request logins. + += 0.35 = +* Initial WordPress app support added (XMLRPC). + += 0.30 = +* Code cleanup +* Changed generation of secret key, to no longer have requirement of SHA256 on the server +* German translation + += 0.20 = +* Initial release + + +== Credits == + +Thanks to: + +[Tobias Bäthge](http://tobias.baethge.com/) for his code rewrite and German translation. + +[Pascal de Bruijn](http://blog.pcode.nl/) for his "relaxed mode" idea. + +[Daniel Werl](http://technobabbl.es/) for his usability tips. + +[Dion Hulse](http://dd32.id.au/) for his bugfixes. + +[Aldo Latino](http://profiles.wordpress.org/users/aldolat/) for his Italian translation. + +[Kaijia Feng](http://www.kaijia.me/) for his Simplified Chinese translation. + +[Alex Concha](http://www.buayacorp.com/) for his security tips. + +[Jerome Etienne](http://jetienne.com/) for his jquery-qrcode plugin. + +[Sébastien Prunier](http://orizhial.com/) for his Spanish and French translation. diff --git a/plugins/google-authenticator/screenshot-1.jpg b/plugins/google-authenticator/screenshot-1.jpg new file mode 100644 index 00000000..252831f3 Binary files /dev/null and b/plugins/google-authenticator/screenshot-1.jpg differ diff --git a/plugins/google-authenticator/screenshot-2.jpg b/plugins/google-authenticator/screenshot-2.jpg new file mode 100644 index 00000000..13bb25c2 Binary files /dev/null and b/plugins/google-authenticator/screenshot-2.jpg differ diff --git a/plugins/google-authenticator/screenshot-3.jpg b/plugins/google-authenticator/screenshot-3.jpg new file mode 100644 index 00000000..b74aeae5 Binary files /dev/null and b/plugins/google-authenticator/screenshot-3.jpg differ diff --git a/plugins/google-authenticator/screenshot-4.jpg b/plugins/google-authenticator/screenshot-4.jpg new file mode 100644 index 00000000..804f3cad Binary files /dev/null and b/plugins/google-authenticator/screenshot-4.jpg differ diff --git a/plugins/google-authenticator/screenshot-5.jpg b/plugins/google-authenticator/screenshot-5.jpg new file mode 100644 index 00000000..1b396294 Binary files /dev/null and b/plugins/google-authenticator/screenshot-5.jpg differ -- cgit v1.2.3