Flower Password

花密 Flower Password --- 可记忆的密码管理方案

当前为 2016-09-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Flower Password
  3. // @namespace https://greasyfork.org/en/scripts/23026-flower-password
  4. // @version 0.4.6
  5. // @description 花密 Flower Password --- 可记忆的密码管理方案
  6. // @author 徐小花, Johnny Jian, xLsDg
  7. // @include http://*
  8. // @include https://*
  9. // @match http://*/*
  10. // @match https://*/*
  11. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js
  12. // @require https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.3.1/js/md5.min.js
  13. // @grant GM_addStyle
  14. // @grant GM_getResourceText
  15. // @grant GM_setClipboard
  16. // @grant GM_getValue
  17. // @grant GM_setValue
  18. // @grant GM_deleteValue
  19. // @grant GM_listValues
  20. // @grant GM_registerMenuCommand
  21. // @run-at document-end
  22. // @license MIT License
  23. // @encoding utf-8
  24. // @homepageURL https://github.com/xlsdg/flower-password-user-script
  25. // @supportURL https://github.com/xlsdg/flower-password-user-script/issues
  26. // @icon https://raw.githubusercontent.com/xlsdg/flower-password-user-script/master/icon.png
  27. // @resource fpStyle https://raw.githubusercontent.com/xlsdg/flower-password-user-script/master/fp.min.css
  28. // ==/UserScript==
  29.  
  30. (function() {
  31. 'use strict';
  32.  
  33. function fpCode(password, key, length) {
  34. var hmd5, rule, source, str, code32, code01, i;
  35. length = length || 16;
  36. if (password && key && (1 < length) && (length < 33)) {
  37. hmd5 = md5(password, key);
  38. rule = md5(hmd5, 'kise').split('');
  39. source = md5(hmd5, 'snow').split('');
  40. str = 'sunlovesnow1990090127xykab';
  41. for (i = 0; i < 32; i++) {
  42. if (isNaN(source[i])) {
  43. if (str.search(rule[i]) > -1) {
  44. source[i] = source[i].toUpperCase();
  45. }
  46. }
  47. }
  48. code32 = source.join('');
  49. code01 = code32.slice(0, 1);
  50. code32 = (isNaN(code01) ? code01 : 'K') + code32.slice(1, length);
  51. return code32;
  52. } else {
  53. return '';
  54. }
  55. }
  56.  
  57. var currentField = null;
  58.  
  59. function setupInputListeners() {
  60. function insideBox(e) {
  61. return e.parents('#flower-password-input').size() > 0;
  62. }
  63.  
  64. $(document).on('focus', 'input:password', function() {
  65. if (insideBox($(this))) {
  66. return;
  67. }
  68.  
  69. lazyInject();
  70.  
  71. if (currentField && currentField.get(0) != this) {
  72. $('#flower-password-password, #flower-password-key').val('');
  73. }
  74.  
  75. currentField = $(this);
  76.  
  77. var offset = currentField.offset();
  78. var height = currentField.outerHeight();
  79. $('#flower-password-input').css({
  80. left: offset.left + 'px',
  81. top: offset.top + height + 'px'
  82. }).show();
  83. });
  84.  
  85. $(document).on('focus', 'input:not(:password)', function() {
  86. if (insideBox($(this))) {
  87. return;
  88. }
  89. $('#flower-password-input').hide();
  90. });
  91. }
  92.  
  93. function isInjected() {
  94. return $('#flower-password-input').size() > 0;
  95. }
  96.  
  97. function lazyInject() {
  98. if (isInjected()) {
  99. return;
  100. }
  101.  
  102. var style = GM_getResourceText('fpStyle');
  103. // var style = '#flower-password-input,#flower-password-input span,#flower-password-input h1,#flower-password-input label,#flower-password-input input,#flower-password-input p,#flower-password-input a{border:0;font:inherit;font-size:100%;color:#000;background:#FFF;text-align:left;vertical-align:baseline;line-height:1;box-sizing:content-box!important;margin:0;padding:0;}#flower-password-input{border:2px solid #168BC3!important;font:normal 14px/1.5 Tahoma, Helvetica, Arial, \\5b8b\\4f53!important;width:250px;z-index:999999;position:absolute;padding:10px!important;}#flower-password-input h1{font-size:21px!important;font-weight:700!important;color:#168BC3!important;margin:0 0 5px!important;}#flower-password-input input[type=text],#flower-password-input input[type=password]{border:1px solid #999!important;border-radius:3px;font-size:14px!important;display:inline;height:18px;width:160px;margin:5px 10px!important;padding:5px!important;}#flower-password-input input[type=checkbox]{border:1px solid #999!important;border-radius:3px;vertical-align:middle!important;display:inline-block;width:13px;height:13px;cursor:pointer;-webkit-appearance:none;margin:10px!important;}#flower-password-input input[type=checkbox]:checked::after{display:block;position:relative;top:-3px;left:-5px;}#flower-password-input label{vertical-align:middle!important;display:inline;float:none;}#flower-password-input p{font-size:12px!important;color:#999!important;line-height:1.5!important;}#flower-password-close{border:2px solid #168BC3!important;font-weight:700!important;color:#FFF!important;background:#168BC3!important;display:block;width:16px;height:16px;overflow:hidden;position:absolute;top:-2px;right:-2px;cursor:pointer;}#flower-password-close::before{text-align:center!important;line-height:16px!important;content:"\\D7";display:block;width:16px;height:16px;position:relative;top:-1px;}#flower-password-input a{color:#168BC3!important;text-decoration:none;cursor:pointer;}#flower-password-input a:hover{color:#FF881C!important;text-decoration:none;cursor:pointer;}#flower-password-toolbar{display:block;text-align:right!important;}#flower-password-toolbar a{font-size:12px!important;margin-left:10px!important;display:inline;}#flower-password-input a img{vertical-align:middle!important;}#flower-password-hint{margin-top:10px!important;}';
  104. GM_addStyle(style);
  105.  
  106. var html = '<div id="flower-password-input" style="display: none;">' +
  107. '<span id="flower-password-close" title="关闭">关闭</span>' +
  108. '<h1>花密 Flower Password</h1>' +
  109. '<label for="flower-password-password">记忆密码</label><input id="flower-password-password" name="flower-password-password" type="password" value=""/>' +
  110. '<br/>' +
  111. '<label for="flower-password-key">区分代号</label><input id="flower-password-key" name="flower-password-key" type="text" value=""/>' +
  112. '<p id="flower-password-hint">· 记忆密码:可选择一个简单易记的密码,用于生成其他高强度密码。<br/>· 区分代号:用于区别不同用途密码的简短代号,如淘宝账号可用“taobao”或“tb”等。<br/>· 按Enter键或Esc键关闭本窗口。<br/>· 花密官网地址:<a href="http://flowerpassword.com/" target="_blank">http://flowerpassword.com/</a></p>' +
  113. '</div>';
  114. $('body').append(html);
  115.  
  116. var onChange = function() {
  117. var password = $('#flower-password-password').val();
  118. var key = $('#flower-password-key').val();
  119. var result = fpCode(password, key);
  120. if (result) {
  121. currentField.val(result);
  122. GM_setClipboard(result);
  123. }
  124. };
  125.  
  126. $('#flower-password-password, #flower-password-key').change(onChange).keyup(onChange).keyup(function(e) {
  127. if (e.which === 13 || e.which === 27) {
  128. currentField.focus();
  129. $('#flower-password-input').hide();
  130. }
  131. });
  132.  
  133. $('#flower-password-close').click(function() {
  134. $('#flower-password-input').hide();
  135. });
  136. }
  137.  
  138. setupInputListeners();
  139. })();