Changeset 3475121
- Timestamp:
- 03/05/2026 05:19:49 AM (3 weeks ago)
- Location:
- drag-and-drop-multiple-file-upload-contact-form-7
- Files:
-
- 33 added
- 7 edited
-
tags/1.3.9.6 (added)
-
tags/1.3.9.6/admin (added)
-
tags/1.3.9.6/admin/form-generator-v1.php (added)
-
tags/1.3.9.6/admin/form-generator-v2.php (added)
-
tags/1.3.9.6/assets (added)
-
tags/1.3.9.6/assets/css (added)
-
tags/1.3.9.6/assets/css/dnd-upload-cf7.css (added)
-
tags/1.3.9.6/assets/images (added)
-
tags/1.3.9.6/assets/js (added)
-
tags/1.3.9.6/assets/js/codedropz-uploader-jquery.js (added)
-
tags/1.3.9.6/assets/js/codedropz-uploader-min.js (added)
-
tags/1.3.9.6/assets/js/dev (added)
-
tags/1.3.9.6/assets/js/dev/jquery-dev.js (added)
-
tags/1.3.9.6/assets/js/dev/native-dev.js (added)
-
tags/1.3.9.6/drag-n-drop-upload-cf7.php (added)
-
tags/1.3.9.6/inc (added)
-
tags/1.3.9.6/inc/dnd-mime-types.php (added)
-
tags/1.3.9.6/inc/dnd-upload-cf7.php (added)
-
tags/1.3.9.6/languages (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-de_DE.mo (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-de_DE.po (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-fr_FR.mo (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-fr_FR.po (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-ko_KR.mo (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-ko_KR.po (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-nl_NL.mo (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-nl_NL.po (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-ru_RU.mo (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-ru_RU.po (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-zh_TW.mo (added)
-
tags/1.3.9.6/languages/drag-and-drop-multiple-file-upload-contact-form-7-zh_TW.po (added)
-
tags/1.3.9.6/readme.txt (added)
-
tags/1.3.9.6/uninstall.php (added)
-
trunk/assets/js/codedropz-uploader-jquery.js (modified) (3 diffs)
-
trunk/assets/js/codedropz-uploader-min.js (modified) (5 diffs)
-
trunk/assets/js/dev/jquery-dev.js (modified) (7 diffs)
-
trunk/assets/js/dev/native-dev.js (modified) (8 diffs)
-
trunk/drag-n-drop-upload-cf7.php (modified) (2 diffs)
-
trunk/inc/dnd-upload-cf7.php (modified) (17 diffs)
-
trunk/readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
drag-and-drop-multiple-file-upload-contact-form-7/trunk/assets/js/codedropz-uploader-jquery.js
r3428236 r3475121 3 3 * Copyright 2018 Glen Mongaya 4 4 * CodeDrop Drag&Drop Uploader 5 * @version 1.3.9. 35 * @version 1.3.9.6 6 6 * @author CodeDropz, Glen Don L. Mongaya 7 7 * @license The MIT License (MIT) … … 9 9 10 10 // CodeDropz Drag and Drop Plugin 11 !function(e){e.fn.CodeDropz_Uploader=function(a){this.each(function(){var d=e(this),r=e.extend({handler:d,color:"#000",background:"",server_max_error:"Uploaded file exceeds the maximum upload size of your server.",max_file:d.data("max")?d.data("max"):10,max_upload_size:d.data("limit")?d.data("limit"):"10485760",supported_type:d.data("type")?d.data("type"):"jpg|jpeg|JPG|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv|xls",text:"Drag & Drop Files Here",separator:"or",button_text:"Browse Files",on_success:""},a),t=d.data("name")+"_count_files";localStorage.setItem(t,1);var s='<div class="codedropz-upload-handler"><div class="codedropz-upload-container"><div class="codedropz-upload-inner"><'+dnd_cf7_uploader.drag_n_drop_upload.tag+">"+r.text+"</"+dnd_cf7_uploader.drag_n_drop_upload.tag+"><span>"+r.separator+'</span><div class="codedropz-btn-wrap"><a class="cd-upload-btn" href="#">'+r.button_text+'</a></div></div></div><span class="dnd-upload-counter"><span>0</span> '+dnd_cf7_uploader.dnd_text_counter+" "+parseInt(r.max_file)+"</span></div>";r.handler.wrapAll('<div class="codedropz-upload-wrapper"></div>'),r.supported_type=r.supported_type.replace(/[^a-zA-Z0-9| ]/g,"");var o=r.handler.parents("form"),n=r.handler.parents(".codedropz-upload-wrapper"),p=e('input[type="submit"], button[type="submit"]',o);r.handler.after(s),e(".codedropz-upload-handler",n).on("drag dragstart dragend dragover dragenter dragleave drop",function(e){e.preventDefault(),e.stopPropagation()}),e(".codedropz-upload-handler",n).on("dragover dragenter",function(a){e(this).addClass("codedropz-dragover")}),e(".codedropz-upload-handler",n).on("dragleave dragend drop",function(a){e(this).removeClass("codedropz-dragover")}),e("a.cd-upload-btn",n).on("click",function(e){e.preventDefault(),r.handler.val(null),r.handler.click()}),e(".codedropz-upload-handler",n).on("drop",function(e){l(e.originalEvent.dataTransfer.files,"drop")}),r.handler.on("change",function(e){l(this.files,"click")}),/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)&&d.removeAttr("accept"),d.attr("data-random-id",function(e=20){let a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",d=a.length,r="";for(let t=0;t<e;t++){let s=Math.floor(Math.random()*d);r+=a[s]}let o=Math.floor(Date.now()/1e3);return r+o}());var l=function(a,s){if(!(!a.length>1)){var p=new FormData;p.append("action","dnd_codedropz_upload"),p.append("type",s),p.append("security",dnd_cf7_uploader.ajax_nonce),p.append("form_id",d.data("id")),p.append("upload_name",d.data("name")),p.append("upload_folder",d.data("random-id")),d.data("black-list")&&p.append("blacklist-types",d.data("black-list")),e("span.has-error",r.handler).remove(),e.each(a,function(a,s){if(void 0!==p.delete&&p.delete("upload-file"),localStorage.getItem(t)>r.max_file)return!e("span.has-error-msg",n).length>0&&(err_msg=dnd_cf7_uploader.drag_n_drop_upload.max_file_limit,e(".codedropz-upload-handler",n).next('<span class="has-error-msg">'+err_msg.replace("%count%",r.max_file)+"</span>")),!1;var l=i.createProgressBar(s),u=!1;s.size>r.max_upload_size&&(e(".dnd-upload-details",e("#"+l)).append('<span class="has-error">'+dnd_cf7_uploader.drag_n_drop_upload.large_file+"</span>"),u=!0),regex_type=RegExp("(.*?).("+r.supported_type+")$"),!1!==u||regex_type.test(s.name.toLowerCase())||(e(".dnd-upload-details",e("#"+l)).append('<span class="has-error">'+dnd_cf7_uploader.drag_n_drop_upload.inavalid_type+"</span>"),u=!0),localStorage.setItem(t,Number(localStorage.getItem(t))+1),!1===u&&(p.append("upload-file",s),e.ajax({url:r.ajax_url,type:o.attr("method"),data:p,dataType:"json",cache:!1,contentType:!1,processData:!1,xhr:function(){var e=new window.XMLHttpRequest;return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var a=parseInt(100*(e.loaded/e.total));i.setProgressBar(l,a-1)}},!1),e},complete:function(){i.setProgressBar(l,100)},success:function(a){a.success?(i.setProgressBar(l,100),e.isFunction(r.on_success)&&r.on_success.call(this,d,l,a)):(e(".dnd-progress-bar",e("#"+l)).remove(),e(".dnd-upload-details",e("#"+l)).append('<span class="has-error">'+a.data+"</span>"),e('input[type="submit"], button[type="submit"]',o).removeClass("disabled").prop("disabled",!1),e("#"+l).removeClass("in-progress"))},error:function(a,d,t){e(".dnd-progress-bar",e("#"+l)).remove(),e(".dnd-upload-details",e("#"+l)).append('<span class="has-error">'+r.server_max_error+"</span>"),e('input[type="submit"],button[type="submit"]',o).removeClass("disabled").prop("disabled",!1),e("#"+l).removeClass("in-progress")}}))})}},i={createProgressBar:function(a){var d=e(".codedropz-upload-handler",n),r="dnd-file-"+Math.random().toString(36).substr(2,9),s='<div class="dnd-upload-image"><span class="file"></span></div><div class="dnd-upload-details"><span class="name"><span>'+a.name+"</span><em>("+i.bytesToSize(a.size)+')</em></span><a href="#" title="'+dnd_cf7_uploader.drag_n_drop_upload.delete.title+'" class="remove-file" data-storage="'+t+'"><span class="dnd-icon-remove"></span></a><span class="dnd-progress-bar"><span></span></span></div>';return d.after('<div id="'+r+'" class="dnd-upload-status">'+s+"</div>"),r},setProgressBar:function(a,d){var r=e(".dnd-progress-bar",e("#"+a));return r.length>0&&(p&&i.disableBtn(p),progress_width=d*r.width()/100,e("#"+a).addClass("in-progress"),100==d?e("span",r).width("100%").text(d+"% "):e("span",r).animate({width:progress_width},10).text(d+"% "),100==d&&e("#"+a).addClass("complete").removeClass("in-progress")),!1},bytesToSize:function(e){return 0===e?"0":fileSize=(kBytes=e/1024)>=1024?(kBytes/1024).toFixed(2)+"MB":kBytes.toFixed(2)+"KB"},disableBtn:function(e){e.length>0&&e.addClass("disable").prop("disabled",!0)}}}),e(document).on("click",".dnd-icon-remove",function(d){d.preventDefault();var r=e(this),t=r.parents(".dnd-upload-status"),s=r.parents(".codedropz-upload-wrapper"),o=r.parent("a").attr("data-storage"),n=Number(localStorage.getItem(o));if(t.hasClass("in-progress"))return!1;if(e(".has-error",t).length>0)return t.remove(),localStorage.setItem(o,n-1),!1;r.addClass("deleting").text(dnd_cf7_uploader.drag_n_drop_upload.delete.text+"...");var p={path:t.find('input[type="hidden"]').val(),action:"dnd_codedropz_upload_delete",security:dnd_cf7_uploader.ajax_nonce};e.post(a.ajax_url,p,function(a){a.success?(t.remove(),localStorage.setItem(o,n-1),e(".dnd-upload-status",s).length<=1&&e("span.has-error-msg",s).remove(),e(".dnd-upload-counter span",s).text(Number(localStorage.getItem(o))-1)):e(".dnd-upload-details",t).append('<span class="has-error-msg">'+a.data+"</span>")}),e("span.has-error-msg").remove()})}}(jQuery); 12 // End CodeDropz fn. 11 !function(e){e.fn.CodeDropz_Uploader=function(a){this.each(function(){var d=e(this),r=e.extend({handler:d,color:"#000",background:"",server_max_error:"Uploaded file exceeds the maximum upload size of your server.",max_file:d.data("max")?d.data("max"):10,max_upload_size:d.data("limit")?d.data("limit"):"10485760",supported_type:d.data("type")?d.data("type"):"jpg|jpeg|JPG|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv|xls",text:"Drag & Drop Files Here",separator:"or",button_text:"Browse Files",on_success:""},a);let t=function(e=20){let a=new Uint8Array(16);crypto.getRandomValues(a),a[6]=15&a[6]|64,a[8]=63&a[8]|128;let d=Array.from(a,e=>e.toString(16).padStart(2,"0")).join("");return d.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5")};var s=d.data("name")+"_count_files";localStorage.setItem(s,1);var n=dnd_upload_cf7_unique_id();n||(n=t(),localStorage.setItem("dnd_wpcf7_session_id",JSON.stringify({value:n,savedAt:Date.now()})));var o='<div class="codedropz-upload-handler"><div class="codedropz-upload-container"><div class="codedropz-upload-inner"><'+dnd_cf7_uploader.drag_n_drop_upload.tag+">"+r.text+"</"+dnd_cf7_uploader.drag_n_drop_upload.tag+"><span>"+r.separator+'</span><div class="codedropz-btn-wrap"><a class="cd-upload-btn" href="#">'+r.button_text+'</a></div></div></div><span class="dnd-upload-counter"><span>0</span> '+dnd_cf7_uploader.dnd_text_counter+" "+parseInt(r.max_file)+"</span></div>";r.handler.wrapAll('<div class="codedropz-upload-wrapper"></div>'),r.supported_type=r.supported_type.replace(/[^a-zA-Z0-9| ]/g,"");var p=r.handler.parents("form"),l=r.handler.parents(".codedropz-upload-wrapper"),i=e('input[type="submit"], button[type="submit"]',p);r.handler.after(o),e(".codedropz-upload-handler",l).on("drag dragstart dragend dragover dragenter dragleave drop",function(e){e.preventDefault(),e.stopPropagation()}),e(".codedropz-upload-handler",l).on("dragover dragenter",function(a){e(this).addClass("codedropz-dragover")}),e(".codedropz-upload-handler",l).on("dragleave dragend drop",function(a){e(this).removeClass("codedropz-dragover")}),e("a.cd-upload-btn",l).on("click",function(e){e.preventDefault(),r.handler.val(null),r.handler.click()}),e(".codedropz-upload-handler",l).on("drop",function(e){u(e.originalEvent.dataTransfer.files,"drop")}),r.handler.on("change",function(e){u(this.files,"click")}),/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)&&d.removeAttr("accept"),d.attr("data-random-id",t());var u=function(a,t){if(!(!a.length>1)){var o=new FormData;o.append("action","dnd_codedropz_upload"),o.append("type",t),o.append("security",dnd_cf7_uploader.ajax_nonce),o.append("form_id",d.data("id")),o.append("upload_name",d.data("name")),o.append("upload_folder",n),d.data("black-list")&&o.append("blacklist-types",d.data("black-list")),e("span.has-error",r.handler).remove(),e.each(a,function(a,t){if(void 0!==o.delete&&o.delete("upload-file"),localStorage.getItem(s)>r.max_file)return!e("span.has-error-msg",l).length>0&&(err_msg=dnd_cf7_uploader.drag_n_drop_upload.max_file_limit,e(".codedropz-upload-handler",l).next('<span class="has-error-msg">'+err_msg.replace("%count%",r.max_file)+"</span>")),!1;var n=c.createProgressBar(t),i=!1;t.size>r.max_upload_size&&(e(".dnd-upload-details",e("#"+n)).append('<span class="has-error">'+dnd_cf7_uploader.drag_n_drop_upload.large_file+"</span>"),i=!0),regex_type=RegExp("(.*?).("+r.supported_type+")$"),!1!==i||regex_type.test(t.name.toLowerCase())||(e(".dnd-upload-details",e("#"+n)).append('<span class="has-error">'+dnd_cf7_uploader.drag_n_drop_upload.inavalid_type+"</span>"),i=!0),localStorage.setItem(s,Number(localStorage.getItem(s))+1),!1===i&&(o.append("upload-file",t),e.ajax({url:r.ajax_url,type:p.attr("method"),data:o,dataType:"json",cache:!1,contentType:!1,processData:!1,xhr:function(){var e=new window.XMLHttpRequest;return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var a=parseInt(100*(e.loaded/e.total));c.setProgressBar(n,a-1)}},!1),e},complete:function(){c.setProgressBar(n,100)},success:function(a){a.success?(c.setProgressBar(n,100),e.isFunction(r.on_success)&&r.on_success.call(this,d,n,a)):(e(".dnd-progress-bar",e("#"+n)).remove(),e(".dnd-upload-details",e("#"+n)).append('<span class="has-error">'+a.data+"</span>"),e('input[type="submit"], button[type="submit"]',p).removeClass("disabled").prop("disabled",!1),e("#"+n).removeClass("in-progress"))},error:function(a,d,t){e(".dnd-progress-bar",e("#"+n)).remove(),e(".dnd-upload-details",e("#"+n)).append('<span class="has-error">'+r.server_max_error+"</span>"),e('input[type="submit"],button[type="submit"]',p).removeClass("disabled").prop("disabled",!1),e("#"+n).removeClass("in-progress")}}))})}},c={createProgressBar:function(a){var d=e(".codedropz-upload-handler",l),r="dnd-file-"+Math.random().toString(36).substr(2,9),t='<div class="dnd-upload-image"><span class="file"></span></div><div class="dnd-upload-details"><span class="name"><span>'+a.name+"</span><em>("+c.bytesToSize(a.size)+')</em></span><a href="#" title="'+dnd_cf7_uploader.drag_n_drop_upload.delete.title+'" class="remove-file" data-storage="'+s+'"><span class="dnd-icon-remove"></span></a><span class="dnd-progress-bar"><span></span></span></div>';return d.after('<div id="'+r+'" class="dnd-upload-status">'+t+"</div>"),r},setProgressBar:function(a,d){var r=e(".dnd-progress-bar",e("#"+a));return r.length>0&&(i&&c.disableBtn(i),progress_width=d*r.width()/100,e("#"+a).addClass("in-progress"),100==d?e("span",r).width("100%").text(d+"% "):e("span",r).animate({width:progress_width},10).text(d+"% "),100==d&&e("#"+a).addClass("complete").removeClass("in-progress")),!1},bytesToSize:function(e){return 0===e?"0":fileSize=(kBytes=e/1024)>=1024?(kBytes/1024).toFixed(2)+"MB":kBytes.toFixed(2)+"KB"},disableBtn:function(e){e.length>0&&e.addClass("disabled").prop("disabled",!0)}}}),e(document).on("click",".dnd-icon-remove",function(d){d.preventDefault();var r=e(this),t=r.parents(".dnd-upload-status"),s=r.parents(".codedropz-upload-wrapper"),n=r.parent("a").attr("data-storage"),o=Number(localStorage.getItem(n)),p=dnd_upload_cf7_unique_id();if(t.hasClass("in-progress"))return!1;if(e(".has-error",t).length>0)return t.remove(),localStorage.setItem(n,o-1),!1;r.addClass("deleting").text(dnd_cf7_uploader.drag_n_drop_upload.delete.text+"...");var l={path:t.find('input[type="hidden"]').val(),action:"dnd_codedropz_upload_delete",security:dnd_cf7_uploader.ajax_nonce,upload_folder:p};e.post(a.ajax_url,l,function(a){a.success?(t.remove(),localStorage.setItem(n,o-1),e(".dnd-upload-status",s).length<=1&&e("span.has-error-msg",s).remove(),e(".dnd-upload-counter span",s).text(Number(localStorage.getItem(n))-1)):e(".dnd-upload-details",t).append('<span class="has-error-msg">'+a.data+"</span>")}),e("span.has-error-msg").remove()})}}(jQuery); 12 // End: CodeDropz Uploader 13 14 // Get unique id. (reset after 24hours) 15 function dnd_upload_cf7_unique_id() { 16 const item = localStorage.getItem('dnd_wpcf7_session_id'); 17 if ( ! item ) { 18 return null; 19 } 20 21 // Parse item 22 const data = JSON.parse( item ); 23 24 // Compare date 25 if ( Date.now() - data.savedAt > ( 24 * 60 * 60 * 1000 ) ) { 26 localStorage.removeItem('dnd_wpcf7_session_id'); 27 return null; 28 } 29 30 return data.value; 31 } 13 32 14 33 jQuery(document).ready(function($){ … … 74 93 const buttonSubmit = $('input[type="submit"], button[type="submit"]', $form); 75 94 if( buttonSubmit ){ 76 buttonSubmit.remove Attr('disabled');95 buttonSubmit.removeClass('disabled').removeAttr('disabled'); 77 96 } 78 97 }, 1); -
drag-and-drop-multiple-file-upload-contact-form-7/trunk/assets/js/codedropz-uploader-min.js
r3428236 r3475121 3 3 * Copyright 2018 Glen Mongaya 4 4 * CodeDrop Drag&Drop Uploader 5 * @version 1.3.9. 35 * @version 1.3.9.6 6 6 * @author CodeDropz, Glen Don L. Mongaya 7 7 * @license The MIT License (MIT) … … 9 9 10 10 // CodeDropz Drag and Drop Plugin 11 !function(){let e=function(e){let t=document.querySelector("form.wpcf7-form");if(t){let r=new FormData;r.append("action","_wpcf7_check_nonce"),r.append("_ajax_nonce",dnd_cf7_uploader.ajax_nonce),fetch(dnd_cf7_uploader.ajax_url,{method:"POST",body:r}).then(e=>e.json()).then(({data:e,success:t})=>t&&(dnd_cf7_uploader.ajax_nonce=e)).catch(console.error)}var a=this;let d={handler:a,color:"#000",background:"",server_max_error:"Uploaded file exceeds the maximum upload size of your server.",max_file:a.dataset.max?a.dataset.max:10,max_upload_size:a.dataset.limit?a.dataset.limit:"10485760",supported_type:a.dataset.type?a.dataset.type:"jpg|jpeg|JPG|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv|xls",text:"Drag & Drop Files Here",separator:"or",button_text:"Browse Files",on_success:""},o=Object.assign({},d,e);var n=a.dataset.name+"_count_files";localStorage.setItem(n,1);let s=`11 !function(){let e=function(e){let t=document.querySelector("form.wpcf7-form");if(t){let a=new FormData;a.append("action","_wpcf7_check_nonce"),a.append("_ajax_nonce",dnd_cf7_uploader.ajax_nonce),fetch(dnd_cf7_uploader.ajax_url,{method:"POST",body:a}).then(e=>e.json()).then(({data:e,success:t})=>t&&(dnd_cf7_uploader.ajax_nonce=e)).catch(console.error)}var r=this;let d={handler:r,color:"#000",background:"",server_max_error:"Uploaded file exceeds the maximum upload size of your server.",max_file:r.dataset.max?r.dataset.max:10,max_upload_size:r.dataset.limit?r.dataset.limit:"10485760",supported_type:r.dataset.type?r.dataset.type:"jpg|jpeg|JPG|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv|xls",text:"Drag & Drop Files Here",separator:"or",button_text:"Browse Files",on_success:""},o=Object.assign({},d,e);var n=r.dataset.name+"_count_files";localStorage.setItem(n,1);var s=dnd_upload_cf7_unique_id();s||(s=function(e=20){let t=new Uint8Array(16);crypto.getRandomValues(t),t[6]=15&t[6]|64,t[8]=63&t[8]|128;let a=Array.from(t,e=>e.toString(16).padStart(2,"0")).join("");return a.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5")}(),localStorage.setItem("dnd_wpcf7_session_id",JSON.stringify({value:s,savedAt:Date.now()})));let l=` 12 12 <div class="codedropz-upload-handler"> 13 13 <div class="codedropz-upload-container"> … … 20 20 <span class="dnd-upload-counter"><span>0</span> ${dnd_cf7_uploader.dnd_text_counter} ${parseInt(o.max_file)}</span> 21 21 </div> 22 `, l=document.createElement("div");l.classList.add("codedropz-upload-wrapper"),o.handler.parentNode.insertBefore(l,o.handler),l.appendChild(o.handler),o.supported_type=o.supported_type.replace(/[^a-zA-Z0-9_| ]/g,"");let p=o.handler.closest("form"),i=o.handler.closest(".codedropz-upload-wrapper"),c=p.querySelector('input[type="submit"], button[type="submit"]');o.handler.insertAdjacentHTML("afterend",s),["drag","dragstart","dragend","dragover","dragenter","dragleave","drop"].forEach(function(e){i.querySelector(".codedropz-upload-handler").addEventListener(e,function(e){e.preventDefault(),e.stopPropagation()})}),["dragover","dragenter"].forEach(function(e){i.querySelector(".codedropz-upload-handler").addEventListener(e,function(e){i.querySelector(".codedropz-upload-handler").classList.add("codedropz-dragover")})}),["dragleave","dragend","drop"].forEach(function(e){i.querySelector(".codedropz-upload-handler").addEventListener(e,function(e){i.querySelector(".codedropz-upload-handler").classList.remove("codedropz-dragover")})}),i.querySelector(".cd-upload-btn").addEventListener("click",function(e){e.preventDefault(),o.handler.value=null,o.handler.click()}),i.querySelector(".codedropz-upload-handler").addEventListener("drop",function(e){u(e.dataTransfer.files,"drop")}),o.handler.addEventListener("change",function(e){u(this.files,"click")}),/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)&&a.removeAttribute("accept"),a.setAttribute("data-random-id",function(e=20){let t="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",r=t.length,a="";for(let d=0;d<e;d++){let o=Math.floor(Math.random()*r);a+=t[o]}let n=Math.floor(Date.now()/1e3);return a+n}());var u=function(e,t){if(0==e.length)return;var r=new FormData;r.append("action","dnd_codedropz_upload"),r.append("type",t),r.append("security",dnd_cf7_uploader.ajax_nonce),r.append("form_id",a.dataset.id),r.append("upload_name",a.dataset.name),r.append("upload_folder",a.getAttribute("data-random-id"));let d=o.handler.querySelector(".has-error"),s=i.querySelector(".codedropz-upload-handler");for(let l of(d&&d.remove(),e)){if(void 0!==r.delete&&r.delete("upload-file"),Number(localStorage.getItem(n))>o.max_file){if(!i.querySelector("span.has-error-msg")){var c=dnd_cf7_uploader.drag_n_drop_upload.max_file_limit,u=document.createElement("span");u.className="has-error-msg",u.textContent=c.replace("%count%",o.max_file),s.parentNode.insertBefore(u,s.nextSibling)}return!1}let f=m.createProgressBar(l);var g=!1;if(l.size>o.max_upload_size){let v=document.getElementById(f),h=document.createElement("span");h.classList.add("has-error"),h.textContent=dnd_cf7_uploader.drag_n_drop_upload.large_file,v.querySelector(".dnd-upload-details").appendChild(h),g=!0}if(regex_type=RegExp("(.*?).("+o.supported_type+")$"),!1!==g||regex_type.test(l.name.toLowerCase())||(document.querySelector("#"+f+" .dnd-upload-details").insertAdjacentHTML("beforeend",'<span class="has-error">'+dnd_cf7_uploader.drag_n_drop_upload.inavalid_type+"</span>"),g=!0),localStorage.setItem(n,Number(localStorage.getItem(n))+1),!1===g){r.append("upload-file",l);var y=new XMLHttpRequest;let x=document.getElementById(f),b=x.querySelector(".dnd-progress-bar"),S=x.querySelector(".dnd-upload-details"),$=p.querySelector('input[type="submit"], button[type="submit"]');y.open(p.getAttribute("method"),o.ajax_url),y.onreadystatechange=function(){if(4===this.readyState){if(200===this.status){var e=JSON.parse(this.responseText);e.success?(m.setProgressBar(f,100),"function"==typeof o.on_success&&o.on_success.call(this,a,f,e)):(b.remove(),S.insertAdjacentHTML("beforeend",'<span class="has-error">'+e.data+"</span>"),$&&($.classList.remove("disabled"),$.removeAttribute("disabled")),x.classList.remove("in-progress"))}else b.remove(),S.insertAdjacentHTML("beforeend",'<span class="has-error">'+o.server_max_error+"</span>"),$&&($.classList.remove("disabled"),$.removeAttribute("disabled")),x.classList.remove("in-progress")}},y.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=parseInt(100*(e.loaded/e.total));m.setProgressBar(f,t-1)}},!1),y.send(r)}}},m={createProgressBar:function(e){var t=i.querySelector(".codedropz-upload-handler"),r="dnd-file-"+Math.random().toString(36).substr(2,9),a=`22 `,p=document.createElement("div");p.classList.add("codedropz-upload-wrapper"),o.handler.parentNode.insertBefore(p,o.handler),p.appendChild(o.handler),o.supported_type=o.supported_type.replace(/[^a-zA-Z0-9| ]/g,"");let i=o.handler.closest("form"),c=o.handler.closest(".codedropz-upload-wrapper"),u=i.querySelector('input[type="submit"], button[type="submit"]');o.handler.insertAdjacentHTML("afterend",l),["drag","dragstart","dragend","dragover","dragenter","dragleave","drop"].forEach(function(e){c.querySelector(".codedropz-upload-handler").addEventListener(e,function(e){e.preventDefault(),e.stopPropagation()})}),["dragover","dragenter"].forEach(function(e){c.querySelector(".codedropz-upload-handler").addEventListener(e,function(e){c.querySelector(".codedropz-upload-handler").classList.add("codedropz-dragover")})}),["dragleave","dragend","drop"].forEach(function(e){c.querySelector(".codedropz-upload-handler").addEventListener(e,function(e){c.querySelector(".codedropz-upload-handler").classList.remove("codedropz-dragover")})}),c.querySelector(".cd-upload-btn").addEventListener("click",function(e){e.preventDefault(),o.handler.value=null,o.handler.click()}),c.querySelector(".codedropz-upload-handler").addEventListener("drop",function(e){m(e.dataTransfer.files,"drop")}),o.handler.addEventListener("change",function(e){m(this.files,"click")}),/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)&&r.removeAttribute("accept");var m=function(e,t){if(0==e.length)return;var a=new FormData;a.append("action","dnd_codedropz_upload"),a.append("type",t),a.append("security",dnd_cf7_uploader.ajax_nonce),a.append("form_id",r.dataset.id),a.append("upload_name",r.dataset.name),a.append("upload_folder",s);let d=o.handler.querySelector(".has-error"),l=c.querySelector(".codedropz-upload-handler");for(let p of(d&&d.remove(),e)){if(void 0!==a.delete&&a.delete("upload-file"),Number(localStorage.getItem(n))>o.max_file){if(!c.querySelector("span.has-error-msg")){var u=dnd_cf7_uploader.drag_n_drop_upload.max_file_limit,m=document.createElement("span");m.className="has-error-msg",m.textContent=u.replace("%count%",o.max_file),l.parentNode.insertBefore(m,l.nextSibling)}return!1}let g=f.createProgressBar(p);var v=!1;if(p.size>o.max_upload_size){let h=document.getElementById(g),y=document.createElement("span");y.classList.add("has-error"),y.textContent=dnd_cf7_uploader.drag_n_drop_upload.large_file,h.querySelector(".dnd-upload-details").appendChild(y),v=!0}if(regex_type=RegExp("(.*?).("+o.supported_type+")$"),!1!==v||regex_type.test(p.name.toLowerCase())||(document.querySelector("#"+g+" .dnd-upload-details").insertAdjacentHTML("beforeend",'<span class="has-error">'+dnd_cf7_uploader.drag_n_drop_upload.inavalid_type+"</span>"),v=!0),localStorage.setItem(n,Number(localStorage.getItem(n))+1),!1===v){a.append("upload-file",p);var x=new XMLHttpRequest;let $=document.getElementById(g),S=$.querySelector(".dnd-progress-bar"),b=$.querySelector(".dnd-upload-details"),q=i.querySelector('input[type="submit"], button[type="submit"]');x.open(i.getAttribute("method"),o.ajax_url),x.onreadystatechange=function(){if(4===this.readyState){if(200===this.status){var e=JSON.parse(this.responseText);e.success?(f.setProgressBar(g,100),"function"==typeof o.on_success&&o.on_success.call(this,r,g,e)):(S.remove(),b.insertAdjacentHTML("beforeend",'<span class="has-error">'+e.data+"</span>"),q&&(q.classList.remove("disabled"),q.removeAttribute("disabled")),$.classList.remove("in-progress"))}else S.remove(),b.insertAdjacentHTML("beforeend",'<span class="has-error">'+o.server_max_error+"</span>"),q&&(q.classList.remove("disabled"),q.removeAttribute("disabled")),$.classList.remove("in-progress")}},x.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=parseInt(100*(e.loaded/e.total));f.setProgressBar(g,t-1)}},!1),x.send(a)}}},f={createProgressBar:function(e){var t=c.querySelector(".codedropz-upload-handler"),a="dnd-file-"+Math.random().toString(36).substr(2,9),r=` 23 23 <div class="dnd-upload-image"> 24 24 <span class="file"></span> 25 25 </div> 26 26 <div class="dnd-upload-details"> 27 <span class="name"><span>${e.name}</span><em>(${ m.bytesToSize(e.size)})</em></span>27 <span class="name"><span>${e.name}</span><em>(${f.bytesToSize(e.size)})</em></span> 28 28 <a href="#" title="${dnd_cf7_uploader.drag_n_drop_upload.delete.title}" class="remove-file" data-storage="${n}"> 29 29 <span class="dnd-icon-remove"></span> … … 31 31 <span class="dnd-progress-bar"><span></span></span> 32 32 </div> 33 `,d=document.createElement("div");return d.id= r,d.className="dnd-upload-status",d.innerHTML=a,t.parentNode.insertBefore(d,t.nextSibling),r},setProgressBar:function(e,t){let r=document.getElementById(e),a=r.querySelector(".dnd-progress-bar");if(a){c&&m.disableBtn(c);let d=t*a.offsetWidth/100;r.classList.add("in-progress"),100==t?(a.querySelector("span").style.width="100%",a.querySelector("span").textContent=`${t}% `):(a.querySelector("span").style.width=d+"px",a.querySelector("span").textContent=`${t}% `),100==t&&(r.classList.add("complete"),r.classList.remove("in-progress"))}return!1},bytesToSize:function(e){return 0===e?"0":fileSize=(kBytes=e/1024)>=1024?(kBytes/1024).toFixed(2)+"MB":kBytes.toFixed(2)+"KB"},disableBtn:function(e){e&&(e.classList.add("disabled"),e.disabled=!0)}}};document.addEventListener("click",function(e){if(e.target.classList.contains("dnd-icon-remove")){e.preventDefault();var t=e.target,r=t.closest(".dnd-upload-status"),a=t.closest(".codedropz-upload-wrapper"),d=t.parentElement.getAttribute("data-storage"),o=Number(localStorage.getItem(d));if(r.classList.contains("in-progress")||r.querySelector(".has-error"))return r.remove(),localStorage.setItem(d,o-1),!1;t.classList.add("deleting"),t.textContent=dnd_cf7_uploader.drag_n_drop_upload.delete.text+"...";var n=new XMLHttpRequest;n.open("POST",dnd_cf7_uploader.ajax_url),n.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),n.onload=function(){if(200===this.status){var e=JSON.parse(this.responseText);if(e.success)r.remove(),localStorage.setItem(d,o-1),a.querySelectorAll(".dnd-upload-status").length<=1&&a.querySelector(".has-error-msg")&&a.querySelector(".has-error-msg").remove(),a.querySelector(".dnd-upload-counter span").textContent=Number(localStorage.getItem(d))-1;else{let t=r.querySelector(".dnd-upload-details");if(t){let n=document.createElement("span");n.classList.add("has-error-msg"),n.textContent=e.data,t.appendChild(n)}}}},n.send("path="+r.querySelector('input[type="hidden"]').value+"&action=dnd_codedropz_upload_delete&security="+dnd_cf7_uploader.ajax_nonce),document.querySelectorAll(".has-error-msg").forEach(function(e){e.remove()})}}),HTMLElement.prototype.CodeDropz_Uploader=e}();33 `,d=document.createElement("div");return d.id=a,d.className="dnd-upload-status",d.innerHTML=r,t.parentNode.insertBefore(d,t.nextSibling),a},setProgressBar:function(e,t){let a=document.getElementById(e),r=a.querySelector(".dnd-progress-bar");if(r){u&&f.disableBtn(u);let d=t*r.offsetWidth/100;a.classList.add("in-progress"),100==t?(r.querySelector("span").style.width="100%",r.querySelector("span").textContent=`${t}% `):(r.querySelector("span").style.width=d+"px",r.querySelector("span").textContent=`${t}% `),100==t&&(a.classList.add("complete"),a.classList.remove("in-progress"))}return!1},bytesToSize:function(e){return 0===e?"0":fileSize=(kBytes=e/1024)>=1024?(kBytes/1024).toFixed(2)+"MB":kBytes.toFixed(2)+"KB"},disableBtn:function(e){e&&(e.classList.add("disabled"),e.disabled=!0)}}};document.addEventListener("click",function(e){if(e.target.classList.contains("dnd-icon-remove")){e.preventDefault();var t=e.target,a=t.closest(".dnd-upload-status"),r=t.closest(".codedropz-upload-wrapper"),d=t.parentElement.getAttribute("data-storage"),o=Number(localStorage.getItem(d)),n=dnd_upload_cf7_unique_id();if(a.classList.contains("in-progress")||a.querySelector(".has-error"))return a.remove(),localStorage.setItem(d,o-1),!1;t.classList.add("deleting"),t.textContent=dnd_cf7_uploader.drag_n_drop_upload.delete.text+"...";var s=new XMLHttpRequest;s.open("POST",dnd_cf7_uploader.ajax_url),s.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),s.onload=function(){if(200===this.status){var e=JSON.parse(this.responseText);if(e.success)a.remove(),localStorage.setItem(d,o-1),r.querySelectorAll(".dnd-upload-status").length<=1&&r.querySelector(".has-error-msg")&&r.querySelector(".has-error-msg").remove(),r.querySelector(".dnd-upload-counter span").textContent=Number(localStorage.getItem(d))-1;else{let t=a.querySelector(".dnd-upload-details");if(t){let n=document.createElement("span");n.classList.add("has-error-msg"),n.textContent=e.data,t.appendChild(n)}}}},s.send("path="+a.querySelector('input[type="hidden"]').value+"&action=dnd_codedropz_upload_delete&security="+dnd_cf7_uploader.ajax_nonce+"&upload_folder="+n),document.querySelectorAll(".has-error-msg").forEach(function(e){e.remove()})}}),HTMLElement.prototype.CodeDropz_Uploader=e}(); 34 34 // END: CodeDropz Uploader function 35 35 … … 42 42 }); 43 43 target.dispatchEvent(event); 44 } 45 46 // Get unique id. (reset after 24hours) 47 function dnd_upload_cf7_unique_id() { 48 const item = localStorage.getItem('dnd_wpcf7_session_id'); 49 if ( ! item ) { 50 return null; 51 } 52 53 // Parse item 54 const data = JSON.parse( item ); 55 56 // Compare date 57 if ( Date.now() - data.savedAt > ( 24 * 60 * 60 * 1000 ) ) { 58 localStorage.removeItem('dnd_wpcf7_session_id'); 59 return null; 60 } 61 62 return data.value; 44 63 } 45 64 -
drag-and-drop-multiple-file-upload-contact-form-7/trunk/assets/js/dev/jquery-dev.js
r3391555 r3475121 3 3 * Copyright 2018 Glen Mongaya 4 4 * CodeDrop Drag&Drop Uploader 5 * @version 1.3. 8.75 * @version 1.3.9.6 6 6 * @author CodeDropz, Glen Don L. Mongaya 7 7 * @license The MIT License (MIT) … … 33 33 }, settings); 34 34 35 // Generate random string 36 const generateRandomFolder = function( length = 20 ) { 37 const bytes = new Uint8Array(16); 38 crypto.getRandomValues(bytes); 39 bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4 40 bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10 41 const hex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join(''); 42 return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, '$1-$2-$3-$4-$5'); 43 } 44 35 45 // Get storage name 36 46 var dataStorageName = input.data('name') + '_count_files'; … … 39 49 localStorage.setItem( dataStorageName, 1); 40 50 41 // Generate random string 42 const generateRandomFolder = function( length = 20 ) { 43 const characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 44 const charactersLength = characters.length; 45 let randomString = ''; 46 47 // Generate a random string 48 for (let i = 0; i < length; i++) { 49 const randomIndex = Math.floor(Math.random() * charactersLength); 50 randomString += characters[randomIndex]; 51 } 52 53 // Append the current timestamp (in seconds) 54 const timestamp = Math.floor(Date.now() / 1000); // Get Unix timestamp in seconds 55 return randomString + timestamp; 51 // Get unique id from local storage. 52 var sessionID = dnd_upload_cf7_unique_id(); 53 54 // Unique upload session_id 55 if ( ! sessionID ) { 56 sessionID = generateRandomFolder(); 57 localStorage.setItem( 'dnd_wpcf7_session_id', JSON.stringify({ value: sessionID, savedAt: Date.now() }) ); 56 58 } 57 59 … … 152 154 formData.append('form_id', input.data('id')); 153 155 formData.append('upload_name', input.data('name')); 154 formData.append('upload_folder', input.data('random-id'));156 formData.append('upload_folder', sessionID ); 155 157 156 158 // black list file types … … 342 344 e.preventDefault(); 343 345 var _self = $(this), 344 _dnd_status = _self.parents('.dnd-upload-status'),345 _parent_wrap = _self.parents('.codedropz-upload-wrapper'),346 _dnd_status = _self.parents('.dnd-upload-status'), 347 _parent_wrap = _self.parents('.codedropz-upload-wrapper'), 346 348 removeStorageData = _self.parent('a').attr('data-storage'), 347 storageCount = Number( localStorage.getItem( removeStorageData ) ); 349 storageCount = Number( localStorage.getItem( removeStorageData ) ), 350 sessionId = dnd_upload_cf7_unique_id(); 348 351 349 352 // If file upload is in progress don't delete … … 363 366 // Request ajax image delete 364 367 var delData = { 365 path : _dnd_status.find('input[type="hidden"]').val(), 366 action : 'dnd_codedropz_upload_delete', 367 security : dnd_cf7_uploader.ajax_nonce 368 path : _dnd_status.find('input[type="hidden"]').val(), 369 action : 'dnd_codedropz_upload_delete', 370 security : dnd_cf7_uploader.ajax_nonce, 371 upload_folder : sessionId 368 372 }; 369 373 … … 394 398 395 399 }( jQuery )); 400 401 // Get unique id. (reset after 24hours) 402 function dnd_upload_cf7_unique_id() { 403 const item = localStorage.getItem('dnd_wpcf7_session_id'); 404 if ( ! item ) { 405 return null; 406 } 407 408 // Parse item 409 const data = JSON.parse( item ); 410 411 // Compare date 412 if ( Date.now() - data.savedAt > ( 24 * 60 * 60 * 1000 ) ) { 413 localStorage.removeItem('dnd_wpcf7_session_id'); 414 return null; 415 } 416 417 return data.value; 418 } 396 419 397 420 jQuery(document).ready(function($){ -
drag-and-drop-multiple-file-upload-contact-form-7/trunk/assets/js/dev/native-dev.js
r3450209 r3475121 3 3 * Copyright 2018 Glen Mongaya 4 4 * CodeDrop Drag&Drop Uploader 5 * @version 1.3. 8.75 * @version 1.3.9.6 6 6 * @author CodeDropz, Glen Don L. Mongaya 7 7 * @license The MIT License (MIT) … … 27 27 // Generate random string 28 28 const generateRandomFolder = function( length = 20 ) { 29 const characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 30 const charactersLength = characters.length; 31 let randomString = ''; 32 33 // Generate a random string 34 for (let i = 0; i < length; i++) { 35 const randomIndex = Math.floor(Math.random() * charactersLength); 36 randomString += characters[randomIndex]; 37 } 38 39 // Append the current timestamp (in seconds) 40 const timestamp = Math.floor(Date.now() / 1000); // Get Unix timestamp in seconds 41 return randomString + timestamp; 29 const bytes = new Uint8Array(16); 30 crypto.getRandomValues(bytes); 31 bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4 32 bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10 33 const hex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join(''); 34 return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, '$1-$2-$3-$4-$5'); 42 35 } 43 36 … … 69 62 localStorage.setItem( dataStorageName, 1); 70 63 64 // Get unique id from local storage. 65 var sessionID = dnd_upload_cf7_unique_id(); 66 67 // Unique upload session_id 68 if ( ! sessionID ) { 69 sessionID = generateRandomFolder(); 70 localStorage.setItem( 'dnd_wpcf7_session_id', JSON.stringify({ value: sessionID, savedAt: Date.now() }) ); 71 } 72 71 73 // Template Container 72 74 const cdropz_template = ` … … 153 155 } 154 156 155 // Add unique ID or random string156 input.setAttribute( 'data-random-id', generateRandomFolder() );157 158 157 // Setup Uploader 159 158 var DND_Setup_Uploader = function( files, action ) { … … 175 174 formData.append('form_id', input.dataset.id); 176 175 formData.append('upload_name', input.dataset.name); 177 formData.append('upload_folder', input.getAttribute('data-random-id'));176 formData.append('upload_folder', sessionID ); 178 177 179 178 // black list file types … … 405 404 406 405 e.preventDefault(); 407 var _self = e.target,408 _dnd_status = _self.closest(".dnd-upload-status"),409 _parent_wrap = _self.closest(".codedropz-upload-wrapper"),406 var _self = e.target, 407 _dnd_status = _self.closest(".dnd-upload-status"), 408 _parent_wrap = _self.closest(".codedropz-upload-wrapper"), 410 409 removeStorageData = _self.parentElement.getAttribute("data-storage"), 411 storageCount = Number(localStorage.getItem(removeStorageData)); 410 storageCount = Number(localStorage.getItem(removeStorageData)), 411 sessionId = dnd_upload_cf7_unique_id(); 412 412 413 413 // Direct remove the file if there's any error. … … 459 459 "path=" + _dnd_status.querySelector('input[type="hidden"]').value + 460 460 "&action=dnd_codedropz_upload_delete" + 461 "&security=" + dnd_cf7_uploader.ajax_nonce 461 "&security=" + dnd_cf7_uploader.ajax_nonce + 462 "&upload_folder=" + sessionId 462 463 ); 463 464 … … 482 483 }); 483 484 target.dispatchEvent(event); 485 } 486 487 // Get unique id. (reset after 24hours) 488 function dnd_upload_cf7_unique_id() { 489 const item = localStorage.getItem('dnd_wpcf7_session_id'); 490 if ( ! item ) { 491 return null; 492 } 493 494 // Parse item 495 const data = JSON.parse( item ); 496 497 // Compare date 498 if ( Date.now() - data.savedAt > ( 24 * 60 * 60 * 1000 ) ) { 499 localStorage.removeItem('dnd_wpcf7_session_id'); 500 return null; 501 } 502 503 return data.value; 484 504 } 485 505 -
drag-and-drop-multiple-file-upload-contact-form-7/trunk/drag-n-drop-upload-cf7.php
r3450244 r3475121 7 7 * Text Domain: drag-and-drop-multiple-file-upload-contact-form-7 8 8 * Domain Path: /languages 9 * Version: 1.3.9. 59 * Version: 1.3.9.6 10 10 * Author: Glen Don L. Mongaya 11 11 * Author URI: http://codedropz.com … … 22 22 23 23 /** Define plugin Version */ 24 define( 'dnd_upload_cf7_version', '1.3.9. 5' );24 define( 'dnd_upload_cf7_version', '1.3.9.6' ); 25 25 26 26 /** Define constant Plugin Directories */ -
drag-and-drop-multiple-file-upload-contact-form-7/trunk/inc/dnd-upload-cf7.php
r3450244 r3475121 17 17 add_action( 'wpcf7_init', 'dnd_cf7_upload_add_form_tag_file' ); 18 18 add_action( 'wpcf7_enqueue_scripts', 'dnd_cf7_scripts' ); 19 add_action( 'wpcf7_enqueue_scripts', 'dnd_cf7_cookie_scripts', 50 );20 19 21 20 // Hook on plugins loaded … … 74 73 // Return created cookie with unique id. 75 74 function dnd_cf7_get_unique_id() { 76 if ( isset( $_COOKIE['wpcf7_guest_user_id'] ) ) { 77 return $_COOKIE['wpcf7_guest_user_id']; 78 } 75 print_r( $_POST ); 79 76 } 80 77 … … 204 201 if ( is_array( $posted_data ) ) { 205 202 foreach( $posted_data[$field_name] as $key => $file ) { 206 if ( strpos( dirname($file), 'wpcf7-files' ) !== false ) {207 $file = wp_basename( $file ); // remove duplicate path "/12/file.jpg" to just "/file.jpg"208 }209 203 $posted_data[$field_name][$key] = trailingslashit( $uploads_dir['upload_url'] ) . $file; 210 204 } … … 253 247 254 248 // Get folder path 255 function dnd_get_upload_dir( $dir = false) {249 function dnd_get_upload_dir( $dir = '' ) { 256 250 $upload = wp_upload_dir(); 257 $uploads_dir = wpcf7_dnd_dir . '/wpcf7-files'; 251 $uploads_dir = wpcf7_dnd_dir . '/wpcf7-files'; // ie: "/wp_dndcf7_uploads/wpcf7-files" 258 252 259 253 // Send file as links is enabled. … … 263 257 264 258 // Setup random/unique folder, only created if user uploading. 265 if ( true ===$dir ) {266 $unique_id = dnd_cf7_get_unique_id();259 if ( $dir ) { 260 $unique_id = sanitize_file_name( $dir ); 267 261 if ( ! empty( $unique_id ) ) { 268 $unique_id = preg_replace( '/[^a-zA-Z0-9_-]/', '', $unique_id ); 269 if ( '' !== $unique_id ) { 270 $uploads_dir = trailingslashit( $uploads_dir ) . sanitize_file_name( $unique_id ); 271 } 272 } 273 } 262 $unique_id = preg_replace( '/[^a-zA-Z0-9_-]/', '', $unique_id ); 263 $uploads_dir = trailingslashit( $uploads_dir ) . $unique_id; 264 } 265 } 266 267 // Get full dir and url 268 $full_dir = wp_normalize_path( trailingslashit( $upload['basedir'] ) . $uploads_dir ); 269 $full_url = trailingslashit( $upload['baseurl'] ) . $uploads_dir; 274 270 275 271 // Create directory if not exists. 276 if ( ! is_dir( trailingslashit( $upload['basedir'] ) . $uploads_dir ) ) {277 wp_mkdir_p( trailingslashit( $upload['basedir'] ) . $uploads_dir );278 chmod( trailingslashit( $upload['basedir'] ) . $uploads_dir, 0755 );272 if ( ! is_dir( $full_dir ) ) { 273 wp_mkdir_p( $full_dir ); 274 @chmod( $full_dir, 0755 ); 279 275 } 280 276 281 277 // Make sure directory exist before returning 282 if( file_exists( trailingslashit( $upload['basedir'] ) . $uploads_dir ) ) {278 if( file_exists( $full_dir ) ) { 283 279 return array( 284 'upload_dir' => trailingslashit( $upload['basedir'] ) . $uploads_dir,285 'upload_url' => trailingslashit( $upload['baseurl'] ) . $uploads_dir280 'upload_dir' => $full_dir, 281 'upload_url' => $full_url 286 282 ); 287 283 } 288 284 289 return trailingslashit( $upload['basedir'] ) . $uploads_dir;285 return $full_dir; 290 286 } 291 287 … … 586 582 } 587 583 588 // Add inline js for cookie script.589 function dnd_cf7_cookie_scripts() {590 wp_add_inline_script( 'codedropz-uploader',591 "592 function dnd_cf7_generateUUIDv4() {593 const bytes = new Uint8Array(16);594 crypto.getRandomValues(bytes);595 bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4596 bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10597 const hex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');598 return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, '$1-$2-$3-$4-$5');599 }600 601 document.addEventListener('DOMContentLoaded', function() {602 if ( ! document.cookie.includes('wpcf7_guest_user_id')) {603 document.cookie = 'wpcf7_guest_user_id=' + dnd_cf7_generateUUIDv4() + '; path=/; max-age=' + (12 * 3600) + '; samesite=Lax';604 }605 });606 "607 );608 }609 610 584 // Generate tag 611 585 function dnd_cf7_upload_add_form_tag_file() { … … 913 887 914 888 // Get upload dir 915 $path = dnd_get_upload_dir( true ); // ok 889 $folder = isset( $_POST['upload_folder'] ) ? sanitize_text_field( $_POST['upload_folder'] ) : null; 890 $path = dnd_get_upload_dir( $folder ); // ok 916 891 917 892 // input type file 'name' … … 939 914 $filename = wp_basename( $file['name'] ); 940 915 $filename = wpcf7_canonicalize( $filename, 'as-is' ); 916 $filename = sanitize_file_name( $filename ); // sanitize filename 917 918 // Check unique name 919 $filename = wp_unique_filename( $path['upload_dir'], $filename ); 941 920 942 921 // Get file extension 943 922 $extension = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); 944 923 945 // Check unique name946 $filename = wp_unique_filename( $path['upload_dir'], $filename );947 948 924 // Validate File Types (if supported type is set to "*") 949 925 if ( $supported_type == '*' ) { 950 $file_type = wp_check_filetype( $file ['name']);951 $not_allowed_ext = array( 'phar', 'svg', ); // not allowed file type.926 $file_type = wp_check_filetype( $filename ); 927 $not_allowed_ext = array( 'phar', 'svg', 'php5', 'php7', 'php8' ); // not allowed file type. 952 928 $type_ext = ( $file_type['ext'] !== false ? strtolower( $file_type['ext'] ) : $extension ); 953 929 $error_invalid_type = dnd_cf7_settings('drag_n_drop_error_invalid_file') ?: dnd_cf7_error_msg('invalid_type'); … … 961 937 962 938 // validate file type 963 if ( ( ! preg_match( $file_type_pattern, $file ['name']) || ! dnd_cf7_validate_type( $extension, $supported_type ) ) && $supported_type != '*' ) {939 if ( ( ! preg_match( $file_type_pattern, $filename ) || ! dnd_cf7_validate_type( $extension, $supported_type ) ) && $supported_type != '*' ) { 964 940 wp_send_json_error( dnd_cf7_settings('drag_n_drop_error_invalid_file') ? dnd_cf7_settings('drag_n_drop_error_invalid_file') : dnd_cf7_error_msg('invalid_type') ); 965 941 } 966 942 967 943 // validate mime type 968 if ( $supported_type && $supported_type != '*' ){944 if ( $supported_type && $supported_type != '*' ){ 969 945 970 946 // wheather if we validate mime type 971 947 $validate_mime = apply_filters('dnd_cf7_validate_mime', false ); 972 973 if( $validate_mime ){ 974 975 if( ! function_exists('wp_check_filetype_and_ext') ){ 948 if ( $validate_mime ) { 949 if ( ! function_exists('wp_check_filetype_and_ext') ){ 976 950 require_once ABSPATH .'wp-admin/includes/file.php'; 977 951 } … … 981 955 $valid_mimes = explode('|', $supported_type); // array[png, jpg] 982 956 983 if ( empty( $wp_filetype['type'] ) || empty( $wp_filetype['ext'] ) || ! in_array( $wp_filetype['ext'], $valid_mimes ) ){957 if ( empty( $wp_filetype['type'] ) || empty( $wp_filetype['ext'] ) || ! in_array( $wp_filetype['ext'], $valid_mimes ) ){ 984 958 wp_send_json_error( dnd_cf7_settings('drag_n_drop_error_invalid_file') ? dnd_cf7_settings('drag_n_drop_error_invalid_file') : dnd_cf7_error_msg('invalid_type') ); 985 959 } … … 988 962 989 963 // validate file size limit 990 if ( isset( $size_limit["$cf7_upload_name"] ) && $file['size'] > $size_limit["$cf7_upload_name"] ) {964 if ( isset( $size_limit["$cf7_upload_name"] ) && $file['size'] > $size_limit["$cf7_upload_name"] ) { 991 965 wp_send_json_error( dnd_cf7_settings('drag_n_drop_error_files_too_large') ? dnd_cf7_settings('drag_n_drop_error_files_too_large') : dnd_cf7_error_msg('large_file') ); 992 966 } 993 967 994 968 // Check if string is ascii then proceed with antiscript function ( remove or clean filename ) 995 if( dnd_cf7_check_ascii( $filename ) ){ 996 $filename = wpcf7_antiscript_file_name( $filename ); 969 $ascii_name = dnd_cf7_remove_icons( $filename ); 970 if ( dnd_cf7_check_ascii( $ascii_name ) ) { 971 $filename = wpcf7_antiscript_file_name( $ascii_name ); 997 972 } 998 973 … … 1037 1012 } 1038 1013 1014 // Force to remove emoji in the filename. 1015 function dnd_cf7_remove_icons( $filename ) { 1016 return preg_replace( 1017 '/[\x{1F000}-\x{1FAFF}' 1018 . '\x{2600}-\x{27BF}' 1019 . '\x{1F1E6}-\x{1F1FF}' 1020 . '\x{200D}' 1021 . '\x{FE00}-\x{FE0F}' 1022 . '\x{1F3FB}-\x{1F3FF}]/u', 1023 '', 1024 $filename 1025 ); 1026 } 1027 1039 1028 // Check if a string is ASCII. 1040 1029 function dnd_cf7_check_ascii( $string ) { 1030 $string = sanitize_file_name( $string ); 1031 1041 1032 if ( function_exists( 'mb_check_encoding' ) ) { 1042 1033 if ( mb_check_encoding( $string, 'ASCII' ) ) { … … 1078 1069 1079 1070 // Validate path if it's match on the current folder 1080 $unique_id = dnd_cf7_get_unique_id();1071 $unique_id = isset( $_POST['upload_folder'] ) ? sanitize_file_name( $_POST['upload_folder'] ) : ''; 1081 1072 $current_folder = trim( dirname( $path ) ); 1082 1073 $file_name = wp_basename( $path ); // added Aug 2025 1083 $current_path = $dir['upload_dir'] .'/'. sanitize_file_name( $unique_id ).'/'. $file_name;1074 $current_path = $dir['upload_dir'] .'/'. $unique_id .'/'. $file_name; 1084 1075 1085 1076 // Validate unique id. … … 1088 1079 } 1089 1080 1090 // Validate cookieand current_folder to ensure they match.1081 // Validate unique id and current_folder to ensure they match. 1091 1082 if ( ( $unique_id !== $current_folder ) || ! file_exists( $current_path ) || preg_match( '#\.\.[/\\\\]#', $path ) ) { 1092 1083 wp_send_json_error( 'Error: Unauthorized Request!' ); … … 1145 1136 // list of not allowed extensions. 1146 1137 function dnd_cf7_not_allowed_ext() { 1147 return array( ' svg', 'phar', 'php', 'php3','php4','phtml','exe','script', 'app', 'asp', 'bas', 'bat', 'cer', 'cgi', 'chm', 'cmd', 'com', 'cpl', 'crt', 'csh', 'csr', 'dll', 'drv', 'fxp', 'flv', 'hlp', 'hta', 'htaccess', 'htm', 'htpasswd', 'inf', 'ins', 'isp', 'jar', 'js', 'jse', 'jsp', 'ksh', 'lnk', 'mdb', 'mde', 'mdt', 'mdw', 'msc', 'msi', 'msp', 'mst', 'ops', 'pcd', 'pif', 'pl', 'prg', 'ps1', 'ps2', 'py', 'rb', 'reg', 'scr', 'sct', 'sh', 'shb', 'shs', 'sys', 'swf', 'tmp', 'torrent', 'url', 'vb', 'vbe', 'vbs', 'vbscript', 'wsc', 'wsf', 'wsf', 'wsh' );1138 return array( 'html', 'svg', 'phar', 'php', 'php3','php4','pht', 'php5', 'php7', 'php8', 'xhtml','shtml', 'mhtml', 'dhtml', 'phtml','exe','script', 'app', 'asp', 'bas', 'bat', 'cer', 'cgi', 'chm', 'cmd', 'com', 'cpl', 'crt', 'csh', 'csr', 'dll', 'drv', 'fxp', 'flv', 'hlp', 'hta', 'htaccess', 'htm', 'htpasswd', 'inf', 'ins', 'isp', 'jar', 'js', 'jse', 'jsp', 'ksh', 'lnk', 'mdb', 'mde', 'mdt', 'mdw', 'msc', 'msi', 'msp', 'mst', 'ops', 'pcd', 'pif', 'pl', 'prg', 'ps1', 'ps2', 'py', 'rb', 'reg', 'scr', 'sct', 'sh', 'shb', 'shs', 'sys', 'swf', 'tmp', 'torrent', 'url', 'vb', 'vbe', 'vbs', 'vbscript', 'wsc', 'wsf', 'wsf', 'wsh' ); 1148 1139 } 1149 1140 … … 1426 1417 } 1427 1418 1419 // Get the default Media max upload size. 1428 1420 function dnd_cf7_max_upload() { 1429 1421 $max = wp_max_upload_size(); … … 1435 1427 1436 1428 return round( $max_mb, 2 ) . ' MB'; 1437 }1438 1439 // Generate cookie (Cookie expiration 12 Hours)1440 function dnd_cf7_generate_cookie() {1441 ?>1442 <script type="text/javascript">1443 function dnd_cf7_generateUUIDv4() {1444 const bytes = new Uint8Array(16);1445 crypto.getRandomValues(bytes);1446 bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 41447 bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 101448 const hex = Array.from(bytes, b => b.toString(16).padStart(2, "0")).join("");1449 return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, "$1-$2-$3-$4-$5");1450 }1451 1452 document.addEventListener("DOMContentLoaded", function() {1453 if ( ! document.cookie.includes("wpcf7_guest_user_id")) {1454 document.cookie = "wpcf7_guest_user_id=" + dnd_cf7_generateUUIDv4() + "; path=/; max-age=" + (12 * 3600) + "; samesite=Lax";1455 }1456 });1457 </script>1458 <?php1459 1429 } 1460 1430 -
drag-and-drop-multiple-file-upload-contact-form-7/trunk/readme.txt
r3465187 r3475121 5 5 Requires at least: 3.0.1 6 6 Tested up to: 6.9 7 Stable tag: 1.3.9. 57 Stable tag: 1.3.9.6 8 8 Requires PHP: 5.2.4 9 9 License: GPLv2 or later … … 95 95 96 96 * [Order Files for WooCommerce](https://www.codedropz.com/woo-order-files/) 97 An extension that attach files to existing WooCommerce orders, allowing both customers and admins to upload and manage files easily.97 An extension that attach files to existing **WooCommerce orders**, allowing both customers and admins to upload and manage files easily. 98 98 99 99 * [Easy File Upload & Approval](https://wordpress.org/plugins/easy-file-upload-approval/) … … 185 185 186 186 == Changelog == 187 = 1.3.9.6 = 188 - New : Replaced cookies with localStorage for unique upload folder generation. 189 - Security : Unauthenticated Arbitrary File Upload (Reported by Thomas Sanzey via WordFence) - user able to upload "php5 - php8" for non ascii filename by bypassing extensions present in the blacklists. 190 187 191 = 1.3.9.5 = 188 192 - Hot Fix: Minor spelling mistakes.
Note: See TracChangeset
for help on using the changeset viewer.