WP Htaccess Editor - Version 1.5

Version Description

Download this release

Release Info

Developer WebFactory
Plugin Icon 128x128 WP Htaccess Editor
Version 1.5
Comparing to
See all releases

Code changes from version 1.3.0 to 1.5

css/sweetalert2.min.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*
2
+ SweetAlert2
3
+ https://github.com/sweetalert2/sweetalert2
4
+ MIT License
5
+ */
6
+
7
+ @-webkit-keyframes swal2-show{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes swal2-show{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}100%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}100%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}50%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}80%{margin-top:-.375em;-webkit-transform:scale(1.15);transform:scale(1.15)}100%{margin-top:0;-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}50%{margin-top:1.625em;-webkit-transform:scale(.4);transform:scale(.4);opacity:0}80%{margin-top:-.375em;-webkit-transform:scale(1.15);transform:scale(1.15)}100%{margin-top:0;-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}body.swal2-toast-shown.swal2-has-input>.swal2-container>.swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-shown.swal2-has-input>.swal2-container>.swal2-toast .swal2-actions{flex:1;align-self:stretch;justify-content:flex-end;height:2.2em}body.swal2-toast-shown.swal2-has-input>.swal2-container>.swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-shown.swal2-has-input>.swal2-container>.swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-shown.swal2-has-input>.swal2-container>.swal2-toast .swal2-validationerror{font-size:1em}body.swal2-toast-shown>.swal2-container{position:fixed;background-color:transparent}body.swal2-toast-shown>.swal2-container.swal2-shown{background-color:transparent}body.swal2-toast-shown>.swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-toast-shown>.swal2-container.swal2-top-end,body.swal2-toast-shown>.swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown>.swal2-container.swal2-top-left,body.swal2-toast-shown>.swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown>.swal2-container.swal2-center-left,body.swal2-toast-shown>.swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-toast-shown>.swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}body.swal2-toast-shown>.swal2-container.swal2-center-end,body.swal2-toast-shown>.swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-toast-shown>.swal2-container.swal2-bottom-left,body.swal2-toast-shown>.swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown>.swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-toast-shown>.swal2-container.swal2-bottom-end,body.swal2-toast-shown>.swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;box-shadow:0 0 .625em #d9d9d9;overflow-y:hidden}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-close{position:initial}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon-text{font-size:2em;font-weight:700;line-height:1em}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 .0625em #fff,0 0 0 .125em rgba(50,100,150,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:2em;height:2.8125em;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.25em;left:-.9375em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:2em 2em;transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;-webkit-transform-origin:0 2em;transform-origin:0 2em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:showSweetToast .5s;animation:showSweetToast .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:hideSweetToast .2s forwards;animation:hideSweetToast .2s forwards}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:animate-toast-success-tip .75s;animation:animate-toast-success-tip .75s}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:animate-toast-success-long .75s;animation:animate-toast-success-long .75s}@-webkit-keyframes showSweetToast{0%{-webkit-transform:translateY(-.625em) rotateZ(2deg);transform:translateY(-.625em) rotateZ(2deg);opacity:0}33%{-webkit-transform:translateY(0) rotateZ(-2deg);transform:translateY(0) rotateZ(-2deg);opacity:.5}66%{-webkit-transform:translateY(.3125em) rotateZ(2deg);transform:translateY(.3125em) rotateZ(2deg);opacity:.7}100%{-webkit-transform:translateY(0) rotateZ(0);transform:translateY(0) rotateZ(0);opacity:1}}@keyframes showSweetToast{0%{-webkit-transform:translateY(-.625em) rotateZ(2deg);transform:translateY(-.625em) rotateZ(2deg);opacity:0}33%{-webkit-transform:translateY(0) rotateZ(-2deg);transform:translateY(0) rotateZ(-2deg);opacity:.5}66%{-webkit-transform:translateY(.3125em) rotateZ(2deg);transform:translateY(.3125em) rotateZ(2deg);opacity:.7}100%{-webkit-transform:translateY(0) rotateZ(0);transform:translateY(0) rotateZ(0);opacity:1}}@-webkit-keyframes hideSweetToast{0%{opacity:1}33%{opacity:.5}100%{-webkit-transform:rotateZ(1deg);transform:rotateZ(1deg);opacity:0}}@keyframes hideSweetToast{0%{opacity:1}33%{opacity:.5}100%{-webkit-transform:rotateZ(1deg);transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes animate-toast-success-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes animate-toast-success-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes animate-toast-success-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes animate-toast-success-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-shown{top:auto;right:auto;bottom:auto;left:auto;background-color:transparent}body.swal2-no-backdrop .swal2-shown>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:10px;background-color:transparent;z-index:1060;overflow-x:hidden;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem;box-sizing:border-box}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-popup .swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-popup .swal2-title{display:block;position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-popup .swal2-actions{align-items:center;justify-content:center;margin:1.25em auto 0}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-confirm{width:2.5em;height:2.5em;margin:.46875em;padding:0;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;box-sizing:border-box;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-popup .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{display:inline-block;width:15px;height:15px;margin-left:5px;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff;content:'';-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal}.swal2-popup .swal2-styled{margin:0 .3125em;padding:.625em 2em;font-weight:500;box-shadow:none}.swal2-popup .swal2-styled:not([disabled]){cursor:pointer}.swal2-popup .swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-popup .swal2-styled::-moz-focus-inner{border:0}.swal2-popup .swal2-footer{justify-content:center;margin:1.25em 0 0;padding-top:1em;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-popup .swal2-image{max-width:100%;margin:1.25em auto}.swal2-popup .swal2-close{position:absolute;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;transition:color .1s ease-out;border:none;border-radius:0;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer;overflow:hidden}.swal2-popup .swal2-close:hover{-webkit-transform:none;transform:none;color:#f27474}.swal2-popup>.swal2-checkbox,.swal2-popup>.swal2-file,.swal2-popup>.swal2-input,.swal2-popup>.swal2-radio,.swal2-popup>.swal2-select,.swal2-popup>.swal2-textarea{display:none}.swal2-popup .swal2-content{justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:300;line-height:normal;word-wrap:break-word}.swal2-popup #swal2-content{text-align:center}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-radio,.swal2-popup .swal2-select,.swal2-popup .swal2-textarea{margin:1em auto}.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-textarea{width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;font-size:1.125em;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);box-sizing:border-box}.swal2-popup .swal2-file.swal2-inputerror,.swal2-popup .swal2-input.swal2-inputerror,.swal2-popup .swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-popup .swal2-file:focus,.swal2-popup .swal2-input:focus,.swal2-popup .swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-popup .swal2-file::-webkit-input-placeholder,.swal2-popup .swal2-input::-webkit-input-placeholder,.swal2-popup .swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-popup .swal2-file:-ms-input-placeholder,.swal2-popup .swal2-input:-ms-input-placeholder,.swal2-popup .swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::-ms-input-placeholder,.swal2-popup .swal2-input::-ms-input-placeholder,.swal2-popup .swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::placeholder,.swal2-popup .swal2-input::placeholder,.swal2-popup .swal2-textarea::placeholder{color:#ccc}.swal2-popup .swal2-range input{width:80%}.swal2-popup .swal2-range output{width:20%;font-weight:600;text-align:center}.swal2-popup .swal2-range input,.swal2-popup .swal2-range output{height:2.625em;margin:1em auto;padding:0;font-size:1.125em;line-height:2.625em}.swal2-popup .swal2-input{height:2.625em;padding:.75em}.swal2-popup .swal2-input[type=number]{max-width:10em}.swal2-popup .swal2-file{font-size:1.125em}.swal2-popup .swal2-textarea{height:6.75em;padding:.75em}.swal2-popup .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;color:#545454;font-size:1.125em}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-radio{align-items:center;justify-content:center}.swal2-popup .swal2-checkbox label,.swal2-popup .swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-popup .swal2-checkbox input,.swal2-popup .swal2-radio input{margin:0 .4em}.swal2-popup .swal2-validationerror{display:none;align-items:center;justify-content:center;padding:.625em;background:#f0f0f0;color:#666;font-size:1em;font-weight:300;overflow:hidden}.swal2-popup .swal2-validationerror::before{display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center;content:'!';zoom:normal}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;border:.25em solid transparent;border-radius:50%;line-height:5em;cursor:default;box-sizing:content-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;zoom:normal}.swal2-icon-text{font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:3.75em 3.75em;transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 3.75em;transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;top:-.25em;left:-.25em;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%;z-index:2;box-sizing:content-box}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;top:.5em;left:1.625em;width:.4375em;height:5.625em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);z-index:1}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;height:.3125em;border-radius:.125em;background-color:#a5dc86;z-index:2}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-progresssteps{align-items:center;margin:0 0 1.25em;padding:0;font-weight:600}.swal2-progresssteps li{display:inline-block;position:relative}.swal2-progresssteps .swal2-progresscircle{width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center;z-index:20}.swal2-progresssteps .swal2-progresscircle:first-child{margin-left:0}.swal2-progresssteps .swal2-progresscircle:last-child{margin-right:0}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep{background:#3085d6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progresscircle{background:#add8e6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progressline{background:#add8e6}.swal2-progresssteps .swal2-progressline{width:2.5em;height:.4em;margin:0 -1px;background:#3085d6;z-index:10}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}[dir=rtl] .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}
css/wp-htaccess-editor.css ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WP Htaccess Editor
3
+ * (c) WebFactory Ltd, 2018-2019
4
+ */
5
+
6
+ .tools_page_wp-htaccess-editor .card {
7
+ padding: 1em 2em 1em 2em;
8
+ width: 520px;
9
+ }
10
+
11
+ .tools_page_wp-htaccess-editor .toggle-card {
12
+ position: absolute;
13
+ right: 2em;
14
+ top: 2.2em;
15
+ text-decoration: none;
16
+ }
17
+
18
+ .tools_page_wp-htaccess-editor .card.collapsed p,
19
+ .tools_page_wp-htaccess-editor .card.collapsed b,
20
+ .tools_page_wp-htaccess-editor .card.collapsed ul {
21
+ display: none;
22
+ }
23
+
24
+ .tools_page_wp-htaccess-editor .textcenter {
25
+ text-align: center;
26
+ }
27
+
28
+ .tools_page_wp-htaccess-editor .button.disabled {
29
+ pointer-events: none;
30
+ cursor: not-allowed;
31
+ }
32
+
33
+ .tools_page_wp-htaccess-editor.wp-core-ui .button,
34
+ .tools_page_wp-htaccess-editor.wp-core-ui .button-primary,
35
+ .tools_page_wp-htaccess-editor.wp-core-ui .button-secondary {
36
+ border-radius: 0;
37
+ }
38
+
39
+ .tools_page_wp-htaccess-editor .button {
40
+ box-shadow: none;
41
+ text-shadow: none;
42
+ }
43
+
44
+ .tools_page_wp-htaccess-editor .plain-list {
45
+ margin-top: 5px;
46
+ list-style-type: circle;
47
+ list-style-position: inside;
48
+ }
49
+
50
+ .tools_page_wp-htaccess-editor .plain-list li {
51
+ text-indent: -18px;
52
+ padding-left: 23px;
53
+ line-height: 23px;
54
+ margin: 0;
55
+ }
56
+
57
+ #enable-editor-notice {
58
+ background-color: #dd3036e0;
59
+ width: 574px;
60
+ min-height: 300px;
61
+ height: calc(100vh - 400px);
62
+ position: absolute;
63
+ z-index: 10;
64
+ padding: 30px;
65
+ box-sizing: border-box;
66
+ text-align: center;
67
+ }
68
+
69
+ #enable-editor-notice h3 {
70
+ color: #fefefe;
71
+ line-height: 140%;
72
+ }
73
+
74
+ #enable-editor-notice a {
75
+ color: #111111;
76
+ }
77
+
78
+ #wphe-buttons .button {
79
+ margin-right: 15px;
80
+ }
81
+
82
+ .tools_page_wp-htaccess-editor .red {
83
+ color: #dd3036;
84
+ }
85
+
86
+ .tools_page_wp-htaccess-editor .green {
87
+ color: #1daf1d;
88
+ }
89
+
90
+ .tools_page_wp-htaccess-editor .dismiss-notice-rate {
91
+ vertical-align: bottom;
92
+ margin-left: 10px;
93
+ }
94
+
95
+ .tools_page_wp-htaccess-editor .swal2-container {
96
+ z-index: 99999;
97
+ }
98
+
99
+ .tools_page_wp-htaccess-editor .swal2-container.swal2-shown {
100
+ background-color: rgba(0,0,0,.6);
101
+ }
102
+
103
+ .tools_page_wp-htaccess-editor .swal2-popup .swal2-title {
104
+ line-height: 1;
105
+ }
106
+
107
+ .tools_page_wp-htaccess-editor code {
108
+ white-space: nowrap;
109
+ }
110
+
111
+ .tools_page_wp-htaccess-editor p {
112
+ line-height: 1.7;
113
+ }
114
+
115
+ .tools_page_wp-htaccess-editor .rotating {
116
+ -webkit-animation:spin 1.5s linear infinite;
117
+ -moz-animation:spin 1.5s linear infinite;
118
+ animation:spin 1.5s linear infinite;
119
+ }
120
+
121
+ .tools_page_wp-htaccess-editor .notice-error {
122
+ border-color: #dd3036;
123
+ }
124
+
125
+ .tools_page_wp-htaccess-editor .swal2-popup {
126
+ border-radius: 0;
127
+ }
128
+
129
+ #htaccess-editor-wrap .CodeMirror, #htaccess-editor-wrap textarea {
130
+ width: 100%;
131
+ max-width: 574px;
132
+ min-height: 300px;
133
+ height: calc(100vh - 400px);
134
+ border: 1px solid #ddd;
135
+ box-sizing: border-box;
136
+ }
137
+
138
+ #htaccess-editor-wrap {
139
+ margin-top: 20px;
140
+ }
141
+
142
+ @-moz-keyframes spin {
143
+ 100% {
144
+ -moz-transform: rotate(-360deg);
145
+ }
146
+ }
147
+ @-webkit-keyframes spin {
148
+ 100% {
149
+ -webkit-transform: rotate(-360deg);
150
+ }
151
+ }
152
+ @keyframes spin {
153
+ 100% {
154
+ -webkit-transform: rotate(-360deg); transform:rotate(-360deg);
155
+ }
156
+ }
img/loading-icon.png ADDED
Binary file
index.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- header('Location: ../../');
3
- exit();
4
- ?>
 
 
 
 
js/sweetalert2.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*
2
+ SweetAlert2
3
+ https://github.com/sweetalert2/sweetalert2
4
+ MIT License
5
+ */
6
+
7
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Sweetalert2=t()}(this,function(){"use strict";var q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},o=function(){function o(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(e,t,n){return t&&o(e.prototype,t),n&&o(e,n),e}}(),r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},i=function e(t,n,o){null===t&&(t=Function.prototype);var r=Object.getOwnPropertyDescriptor(t,n);if(void 0===r){var i=Object.getPrototypeOf(t);return null===i?void 0:e(i,n,o)}if("value"in r)return r.value;var a=r.get;return void 0!==a?a.call(o):void 0},a=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},u=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},M=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],o=!0,r=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(o=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);o=!0);}catch(e){r=!0,i=e}finally{try{!o&&s.return&&s.return()}finally{if(r)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t="SweetAlert2:",B=function(e){console.warn(t+" "+e)},H=function(e){console.error(t+" "+e)},n=[],l=function(e){-1===n.indexOf(e)&&(n.push(e),B(e))},I=function(e){return"function"==typeof e?e():e},R=function(e){return"object"===(void 0===e?"undefined":q(e))&&"function"==typeof e.then},e=Object.freeze({cancel:"cancel",backdrop:"overlay",close:"close",esc:"esc",timer:"timer"}),c=function(e){var t={};for(var n in e)t[e[n]]="swal2-"+e[n];return t},D=c(["container","shown","height-auto","iosfix","popup","modal","no-backdrop","toast","toast-shown","fade","show","hide","noanimation","close","title","header","content","actions","confirm","cancel","footer","icon","icon-text","image","input","has-input","file","range","select","radio","checkbox","textarea","inputerror","validationerror","progresssteps","activeprogressstep","progresscircle","progressline","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen"]),E=c(["success","warning","info","question","error"]),d={previousBodyPadding:null},p=function(e,t){return!!e.classList&&e.classList.contains(t)},N=function(e){if(e.focus(),"file"!==e.type){var t=e.value;e.value="",e.value=t}},f=function(e,t,n){e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach(function(t){e.forEach?e.forEach(function(e){n?e.classList.add(t):e.classList.remove(t)}):n?e.classList.add(t):e.classList.remove(t)}))},W=function(e,t){f(e,t,!0)},P=function(e,t){f(e,t,!1)},z=function(e,t){for(var n=0;n<e.childNodes.length;n++)if(p(e.childNodes[n],t))return e.childNodes[n]},U=function(e){e.style.opacity="",e.style.display=e.id===D.content?"block":"flex"},F=function(e){e.style.opacity="",e.style.display="none"},S=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},K=function(e){return e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},O=function(e,t){e.style.removeProperty?e.style.removeProperty(t):e.style.removeAttribute(t)},L=function(){return document.body.querySelector("."+D.container)},m=function(e){var t=L();return t?t.querySelector("."+e):null},Z=function(){return m(D.popup)},Q=function(){var e=Z();return Array.prototype.slice.call(e.querySelectorAll("."+D.icon))},Y=function(){return m(D.title)},$=function(){return m(D.content)},J=function(){return m(D.image)},X=function(){return m(D.progresssteps)},G=function(){return m(D.confirm)},ee=function(){return m(D.cancel)},te=function(){return m(D.actions)},ne=function(){return m(D.footer)},oe=function(){return m(D.close)},re=function(){var e=Array.prototype.slice.call(Z().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')).sort(function(e,t){return e=parseInt(e.getAttribute("tabindex")),(t=parseInt(t.getAttribute("tabindex")))<e?1:e<t?-1:0}),t=Array.prototype.slice.call(Z().querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable], audio[controls], video[controls]'));return function(e){for(var t=[],n=0;n<e.length;n++)-1===t.indexOf(e[n])&&t.push(e[n]);return t}(e.concat(t))},h=function(){return!document.body.classList.contains(D["toast-shown"])},g=function(){return document.body.classList.contains(D["toast-shown"])},v=function(){return"undefined"==typeof window||"undefined"==typeof document},y=('\n <div aria-labelledby="'+D.title+'" aria-describedby="'+D.content+'" class="'+D.popup+'" tabindex="-1">\n <div class="'+D.header+'">\n <ul class="'+D.progresssteps+'"></ul>\n <div class="'+D.icon+" "+E.error+'">\n <span class="swal2-x-mark"><span class="swal2-x-mark-line-left"></span><span class="swal2-x-mark-line-right"></span></span>\n </div>\n <div class="'+D.icon+" "+E.question+'">\n <span class="'+D["icon-text"]+'">?</span>\n </div>\n <div class="'+D.icon+" "+E.warning+'">\n <span class="'+D["icon-text"]+'">!</span>\n </div>\n <div class="'+D.icon+" "+E.info+'">\n <span class="'+D["icon-text"]+'">i</span>\n </div>\n <div class="'+D.icon+" "+E.success+'">\n <div class="swal2-success-circular-line-left"></div>\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n <div class="swal2-success-circular-line-right"></div>\n </div>\n <img class="'+D.image+'" />\n <h2 class="'+D.title+'" id="'+D.title+'"></h2>\n <button type="button" class="'+D.close+'">×</button>\n </div>\n <div class="'+D.content+'">\n <div id="'+D.content+'"></div>\n <input class="'+D.input+'" />\n <input type="file" class="'+D.file+'" />\n <div class="'+D.range+'">\n <input type="range" />\n <output></output>\n </div>\n <select class="'+D.select+'"></select>\n <div class="'+D.radio+'"></div>\n <label for="'+D.checkbox+'" class="'+D.checkbox+'">\n <input type="checkbox" />\n </label>\n <textarea class="'+D.textarea+'"></textarea>\n <div class="'+D.validationerror+'" id="'+D.validationerror+'"></div>\n </div>\n <div class="'+D.actions+'">\n <button type="button" class="'+D.confirm+'">OK</button>\n <button type="button" class="'+D.cancel+'">Cancel</button>\n </div>\n <div class="'+D.footer+'">\n </div>\n </div>\n').replace(/(^|\n)\s*/g,""),ie=function(e){var t=L();if(t&&(t.parentNode.removeChild(t),P([document.documentElement,document.body],[D["no-backdrop"],D["has-input"],D["toast-shown"]])),!v()){var n=document.createElement("div");n.className=D.container,n.innerHTML=y,("string"==typeof e.target?document.querySelector(e.target):e.target).appendChild(n);var o=Z(),r=$(),i=z(r,D.input),a=z(r,D.file),s=r.querySelector("."+D.range+" input"),u=r.querySelector("."+D.range+" output"),l=z(r,D.select),c=r.querySelector("."+D.checkbox+" input"),d=z(r,D.textarea);o.setAttribute("role",e.toast?"alert":"dialog"),o.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||o.setAttribute("aria-modal","true");var p=void 0,f=function(e){Ae.isVisible()&&p!==e.target.value&&Ae.resetValidationError(),p=e.target.value};return i.oninput=f,a.onchange=f,l.onchange=f,c.onchange=f,d.oninput=f,s.oninput=function(e){f(e),u.value=s.value},s.onchange=function(e){f(e),s.nextSibling.value=s.value},o}H("SweetAlert2 requires document to initialize")},ae=function(e,t){if(!e)return F(t);if("object"===(void 0===e?"undefined":q(e)))if(t.innerHTML="",0 in e)for(var n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0));else e&&(t.innerHTML=e);U(t)},b=function(){if(v())return!1;var e=document.createElement("div"),t={WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd oanimationend",animation:"animationend"};for(var n in t)if(t.hasOwnProperty(n)&&void 0!==e.style[n])return t[n];return!1}(),w=function(){null===d.previousBodyPadding&&document.body.scrollHeight>window.innerHeight&&(d.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=d.previousBodyPadding+function(){if("ontouchstart"in window||navigator.msMaxTouchPoints)return 0;var e=document.createElement("div");e.style.width="50px",e.style.height="50px",e.style.overflow="scroll",document.body.appendChild(e);var t=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),t}()+"px")},se={},C=function(e,n){var o=L(),t=Z();if(t){null!==e&&"function"==typeof e&&e(t),P(t,D.show),W(t,D.hide);var r=function(){var e,t;g()||(e=window.scrollX,t=window.scrollY,se.restoreFocusTimeout=setTimeout(function(){se.previousActiveElement&&se.previousActiveElement.focus&&(se.previousActiveElement.focus(),se.previousActiveElement=null)},100),void 0!==e&&void 0!==t&&window.scrollTo(e,t),se.keydownTarget.removeEventListener("keydown",se.keydownHandler,{capture:se.keydownListenerCapture}),se.keydownHandlerAdded=!1),o.parentNode&&o.parentNode.removeChild(o),P([document.documentElement,document.body],[D.shown,D["height-auto"],D["no-backdrop"],D["has-input"],D["toast-shown"]]),h()&&(null!==d.previousBodyPadding&&(document.body.style.paddingRight=d.previousBodyPadding,d.previousBodyPadding=null),function(){if(p(document.body,D.iosfix)){var e=parseInt(document.body.style.top,10);P(document.body,D.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}}()),null!==n&&"function"==typeof n&&setTimeout(function(){n()})};b&&!p(t,D.noanimation)?t.addEventListener(b,function e(){t.removeEventListener(b,e),p(t,D.hide)&&r()}):r()}};function k(e){var t=function e(){for(var t=arguments.length,n=Array(t),o=0;o<t;o++)n[o]=arguments[o];if(!(this instanceof e))return new(Function.prototype.bind.apply(e,[null].concat(n)));Object.getPrototypeOf(e).apply(this,n)};return t.prototype=r(Object.create(e.prototype),{constructor:t}),"function"==typeof Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e,t}var x={title:"",titleText:"",text:"",html:"",footer:"",type:null,toast:!1,customClass:"",target:"body",backdrop:!0,animation:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showCancelButton:!1,preConfirm:null,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:null,confirmButtonClass:null,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:null,cancelButtonClass:null,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusCancel:!1,showCloseButton:!1,closeButtonAriaLabel:"Close this dialog",showLoaderOnConfirm:!1,imageUrl:null,imageWidth:null,imageHeight:null,imageAlt:"",imageClass:null,timer:null,width:null,padding:null,background:null,input:null,inputPlaceholder:"",inputValue:"",inputOptions:{},inputAutoTrim:!0,inputClass:null,inputAttributes:{},inputValidator:null,grow:!1,position:"center",progressSteps:[],currentProgressStep:null,progressStepsDistance:null,onBeforeOpen:null,onAfterClose:null,onOpen:null,onClose:null,useRejections:!1,expectRejections:!1},A=["useRejections","expectRejections"],T=function(e){return x.hasOwnProperty(e)||"extraParams"===e},j=function(e){return-1!==A.indexOf(e)},ue=function(e){for(var t in e)T(t)||B('Unknown parameter "'+t+'"'),j(t)&&l('The parameter "'+t+'" is deprecated and will be removed in the next major release.')},_='"setDefaults" & "resetDefaults" methods are deprecated in favor of "mixin" method and will be removed in the next major release. For new projects, use "mixin". For past projects already using "setDefaults", support will be provided through an additional package.',V={};var le=[],ce=function(){var e=Z();e||Ae(""),e=Z();var t=te(),n=G(),o=ee();U(t),U(n),W([e,t],D.loading),n.disabled=!0,o.disabled=!0,e.setAttribute("data-loading",!0),e.setAttribute("aria-busy",!0),e.focus()},de=Object.freeze({isValidParameter:T,isDeprecatedParameter:j,argsToParams:function(n){var o={};switch(q(n[0])){case"string":["title","html","type"].forEach(function(e,t){switch(q(n[t])){case"string":o[e]=n[t];break;case"undefined":break;default:H("Unexpected type of "+e+'! Expected "string", got '+q(n[t]))}});break;case"object":r(o,n[0]);break;default:return H('Unexpected type of argument! Expected "string" or "object", got '+q(n[0])),!1}return o},adaptInputValidator:function(n){return function(e,t){return n.call(this,e,t).then(function(){},function(e){return e})}},close:C,closePopup:C,closeModal:C,closeToast:C,isVisible:function(){return!!Z()},clickConfirm:function(){return G().click()},clickCancel:function(){return ee().click()},getPopup:Z,getTitle:Y,getContent:$,getImage:J,getIcons:Q,getButtonsWrapper:function(){return l("swal.getButtonsWrapper() is deprecated and will be removed in the next major release, use swal.getActions() instead"),m(D.actions)},getActions:te,getConfirmButton:G,getCancelButton:ee,getFooter:ne,isLoading:function(){return Z().hasAttribute("data-loading")},fire:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return new(Function.prototype.bind.apply(this,[null].concat(t)))},mixin:function(n){return k(function(e){function t(){return s(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return a(t,e),o(t,[{key:"_main",value:function(e){return i(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_main",this).call(this,r({},n,e))}}]),t}(this))},queue:function(e){var i=this;le=e;var a=function(){le=[],document.body.removeAttribute("data-swal2-queue-step")},s=[];return new Promise(function(r,e){!function t(n,o){n<le.length?(document.body.setAttribute("data-swal2-queue-step",n),i(le[n]).then(function(e){void 0!==e.value?(s.push(e.value),t(n+1,o)):(a(),r({dismiss:e.dismiss}))})):(a(),r({value:s}))}(0)})},getQueueStep:function(){return document.body.getAttribute("data-swal2-queue-step")},insertQueueStep:function(e,t){return t&&t<le.length?le.splice(t,0,e):le.push(e)},deleteQueueStep:function(e){void 0!==le[e]&&le.splice(e,1)},showLoading:ce,enableLoading:ce,getTimerLeft:function(){return se.timeout&&se.timeout.getTimerLeft()}}),pe="function"==typeof Symbol?Symbol:function(){var t=0;function e(e){return"__"+e+"_"+Math.floor(1e9*Math.random())+"_"+ ++t+"__"}return e.iterator=e("Symbol.iterator"),e}(),fe="function"==typeof WeakMap?WeakMap:function(n,o,t){function e(){o(this,n,{value:pe("WeakMap")})}return e.prototype={delete:function(e){delete e[this[n]]},get:function(e){return e[this[n]]},has:function(e){return t.call(e,this[n])},set:function(e,t){o(e,this[n],{configurable:!0,value:t})}},e}(pe("WeakMap"),Object.defineProperty,{}.hasOwnProperty),me={promise:new fe,innerParams:new fe,domCache:new fe};function he(){var e=me.innerParams.get(this),t=me.domCache.get(this);e.showConfirmButton||(F(t.confirmButton),e.showCancelButton||F(t.actions)),P([t.popup,t.actions],D.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.cancelButton.disabled=!1}var ge=function e(t,n){var o,r,i;s(this,e);var a=n;this.start=function(){i=!0,r=new Date,o=setTimeout(t,a)},this.stop=function(){i=!1,clearTimeout(o),a-=new Date-r},this.getTimerLeft=function(){return i&&(this.stop(),this.start()),a},this.getStateRunning=function(){return i},this.start()},ve={email:function(e,t){return/^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(e)?Promise.resolve():Promise.reject(t&&t.validationMessage?t.validationMessage:"Invalid email address")},url:function(e,t){return/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/.test(e)?Promise.resolve():Promise.reject(t&&t.validationMessage?t.validationMessage:"Invalid URL")}};var ye=function(e){var t=L(),n=Z();null!==e.onBeforeOpen&&"function"==typeof e.onBeforeOpen&&e.onBeforeOpen(n),e.animation?(W(n,D.show),W(t,D.fade),P(n,D.hide)):P(n,D.fade),U(n),t.style.overflowY="hidden",b&&!p(n,D.noanimation)?n.addEventListener(b,function e(){n.removeEventListener(b,e),t.style.overflowY="auto"}):t.style.overflowY="auto",W([document.documentElement,document.body,t],D.shown),e.heightAuto&&e.backdrop&&!e.toast&&W([document.documentElement,document.body],D["height-auto"]),h()&&(w(),function(){if(/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream&&!p(document.body,D.iosfix)){var e=document.body.scrollTop;document.body.style.top=-1*e+"px",W(document.body,D.iosfix)}}()),g()||se.previousActiveElement||(se.previousActiveElement=document.activeElement),null!==e.onOpen&&"function"==typeof e.onOpen&&setTimeout(function(){e.onOpen(n)})};var be=Object.freeze({hideLoading:he,disableLoading:he,getInput:function(e){var t=me.innerParams.get(this),n=me.domCache.get(this);if(!(e=e||t.input))return null;switch(e){case"select":case"textarea":case"file":return z(n.content,D[e]);case"checkbox":return n.popup.querySelector("."+D.checkbox+" input");case"radio":return n.popup.querySelector("."+D.radio+" input:checked")||n.popup.querySelector("."+D.radio+" input:first-child");case"range":return n.popup.querySelector("."+D.range+" input");default:return z(n.content,D.input)}},enableButtons:function(){var e=me.domCache.get(this);e.confirmButton.disabled=!1,e.cancelButton.disabled=!1},disableButtons:function(){var e=me.domCache.get(this);e.confirmButton.disabled=!0,e.cancelButton.disabled=!0},enableConfirmButton:function(){me.domCache.get(this).confirmButton.disabled=!1},disableConfirmButton:function(){me.domCache.get(this).confirmButton.disabled=!0},enableInput:function(){var e=this.getInput();if(!e)return!1;if("radio"===e.type)for(var t=e.parentNode.parentNode.querySelectorAll("input"),n=0;n<t.length;n++)t[n].disabled=!1;else e.disabled=!1},disableInput:function(){var e=this.getInput();if(!e)return!1;if(e&&"radio"===e.type)for(var t=e.parentNode.parentNode.querySelectorAll("input"),n=0;n<t.length;n++)t[n].disabled=!0;else e.disabled=!0},showValidationError:function(e){var t=me.domCache.get(this);t.validationError.innerHTML=e;var n=window.getComputedStyle(t.popup);t.validationError.style.marginLeft="-"+n.getPropertyValue("padding-left"),t.validationError.style.marginRight="-"+n.getPropertyValue("padding-right"),U(t.validationError);var o=this.getInput();o&&(o.setAttribute("aria-invalid",!0),o.setAttribute("aria-describedBy",D.validationerror),N(o),W(o,D.inputerror))},resetValidationError:function(){var e=me.domCache.get(this);e.validationError&&F(e.validationError);var t=this.getInput();t&&(t.removeAttribute("aria-invalid"),t.removeAttribute("aria-describedBy"),P(t,D.inputerror))},_main:function(e){var T=this;ue(e);var j=r({},x,e);!function(r){r.inputValidator||Object.keys(ve).forEach(function(e){r.input===e&&(r.inputValidator=r.expectRejections?ve[e]:Ae.adaptInputValidator(ve[e]))}),(!r.target||"string"==typeof r.target&&!document.querySelector(r.target)||"string"!=typeof r.target&&!r.target.appendChild)&&(B('Target parameter is not valid, defaulting to "body"'),r.target="body");var e=void 0,t=Z(),n="string"==typeof r.target?document.querySelector(r.target):r.target;e=t&&n&&t.parentNode!==n.parentNode?ie(r):t||ie(r),r.width&&(e.style.width="number"==typeof r.width?r.width+"px":r.width),r.padding&&(e.style.padding="number"==typeof r.padding?r.padding+"px":r.padding),r.background&&(e.style.background=r.background);for(var o=window.getComputedStyle(e).getPropertyValue("background-color"),i=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix"),a=0;a<i.length;a++)i[a].style.backgroundColor=o;var s=L(),u=Y(),l=$().querySelector("#"+D.content),c=te(),d=G(),p=ee(),f=oe(),m=ne();if(r.titleText?u.innerText=r.titleText:r.title&&(u.innerHTML=r.title.split("\n").join("<br />")),"string"==typeof r.backdrop?L().style.background=r.backdrop:r.backdrop||W([document.documentElement,document.body],D["no-backdrop"]),r.html?ae(r.html,l):r.text?(l.textContent=r.text,U(l)):F(l),r.position in D?W(s,D[r.position]):(B('The "position" parameter is not valid, defaulting to "center"'),W(s,D.center)),r.grow&&"string"==typeof r.grow){var h="grow-"+r.grow;h in D&&W(s,D[h])}"function"==typeof r.animation&&(r.animation=r.animation.call()),r.showCloseButton?(f.setAttribute("aria-label",r.closeButtonAriaLabel),U(f)):F(f),e.className=D.popup,r.toast?(W([document.documentElement,document.body],D["toast-shown"]),W(e,D.toast)):W(e,D.modal),r.customClass&&W(e,r.customClass);var g=X(),v=parseInt(null===r.currentProgressStep?Ae.getQueueStep():r.currentProgressStep,10);r.progressSteps&&r.progressSteps.length?(U(g),S(g),v>=r.progressSteps.length&&B("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),r.progressSteps.forEach(function(e,t){var n=document.createElement("li");if(W(n,D.progresscircle),n.innerHTML=e,t===v&&W(n,D.activeprogressstep),g.appendChild(n),t!==r.progressSteps.length-1){var o=document.createElement("li");W(o,D.progressline),r.progressStepsDistance&&(o.style.width=r.progressStepsDistance),g.appendChild(o)}})):F(g);for(var y=Q(),b=0;b<y.length;b++)F(y[b]);if(r.type){var w=!1;for(var C in E)if(r.type===C){w=!0;break}if(!w)return H("Unknown alert type: "+r.type);var k=e.querySelector("."+D.icon+"."+E[r.type]);U(k),r.animation&&W(k,"swal2-animate-"+r.type+"-icon")}var x=J();if(r.imageUrl?(x.setAttribute("src",r.imageUrl),x.setAttribute("alt",r.imageAlt),U(x),r.imageWidth?x.setAttribute("width",r.imageWidth):x.removeAttribute("width"),r.imageHeight?x.setAttribute("height",r.imageHeight):x.removeAttribute("height"),x.className=D.image,r.imageClass&&W(x,r.imageClass)):F(x),r.showCancelButton?p.style.display="inline-block":F(p),r.showConfirmButton?O(d,"display"):F(d),r.showConfirmButton||r.showCancelButton?U(c):F(c),d.innerHTML=r.confirmButtonText,p.innerHTML=r.cancelButtonText,d.setAttribute("aria-label",r.confirmButtonAriaLabel),p.setAttribute("aria-label",r.cancelButtonAriaLabel),d.className=D.confirm,W(d,r.confirmButtonClass),p.className=D.cancel,W(p,r.cancelButtonClass),r.buttonsStyling){W([d,p],D.styled),r.confirmButtonColor&&(d.style.backgroundColor=r.confirmButtonColor),r.cancelButtonColor&&(p.style.backgroundColor=r.cancelButtonColor);var A=window.getComputedStyle(d).getPropertyValue("background-color");d.style.borderLeftColor=A,d.style.borderRightColor=A}else P([d,p],D.styled),d.style.backgroundColor=d.style.borderLeftColor=d.style.borderRightColor="",p.style.backgroundColor=p.style.borderLeftColor=p.style.borderRightColor="";ae(r.footer,m),!0===r.animation?P(e,D.noanimation):W(e,D.noanimation),r.showLoaderOnConfirm&&!r.preConfirm&&B("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request")}(j),Object.freeze(j),me.innerParams.set(this,j),se.timeout&&(se.timeout.stop(),delete se.timeout),clearTimeout(se.restoreFocusTimeout);var _={popup:Z(),container:L(),content:$(),actions:te(),confirmButton:G(),cancelButton:ee(),closeButton:oe(),validationError:m(D.validationerror),progressSteps:X()};me.domCache.set(this,_);var V=this.constructor;return new Promise(function(t,n){var o=function(e){V.closePopup(j.onClose,j.onAfterClose),j.useRejections?t(e):t({value:e})},l=function(e){V.closePopup(j.onClose,j.onAfterClose),j.useRejections?n(e):t({dismiss:e})},c=function(e){V.closePopup(j.onClose,j.onAfterClose),n(e)};j.timer&&(se.timeout=new ge(function(){l("timer"),delete se.timeout},j.timer)),j.input&&setTimeout(function(){var e=T.getInput();e&&N(e)},0);for(var d=function(t){if(j.showLoaderOnConfirm&&V.showLoading(),j.preConfirm){T.resetValidationError();var e=Promise.resolve().then(function(){return j.preConfirm(t,j.extraParams)});j.expectRejections?e.then(function(e){return o(e||t)},function(e){T.hideLoading(),e&&T.showValidationError(e)}):e.then(function(e){K(_.validationError)||!1===e?T.hideLoading():o(e||t)},function(e){return c(e)})}else o(t)},e=function(e){var t=e||window.event,n=t.target||t.srcElement,o=_.confirmButton,r=_.cancelButton,i=o&&(o===n||o.contains(n)),a=r&&(r===n||r.contains(n));switch(t.type){case"click":if(i&&V.isVisible())if(T.disableButtons(),j.input){var s=function(){var e=T.getInput();if(!e)return null;switch(j.input){case"checkbox":return e.checked?1:0;case"radio":return e.checked?e.value:null;case"file":return e.files.length?e.files[0]:null;default:return j.inputAutoTrim?e.value.trim():e.value}}();if(j.inputValidator){T.disableInput();var u=Promise.resolve().then(function(){return j.inputValidator(s,j.extraParams)});j.expectRejections?u.then(function(){T.enableButtons(),T.enableInput(),d(s)},function(e){T.enableButtons(),T.enableInput(),e&&T.showValidationError(e)}):u.then(function(e){T.enableButtons(),T.enableInput(),e?T.showValidationError(e):d(s)},function(e){return c(e)})}else d(s)}else d(!0);else a&&V.isVisible()&&(T.disableButtons(),l(V.DismissReason.cancel))}},r=_.popup.querySelectorAll("button"),i=0;i<r.length;i++)r[i].onclick=e,r[i].onmouseover=e,r[i].onmouseout=e,r[i].onmousedown=e;if(_.closeButton.onclick=function(){l(V.DismissReason.close)},j.toast)_.popup.onclick=function(e){j.showConfirmButton||j.showCancelButton||j.showCloseButton||j.input||(V.closePopup(j.onClose,j.onAfterClose),l(V.DismissReason.close))};else{var a=!1;_.popup.onmousedown=function(){_.container.onmouseup=function(e){_.container.onmouseup=void 0,e.target===_.container&&(a=!0)}},_.container.onmousedown=function(){_.popup.onmouseup=function(e){_.popup.onmouseup=void 0,(e.target===_.popup||_.popup.contains(e.target))&&(a=!0)}},_.container.onclick=function(e){a?a=!1:e.target===_.container&&I(j.allowOutsideClick)&&l(V.DismissReason.backdrop)}}j.reverseButtons?_.confirmButton.parentNode.insertBefore(_.cancelButton,_.confirmButton):_.confirmButton.parentNode.insertBefore(_.confirmButton,_.cancelButton);var s=function(e,t){for(var n=re(j.focusCancel),o=0;o<n.length;o++){(e+=t)===n.length?e=0:-1===e&&(e=n.length-1);var r=n[e];if(K(r))return r.focus()}_.popup.focus()};se.keydownHandlerAdded&&(se.keydownTarget.removeEventListener("keydown",se.keydownHandler,{capture:se.keydownListenerCapture}),se.keydownHandlerAdded=!1),j.toast||(se.keydownHandler=function(e){return function(e,t){if(t.stopKeydownPropagation&&e.stopPropagation(),"Enter"!==e.key||e.isComposing)if("Tab"===e.key){for(var n=e.target||e.srcElement,o=re(t.focusCancel),r=-1,i=0;i<o.length;i++)if(n===o[i]){r=i;break}e.shiftKey?s(r,-1):s(r,1),e.stopPropagation(),e.preventDefault()}else-1!==["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Left","Right","Up","Down"].indexOf(e.key)?document.activeElement===_.confirmButton&&K(_.cancelButton)?_.cancelButton.focus():document.activeElement===_.cancelButton&&K(_.confirmButton)&&_.confirmButton.focus():"Escape"!==e.key&&"Esc"!==e.key||!0!==I(t.allowEscapeKey)||l(V.DismissReason.esc);else if(e.target&&T.getInput()&&e.target.outerHTML===T.getInput().outerHTML){if(-1!==["textarea","file"].indexOf(t.input))return;V.clickConfirm(),e.preventDefault()}}(e,j)},se.keydownTarget=j.keydownListenerCapture?window:_.popup,se.keydownListenerCapture=j.keydownListenerCapture,se.keydownTarget.addEventListener("keydown",se.keydownHandler,{capture:se.keydownListenerCapture}),se.keydownHandlerAdded=!0),T.enableButtons(),T.hideLoading(),T.resetValidationError(),j.input&&W(document.body,D["has-input"]);for(var u=["input","file","range","select","radio","checkbox","textarea"],p=void 0,f=0;f<u.length;f++){var m=D[u[f]],h=z(_.content,m);if(p=T.getInput(u[f])){for(var g in p.attributes)if(p.attributes.hasOwnProperty(g)){var v=p.attributes[g].name;"type"!==v&&"value"!==v&&p.removeAttribute(v)}for(var y in j.inputAttributes)p.setAttribute(y,j.inputAttributes[y])}h.className=m,j.inputClass&&W(h,j.inputClass),F(h)}var b=void 0;switch(j.input){case"text":case"email":case"password":case"number":case"tel":case"url":(p=z(_.content,D.input)).value=j.inputValue,p.placeholder=j.inputPlaceholder,p.type=j.input,U(p);break;case"file":(p=z(_.content,D.file)).placeholder=j.inputPlaceholder,p.type=j.input,U(p);break;case"range":var w=z(_.content,D.range),C=w.querySelector("input"),k=w.querySelector("output");C.value=j.inputValue,C.type=j.input,k.value=j.inputValue,U(w);break;case"select":var x=z(_.content,D.select);if(x.innerHTML="",j.inputPlaceholder){var A=document.createElement("option");A.innerHTML=j.inputPlaceholder,A.value="",A.disabled=!0,A.selected=!0,x.appendChild(A)}b=function(e){e.forEach(function(e){var t=M(e,2),n=t[0],o=t[1],r=document.createElement("option");r.value=n,r.innerHTML=o,j.inputValue.toString()===n.toString()&&(r.selected=!0),x.appendChild(r)}),U(x),x.focus()};break;case"radio":var B=z(_.content,D.radio);B.innerHTML="",b=function(e){e.forEach(function(e){var t=M(e,2),n=t[0],o=t[1],r=document.createElement("input"),i=document.createElement("label");r.type="radio",r.name=D.radio,r.value=n,j.inputValue.toString()===n.toString()&&(r.checked=!0),i.innerHTML=o,i.insertBefore(r,i.firstChild),B.appendChild(i)}),U(B);var t=B.querySelectorAll("input");t.length&&t[0].focus()};break;case"checkbox":var E=z(_.content,D.checkbox),P=T.getInput("checkbox");P.type="checkbox",P.value=1,P.id=D.checkbox,P.checked=Boolean(j.inputValue);var S=E.getElementsByTagName("span");S.length&&E.removeChild(S[0]),(S=document.createElement("span")).innerHTML=j.inputPlaceholder,E.appendChild(S),U(E);break;case"textarea":var O=z(_.content,D.textarea);O.value=j.inputValue,O.placeholder=j.inputPlaceholder,U(O);break;case null:break;default:H('Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "'+j.input+'"')}if("select"===j.input||"radio"===j.input){var L=function(e){return b((t=e,n=[],"undefined"!=typeof Map&&t instanceof Map?t.forEach(function(e,t){n.push([t,e])}):Object.keys(t).forEach(function(e){n.push([e,t[e]])}),n));var t,n};R(j.inputOptions)?(V.showLoading(),j.inputOptions.then(function(e){T.hideLoading(),L(e)})):"object"===q(j.inputOptions)?L(j.inputOptions):H("Unexpected type of inputOptions! Expected object, Map or Promise, got "+q(j.inputOptions))}else-1!==["text","email","number","tel","textarea"].indexOf(j.input)&&R(j.inputValue)&&(V.showLoading(),F(p),j.inputValue.then(function(e){p.value="number"===j.input?parseFloat(e)||0:e+"",U(p),T.hideLoading()}).catch(function(e){H("Error in inputValue promise: "+e),p.value="",U(p),T.hideLoading()}));ye(j),j.toast||(I(j.allowEnterKey)?j.focusCancel&&K(_.cancelButton)?_.cancelButton.focus():j.focusConfirm&&K(_.confirmButton)?_.confirmButton.focus():s(-1,1):document.activeElement&&document.activeElement.blur()),_.container.scrollTop=0})}}),we=void 0;function Ce(){if("undefined"!=typeof window){"undefined"==typeof Promise&&H("This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)");for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];if(void 0===t[0])return H("SweetAlert2 expects at least 1 attribute!"),!1;we=this;var o=Object.freeze(this.constructor.argsToParams(t));Object.defineProperties(this,{params:{value:o,writable:!1,enumerable:!0}});var r=this._main(this.params);me.promise.set(this,r)}}Ce.prototype.then=function(e,t){return me.promise.get(this).then(e,t)},Ce.prototype.catch=function(e){return me.promise.get(this).catch(e)},Ce.prototype.finally=function(e){return me.promise.get(this).finally(e)},r(Ce.prototype,be),r(Ce,de),Object.keys(be).forEach(function(t){Ce[t]=function(){var e;if(we)return(e=we)[t].apply(e,arguments)}}),Ce.DismissReason=e,Ce.noop=function(){},Ce.version="7.25.0";var ke,xe,Ae=k((ke=Ce,xe=function(e){function t(){return s(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return a(t,ke),o(t,[{key:"_main",value:function(e){return i(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"_main",this).call(this,r({},V,e))}}],[{key:"setDefaults",value:function(t){if(l(_),!t||"object"!==(void 0===t?"undefined":q(t)))throw new TypeError("SweetAlert2: The argument for setDefaults() is required and has to be a object");ue(t),Object.keys(t).forEach(function(e){ke.isValidParameter(e)&&(V[e]=t[e])})}},{key:"resetDefaults",value:function(){l(_),V={}}}]),t}(),"undefined"!=typeof window&&"object"===q(window._swalDefaults)&&xe.setDefaults(window._swalDefaults),xe));return Ae.default=Ae}),"undefined"!=typeof window&&window.Sweetalert2&&(window.swal=window.sweetAlert=window.Swal=window.SweetAlert=window.Sweetalert2);
js/wp-htaccess-editor-pointers.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * WP Htaccess Editor
3
+ * Backend GUI pointers
4
+ * (c) Web factory Ltd, 2017 - 2018
5
+ */
6
+
7
+ jQuery(document).ready(function($){
8
+ if (typeof wp_htaccess_editor_pointers == 'undefined') {
9
+ return;
10
+ }
11
+
12
+ $.each(wp_htaccess_editor_pointers, function(index, pointer) {
13
+ if (index.charAt(0) == '_') {
14
+ return true;
15
+ }
16
+ $(pointer.target).pointer({
17
+ content: '<h3>WP Htaccess Editor</h3><p>' + pointer.content + '</p>',
18
+ pointerWidth: 380,
19
+ position: {
20
+ edge: pointer.edge,
21
+ align: pointer.align
22
+ },
23
+ close: function() {
24
+ $.get(ajaxurl, {
25
+ notice_name: index,
26
+ _ajax_nonce: wp_htaccess_editor_pointers._nonce_dismiss_pointer,
27
+ action: 'wp_htaccess_editor_dismiss_notice'
28
+ });
29
+ }
30
+ }).pointer('open');
31
+ });
32
+ });
js/wp-htaccess-editor.js ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * WP Htaccess Editor
3
+ * (c) WebFactory Ltd, 2018-2019
4
+ */
5
+
6
+
7
+ jQuery(document).ready(function($) {
8
+ // init code editor
9
+ wp.themePluginEditor.init($('#htaccess-editor-wrap'), wp_htaccess_editor.cm_settings);
10
+ wp.themePluginEditor.themeOrPlugin = 'theme';
11
+
12
+
13
+ // display a message while an action is performed
14
+ function block_ui(message) {
15
+ tmp = swal({
16
+ text: message,
17
+ type: false,
18
+ imageUrl: wp_htaccess_editor.loading_icon_url,
19
+ onOpen: () => { $(swal.getImage()).addClass('rotating'); },
20
+ imageWidth: 100,
21
+ imageHeight: 100,
22
+ imageAlt: message,
23
+ allowOutsideClick: false,
24
+ allowEscapeKey: false,
25
+ allowEnterKey: false,
26
+ showConfirmButton: false,
27
+ width: 600
28
+ });
29
+
30
+ return tmp;
31
+ } // block_ui
32
+
33
+
34
+ // display dialog to confirm action
35
+ function confirm_action(title, question, btn_confirm, btn_cancel) {
36
+ tmp = swal({
37
+ title: title,
38
+ type: 'question',
39
+ html: question,
40
+ showCancelButton: true,
41
+ focusConfirm: false,
42
+ confirmButtonText: btn_confirm,
43
+ cancelButtonText: btn_cancel,
44
+ confirmButtonColor: '#dd3036',
45
+ width: 600
46
+ });
47
+
48
+ return tmp;
49
+ } // confirm_action
50
+
51
+
52
+ // dismiss notice / pointer
53
+ $('.wphe-dismiss-notice').on('click', function(e) {
54
+ notice_name = $(this).data('notice');
55
+ if (!notice_name) {
56
+ return true;
57
+ }
58
+
59
+ $.get(ajaxurl, { notice_name: notice_name,
60
+ _ajax_nonce: wp_htaccess_editor.nonce_dismiss_notice,
61
+ action: 'wp_htaccess_editor_dismiss_notice'
62
+ });
63
+
64
+ $(this).parents('.notice-wrapper').fadeOut();
65
+
66
+ if (notice_name == 'editor-warning') {
67
+ $('#wphe-buttons').fadeIn();
68
+ }
69
+
70
+ e.preventDefault();
71
+ return false;
72
+ }); // dismiss notice
73
+
74
+
75
+ // collapse / expand card
76
+ $('.card').on('click', '.toggle-card', function(e) {
77
+ e.preventDefault();
78
+
79
+ card = $(this).parents('.card').toggleClass('collapsed');
80
+ $('.dashicons', this).toggleClass('dashicons-arrow-up-alt2').toggleClass('dashicons-arrow-down-alt2');
81
+ $(this).blur();
82
+
83
+ cards = localStorage.getItem('wp-htaccess-editor-cards');
84
+ if (cards == null) {
85
+ cards = new Object();
86
+ } else {
87
+ cards = JSON.parse(cards);
88
+ }
89
+
90
+ if (card.hasClass('collapsed')) {
91
+ cards[card.attr('id')] = 'collapsed';
92
+ } else {
93
+ cards[card.attr('id')] = 'expanded';
94
+ }
95
+ localStorage.setItem('wp-htaccess-editor-cards', JSON.stringify(cards));
96
+
97
+ return false;
98
+ }); // toggle-card
99
+
100
+
101
+ // init cards; collapse those that need collapsing
102
+ cards = localStorage.getItem('wp-htaccess-editor-cards');
103
+ if (cards != null) {
104
+ cards = JSON.parse(cards);
105
+ }
106
+ $.each(cards, function(card_name, card_value) {
107
+ if (card_value == 'collapsed') {
108
+ $('a.toggle-card', '#' + card_name).trigger('click');
109
+ }
110
+ });
111
+
112
+
113
+ // save htaccess file
114
+ $('#wphe_save_htaccess').click(function(e) {
115
+ e.preventDefault();
116
+
117
+ block_ui(wp_htaccess_editor.saving);
118
+ $.post({
119
+ url: ajaxurl,
120
+ data: {
121
+ action: 'wp_htaccess_editor_do_action',
122
+ _ajax_nonce: wp_htaccess_editor.nonce_do_action,
123
+ subaction: 'save_htaccess',
124
+ new_content: wp.themePluginEditor.instance.codemirror.getValue()
125
+ }
126
+ }).always(function(data) {
127
+ swal.close();
128
+ }).done(function(data) {
129
+ if (typeof data.success != 'undefined' && data.success) {
130
+ // TODO: bug; does not work if user continues to edit after saving; we need to re-hook it
131
+ $(window).off('beforeunload');
132
+ jQuery.get(wp_htaccess_editor.home_url).always(function(data, text, xhr) {
133
+ status = xhr.status;
134
+ if (status.substr(0, 1) != '2') {
135
+ swal({ type: 'error', title: wp_htaccess_editor.site_error });
136
+ } else {
137
+ swal({ type: 'success', title: wp_htaccess_editor.save_success, showConfirmButton: false, timer: 1000 });
138
+ }
139
+ })
140
+ } else if (typeof data.success != 'undefined' && !data.success) {
141
+ swal({ type: 'error', title: data.data });
142
+ } else {
143
+ swal({ type: 'error', title: wp_htaccess_editor.undocumented_error });
144
+ }
145
+ }).fail(function(data) {
146
+ if (data.data) {
147
+ swal({ type: 'error', title: wp_htaccess_editor.documented_error + ' ' + data.data });
148
+ } else {
149
+ swal({ type: 'error', title: wp_htaccess_editor.undocumented_error });
150
+ }
151
+ });
152
+
153
+ return false;
154
+ }); // save htaccess
155
+
156
+
157
+ // restore htaccess backup from DB
158
+ $('#wphe_restore_htaccess').click(function(e) {
159
+ message = wp_htaccess_editor.restore_message;
160
+ swal({
161
+ title: wp_htaccess_editor.restore_title,
162
+ type: 'question',
163
+ html: message,
164
+ showCancelButton: true,
165
+ focusConfirm: false,
166
+ confirmButtonText: wp_htaccess_editor.restore_button,
167
+ cancelButtonText: wp_htaccess_editor.cancel_button,
168
+ confirmButtonColor: '#dd3036',
169
+ width: 600
170
+ }).then((result) => {
171
+ if (result.value === true) {
172
+ block_ui(wp_htaccess_editor.restoring);
173
+ $.post({
174
+ url: ajaxurl,
175
+ data: {
176
+ action: 'wp_htaccess_editor_do_action',
177
+ _ajax_nonce: wp_htaccess_editor.nonce_do_action,
178
+ subaction: 'restore_htaccess_from_db'
179
+ }
180
+ }).always(function(data) {
181
+ swal.close();
182
+ }).done(function(data) {
183
+ if (data.success) {
184
+ // TODO: see note on line #130
185
+ $(window).off('beforeunload');
186
+ swal({ type: 'success', title: wp_htaccess_editor.restore_success, onClose: function() { location.reload(); } });
187
+ } else {
188
+ swal({ type: 'error', title: wp_htaccess_editor.documented_error + ' ' + data.data });
189
+ }
190
+ }).fail(function(data) {
191
+ swal({ type: 'error', title: wp_htaccess_editor.undocumented_error });
192
+ });
193
+ return false;
194
+ }
195
+ });
196
+ }); // restore htaccess from DB
197
+ }); // onload
lang/cs_CZ.mo DELETED
Binary file
lang/cs_CZ.po DELETED
@@ -1,381 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: WP Htaccess editor\n"
4
- "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2012-08-23 21:43+0100\n"
6
- "PO-Revision-Date: 2012-08-23 21:43+0100\n"
7
- "Last-Translator: Lukenzi <lukenzi@gmail.com>\n"
8
- "Language-Team: Lukenzi <lukenzi@gmail.com>\n"
9
- "Language: \n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "X-Poedit-KeywordsList: _e;__\n"
14
- "X-Poedit-Basepath: /opt/lampp/htdocs/wordpress/wp-content/plugins/wp-htaccess-editor/\n"
15
- "X-Poedit-Language: Czech\n"
16
- "X-Poedit-Country: CZECH REPUBLIC\n"
17
- "X-Poedit-SourceCharset: utf-8\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
-
20
- #: wp-htaccess-editor.php:77
21
- #: wp-htaccess-editor.php:81
22
- #: wp-htaccess-editor.php:85
23
- #: wp-htaccess-editor.php:90
24
- #: lib/lib.pages.php:31
25
- #: lib/lib.pages.php:38
26
- #: lib/lib.pages.php:45
27
- msgid "Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted"
28
- msgstr "Chyba: Plugin <strong>WP Htaccess Editor</strong> je poškozen"
29
-
30
- #: pages/wphe-backup.php:7
31
- #: lib/lib.pages.php:11
32
- msgid "Backup"
33
- msgstr "Záloha"
34
-
35
- #: pages/wphe-backup.php:16
36
- msgid "Unable to restore backup! Probably the wrong setting write permissions to the files."
37
- msgstr "Obnovení zálohy nebylo úspěšné! Pravděpodobně jsou špatně nastavena práva k zápisu do souboru. "
38
-
39
- #: pages/wphe-backup.php:18
40
- #: pages/wphe-backup.php:38
41
- msgid "The backup file is located in the <code>wp-content</code> folder."
42
- msgstr "Soubor zálohy je uložen ve složce <code>wp-content</code>."
43
-
44
- #: pages/wphe-backup.php:22
45
- msgid "Backup was restored successfully"
46
- msgstr "Záloha souboru byla úspěšně obnovena."
47
-
48
- #: pages/wphe-backup.php:23
49
- msgid "Old backup file was deleted successfully"
50
- msgstr "Starý záložní soubor byl úspěšně odstraněn."
51
-
52
- #: pages/wphe-backup.php:26
53
- msgid "Unable to restore backup!"
54
- msgstr "Nelze obnovit zálohu!"
55
-
56
- #: pages/wphe-backup.php:28
57
- msgid "This is contents of the original file, put it into a file manually"
58
- msgstr "Toto je obsah původního souboru, vložte jej do souboru <code>htaccess</code> ručně."
59
-
60
- #: pages/wphe-backup.php:36
61
- msgid "Backup file was created successfully"
62
- msgstr "Záložní soubor byl úspěšně vytvořen."
63
-
64
- #: pages/wphe-backup.php:41
65
- msgid "Unable to create backup! <code>wp-content</code> folder is not writeable! Change the permissions this folder manually!"
66
- msgstr "Nelze vytvořit zálohu! Do složky <code>wp-content</code> nelze zapisovat, změňte oprávnění této složky!"
67
-
68
- #: pages/wphe-backup.php:42
69
- #: pages/wphe-backup.php:52
70
- #: pages/wphe-dashboard.php:31
71
- #: pages/wphe-dashboard.php:43
72
- msgid "Due to server configuration can not change permissions on files or create new files"
73
- msgstr "Kvůli nastavení serveru nelze měnit oprávnění souborů ani vytvářet nové soubory nebo mazat stávající"
74
-
75
- #: pages/wphe-backup.php:49
76
- msgid "Backup file was successfully removed"
77
- msgstr "Záložní soubor byl úspěšně odstraněn."
78
-
79
- #: pages/wphe-backup.php:51
80
- msgid "Backup file could not be removed! Probably the wrong setting write permissions to the files."
81
- msgstr "Záložní soubor nelze odstranit! Pravděpodobně jsou špatně nastavena práva k zápisu do souboru. "
82
-
83
- #: pages/wphe-backup.php:63
84
- msgid "Do you want to restore the backup file?"
85
- msgstr "Chcete obnovit zálohu původního souboru?"
86
-
87
- #: pages/wphe-backup.php:63
88
- msgid "Restore backup &raquo;"
89
- msgstr "Obnovit &raquo;"
90
-
91
- #: pages/wphe-backup.php:72
92
- msgid "Do you want to delete a backup file?"
93
- msgstr "Chcete odstranit záložní soubor?"
94
-
95
- #: pages/wphe-backup.php:72
96
- #: pages/wphe-dashboard.php:25
97
- msgid "Remove backup &raquo;"
98
- msgstr "Odstranit zálohu &raquo;"
99
-
100
- #: pages/wphe-backup.php:78
101
- msgid "Backup file not found..."
102
- msgstr "Záložní soubor nebyl nalezen..."
103
-
104
- #: pages/wphe-backup.php:86
105
- msgid "Do you want to create a new backup file?"
106
- msgstr "Chcete vytvořit nový záložní soubor?"
107
-
108
- #: pages/wphe-backup.php:86
109
- msgid "Create new &raquo;"
110
- msgstr "Vytvořit nový &raquo;"
111
-
112
- #: pages/wphe-backup.php:95
113
- #: pages/wphe-dashboard.php:129
114
- msgid "Information about this plugin"
115
- msgstr "Informace o tomto pluginu"
116
-
117
- #: pages/wphe-backup.php:97
118
- #: pages/wphe-dashboard.php:131
119
- msgid "Author"
120
- msgstr "Autor"
121
-
122
- #: pages/wphe-backup.php:101
123
- #: pages/wphe-dashboard.php:135
124
- msgid "Translators"
125
- msgstr "Překladatelé"
126
-
127
- #: pages/wphe-backup.php:108
128
- #: pages/wphe-dashboard.php:142
129
- msgid "Plugin"
130
- msgstr "Plugin"
131
-
132
- #: pages/wphe-backup.php:110
133
- #: pages/wphe-dashboard.php:144
134
- msgid "Version:"
135
- msgstr "Verze pluginu:"
136
-
137
- #: pages/wphe-backup.php:111
138
- #: pages/wphe-dashboard.php:145
139
- msgid "Plugin homepage:"
140
- msgstr "Domovská stránka pluginu:"
141
-
142
- #: pages/wphe-backup.php:111
143
- #: pages/wphe-dashboard.php:145
144
- msgid "WordPress repository"
145
- msgstr "WordPress repozitář"
146
-
147
- #: pages/wphe-backup.php:112
148
- #: pages/wphe-dashboard.php:146
149
- msgid "Support:"
150
- msgstr "Podpora:"
151
-
152
- #: pages/wphe-backup.php:112
153
- #: pages/wphe-dashboard.php:146
154
- msgid "Forum"
155
- msgstr "Fórum"
156
-
157
- #: pages/wphe-backup.php:113
158
- #: pages/wphe-dashboard.php:147
159
- msgid "Support for the development:"
160
- msgstr "Přispějte na další vývoj:"
161
-
162
- #: pages/wphe-backup.php:113
163
- #: pages/wphe-backup.php:124
164
- #: pages/wphe-dashboard.php:147
165
- #: pages/wphe-dashboard.php:158
166
- #: lib/lib.ad.php:20
167
- msgid "Donate"
168
- msgstr "Přispějte"
169
-
170
- #: pages/wphe-backup.php:117
171
- #: pages/wphe-dashboard.php:151
172
- msgid "Other plugins"
173
- msgstr "Další pluginy autora"
174
-
175
- #: pages/wphe-backup.php:119
176
- #: pages/wphe-dashboard.php:153
177
- msgid "System Files Editor"
178
- msgstr "System Files Editor"
179
-
180
- #: pages/wphe-backup.php:120
181
- #: pages/wphe-dashboard.php:154
182
- msgid "Czech support for WordPress"
183
- msgstr "Česká podpora pro WordPress"
184
-
185
- #: pages/wphe-backup.php:139
186
- #: pages/wphe-dashboard.php:174
187
- msgid "You do not have permission to view this page"
188
- msgstr "Nemáte oprávnění k zobrazení této stránky"
189
-
190
- #: pages/wphe-dashboard.php:17
191
- msgid "File has been successfully changed"
192
- msgstr "Soubor byl uložen"
193
-
194
- #: pages/wphe-dashboard.php:19
195
- msgid "You have made changes to the htaccess file. The original file was automatically backed up (in <code>wp-content</code> folder)"
196
- msgstr "Provedli jste změny v htaccess souboru. Původní soubor byl automaticky zálohován (ve složce <code>wp-content</code>)"
197
-
198
- #: pages/wphe-dashboard.php:20
199
- msgid "Check the functionality of your site (the links to the articles or categories)."
200
- msgstr "Vyzkoušejte funkčnost Vašeho webu (odkazy na články nebo rubriky)."
201
-
202
- #: pages/wphe-dashboard.php:20
203
- msgid "If something is not working properly restore the original file from backup"
204
- msgstr "Pokud nefungují správně, obnovte zálohu původního souboru."
205
-
206
- #: pages/wphe-dashboard.php:25
207
- msgid "If everything works properly, you can delete the backup file:"
208
- msgstr "Pokud vše funguje jak má, můžete záložní soubor smazat:"
209
-
210
- #: pages/wphe-dashboard.php:25
211
- #: pages/wphe-dashboard.php:66
212
- msgid "or"
213
- msgstr "nebo"
214
-
215
- #: pages/wphe-dashboard.php:25
216
- msgid "restore the original file from backup"
217
- msgstr "obnovte zálohu původního souboru"
218
-
219
- #: pages/wphe-dashboard.php:30
220
- #: pages/wphe-dashboard.php:34
221
- msgid "The file could not be saved!"
222
- msgstr "Soubor nebyl uložen!"
223
-
224
- #: pages/wphe-dashboard.php:35
225
- msgid "Unable to create backup of the original file! <code>wp-content</code> folder is not writeable! Change the permissions this folder!"
226
- msgstr "Nelze vytvořit zálohu původního souboru! Do složky <code>wp-content</code> nelze zapisovat, změňte oprávnění u této složky!"
227
-
228
- #: pages/wphe-dashboard.php:42
229
- msgid "Htaccess file is not created."
230
- msgstr "Soubor Htaccess nebyl vytvořen."
231
-
232
- #: pages/wphe-dashboard.php:45
233
- msgid "Htaccess file was successfully created."
234
- msgstr "Soubor htaccess byl úspěšně vytvořen."
235
-
236
- #: pages/wphe-dashboard.php:46
237
- msgid "View new Htaccess file"
238
- msgstr "Zobrazit Htaccess soubor"
239
-
240
- #: pages/wphe-dashboard.php:53
241
- msgid "Backup file could not be removed! <code>wp-content</code> folder is not writeable! Change the permissions this folder!"
242
- msgstr "Záložní soubor nelze odstranit! Složka <code>wp-content</code> nemá nastavena oprávnění pro zápis, změňte oprávnění ručně!"
243
-
244
- #: pages/wphe-dashboard.php:55
245
- msgid "Backup file has been successfully removed."
246
- msgstr "Záložní soubor byl úspěšně odstraněn."
247
-
248
- #: pages/wphe-dashboard.php:60
249
- msgid "Using this editor you can easily modify your htaccess file without having to use an FTP client."
250
- msgstr "Tento editor slouží k snadné úpravě vašeho htaccess souboru bez nutnosti použití FTP klienta."
251
-
252
- #: pages/wphe-dashboard.php:61
253
- msgid "<strong>WARNING:</strong> Any error in this file may cause malfunction of your site!"
254
- msgstr "<strong>POZOR:</strong> Jakákoliv chyba v tomto souboru může způsobit nefunkčnost vašeho webu!"
255
-
256
- #: pages/wphe-dashboard.php:62
257
- msgid "Edit htaccess file should therefore be performed only by experienced users!"
258
- msgstr "Upravovat htaccess soubor by měli provádět pouze zkušení uživatelé!"
259
-
260
- #: pages/wphe-dashboard.php:65
261
- msgid "Information for editing htaccess file"
262
- msgstr "Informace pro úpravy Htaccess souboru"
263
-
264
- #: pages/wphe-dashboard.php:66
265
- msgid "For more information on possible adjustments to this file, please visit"
266
- msgstr "Pro více informací o možných úpravách tohoto souboru navštivte weby"
267
-
268
- #: pages/wphe-dashboard.php:67
269
- msgid "Interesting tips and guides can also be found on "
270
- msgstr "Zajímavé tipy a návody můžete nalézt také na webu"
271
-
272
- #: pages/wphe-dashboard.php:68
273
- msgid "Or use the Google search."
274
- msgstr "Nebo použijte vyhledávač Google"
275
-
276
- #: pages/wphe-dashboard.php:74
277
- msgid "Htaccess file does not exists!"
278
- msgstr "Soubor Htaccess neexistuje!"
279
-
280
- #: pages/wphe-dashboard.php:82
281
- #: pages/wphe-dashboard.php:91
282
- msgid "Htaccess file cannot read!"
283
- msgstr "Soubor Htaccess nelze přečíst!"
284
-
285
- #: pages/wphe-dashboard.php:106
286
- msgid "Content of the Htaccess file"
287
- msgstr "Obsah Htaccess souboru"
288
-
289
- #: pages/wphe-dashboard.php:108
290
- msgid "Save file &raquo;"
291
- msgstr "Uložit soubor &raquo;"
292
-
293
- #: pages/wphe-dashboard.php:119
294
- msgid "Create new <code>.htaccess</code> file?"
295
- msgstr "Vytvořit nový <code>.htaccess</code> soubor?"
296
-
297
- #: pages/wphe-dashboard.php:119
298
- msgid "Create &raquo;"
299
- msgstr "Vytvořit nový &raquo;"
300
-
301
- #: lib/lib.wp-files.php:10
302
- msgid "Plugin WP Htaccess Editor Error: File \"/wp-includes/pluggable.php\" does not exists!"
303
- msgstr "Chyba v pluginu WP Htaccess Editor: Soubor \"/wp-includes/pluggable.php\" neexistuje!"
304
-
305
- #: lib/lib.wp-files.php:18
306
- msgid "Plugin WP Htaccess Editor Error: File \"/wp-includes/capabilities.php\" does not exists!"
307
- msgstr "Chyba v pluginu WP Htaccess Editor: Soubor \"/wp-includes/capabilities.php\" neexistuje!"
308
-
309
- #: lib/lib.ad.php:7
310
- msgid "Plugin homepage"
311
- msgstr "Web autora pluginu"
312
-
313
- #~ msgid "The backup file was found..."
314
- #~ msgstr "Záložní soubor byl nalezen..."
315
-
316
- #~ msgid "Unlimited hosting WEDOS"
317
- #~ msgstr "Neomezený hosting WEDOS"
318
-
319
- #~ msgid "WP Htaccess Editor"
320
- #~ msgstr "WP Htaccess Editor"
321
-
322
- #~ msgid "Htaccess"
323
- #~ msgstr "Htaccess"
324
-
325
- #~ msgid "Htaccess Editor"
326
- #~ msgstr "Htaccess Editor"
327
-
328
- #~ msgid "WP Htaccess Editor - Backup"
329
- #~ msgstr "WP Htaccess Editor - Záloha"
330
-
331
- #~ msgid "Download backup file"
332
- #~ msgstr "Uložit záložní soubor do PC"
333
-
334
- #~ msgid ""
335
- #~ "Unable to create backup! Probably the wrong setting write permissions to "
336
- #~ "the files."
337
- #~ msgstr ""
338
- #~ "Vytvoření zálohy nebylo úspěšné! Pravděpodobně jsou špatně nastavena "
339
- #~ "práva k zápisu do souboru. "
340
-
341
- #~ msgid "Access denied"
342
- #~ msgstr "Přístup odepřen"
343
-
344
- #~ msgid ""
345
- #~ "The file could not be saved! Probably the wrong setting read permissions "
346
- #~ "to the files"
347
- #~ msgstr ""
348
- #~ "Soubor nebyl uložen! Pravděpodobně jsou špatně nastavena práva k zápisu "
349
- #~ "do souboru. "
350
-
351
- #~ msgid ""
352
- #~ "Htaccess file is not created. Probably the wrong setting read permissions "
353
- #~ "to the files"
354
- #~ msgstr ""
355
- #~ "Soubor Htaccess nebyl vytvořen! Pravděpodobně jsou špatně nastavena práva "
356
- #~ "k zápisu do souboru. "
357
-
358
- #~ msgid ""
359
- #~ "Backup file could not be removed! Probably the wrong setting read "
360
- #~ "permissions to the files"
361
- #~ msgstr ""
362
- #~ "Záložní soubor se nepodařilo odstranit! Pravděpodobně jsou špatně "
363
- #~ "nastavena práva k zápisu do souboru. "
364
-
365
- #~ msgid "Htaccess file not found!"
366
- #~ msgstr "Htaccess soubor nebyl nalezen!"
367
-
368
- #~ msgid "Htaccess file found..."
369
- #~ msgstr "Htaccess soubor byl nalezen..."
370
-
371
- #~ msgid "Htaccess file is empty..."
372
- #~ msgstr "Htaccess soubor je prázdný..."
373
-
374
- #~ msgid "Htaccess file is not readable, probably does not exist"
375
- #~ msgstr "Htaccess soubor nelze přečíst, pravděpodobně neexistuje"
376
-
377
- #~ msgid "URL:"
378
- #~ msgstr "Web pluginu:"
379
-
380
- #~ msgid "Feedback:"
381
- #~ msgstr "Hlášení chyb:"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lang/default.po DELETED
@@ -1,398 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: WP Htaccess editor\n"
4
- "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2012-08-23 21:25+0100\n"
6
- "PO-Revision-Date: 2012-08-23 21:26+0100\n"
7
- "Last-Translator: Lukenzi <lukenzi@gmail.com>\n"
8
- "Language-Team: Lukenzi <lukenzi@gmail.com>\n"
9
- "Language: \n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "X-Poedit-KeywordsList: _e;__\n"
14
- "X-Poedit-Basepath: /opt/lampp/htdocs/wordpress/wp-content/plugins/wp-htaccess-editor/\n"
15
- "X-Poedit-Language: Czech\n"
16
- "X-Poedit-Country: CZECH REPUBLIC\n"
17
- "X-Poedit-SourceCharset: utf-8\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
-
20
- #: wp-htaccess-editor.php:77
21
- #: wp-htaccess-editor.php:81
22
- #: wp-htaccess-editor.php:85
23
- #: wp-htaccess-editor.php:90
24
- #: lib/lib.pages.php:31
25
- #: lib/lib.pages.php:38
26
- #: lib/lib.pages.php:45
27
- msgid "Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted"
28
- msgstr ""
29
-
30
- #: pages/wphe-backup.php:7
31
- #: lib/lib.pages.php:11
32
- #, fuzzy
33
- msgid "Backup"
34
- msgstr "Záložní"
35
-
36
- #: pages/wphe-backup.php:16
37
- msgid "Unable to restore backup! Probably the wrong setting write permissions to the files."
38
- msgstr ""
39
-
40
- #: pages/wphe-backup.php:18
41
- #: pages/wphe-backup.php:38
42
- msgid "The backup file is located in the <code>wp-content</code> folder."
43
- msgstr ""
44
-
45
- #: pages/wphe-backup.php:22
46
- #, fuzzy
47
- msgid "Backup was restored successfully"
48
- msgstr "<b>{0}</b> z <b>{1}</b> lepicí poznámky bylo úspěšně importováno."
49
-
50
- #: pages/wphe-backup.php:23
51
- msgid "Old backup file was deleted successfully"
52
- msgstr ""
53
-
54
- #: pages/wphe-backup.php:26
55
- #, fuzzy
56
- msgid "Unable to restore backup!"
57
- msgstr "nelze obnovit záložní verzi „%.250s“"
58
-
59
- #: pages/wphe-backup.php:28
60
- msgid "This is contents of the original file, put it into a file manually"
61
- msgstr ""
62
-
63
- #: pages/wphe-backup.php:36
64
- msgid "Backup file was created successfully"
65
- msgstr ""
66
-
67
- #: pages/wphe-backup.php:41
68
- msgid "Unable to create backup! <code>wp-content</code> folder is not writeable! Change the permissions this folder manually!"
69
- msgstr ""
70
-
71
- #: pages/wphe-backup.php:42
72
- #: pages/wphe-backup.php:52
73
- #: pages/wphe-dashboard.php:31
74
- #: pages/wphe-dashboard.php:43
75
- msgid "Due to server configuration can not change permissions on files or create new files"
76
- msgstr ""
77
-
78
- #: pages/wphe-backup.php:49
79
- msgid "Backup file was successfully removed"
80
- msgstr ""
81
-
82
- #: pages/wphe-backup.php:51
83
- msgid "Backup file could not be removed! Probably the wrong setting write permissions to the files."
84
- msgstr ""
85
-
86
- #: pages/wphe-backup.php:59
87
- #, fuzzy
88
- msgid "The backup file was found..."
89
- msgstr "Soubor s nastavením „%s“ nebyl nalezen: %s"
90
-
91
- #: pages/wphe-backup.php:66
92
- #, fuzzy
93
- msgid "Do you want to restore the backup file?"
94
- msgstr "Chcete nahradit stávající soubor?"
95
-
96
- #: pages/wphe-backup.php:66
97
- #, fuzzy
98
- msgid "Restore backup &raquo;"
99
- msgstr "Odhlásit se &raquo;"
100
-
101
- #: pages/wphe-backup.php:75
102
- #, fuzzy
103
- msgid "Do you want to delete a backup file?"
104
- msgstr "Chcete nahradit stávající soubor?"
105
-
106
- #: pages/wphe-backup.php:75
107
- #: pages/wphe-dashboard.php:25
108
- #, fuzzy
109
- msgid "Remove backup &raquo;"
110
- msgstr "Při zavření odst_ranit záložní soubor"
111
-
112
- #: pages/wphe-backup.php:81
113
- #, fuzzy
114
- msgid "Backup file not found..."
115
- msgstr "Soubor s nastavením „%s“ nebyl nalezen: %s"
116
-
117
- #: pages/wphe-backup.php:89
118
- #, fuzzy
119
- msgid "Do you want to create a new backup file?"
120
- msgstr "Chcete vytvořit nový archiv s těmito soubory?"
121
-
122
- #: pages/wphe-backup.php:89
123
- #, fuzzy
124
- msgid "Create new &raquo;"
125
- msgstr "Vytvořit nový web"
126
-
127
- #: pages/wphe-backup.php:98
128
- #: pages/wphe-dashboard.php:129
129
- #, fuzzy
130
- msgid "Information about this plugin"
131
- msgstr "Zobrazit informace o aplikaci gthumb"
132
-
133
- #: pages/wphe-backup.php:100
134
- #: pages/wphe-dashboard.php:131
135
- #, fuzzy
136
- msgid "Author"
137
- msgstr "Autor"
138
-
139
- #: pages/wphe-backup.php:104
140
- #: pages/wphe-dashboard.php:135
141
- #, fuzzy
142
- msgid "Translators"
143
- msgstr "Česká lokalizace"
144
-
145
- #: pages/wphe-backup.php:111
146
- #: pages/wphe-dashboard.php:142
147
- #, fuzzy
148
- msgid "Plugin"
149
- msgstr "Plugin"
150
-
151
- #: pages/wphe-backup.php:113
152
- #: pages/wphe-dashboard.php:144
153
- #, fuzzy
154
- msgid "Version:"
155
- msgstr "Verze:"
156
-
157
- #: pages/wphe-backup.php:114
158
- #: pages/wphe-dashboard.php:145
159
- #, fuzzy
160
- msgid "Plugin homepage:"
161
- msgstr "Domácí stránka pluginu &#187;"
162
-
163
- #: pages/wphe-backup.php:114
164
- #: pages/wphe-dashboard.php:145
165
- #, fuzzy
166
- msgid "WordPress repository"
167
- msgstr "Přid_at zdroj"
168
-
169
- #: pages/wphe-backup.php:115
170
- #: pages/wphe-dashboard.php:146
171
- #, fuzzy
172
- msgid "Support:"
173
- msgstr "Fórum podpory"
174
-
175
- #: pages/wphe-backup.php:115
176
- #: pages/wphe-dashboard.php:146
177
- #, fuzzy
178
- msgid "Forum"
179
- msgstr "Online fórum..."
180
-
181
- #: pages/wphe-backup.php:116
182
- #: pages/wphe-dashboard.php:147
183
- #, fuzzy
184
- msgid "Support for the development:"
185
- msgstr "Nástroje na vývoj softwaru"
186
-
187
- #: pages/wphe-backup.php:116
188
- #: pages/wphe-backup.php:127
189
- #: pages/wphe-dashboard.php:147
190
- #: pages/wphe-dashboard.php:158
191
- #: lib/lib.ad.php:20
192
- msgid "Donate"
193
- msgstr ""
194
-
195
- #: pages/wphe-backup.php:120
196
- #: pages/wphe-dashboard.php:151
197
- #, fuzzy
198
- msgid "Other plugins"
199
- msgstr "Instalace pluginů"
200
-
201
- #: pages/wphe-backup.php:122
202
- #: pages/wphe-dashboard.php:153
203
- #, fuzzy
204
- msgid "System Files Editor"
205
- msgstr "Editor systému nastavení MateConf."
206
-
207
- #: pages/wphe-backup.php:123
208
- #: pages/wphe-dashboard.php:154
209
- #, fuzzy
210
- msgid "Czech support for WordPress"
211
- msgstr "http://www.separatista.net/forum/"
212
-
213
- #: pages/wphe-backup.php:142
214
- #: pages/wphe-dashboard.php:174
215
- #, fuzzy
216
- msgid "You do not have permission to view this page"
217
- msgstr "Nemáte dostatečné oprávnění pro úpravy tohoto uživatele."
218
-
219
- #: pages/wphe-dashboard.php:17
220
- #, fuzzy
221
- msgid "File has been successfully changed"
222
- msgstr "Dříve otevřený soubor byl změněn."
223
-
224
- #: pages/wphe-dashboard.php:19
225
- msgid "You have made changes to the htaccess file. The original file was automatically backed up (in <code>wp-content</code> folder)"
226
- msgstr ""
227
-
228
- #: pages/wphe-dashboard.php:20
229
- msgid "Check the functionality of your site (the links to the articles or categories)."
230
- msgstr ""
231
-
232
- #: pages/wphe-dashboard.php:20
233
- #, fuzzy
234
- msgid "If something is not working properly restore the original file from backup"
235
- msgstr "Ze zálohy nelze obnovit nastavení displeje"
236
-
237
- #: pages/wphe-dashboard.php:25
238
- msgid "If everything works properly, you can delete the backup file:"
239
- msgstr ""
240
-
241
- #: pages/wphe-dashboard.php:25
242
- #: pages/wphe-dashboard.php:66
243
- #, fuzzy
244
- msgid "or"
245
- msgstr "nebo"
246
-
247
- #: pages/wphe-dashboard.php:25
248
- #, fuzzy
249
- msgid "restore the original file from backup"
250
- msgstr "Ze zálohy nelze obnovit nastavení displeje"
251
-
252
- #: pages/wphe-dashboard.php:30
253
- #: pages/wphe-dashboard.php:34
254
- #, fuzzy
255
- msgid "The file could not be saved!"
256
- msgstr "Soubor s nastaveními nemohl být uložen"
257
-
258
- #: pages/wphe-dashboard.php:35
259
- msgid "Unable to create backup of the original file! <code>wp-content</code> folder is not writeable! Change the permissions this folder!"
260
- msgstr ""
261
-
262
- #: pages/wphe-dashboard.php:42
263
- #, fuzzy
264
- msgid "Htaccess file is not created."
265
- msgstr "Soubor není platným souborem .desktop"
266
-
267
- #: pages/wphe-dashboard.php:45
268
- msgid "Htaccess file was successfully created."
269
- msgstr ""
270
-
271
- #: pages/wphe-dashboard.php:46
272
- #, fuzzy
273
- msgid "View new Htaccess file"
274
- msgstr "_Uložit nový soubor jako:"
275
-
276
- #: pages/wphe-dashboard.php:53
277
- msgid "Backup file could not be removed! <code>wp-content</code> folder is not writeable! Change the permissions this folder!"
278
- msgstr ""
279
-
280
- #: pages/wphe-dashboard.php:55
281
- msgid "Backup file has been successfully removed."
282
- msgstr ""
283
-
284
- #: pages/wphe-dashboard.php:60
285
- msgid "Using this editor you can easily modify your htaccess file without having to use an FTP client."
286
- msgstr ""
287
-
288
- #: pages/wphe-dashboard.php:61
289
- msgid "<strong>WARNING:</strong> Any error in this file may cause malfunction of your site!"
290
- msgstr ""
291
-
292
- #: pages/wphe-dashboard.php:62
293
- msgid "Edit htaccess file should therefore be performed only by experienced users!"
294
- msgstr ""
295
-
296
- #: pages/wphe-dashboard.php:65
297
- #, fuzzy
298
- msgid "Information for editing htaccess file"
299
- msgstr "Nemohu získat informace o souboru '%s': %s"
300
-
301
- #: pages/wphe-dashboard.php:66
302
- msgid "For more information on possible adjustments to this file, please visit"
303
- msgstr ""
304
-
305
- #: pages/wphe-dashboard.php:67
306
- msgid "Interesting tips and guides can also be found on "
307
- msgstr ""
308
-
309
- #: pages/wphe-dashboard.php:68
310
- #, fuzzy
311
- msgid "Or use the Google search."
312
- msgstr "Vyhledat <i>%(name)s</i> pomocí <b>Google</b>"
313
-
314
- #: pages/wphe-dashboard.php:74
315
- #, fuzzy
316
- msgid "Htaccess file does not exists!"
317
- msgstr "Plugin neexistuje."
318
-
319
- #: pages/wphe-dashboard.php:82
320
- #: pages/wphe-dashboard.php:91
321
- #, fuzzy
322
- msgid "Htaccess file cannot read!"
323
- msgstr ""
324
- "Nemůžu přečíst zvkukový soubor:\n"
325
- "%s"
326
-
327
- #: pages/wphe-dashboard.php:106
328
- #, fuzzy
329
- msgid "Content of the Htaccess file"
330
- msgstr "Chyba při čtení obsahu souboru '%s'"
331
-
332
- #: pages/wphe-dashboard.php:108
333
- #, fuzzy
334
- msgid "Save file &raquo;"
335
- msgstr "Uložit aktuální soubor"
336
-
337
- #: pages/wphe-dashboard.php:119
338
- #, fuzzy
339
- msgid "Create new <code>.htaccess</code> file?"
340
- msgstr "Vytvořit nový soubor ze šablony"
341
-
342
- #: pages/wphe-dashboard.php:119
343
- #, fuzzy
344
- msgid "Create &raquo;"
345
- msgstr "Další &raquo;"
346
-
347
- #: lib/lib.wp-files.php:10
348
- msgid "Plugin WP Htaccess Editor Error: File \"/wp-includes/pluggable.php\" does not exists!"
349
- msgstr ""
350
-
351
- #: lib/lib.wp-files.php:18
352
- msgid "Plugin WP Htaccess Editor Error: File \"/wp-includes/capabilities.php\" does not exists!"
353
- msgstr ""
354
-
355
- #: lib/lib.ad.php:7
356
- #, fuzzy
357
- msgid "Plugin homepage"
358
- msgstr "Domácí stránka pluginu &#187;"
359
-
360
- #, fuzzy
361
- #~ msgid "Unlimited hosting WEDOS"
362
- #~ msgstr "Zadejte 0 pro neomezenou rychlost."
363
-
364
- #, fuzzy
365
- #~ msgid "WP Htaccess Editor"
366
- #~ msgstr "Modernizované API pro editor"
367
-
368
- #, fuzzy
369
- #~ msgid "Htaccess Editor"
370
- #~ msgstr "Stylování vizuálního editoru"
371
-
372
- #, fuzzy
373
- #~ msgid "Download backup file"
374
- #~ msgstr "Nezdařila se záloha souboru"
375
-
376
- #, fuzzy
377
- #~ msgid "Access denied"
378
- #~ msgstr "Přístup zamítnut"
379
-
380
- #, fuzzy
381
- #~ msgid "Htaccess file not found!"
382
- #~ msgstr "Soubor s nastavením „%s“ nebyl nalezen: %s"
383
-
384
- #, fuzzy
385
- #~ msgid "Htaccess file found..."
386
- #~ msgstr "Soubor nebyl nalezen"
387
-
388
- #, fuzzy
389
- #~ msgid "Htaccess file is empty..."
390
- #~ msgstr "Soubor s nastavením „%s“ je prázdný"
391
-
392
- #, fuzzy
393
- #~ msgid "URL:"
394
- #~ msgstr "URL:"
395
-
396
- #, fuzzy
397
- #~ msgid "Feedback:"
398
- #~ msgstr "Přání a stížnosti"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lang/es_ES.mo DELETED
Binary file
lang/es_ES.po DELETED
@@ -1,417 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: WP Htaccess editor\n"
4
- "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2012-08-23 21:43+0100\n"
6
- "PO-Revision-Date: 2014-02-06 14:30+0100\n"
7
- "Last-Translator: jelena kovacevic <jecajeca260@gmail.com>\n"
8
- "Language-Team: Lukenzi <lukenzi@gmail.com>\n"
9
- "Language: cs_CZ\n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "X-Poedit-KeywordsList: _e;__\n"
14
- "X-Poedit-Basepath: /opt/lampp/htdocs/wordpress/wp-content/plugins/wp-"
15
- "htaccess-editor/\n"
16
- "X-Poedit-SourceCharset: utf-8\n"
17
- "X-Generator: Poedit 1.5.5\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
-
20
- #: wp-htaccess-editor.php:77 wp-htaccess-editor.php:81
21
- #: wp-htaccess-editor.php:85 wp-htaccess-editor.php:90 lib/lib.pages.php:31
22
- #: lib/lib.pages.php:38 lib/lib.pages.php:45
23
- msgid "Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted"
24
- msgstr "Error Fatal: Plugin <strong> WP htaccess Editor </strong> está dañado"
25
-
26
- #: pages/wphe-backup.php:7 lib/lib.pages.php:11
27
- msgid "Backup"
28
- msgstr "Copia de seguridad"
29
-
30
- #: pages/wphe-backup.php:16
31
- msgid ""
32
- "Unable to restore backup! Probably the wrong setting write permissions to "
33
- "the files."
34
- msgstr ""
35
- "¡No se puede restaurar copia de seguridad! Probablemente el ajuste "
36
- "incorrecto de permisos de escritura a los archivos."
37
-
38
- #: pages/wphe-backup.php:18 pages/wphe-backup.php:38
39
- msgid "The backup file is located in the <code>wp-content</code> folder."
40
- msgstr ""
41
- "El archivo de copia de seguridad se encuentra en la carpeta <code> wp-"
42
- "content </code>."
43
-
44
- #: pages/wphe-backup.php:22
45
- msgid "Backup was restored successfully"
46
- msgstr "La copia de seguridad se restauró con éxito"
47
-
48
- #: pages/wphe-backup.php:23
49
- msgid "Old backup file was deleted successfully"
50
- msgstr "Archivo de copia de seguridad viejo se ha eliminado correctamente"
51
-
52
- #: pages/wphe-backup.php:26
53
- msgid "Unable to restore backup!"
54
- msgstr "¡No se puede restaurar copia de seguridad!"
55
-
56
- #: pages/wphe-backup.php:28
57
- msgid "This is contents of the original file, put it into a file manually"
58
- msgstr ""
59
- "Este es el contenido del archivo original, póngalo en un archivo de forma "
60
- "manual"
61
-
62
- #: pages/wphe-backup.php:36
63
- msgid "Backup file was created successfully"
64
- msgstr "Archivo de Copia de seguridad fue creado con éxito"
65
-
66
- #: pages/wphe-backup.php:41
67
- msgid ""
68
- "Unable to create backup! <code>wp-content</code> folder is not writeable! "
69
- "Change the permissions this folder manually!"
70
- msgstr ""
71
- "¡No se puede crear la copia de seguridad! <code> wp-content </code> ¡La "
72
- "carpeta no se puede escribir! ¡Cambie los permisos de esta carpeta "
73
- "manualmente!"
74
-
75
- #: pages/wphe-backup.php:42 pages/wphe-backup.php:52
76
- #: pages/wphe-dashboard.php:31 pages/wphe-dashboard.php:43
77
- msgid ""
78
- "Due to server configuration can not change permissions on files or create "
79
- "new files"
80
- msgstr ""
81
- "Debido a la configuración del servidor no se pueden cambiar los permisos de "
82
- "los archivos o crear nuevos archivos"
83
-
84
- #: pages/wphe-backup.php:49
85
- msgid "Backup file was successfully removed"
86
- msgstr "El archivo de copia de seguridad se ha eliminado correctamente"
87
-
88
- #: pages/wphe-backup.php:51
89
- msgid ""
90
- "Backup file could not be removed! Probably the wrong setting write "
91
- "permissions to the files."
92
- msgstr ""
93
- "¡El archivo de copia de seguridad no puede ser eliminado! Probablemente el "
94
- "ajuste incorrecto de permisos de escritura a los archivos."
95
-
96
- #: pages/wphe-backup.php:63
97
- msgid "Do you want to restore the backup file?"
98
- msgstr "¿Usted desea restaurar el archivo de copia de seguridad?"
99
-
100
- #: pages/wphe-backup.php:63
101
- msgid "Restore backup &raquo;"
102
- msgstr "Restaurar copia de seguridad &raquo;"
103
-
104
- #: pages/wphe-backup.php:72
105
- msgid "Do you want to delete a backup file?"
106
- msgstr "¿Quiere eliminar un archivo de copia de seguridad?"
107
-
108
- #: pages/wphe-backup.php:72 pages/wphe-dashboard.php:25
109
- msgid "Remove backup &raquo;"
110
- msgstr "Eliminar copia de seguridad &raquo;"
111
-
112
- #: pages/wphe-backup.php:78
113
- msgid "Backup file not found..."
114
- msgstr "El archivo de copia de seguridad no se encuentra ..."
115
-
116
- #: pages/wphe-backup.php:86
117
- msgid "Do you want to create a new backup file?"
118
- msgstr "¿Quiere crear un nuevo archivo de copia de seguridad?"
119
-
120
- #: pages/wphe-backup.php:86
121
- msgid "Create new &raquo;"
122
- msgstr "Crear nuevo &raquo;"
123
-
124
- #: pages/wphe-backup.php:95 pages/wphe-dashboard.php:129
125
- msgid "Information about this plugin"
126
- msgstr "Información sobre este plugin"
127
-
128
- #: pages/wphe-backup.php:97 pages/wphe-dashboard.php:131
129
- msgid "Author"
130
- msgstr "Autor"
131
-
132
- #: pages/wphe-backup.php:101 pages/wphe-dashboard.php:135
133
- msgid "Translators"
134
- msgstr "Traductores"
135
-
136
- #: pages/wphe-backup.php:108 pages/wphe-dashboard.php:142
137
- msgid "Plugin"
138
- msgstr "Plugin"
139
-
140
- #: pages/wphe-backup.php:110 pages/wphe-dashboard.php:144
141
- msgid "Version:"
142
- msgstr "Versión:"
143
-
144
- #: pages/wphe-backup.php:111 pages/wphe-dashboard.php:145
145
- msgid "Plugin homepage:"
146
- msgstr "Página de inicio Plugin:"
147
-
148
- #: pages/wphe-backup.php:111 pages/wphe-dashboard.php:145
149
- msgid "WordPress repository"
150
- msgstr "Repositorio WordPress"
151
-
152
- #: pages/wphe-backup.php:112 pages/wphe-dashboard.php:146
153
- msgid "Support:"
154
- msgstr "Apoyo:"
155
-
156
- #: pages/wphe-backup.php:112 pages/wphe-dashboard.php:146
157
- msgid "Forum"
158
- msgstr "Foro"
159
-
160
- #: pages/wphe-backup.php:113 pages/wphe-dashboard.php:147
161
- msgid "Support for the development:"
162
- msgstr "Apoyo para el desarrollo:"
163
-
164
- #: pages/wphe-backup.php:113 pages/wphe-backup.php:124
165
- #: pages/wphe-dashboard.php:147 pages/wphe-dashboard.php:158 lib/lib.ad.php:20
166
- msgid "Donate"
167
- msgstr "Donar"
168
-
169
- #: pages/wphe-backup.php:117 pages/wphe-dashboard.php:151
170
- msgid "Other plugins"
171
- msgstr "Otros plugins"
172
-
173
- #: pages/wphe-backup.php:119 pages/wphe-dashboard.php:153
174
- msgid "System Files Editor"
175
- msgstr "System Files Editor"
176
-
177
- #: pages/wphe-backup.php:120 pages/wphe-dashboard.php:154
178
- msgid "Czech support for WordPress"
179
- msgstr "Soporte Checo para WordPress"
180
-
181
- #: pages/wphe-backup.php:139 pages/wphe-dashboard.php:174
182
- msgid "You do not have permission to view this page"
183
- msgstr "No tienes permiso para ver esta página"
184
-
185
- #: pages/wphe-dashboard.php:17
186
- msgid "File has been successfully changed"
187
- msgstr "El archivo ha cambiado correctamente"
188
-
189
- #: pages/wphe-dashboard.php:19
190
- msgid ""
191
- "You have made changes to the htaccess file. The original file was "
192
- "automatically backed up (in <code>wp-content</code> folder)"
193
- msgstr ""
194
- "Usted ha realizado cambios en el archivo htaccess. El archivo original se "
195
- "copia automáticamente (en <code> wp-content </code>)"
196
-
197
- #: pages/wphe-dashboard.php:20
198
- msgid ""
199
- "Check the functionality of your site (the links to the articles or "
200
- "categories)."
201
- msgstr ""
202
- "Compruebe la funcionalidad de su sitio web (los enlaces a los artículos o "
203
- "categorías)."
204
-
205
- #: pages/wphe-dashboard.php:20
206
- msgid ""
207
- "If something is not working properly restore the original file from backup"
208
- msgstr ""
209
- "Si algo no está funcionando adecuadamente restaurar el archivo original "
210
- "desde la copia de seguridad"
211
-
212
- #: pages/wphe-dashboard.php:25
213
- msgid "If everything works properly, you can delete the backup file:"
214
- msgstr ""
215
- "Si todo funciona correctamente, puede eliminar el archivo de copia de "
216
- "seguridad:"
217
-
218
- #: pages/wphe-dashboard.php:25 pages/wphe-dashboard.php:66
219
- msgid "or"
220
- msgstr "O"
221
-
222
- #: pages/wphe-dashboard.php:25
223
- msgid "restore the original file from backup"
224
- msgstr "restaurar el archivo original desde la copia de seguridad"
225
-
226
- #: pages/wphe-dashboard.php:30 pages/wphe-dashboard.php:34
227
- msgid "The file could not be saved!"
228
- msgstr "¡El archivo no se puede guardar!"
229
-
230
- #: pages/wphe-dashboard.php:35
231
- msgid ""
232
- "Unable to create backup of the original file! <code>wp-content</code> folder "
233
- "is not writeable! Change the permissions this folder!"
234
- msgstr ""
235
- "No se puede crear la copia de seguridad del archivo original <code> wp-"
236
- "content </code> ¡La carpeta no se puede escribir! ¡Cambie los permisos de "
237
- "esta carpeta!"
238
-
239
- #: pages/wphe-dashboard.php:42
240
- msgid "Htaccess file is not created."
241
- msgstr "No se crea el archivo htaccess."
242
-
243
- #: pages/wphe-dashboard.php:45
244
- msgid "Htaccess file was successfully created."
245
- msgstr "El archivo Htaccess sido creado con éxito."
246
-
247
- #: pages/wphe-dashboard.php:46
248
- msgid "View new Htaccess file"
249
- msgstr "Ver nuevo archivo htaccess"
250
-
251
- #: pages/wphe-dashboard.php:53
252
- msgid ""
253
- "Backup file could not be removed! <code>wp-content</code> folder is not "
254
- "writeable! Change the permissions this folder!"
255
- msgstr ""
256
- "¡El archivo de copia de seguridad no puede ser eliminado! <code> wp-content "
257
- "</code> ¡La carpeta no se puede escribir! ¡Cambie los permisos de esta "
258
- "carpeta!"
259
-
260
- #: pages/wphe-dashboard.php:55
261
- msgid "Backup file has been successfully removed."
262
- msgstr "El archivo de copia de seguridad se ha eliminado con éxito"
263
-
264
- #: pages/wphe-dashboard.php:60
265
- msgid ""
266
- "Using this editor you can easily modify your htaccess file without having to "
267
- "use an FTP client."
268
- msgstr ""
269
- "El uso de este editor puede modificar fácilmente su archivo htaccess sin "
270
- "tener que utilizar un cliente de FTP."
271
-
272
- #: pages/wphe-dashboard.php:61
273
- msgid ""
274
- "<strong>WARNING:</strong> Any error in this file may cause malfunction of "
275
- "your site!"
276
- msgstr ""
277
- "<strong>ADVERTENCIA:</strong> ¡Cualquier error en este archivo podrían "
278
- "causar un mal funcionamiento de su sitio!"
279
-
280
- #: pages/wphe-dashboard.php:62
281
- msgid ""
282
- "Edit htaccess file should therefore be performed only by experienced users!"
283
- msgstr ""
284
- "Por lo tanto, ¡editar el archivo htaccess sólo debe ser efectuado por "
285
- "usuarios experimentados!"
286
-
287
- #: pages/wphe-dashboard.php:65
288
- msgid "Information for editing htaccess file"
289
- msgstr "Información para la edición del archivo htaccess"
290
-
291
- #: pages/wphe-dashboard.php:66
292
- msgid "For more information on possible adjustments to this file, please visit"
293
- msgstr ""
294
- "Para obtener más información sobre los posibles ajustes en el archivo, por "
295
- "favor visite"
296
-
297
- #: pages/wphe-dashboard.php:67
298
- msgid "Interesting tips and guides can also be found on "
299
- msgstr "Interesantes consejos y guías también se pueden encontrar en"
300
-
301
- #: pages/wphe-dashboard.php:68
302
- msgid "Or use the Google search."
303
- msgstr "O utilizar la búsqueda de Google."
304
-
305
- #: pages/wphe-dashboard.php:74
306
- msgid "Htaccess file does not exists!"
307
- msgstr "¡El archivo htaccess no existe!"
308
-
309
- #: pages/wphe-dashboard.php:82 pages/wphe-dashboard.php:91
310
- msgid "Htaccess file cannot read!"
311
- msgstr "¡El archivo htaccess no se puede leer!"
312
-
313
- #: pages/wphe-dashboard.php:106
314
- msgid "Content of the Htaccess file"
315
- msgstr "Contenido del archivo htaccess"
316
-
317
- #: pages/wphe-dashboard.php:108
318
- msgid "Save file &raquo;"
319
- msgstr "Guardar archivo &raquo;"
320
-
321
- #: pages/wphe-dashboard.php:119
322
- msgid "Create new <code>.htaccess</code> file?"
323
- msgstr "¿Crear nuevo archivo<code> htaccess </code>?"
324
-
325
- #: pages/wphe-dashboard.php:119
326
- msgid "Create &raquo;"
327
- msgstr "Create &raquo;"
328
-
329
- #: lib/lib.wp-files.php:10
330
- msgid ""
331
- "Plugin WP Htaccess Editor Error: File \"/wp-includes/pluggable.php\" does "
332
- "not exists!"
333
- msgstr ""
334
- "Error del Plugin WP htaccess Editor: ¡El archivo \"/ wp-includes/pluggable."
335
- "php\"no existe!"
336
-
337
- #: lib/lib.wp-files.php:18
338
- msgid ""
339
- "Plugin WP Htaccess Editor Error: File \"/wp-includes/capabilities.php\" does "
340
- "not exists!"
341
- msgstr ""
342
- "Error: del Plugin WP htaccess Editor: ¡El archivo \"/wp-includes/"
343
- "capabilities.php\"no existe!"
344
-
345
- #: lib/lib.ad.php:7
346
- msgid "Plugin homepage"
347
- msgstr "Página de inicio del Plugin"
348
-
349
- #~ msgid "The backup file was found..."
350
- #~ msgstr "Záložní soubor byl nalezen..."
351
-
352
- #~ msgid "Unlimited hosting WEDOS"
353
- #~ msgstr "Neomezený hosting WEDOS"
354
-
355
- #~ msgid "WP Htaccess Editor"
356
- #~ msgstr "WP Htaccess Editor"
357
-
358
- #~ msgid "Htaccess"
359
- #~ msgstr "Htaccess"
360
-
361
- #~ msgid "Htaccess Editor"
362
- #~ msgstr "Htaccess Editor"
363
-
364
- #~ msgid "WP Htaccess Editor - Backup"
365
- #~ msgstr "WP Htaccess Editor - Záloha"
366
-
367
- #~ msgid "Download backup file"
368
- #~ msgstr "Uložit záložní soubor do PC"
369
-
370
- #~ msgid ""
371
- #~ "Unable to create backup! Probably the wrong setting write permissions to "
372
- #~ "the files."
373
- #~ msgstr ""
374
- #~ "Vytvoření zálohy nebylo úspěšné! Pravděpodobně jsou špatně nastavena "
375
- #~ "práva k zápisu do souboru. "
376
-
377
- #~ msgid "Access denied"
378
- #~ msgstr "Přístup odepřen"
379
-
380
- #~ msgid ""
381
- #~ "The file could not be saved! Probably the wrong setting read permissions "
382
- #~ "to the files"
383
- #~ msgstr ""
384
- #~ "Soubor nebyl uložen! Pravděpodobně jsou špatně nastavena práva k zápisu "
385
- #~ "do souboru. "
386
-
387
- #~ msgid ""
388
- #~ "Htaccess file is not created. Probably the wrong setting read permissions "
389
- #~ "to the files"
390
- #~ msgstr ""
391
- #~ "Soubor Htaccess nebyl vytvořen! Pravděpodobně jsou špatně nastavena práva "
392
- #~ "k zápisu do souboru. "
393
-
394
- #~ msgid ""
395
- #~ "Backup file could not be removed! Probably the wrong setting read "
396
- #~ "permissions to the files"
397
- #~ msgstr ""
398
- #~ "Záložní soubor se nepodařilo odstranit! Pravděpodobně jsou špatně "
399
- #~ "nastavena práva k zápisu do souboru. "
400
-
401
- #~ msgid "Htaccess file not found!"
402
- #~ msgstr "Htaccess soubor nebyl nalezen!"
403
-
404
- #~ msgid "Htaccess file found..."
405
- #~ msgstr "Htaccess soubor byl nalezen..."
406
-
407
- #~ msgid "Htaccess file is empty..."
408
- #~ msgstr "Htaccess soubor je prázdný..."
409
-
410
- #~ msgid "Htaccess file is not readable, probably does not exist"
411
- #~ msgstr "Htaccess soubor nelze přečíst, pravděpodobně neexistuje"
412
-
413
- #~ msgid "URL:"
414
- #~ msgstr "Web pluginu:"
415
-
416
- #~ msgid "Feedback:"
417
- #~ msgstr "Hlášení chyb:"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lang/index.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- header('Location: ../../');
3
- exit();
4
- ?>
 
 
 
 
lib/index.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- header('Location: ../../');
3
- exit();
4
- ?>
 
 
 
 
lib/lib.ad.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
3
-
4
- /*** funkce pro zobrazení odkazu na domovskou stránku pluginu ***/
5
- function WPHE_PluginLink()
6
- {
7
- echo '<a class="plugin-link" href="http://wordpress.org/extend/plugins/wp-htaccess-editor/" title="'.__('Plugin homepage','wphe').'" target="_blank">'.__('Plugin homepage','wphe').'</a>';
8
- }
9
-
10
- /*** funkce pro zobrazení odkazu na domovskou stránku autora ***/
11
- function WPHE_AuthorLink()
12
- {
13
- echo '<a class="author-link" href="http://wp-blog.cz/" target="_blank">WP-blog.cz</a>';
14
- }
15
-
16
-
17
- /*** funkce pro zobrazení odkazu na příspěvky autorovi ***/
18
- function WPHE_DonateLink()
19
- {
20
- echo '<a class="author-link" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=NSKURYL8JEVU8" target="_blank">'.__('Donate', 'wphe').'</a>';
21
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/lib.functions.php DELETED
@@ -1,236 +0,0 @@
1
- <?php
2
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
3
-
4
-
5
-
6
- /***** Vytvoření zálohy htaccess souboru ******************************/
7
- function WPHE_CreateBackup(){
8
- $WPHE_backup_path = ABSPATH.'wp-content/htaccess.backup';
9
- $WPHE_orig_path = ABSPATH.'.htaccess';
10
- @clearstatcache();
11
-
12
- WPHE_CreateSecureWPcontent();
13
-
14
- if(file_exists($WPHE_backup_path)){
15
- WPHE_DeleteBackup();
16
-
17
- if(file_exists(ABSPATH.'.htaccess')){
18
- $htaccess_content_orig = @file_get_contents($WPHE_orig_path, false, NULL);
19
- $htaccess_content_orig = trim($htaccess_content_orig);
20
- $htaccess_content_orig = str_replace('\\\\', '\\', $htaccess_content_orig);
21
- $htaccess_content_orig = str_replace('\"', '"', $htaccess_content_orig);
22
- @chmod($WPHE_backup_path, 0666);
23
- $WPHE_success = @file_put_contents($WPHE_backup_path, $htaccess_content_orig, LOCK_EX);
24
- if($WPHE_success === false)
25
- {
26
- unset($WPHE_backup_path);
27
- unset($WPHE_orig_path);
28
- unset($htaccess_content_orig);
29
- unset($WPHE_success);
30
- return false;
31
- }else{
32
- unset($WPHE_backup_path);
33
- unset($WPHE_orig_path);
34
- unset($htaccess_content_orig);
35
- unset($WPHE_success);
36
- return true;
37
- }
38
- @chmod($WPHE_backup_path, 0644);
39
- }else{
40
- unset($WPHE_backup_path);
41
- unset($WPHE_orig_path);
42
- return false;
43
- }
44
- }else{
45
- if(file_exists(ABSPATH.'.htaccess')){
46
- $htaccess_content_orig = @file_get_contents($WPHE_orig_path, false, NULL);
47
- $htaccess_content_orig = trim($htaccess_content_orig);
48
- $htaccess_content_orig = str_replace('\\\\', '\\', $htaccess_content_orig);
49
- $htaccess_content_orig = str_replace('\"', '"', $htaccess_content_orig);
50
- @chmod($WPHE_backup_path, 0666);
51
- $WPHE_success = @file_put_contents($WPHE_backup_path, $htaccess_content_orig, LOCK_EX);
52
- if($WPHE_success === false){
53
- unset($WPHE_backup_path);
54
- unset($WPHE_orig_path);
55
- unset($htaccess_content_orig);
56
- unset($WPHE_success);
57
- return false;
58
- }else{
59
- unset($WPHE_backup_path);
60
- unset($WPHE_orig_path);
61
- unset($htaccess_content_orig);
62
- unset($WPHE_success);
63
- return true;
64
- }
65
- @chmod($WPHE_backup_path, 0644);
66
- }else{
67
- unset($WPHE_backup_path);
68
- unset($WPHE_orig_path);
69
- return false;
70
- }
71
- }
72
- }
73
-
74
-
75
-
76
- /***** Vytvoření htaccess souboru ve složce wp-content ****************/
77
- function WPHE_CreateSecureWPcontent(){
78
- $wphe_secure_path = ABSPATH.'wp-content/.htaccess';
79
- $wphe_secure_text = '
80
- # WP Htaccess Editor - Secure backups
81
- <files htaccess.backup>
82
- order allow,deny
83
- deny from all
84
- </files>
85
- ';
86
-
87
- if(is_readable(ABSPATH.'wp-content/.htaccess')){
88
- $wphe_secure_content = @file_get_contents(ABSPATH.'wp-content/.htaccess');
89
-
90
- if($wphe_secure_content !== false){
91
- if(strpos($wphe_secure_content, 'Secure backups') === false){
92
- unset($wphe_secure_content);
93
- $wphe_create_sec = @file_put_contents(ABSPATH.'wp-content/.htaccess', $wphe_secure_text, FILE_APPEND|LOCK_EX);
94
- if($wphe_create_sec !== false){
95
- unset($wphe_secure_text);
96
- unset($wphe_create_sec);
97
- return true;
98
- }else{
99
- unset($wphe_secure_text);
100
- unset($wphe_create_sec);
101
- return false;
102
- }
103
- }else{
104
- unset($wphe_secure_content);
105
- return true;
106
- }
107
- }else{
108
- unset($wphe_secure_content);
109
- return false;
110
- }
111
- }else{
112
- if(file_exists(ABSPATH.'wp-content/.htaccess')){
113
- return false;
114
- }else{
115
- $wphe_create_sec = @file_put_contents(ABSPATH.'wp-content/.htaccess', $wphe_secure_text, LOCK_EX);
116
- if($wphe_create_sec !== false){
117
- return true;
118
- }else{
119
- return false;
120
- }
121
- }
122
- }
123
- }
124
-
125
-
126
-
127
- /***** Obnova zálohy htaccess souboru *********************************/
128
- function WPHE_RestoreBackup(){
129
- $wphe_backup_path = ABSPATH.'wp-content/htaccess.backup';
130
- $WPHE_orig_path = ABSPATH.'.htaccess';
131
- @clearstatcache();
132
-
133
- if(!file_exists($wphe_backup_path)){
134
- unset($wphe_backup_path);
135
- unset($WPHE_orig_path);
136
- return false;
137
- }else{
138
- if(file_exists($WPHE_orig_path)){
139
- if(is_writable($WPHE_orig_path)){
140
- @unlink($WPHE_orig_path);
141
- }else{
142
- @chmod($WPHE_orig_path, 0666);
143
- @unlink($WPHE_orig_path);
144
- }
145
- }
146
- $wphe_htaccess_content_backup = @file_get_contents($wphe_backup_path, false, NULL);
147
- if(WPHE_WriteNewHtaccess($wphe_htaccess_content_backup) === false){
148
- unset($wphe_success);
149
- unset($WPHE_orig_path);
150
- unset($wphe_backup_path);
151
- return $wphe_htaccess_content_backup;
152
- }else{
153
- WPHE_DeleteBackup();
154
- unset($wphe_success);
155
- unset($wphe_htaccess_content_backup);
156
- unset($WPHE_orig_path);
157
- unset($wphe_backup_path);
158
- return true;
159
- }
160
- }
161
- }
162
-
163
-
164
-
165
- /***** Smazání záložního souboru **************************************/
166
- function WPHE_DeleteBackup(){
167
- $wphe_backup_path = ABSPATH.'wp-content/htaccess.backup';
168
- @clearstatcache();
169
-
170
- if(file_exists($wphe_backup_path)){
171
- if(is_writable($wphe_backup_path)){
172
- @unlink($wphe_backup_path);
173
- }else{
174
- @chmod($wphe_backup_path, 0666);
175
- @unlink($wphe_backup_path);
176
- }
177
-
178
- @clearstatcache();
179
-
180
- if(file_exists($wphe_backup_path)){
181
- unset($wphe_backup_path);
182
- return false;
183
- }else{
184
- unset($wphe_backup_path);
185
- return true;
186
- }
187
- }else{
188
- unset($wphe_backup_path);
189
- return true;
190
- }
191
- }
192
-
193
-
194
-
195
- /***** Vytvoření nového htaccess souboru ******************************/
196
- function WPHE_WriteNewHtaccess($WPHE_new_content){
197
- $WPHE_orig_path = ABSPATH.'.htaccess';
198
- @clearstatcache();
199
-
200
- if(file_exists($WPHE_orig_path))
201
- {
202
- if(is_writable($WPHE_orig_path))
203
- {
204
- @unlink($WPHE_orig_path);
205
- }else{
206
- @chmod($WPHE_orig_path, 0666);
207
- @unlink($WPHE_orig_path);
208
- }
209
- }
210
- $WPHE_new_content = trim($WPHE_new_content);
211
- $WPHE_new_content = str_replace('\\\\', '\\', $WPHE_new_content);
212
- $WPHE_new_content = str_replace('\"', '"', $WPHE_new_content);
213
- $WPHE_write_success = @file_put_contents($WPHE_orig_path, $WPHE_new_content, LOCK_EX);
214
- @clearstatcache();
215
- if(!file_exists($WPHE_orig_path) && $WPHE_write_success === false)
216
- {
217
- unset($WPHE_orig_path);
218
- unset($WPHE_new_content);
219
- unset($WPHE_write_success);
220
- return false;
221
- }else{
222
- unset($WPHE_orig_path);
223
- unset($WPHE_new_content);
224
- unset($WPHE_write_success);
225
- return true;
226
- }
227
- }
228
-
229
-
230
-
231
- /****** debug funkce **************************************************/
232
- function WPHE_Debug($data){
233
- echo '<pre>';
234
- var_dump($data);
235
- echo '</pre>';
236
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/lib.pages.php DELETED
@@ -1,68 +0,0 @@
1
- <?php
2
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
3
-
4
- /***** Přidání stránek do menu v administraci *************************/
5
- function WPHE_admin_menu()
6
- {
7
- global $WPHE_dirname, $WPHE_dirurl;
8
- if(current_user_can('activate_plugins')){
9
- add_menu_page('WP Htaccess Editor', 'Htaccess', 'activate_plugins', $WPHE_dirname, 'WPHE_view_page', $WPHE_dirurl.'style/img/wphe-mini.png');
10
- WPHE_add_page('Htaccess Editor','Htaccess Editor', 'activate_plugins', $WPHE_dirname, 'WPHE_view_page');
11
- WPHE_add_page(__('Backup', 'wphe'),__('Backup', 'wphe'), 'activate_plugins', $WPHE_dirname.'_backup', 'WPHE_view_page');
12
-
13
- // přidání css stylu do administrace
14
- wp_enqueue_style('wphe-style', $WPHE_dirurl.'style/wphe-style.css');
15
- }
16
- unset($WPHE_dirname);
17
- unset($WPHE_dirurl);
18
- }
19
-
20
- /***** Zobrazení stránky podle požadavku ******************************/
21
- function WPHE_view_page()
22
- {
23
- global $WPHE_dirname, $WPHE_root, $WPHE_dirurl, $WPHE_version;
24
-
25
- switch (strip_tags(addslashes($_GET['page'])))
26
- {
27
- case $WPHE_dirname:
28
- if(file_exists($WPHE_root.'pages/wphe-dashboard.php')){
29
- require $WPHE_root.'pages/wphe-dashboard.php';
30
- }else{
31
- wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe'));
32
- }
33
- break;
34
- case $WPHE_dirname.'_backup':
35
- if(file_exists($WPHE_root.'pages/wphe-backup.php')){
36
- require $WPHE_root.'pages/wphe-backup.php';
37
- }else{
38
- wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe'));
39
- }
40
- break;
41
- default:
42
- if(file_exists($WPHE_root.'pages/wphe-dashboard.php')){
43
- require $WPHE_root.'pages/wphe-dashboard.php';
44
- }else{
45
- wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe'));
46
- }
47
- break;
48
- }
49
-
50
- unset($WPHE_dirname);
51
- unset($WPHE_root);
52
- unset($WPHE_dirurl);
53
- unset($WPHE_version);
54
- }
55
-
56
- /***** Pomocná funkce pro vytvoření menu ******************************/
57
- function WPHE_add_page($page_title, $menu_title, $access_level, $file, $function = '')
58
- {
59
- global $WPHE_dirname;
60
- add_submenu_page($WPHE_dirname, $page_title, $menu_title, $access_level, $file, $function);
61
-
62
- unset($WPHE_dirname);
63
- unset($page_title);
64
- unset($menu_title);
65
- unset($access_level);
66
- unset($file);
67
- unset($function);
68
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/lib.wp-files.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
3
-
4
- /***** Načtení systémových souborů WP pro kontrolu oprávnění uživatele */
5
-
6
- if(!function_exists('wp_get_current_user')){
7
- if(file_exists(ABSPATH.'wp-includes/pluggable.php')){
8
- require_once ABSPATH.'wp-includes/pluggable.php';
9
- }else{
10
- wp_die(__('Plugin WP Htaccess Editor Error: File "/wp-includes/pluggable.php" does not exists!', 'wphe'));
11
- }
12
- }
13
-
14
- if(!function_exists('current_user_can')){
15
- if(file_exists(ABSPATH.'wp-includes/capabilities.php')){
16
- require_once ABSPATH.'wp-includes/capabilities.php';
17
- }else{
18
- wp_die(__('Plugin WP Htaccess Editor Error: File "/wp-includes/capabilities.php" does not exists!', 'wphe'));
19
- }
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
license.txt ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
pages/index.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- header('Location: ../../');
3
- exit();
4
- ?>
 
 
 
 
pages/wphe-backup.php DELETED
@@ -1,143 +0,0 @@
1
- <?php
2
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
3
-
4
- if(current_user_can('activate_plugins')){
5
- ?>
6
- <div class="wrap">
7
- <h2 class="wphe-title">WP Htaccess Editor - <?php _e('Backup', 'wphe'); ?></h2>
8
- <?php
9
- //============================ Restore Backup ===================================
10
- if(!empty($_POST['submit']) && !empty($_POST['restore_backup']) && check_admin_referer('wphe_restoreb', 'wphe_restoreb'))
11
- {
12
-
13
- $wphe_restore_result = WPHE_RestoreBackup();
14
- if($wphe_restore_result === false)
15
- {
16
- echo'<div id="message" class="error fade"><p><strong>'.__('Unable to restore backup! Probably the wrong setting write permissions to the files.', 'wphe').'</strong></p></div>';
17
- echo'<div class="postbox wphe-box">';
18
- echo'<p>'.__('The backup file is located in the <code>wp-content</code> folder.','wphe').'</p>';
19
- echo'</div>';
20
- }elseif($wphe_restore_result === true)
21
- {
22
- echo'<div id="message" class="updated fade"><p><strong>'.__('Backup was restored successfully', 'wphe').'</strong></p></div>';
23
- echo'<div id="message" class="updated fade"><p><strong>'.__('Old backup file was deleted successfully', 'wphe').'</strong></p></div>';
24
- }else
25
- {
26
- echo'<div id="message" class="error fade"><p><strong>'.__('Unable to restore backup!', 'wphe').'</strong></p></div>';
27
- echo'<div class="postbox wphe-box" style="background: #FFEECE;">';
28
- echo'<p class="wphe-red">'.__('This is contents of the original file, put it into a file manually','wphe').':</p>';
29
- echo'<textarea class="wphe-textarea">'.$wphe_restore_result.'</textarea>';
30
- echo'</div>';
31
- }
32
- //============================== Create Backup ===================================
33
- }elseif(!empty($_POST['submit']) && !empty($_POST['create_backup']) && check_admin_referer('wphe_createb', 'wphe_createb')){
34
- if(WPHE_CreateBackup())
35
- {
36
- echo'<div id="message" class="updated fade"><p><strong>'.__('Backup file was created successfully', 'wphe').'</strong></p></div>';
37
- echo'<div class="postbox wphe-box">';
38
- echo'<p>'.__('The backup file is located in the <code>wp-content</code> folder.','wphe').'</p>';
39
- echo'</div>';
40
- }else{
41
- echo'<div id="message" class="error fade"><p><strong>'.__('Unable to create backup! <code>wp-content</code> folder is not writeable! Change the permissions this folder manually!', 'wphe').'</strong></p></div>';
42
- echo'<div id="message" class="error fade"><p><strong>'.__('Due to server configuration can not change permissions on files or create new files','wphe').'</strong></p></div>';
43
- }
44
- //============================== Delete Backup ====================================
45
- }elseif(!empty($_POST['submit']) && !empty($_POST['delete_backup']) && check_admin_referer('wphe_deleteb', 'wphe_deleteb'))
46
- {
47
- if(WPHE_DeleteBackup())
48
- {
49
- echo'<div id="message" class="updated fade"><p><strong>'.__('Backup file was successfully removed', 'wphe').'</strong></p></div>';
50
- }else{
51
- echo'<div id="message" class="error fade"><p><strong>'.__('Backup file could not be removed! Probably the wrong setting write permissions to the files.','wphe').'</strong></p></div>';
52
- echo'<div id="message" class="error fade"><p><strong>'.__('Due to server configuration can not change permissions on files or create new files','wphe').'</strong></p></div>';
53
- }
54
- //============================== Home ==============================================
55
- }else{
56
- if(file_exists(ABSPATH.'wp-content/htaccess.backup'))
57
- {
58
- echo '<div class="postbox wphe-box" style="background: #FFEECE;">';
59
- ?>
60
- <form method="post" action="admin.php?page=<?php echo $WPHE_dirname; ?>_backup">
61
- <?php wp_nonce_field('wphe_restoreb','wphe_restoreb'); ?>
62
- <input type="hidden" name="restore_backup" value="restore" />
63
- <p class="submit"><?php _e('Do you want to restore the backup file?', 'wphe'); ?> <input type="submit" class="button button-primary" name="submit" value="<?php _e('Restore backup &raquo;', 'wphe'); ?>" /></p>
64
- </form>
65
- <?php
66
- echo '</div>';
67
- echo '<div class="postbox wphe-box" style="background: #FFEECE;">';
68
- ?>
69
- <form method="post" action="admin.php?page=<?php echo $WPHE_dirname; ?>_backup">
70
- <?php wp_nonce_field('wphe_deleteb','wphe_deleteb'); ?>
71
- <input type="hidden" name="delete_backup" value="delete" />
72
- <p class="submit"><?php _e('Do you want to delete a backup file?', 'wphe'); ?> <input type="submit" class="button button-primary" name="submit" value="<?php _e('Remove backup &raquo;', 'wphe'); ?>" /></p>
73
- </form>
74
- <?php
75
- echo '</div>';
76
- }else{
77
- echo '<div class="postbox wphe-box">';
78
- echo '<pre class="wphe-red">'.__('Backup file not found...','wphe').'</pre>';
79
- echo '</div>';
80
-
81
- echo '<div class="postbox wphe-box" style="background: #E0FCE1;">';
82
- ?>
83
- <form method="post" action="admin.php?page=<?php echo $WPHE_dirname; ?>_backup">
84
- <?php wp_nonce_field('wphe_createb','wphe_createb'); ?>
85
- <input type="hidden" name="create_backup" value="create" />
86
- <p class="submit"><?php _e('Do you want to create a new backup file?', 'wphe'); ?> <input type="submit" class="button button-primary" name="submit" value="<?php _e('Create new &raquo;', 'wphe'); ?>" /></p>
87
- </form>
88
- <?php
89
- echo '</div>';
90
- }
91
- }
92
- ?>
93
- <p style="clear:both;">&nbsp;</p>
94
- <div class="postbox wphe-box">
95
- <h3 class="wphe-title"><?php _e('Information about this plugin', 'wphe');?></h3>
96
- <div class="wphe-infobox">
97
- <h4><?php _e('Author','wphe'); ?></h4>
98
- <p style="padding-left: 5px"><em>Lukenzi</em>&nbsp;&nbsp;<?php WPHE_AuthorLink(); ?></p>
99
- </div>
100
- <div class="wphe-infobox">
101
- <h4><?php _e('Translators','wphe'); ?></h4>
102
- <table class="wphe-translators">
103
- <tr><td><em>Lukenzi</em></td><td><img src="<?php echo $WPHE_dirurl.'style/img/flag-cz.jpg'; ?>" border="0" alt="Czech" width="12" height="9" /></td><td><?php WPHE_AuthorLink(); ?></td></tr>
104
- <tr><td><em>Andi Eko</em></td><td><img src="<?php echo $WPHE_dirurl.'style/img/flag-en.jpg'; ?>" border="0" alt="English" width="12" height="9" /></td><td><a href="http://andieko.info/" target="_blank">andieko.info</a></td></tr>
105
- <tr><td><em>Andrew Kurtis</em></td><td><img src="<?php echo $WPHE_dirurl.'style/img/flag-es.gif'; ?>" border="0" alt="Spanish" width="12" height="9" /></td><td><a href="http://www.webhostinghub.com" target="_blank">WebHostingHub.com</a></td></tr>
106
- </table>
107
- </div>
108
- <div class="wphe-infobox">
109
- <h4><?php _e('Plugin','wphe'); ?></h4>
110
- <table>
111
- <tr><td><em><?php _e('Version:','wphe'); ?></em></td><td><span class="wphe-green"><?php echo $WPHE_version; ?></span></td></tr>
112
- <tr><td><em><?php _e('Plugin homepage:','wphe'); ?></em></td><td><a href="http://wordpress.org/extend/plugins/wp-htaccess-editor/" target="_blank"><?php _e('WordPress repository','wphe'); ?></a></td></tr>
113
- <tr><td><em><?php _e('Support:','wphe'); ?></em></td><td><a href="http://wordpress.org/support/plugin/wp-htaccess-editor"><?php _e('Forum','wphe'); ?></a></td></tr>
114
- <tr><td><em><?php _e('Support for the development:','wphe');?></em></td><td><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM4GZAE9FVPSN"><?php _e('Donate','wphe'); ?></a></td></tr>
115
- </table>
116
- </div>
117
- <div class="wphe-infobox">
118
- <h4><?php _e('Other plugins','wphe'); ?></h4>
119
- <table>
120
- <tr><td><em><a href="http://wordpress.org/plugins/wedos-news/" target="_blank">WEDOS News</a></em></td></tr>
121
- <tr><td><em><a href="http://wp-blog.cz/wpb-file-manager-spravce-souboru-pro-wordpress/" target="_blank">WPB File Manager</a></em></td></tr>
122
- <tr><td><em><a href="http://wp-blog.cz/system-files-editor/" target="_blank">System Files Editor</a></em></td></tr>
123
- <tr><td><em><a href="http://wordpress.org/extend/plugins/ceska-podpora-wordpressu/" target="_blank"><?php _e('Czech support for WordPress','wphe'); ?></a></em></td></tr>
124
- </table>
125
- </div>
126
- <div class="wphe-infobox">
127
- <h4><?php _e('Donate','wphe'); ?></h4>
128
- <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
129
- <input type="hidden" name="cmd" value="_s-xclick">
130
- <input type="hidden" name="hosted_button_id" value="KM4GZAE9FVPSN">
131
- <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
132
- <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
133
- </form>
134
- </div>
135
- </div>
136
- <p style="clear:both;">&nbsp;</p>
137
- <p style="clear:both;">&nbsp;</p>
138
- <p style="clear:both;">&nbsp;</p>
139
- </div>
140
- <?php
141
- }else{
142
- wp_die( __('You do not have permission to view this page','wphe'));
143
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pages/wphe-dashboard.php DELETED
@@ -1,179 +0,0 @@
1
- <?php
2
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
3
-
4
- if(current_user_can('activate_plugins')){
5
- $WPHE_backup_path = WP_CONTENT_URL.'/htaccess.backup';
6
- $WPHE_orig_path = ABSPATH.'.htaccess';
7
- ?>
8
- <div class="wrap">
9
- <h2 class="wphe-title">WP Htaccess Editor</h2>
10
- <?php
11
- //============================ Uložení Htaccess souboru =======================================
12
- if(!empty($_POST['submit']) AND !empty($_POST['save_htaccess']) AND check_admin_referer('wphe_save', 'wphe_save')){
13
- $WPHE_new_content = $_POST['ht_content'];
14
- WPHE_DeleteBackup();
15
- if(WPHE_CreateBackup()){
16
- if(WPHE_WriteNewHtaccess($WPHE_new_content)){
17
- echo'<div id="message" class="updated fade"><p><strong>'.__('File has been successfully changed', 'wphe').'</strong></p></div>';
18
- ?>
19
- <p><?php _e('You have made changes to the htaccess file. The original file was automatically backed up (in <code>wp-content</code> folder)', 'wphe'); ?><br />
20
- <a href="<?php echo get_option('home'); ?>/" target="_blank"><?php _e('Check the functionality of your site (the links to the articles or categories).', 'wphe');?></a>. <?php _e('If something is not working properly restore the original file from backup', 'wphe');?></p>
21
- <div class="postbox" style="float: left; width: 95%; padding: 15px;">
22
- <form method="post" action="admin.php?page=<?php echo $WPHE_dirname; ?>">
23
- <?php wp_nonce_field('wphe_delete','wphe_delete'); ?>
24
- <input type="hidden" name="delete_backup" value="delete" />
25
- <p class="submit"><?php _e('If everything works properly, you can delete the backup file:', 'wphe');?> <input type="submit" class="button button-primary" name="submit" value="<?php _e('Remove backup &raquo;', 'wphe');?>" />&nbsp;<?php echo __('or','wphe'); ?>&nbsp;<a href="admin.php?page=<?php echo $WPHE_dirname; ?>_backup"><?php _e('restore the original file from backup','wphe');?></a></p>
26
- </form>
27
- </div>
28
- <?php
29
- }else{
30
- echo'<div id="message" class="error fade"><p><strong>'.__('The file could not be saved!', 'wphe').'</strong></p></div>';
31
- echo'<div id="message" class="error fade"><p><strong>'.__('Due to server configuration can not change permissions on files or create new files','wphe').'</strong></p></div>';
32
- }
33
- }else{
34
- echo'<div id="message" class="error fade"><p><strong>'.__('The file could not be saved!', 'wphe').'</strong></p></div>';
35
- echo'<div id="message" class="error fade"><p><strong>'.__('Unable to create backup of the original file! <code>wp-content</code> folder is not writeable! Change the permissions this folder!', 'wphe').'</strong></p></div>';
36
- }
37
- unset($WPHE_new_content);
38
- //============================ Vytvoření nového Htaccess souboru ================================
39
- }elseif(!empty($_POST['submit']) AND !empty($_POST['create_htaccess']) AND check_admin_referer('wphe_create', 'wphe_create')){
40
- if(WPHE_WriteNewHtaccess('# Created by WP Htaccess Editor') === false)
41
- {
42
- echo'<div id="message" class="error fade"><p><strong>'.__('Htaccess file is not created.', 'wphe').'</p></div>';
43
- echo'<div id="message" class="error fade"><p><strong>'.__('Due to server configuration can not change permissions on files or create new files','wphe').'</strong></p></div>';
44
- }else{
45
- echo'<div id="message" class="updated fade"><p><strong>'.__('Htaccess file was successfully created.', 'wphe').'</strong></p></div>';
46
- echo'<div id="message" class="updated fade"><p><strong><a href="admin.php?page='.$WPHE_dirname.'">'.__('View new Htaccess file', 'wphe').'</a></strong></p></div>';
47
- }
48
- //============================ Smazání zálohy =======================================
49
- }elseif(!empty($_POST['submit']) AND !empty($_POST['delete_backup']) AND check_admin_referer('wphe_delete', 'wphe_delete'))
50
- {
51
- if(WPHE_DeleteBackup() === false)
52
- {
53
- echo'<div id="message" class="error fade"><p><strong>'.__('Backup file could not be removed! <code>wp-content</code> folder is not writeable! Change the permissions this folder!', 'wphe').'</p></div>';
54
- }else{
55
- echo'<div id="message" class="updated fade"><p><strong>'.__('Backup file has been successfully removed.', 'wphe').'</strong></p></div>';
56
- }
57
- //============================ Home ================================================
58
- }else{
59
- ?>
60
- <p><?php _e('Using this editor you can easily modify your htaccess file without having to use an FTP client.', 'wphe');?></p>
61
- <p class="wphe-red"><?php _e('<strong>WARNING:</strong> Any error in this file may cause malfunction of your site!', 'wphe');?><br />
62
- <?php _e('Edit htaccess file should therefore be performed only by experienced users!', 'wphe');?><br />
63
- </p>
64
- <div class="postbox wphe-box">
65
- <h3 class="wphe-title"><?php _e('Information for editing htaccess file', 'wphe');?></h3>
66
- <p><?php _e('For more information on possible adjustments to this file, please visit', 'wphe');?> <a href="http://httpd.apache.org/docs/current/howto/htaccess.html" target="_blank">Apache Tutorial: .htaccess files</a> <?php _e('or','wphe'); ?> <a href="http://net.tutsplus.com/tutorials/other/the-ultimate-guide-to-htaccess-files/" target="_blank">The Ultimate Guide to .htaccess Files</a>. </p>
67
- <p><?php _e('Interesting tips and guides can also be found on ', 'wphe');?> <?php WPHE_AuthorLink(); ?>.</p>
68
- <p><a href="http://www.google.com/#sclient=psy&q=htaccess+how+to" target="_blank"><?php _e('Or use the Google search.','wphe');?></a></p>
69
- </div>
70
- <?php
71
- if(!file_exists($WPHE_orig_path))
72
- {
73
- echo'<div class="postbox wphe-box">';
74
- echo'<pre class="wphe-red">'.__('Htaccess file does not exists!', 'wphe').'</pre>';
75
- echo'</div>';
76
- $success = false;
77
- }else{
78
- $success = true;
79
- if(!is_readable($WPHE_orig_path))
80
- {
81
- echo'<div class="postbox wphe-box">';
82
- echo'<pre class="wphe-red">'.__('Htaccess file cannot read!', 'wphe').'</pre>';
83
- echo'</div>';
84
- $success = false;
85
- }
86
- if($success == true){
87
- @chmod($WPHE_orig_path, 0644);
88
- $WPHE_htaccess_content = @file_get_contents($WPHE_orig_path, false, NULL);
89
- if($WPHE_htaccess_content === false){
90
- echo'<div class="postbox wphe-box">';
91
- echo'<pre class="wphe-red">'.__('Htaccess file cannot read!', 'wphe').'</pre>';
92
- echo'</div>';
93
- $success = false;
94
- }else{
95
- $success = true;
96
- }
97
- }
98
- }
99
-
100
- if($success == true){
101
- ?>
102
- <div class="postbox wphe-box">
103
- <form method="post" action="admin.php?page=<?php echo $WPHE_dirname; ?>">
104
- <input type="hidden" name="save_htaccess" value="save" />
105
- <?php wp_nonce_field('wphe_save','wphe_save'); ?>
106
- <h3 class="wphe-title"><?php _e('Content of the Htaccess file', 'wphe');?></h3>
107
- <textarea name="ht_content" class="wphe-textarea" wrap="off"><?php echo $WPHE_htaccess_content;?></textarea>
108
- <p class="submit"><input type="submit" class="button button-primary" name="submit" value="<?php _e('Save file &raquo;', 'wphe');?>" /></p>
109
- </form>
110
- </div>
111
- <?php
112
- unset($WPHE_htaccess_content);
113
- }else{
114
- ?>
115
- <div class="postbox wphe-box" style="background: #E0FCE1;">
116
- <form method="post" action="admin.php?page=<?php echo $WPHE_dirname; ?>">
117
- <input type="hidden" name="create_htaccess" value="create" />
118
- <?php wp_nonce_field('wphe_create','wphe_create'); ?>
119
- <p class="submit"><?php _e('Create new <code>.htaccess</code> file?', 'wphe');?> <input type="submit" class="button button-primary" name="submit" value="<?php _e('Create &raquo;', 'wphe');?>" /></p>
120
- </form>
121
- </div>
122
- <?php
123
- }
124
- unset($success);
125
- }
126
- ?>
127
- <p style="clear:both;">&nbsp;</p>
128
- <div class="postbox wphe-box">
129
- <h3 class="wphe-title"><?php _e('Information about this plugin', 'wphe');?></h3>
130
- <div class="wphe-infobox">
131
- <h4><?php _e('Author','wphe'); ?></h4>
132
- <p style="padding-left: 5px"><em>Lukenzi</em>&nbsp;&nbsp;<?php WPHE_AuthorLink(); ?></p>
133
- </div>
134
- <div class="wphe-infobox">
135
- <h4><?php _e('Translators','wphe'); ?></h4>
136
- <table class="wphe-translators">
137
- <tr><td><em>Lukenzi</em></td><td><img src="<?php echo $WPHE_dirurl.'style/img/flag-cz.jpg'; ?>" border="0" alt="Czech" width="12" height="9" /></td><td><?php WPHE_AuthorLink(); ?></td></tr>
138
- <tr><td><em>Andi Eko</em></td><td><img src="<?php echo $WPHE_dirurl.'style/img/flag-en.jpg'; ?>" border="0" alt="English" width="12" height="9" /></td><td><a href="http://andieko.info/" target="_blank">andieko.info</a></td></tr>
139
- <tr><td><em>Andrew Kurtis</em></td><td><img src="<?php echo $WPHE_dirurl.'style/img/flag-es.gif'; ?>" border="0" alt="Spanish" width="12" height="9" /></td><td><a href="http://www.webhostinghub.com" target="_blank">WebHostingHub.com</a></td></tr>
140
- </table>
141
- </div>
142
- <div class="wphe-infobox">
143
- <h4><?php _e('Plugin','wphe'); ?></h4>
144
- <table>
145
- <tr><td><em><?php _e('Version:','wphe'); ?></em></td><td><span class="wphe-green"><?php echo $WPHE_version; ?></span></td></tr>
146
- <tr><td><em><?php _e('Plugin homepage:','wphe'); ?></em></td><td><a href="http://wordpress.org/extend/plugins/wp-htaccess-editor/" target="_blank"><?php _e('WordPress repository','wphe'); ?></a></td></tr>
147
- <tr><td><em><?php _e('Support:','wphe'); ?></em></td><td><a href="http://wordpress.org/support/plugin/wp-htaccess-editor"><?php _e('Forum','wphe'); ?></a></td></tr>
148
- <tr><td><em><?php _e('Support for the development:','wphe');?></em></td><td><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM4GZAE9FVPSN"><?php _e('Donate','wphe'); ?></a></td></tr>
149
- </table>
150
- </div>
151
- <div class="wphe-infobox">
152
- <h4><?php _e('Other plugins','wphe'); ?></h4>
153
- <table>
154
- <tr><td><em><a href="http://wordpress.org/plugins/wedos-news/" target="_blank">WEDOS News</a></em></td></tr>
155
- <tr><td><em><a href="http://wp-blog.cz/wpb-file-manager-spravce-souboru-pro-wordpress/" target="_blank">WPB File Manager</a></em></td></tr>
156
- <tr><td><em><a href="http://wp-blog.cz/system-files-editor/" target="_blank">System Files Editor</a></em></td></tr>
157
- <tr><td><em><a href="http://wordpress.org/extend/plugins/ceska-podpora-wordpressu/" target="_blank"><?php _e('Czech support for WordPress','wphe'); ?></a></em></td></tr>
158
- </table>
159
- </div>
160
- <div class="wphe-infobox">
161
- <h4><?php _e('Donate','wphe'); ?></h4>
162
- <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
163
- <input type="hidden" name="cmd" value="_s-xclick">
164
- <input type="hidden" name="hosted_button_id" value="KM4GZAE9FVPSN">
165
- <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
166
- <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
167
- </form>
168
- </div>
169
- </div>
170
- <p style="clear:both;">&nbsp;</p>
171
- <p style="clear:both;">&nbsp;</p>
172
- </div>
173
- <?php
174
- unset($WPHE_orig_path);
175
- unset($WPHE_backup_path);
176
- }else{
177
- wp_die( __('You do not have permission to view this page','wphe'));
178
- }
179
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,51 +1,64 @@
1
- === WP Htaccess Editor ===
2
- Contributors: Lukenzi
3
- Author URI: http://wp-blog.cz
4
- Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM4GZAE9FVPSN
5
- Tags: simply,htaccess,file,editor,backup,admin
6
- Version: 1.3.0
7
- Requires at least: 3.0
8
- Tested up to: 3.8.1
9
- Stable tag: 1.3.0
10
  License: GPLv2 or later
 
11
 
12
- Simple editor htaccess file without using FTP client.
13
 
14
  == Description ==
15
 
16
- Simple editor *htaccess* file without using FTP client.
17
- **This plugin should be used only by experienced users!**
 
 
 
 
 
 
 
18
 
19
  == Installation ==
20
 
21
- 1. Extract the zip into the *wp-content/plugins* directory
22
- 2. Activate the plugin through the Admin panel of your WordPress
23
- 3. Go to Menu -> Htaccess
24
 
 
 
 
 
25
 
26
- == Screenshots ==
27
 
28
- 1. Editing htaccess file
29
- 2. Automatic backup htaccess file
30
- 3. Manual backup htaccess file
 
31
 
32
- == Frequently Asked Questions ==
33
 
34
- = Can create or edit the htaccess file =
35
- If your hosting does not allow you to create or modify files on the server, use another (better) hosting :)
 
 
36
 
37
- = I edited my htaccess file and now my site does not work =
38
- You probably have a syntax error in the file or on the server you are not allowed any of the settings in your htaccess file.
39
- Try to restore the original backup file. If restoration is not possible with this plugin, restore the backup file from the folder "wp-content " manually.
40
 
41
  == Changelog ==
42
 
43
- = 1.3.0 =
 
 
 
 
 
 
44
  * Added Spanish translation (Thanks to Andrew Kurtis from WebHostingHub.com)
45
  * Updated design
46
  * Updated info links
47
 
48
- = 1.2.0 =
49
  * Improved code
50
  * Improved design
51
  * Improved security
@@ -55,10 +68,10 @@ Try to restore the original backup file. If restoration is not possible with thi
55
  * Updated screenshots
56
  * Adding plugin logo
57
 
58
- = 1.1.1 =
59
  * Fixed CHMOD
60
 
61
- = 1.1.0 =
62
  * Adding Czech and English language
63
  * Adding debug panel
64
  * Added information about the author and translators
@@ -67,11 +80,33 @@ Try to restore the original backup file. If restoration is not possible with thi
67
  * Optimized for minimum memory requirements
68
  * Small code modifications
69
 
70
- = 1.0.1 =
71
  * Adding button for create .htaccess file if not exists
72
  * Fixed bug in the permissions to view the plugin
73
  * Optimized for smaller memory requirements
74
 
75
- = 1.0.0 =
 
76
  * First stable version
77
  * Adding to WordPress repository
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Htaccess Editor - Safely Edit Htaccess File ===
2
+ Tags: htaccess, htaccess editor, htaccess file, htaccess backup, fix htaccess, modify htaccess, file editor
3
+ Contributors: WebFactory, UnderConstructionPage, googlemapswidget, securityninja, wpreset
4
+ Requires at least: 4.0
5
+ Requires PHP: 5.2
6
+ Tested up to: 5.0
7
+ Stable tag: 1.5
 
 
8
  License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
+ A safe & simple htaccess file editor with automatic backup.
12
 
13
  == Description ==
14
 
15
+ WP Htaccess Editor provides a simple, safe and fast way to edit the site's .htaccess file from WP admin. It automatically makes backups every time you make a change to the htaccess file. Backups can be restored directly from the plugin, or via FTP if the errors in .htaccess file prevent WP from running normally. For all questions, including support please use the official <a href="https://wordpress.org/support/plugin/wp-htaccess-editor">forum</a>.
16
+
17
+ Access WP Htaccess Editor via the "Tools" menu in WP admin.
18
+
19
+ #### Automatic Backups
20
+
21
+ Htaccess Editor makes automatic backups of htaccess file every time you make a change to it. Backups are located in /wp-content/htaccess-editor-backups/ and timestamped so you can easily find the latest htaccess backup and restore it.
22
+
23
+ The plugin was originally developed by <a href="https://profiles.wordpress.org/lukenzi">Lukenzi</a> in March of 2011.
24
 
25
  == Installation ==
26
 
27
+ Follow the usual routine;
 
 
28
 
29
+ 1. Open WordPress admin, go to Plugins, click Add New
30
+ 2. Enter "htaccess editor" in search and hit Enter
31
+ 3. Plugin will show up as the first on the list, click "Install Now"
32
+ 4. Activate & open plugin's settings page located under the Tools menu
33
 
34
+ Or if needed, upload manually;
35
 
36
+ 1. Download the latest stable version from from <a href="https://downloads.wordpress.org/plugin/wp-htaccess-editor.latest-stable.zip">downloads.wordpress.org/plugin/wp-htaccess-editor.latest-stable.zip</a>
37
+ 2. Unzip it and upload to _/wp-content/plugins/_
38
+ 3. Open WordPress admin - Plugins and click "Activate" next to "WP Htaccess Editor"
39
+ 4. Open plugin's admin page located under the Tools menu
40
 
 
41
 
42
+ == Screenshots ==
43
+
44
+ 1. WP Htaccess Editor admin page
45
+ 2. Actions have to be double-confirmed to prevent accidents
46
 
 
 
 
47
 
48
  == Changelog ==
49
 
50
+ = v1.5 =
51
+ * 2018/12/21
52
+ * WebFactory took over development
53
+ * complete plugin rewrite
54
+ * 30,000 installations; 162,200 downloads
55
+
56
+ = v1.3.0 =
57
  * Added Spanish translation (Thanks to Andrew Kurtis from WebHostingHub.com)
58
  * Updated design
59
  * Updated info links
60
 
61
+ = v1.2.0 =
62
  * Improved code
63
  * Improved design
64
  * Improved security
68
  * Updated screenshots
69
  * Adding plugin logo
70
 
71
+ = v1.1.1 =
72
  * Fixed CHMOD
73
 
74
+ = v1.1.0 =
75
  * Adding Czech and English language
76
  * Adding debug panel
77
  * Added information about the author and translators
80
  * Optimized for minimum memory requirements
81
  * Small code modifications
82
 
83
+ = v1.0.1 =
84
  * Adding button for create .htaccess file if not exists
85
  * Fixed bug in the permissions to view the plugin
86
  * Optimized for smaller memory requirements
87
 
88
+ = v1.0.0 =
89
+ * 2011/03/24
90
  * First stable version
91
  * Adding to WordPress repository
92
+
93
+ == Frequently Asked Questions ==
94
+
95
+ = I've killed my site! Help!? =
96
+
97
+ Nothing is lost or deleted. You can easily get your site back.
98
+ You're probably getting an error 500 or a white screen (of death). First connect to your site via FTP and locate the .htaccess file. Delete it, or rename it. Try the site again - it should open. If it did locate the backup of the old, working .htaccess file in /wp-content/htaccess-editor-backups/ copy the file to your site's root folder and you're back in business.
99
+
100
+ = I get an error saying the .htaccess file can't be edited or created =
101
+
102
+ Sorry, we can't change the file access privileges set by your server. You'll have to edit the file via FTP.
103
+
104
+ Head over to our <a href="https://wordpress.org/support/plugin/wp-htaccess-editor">support forums</a>. We'll gladly assist you.
105
+
106
+ = How do I get support? =
107
+
108
+ Head over to our <a href="https://wordpress.org/support/plugin/wp-htaccess-editor">support forums</a>. We'll gladly help you.
109
+
110
+ = Do you support WP-CLI? =
111
+
112
+ Not yet, but we plan to.
screenshot-1.png DELETED
Binary file
screenshot-2.png DELETED
Binary file
screenshot-3.png DELETED
Binary file
style/img/flag-cz.jpg DELETED
Binary file
style/img/flag-en.jpg DELETED
Binary file
style/img/flag-es.gif DELETED
Binary file
style/img/wphe-mini.png DELETED
Binary file
style/img/wphe.png DELETED
Binary file
style/index.php DELETED
@@ -1,4 +0,0 @@
1
- <?php
2
- header('Location: ../../');
3
- exit();
4
- ?>
 
 
 
 
style/wphe-style.css DELETED
@@ -1,5 +0,0 @@
1
- h2.wphe-title{background: url('img/wphe.png') no-repeat left center;padding-left: 40px;}
2
- div.wrap div.wphe-box{float: left;width: 95%;padding: 10px;background: #DADADA;border: 1px solid #7F7F7F;box-shadow: 1px 1px 3px gray;}
3
- div.wrap div.wphe-box h3.wphe-title{background: transparent;border: none;cursor: default;text-shadow:0px 1px 0px white;}
4
- div.wrap div.wphe-box textarea.wphe-textarea{width: 100%;height: 400px;padding: 10px;color: #106AC2;border: 1px solid #9A9A9A;line-height: 1.25em;font-family: Monospace,Mono;background: #EDEDED;}
5
- .wphe-red{color: Red!important;}.wphe-green{color: Green!important;}div.wrap table.wphe-translators tr td{padding: 0 5px 0 5px;}div.wrap div.wphe-infobox{float: left;margin: 0 15px 15px 15px;}
 
 
 
 
 
wp-htaccess-editor.php CHANGED
@@ -1,105 +1,829 @@
1
  <?php
2
  /*
3
- Plugin Name: WP Htaccess Editor
4
- Plugin URI: http://wp-blog.cz/101-plugin-wp-htaccess-editor/
5
- Description: Simple editor htaccess file without using FTP client.
6
- Version: 1.3.0
7
- Text Domain: wphe
8
- Domain Path: /lang/
9
- Author: Lukenzi
10
- Author URI: http://wp-blog.cz/
11
- License: GPLv2 or later
12
- */
13
 
14
- /* Copyright 2011-2012, Lukenzi (email : lukenzi@gmail.com)
 
15
 
16
- This program is free software; you can redistribute it and/or modify
17
- it under the terms of the GNU General Public License as published by
18
- the Free Software Foundation; either version 2 of the License, or
19
- (at your option) any later version.
20
 
21
- This program is distributed in the hope that it will be useful,
22
- but WITHOUT ANY WARRANTY; without even the implied warranty of
23
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
- GNU General Public License for more details.
25
 
26
- You should have received a copy of the GNU General Public License
27
- along with this program; if not, write to the Free Software
28
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29
  */
30
 
31
- if (!defined('ABSPATH')) die('You do not have sufficient permissions to access this file.');
 
 
 
 
32
 
33
 
 
 
 
 
 
 
 
 
34
 
35
 
36
- /***** Základní nastavení cest a URL adres pluginu ********************/
37
- if(!is_admin()){
38
- return;
39
- }else{
40
- $WPHE_version = '1.3.0';
 
 
 
 
41
 
42
- if(!defined('WP_CONTENT_URL')){
43
- if(!defined('WP_SITEURL')){
44
- define('WP_SITEURL', get_option('url').'/');
45
- }
46
- define('WP_CONTENT_URL', WP_SITEURL.'wp-content');
47
- }
48
- if(!defined('WP_PLUGIN_URL')){
49
- define('WP_PLUGIN_URL', WP_CONTENT_URL.'/plugins');
50
- }
51
 
52
- $WPHE_root = str_replace('\\', '/', dirname(__FILE__)).'/';
53
- $WPHE_lib = $WPHE_root.'lib/';
54
- $WPHE_dirname = str_replace('\\', '/', dirname(plugin_basename(__FILE__)));
55
- $WPHE_dirurl = WP_PLUGIN_URL.'/'.$WPHE_dirname.'/';
56
 
 
 
 
 
 
 
 
 
 
57
 
 
 
58
 
59
- /***** Načtení překladu ***********************************************/
60
- $WPHE_Locale = get_locale();
61
- if(!empty($WPHE_Locale))
62
- {
63
- $WPHE_moFile = dirname(__FILE__) . '/lang/'.$WPHE_Locale.'.mo';
64
- if(@file_exists($WPHE_moFile) && is_readable($WPHE_moFile))
65
- {
66
- load_textdomain('wphe', $WPHE_moFile);
67
- }
68
- unset($WPHE_moFile);
69
- }
70
- unset($WPHE_Locale);
71
 
 
 
 
 
72
 
73
 
74
- /***** Načtení souborů pluginu ****************************************/
75
- if(file_exists($WPHE_lib.'lib.wp-files.php')){
76
- require $WPHE_lib.'lib.wp-files.php';
77
- }else{ wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe')); }
 
 
 
78
 
79
- if(file_exists($WPHE_lib.'lib.functions.php')){
80
- require $WPHE_lib.'lib.functions.php';
81
- }else{ wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe')); }
82
 
83
- if(file_exists($WPHE_lib.'lib.ad.php')){
84
- require $WPHE_lib.'lib.ad.php';
85
- }else{ wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe')); }
86
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
- if(file_exists($WPHE_lib.'lib.pages.php')){
89
- require $WPHE_lib.'lib.pages.php';
90
- }else{ wp_die(__('Fatal error: Plugin <strong>WP Htaccess Editor</strong> is corrupted', 'wphe')); }
91
 
 
92
 
 
 
93
 
94
- /***** Vytvoření menu v administraci a spuštění pluginu ***************/
95
- if(function_exists('add_action')){
96
- add_action('admin_menu', 'WPHE_admin_menu');
97
- }else{
98
- unset($WPHE_root);
99
- unset($WPHE_lib);
100
- unset($WPHE_plugin);
101
- unset($WPHE_dirname);
102
- unset($WPHE_dirurl);
103
- return;
104
- }
105
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  /*
3
+ Plugin Name: WP Htaccess Editor
4
+ Description: Safe and easy way to edit the .htaccess file directly from WP admin without using FTP.
5
+ Version: 1.5
6
+ Author: WebFactory Ltd
7
+ Author URI: https://www.webfactoryltd.com/
8
+ Text Domain: wp-htaccess-editor
 
 
 
 
9
 
10
+ Copyright 2011 - 2018 Lukenzi (email: lukenzi@gmail.com)
11
+ Copyright 2018 - 2019 WebFactory Ltd (email: support@webfactoryltd.com)
12
 
13
+ This program is free software; you can redistribute it and/or modify
14
+ it under the terms of the GNU General Public License, version 2, as
15
+ published by the Free Software Foundation.
 
16
 
17
+ This program is distributed in the hope that it will be useful,
18
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ GNU General Public License for more details.
21
 
22
+ You should have received a copy of the GNU General Public License
23
+ along with this program; if not, write to the Free Software
24
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
  */
26
 
27
+
28
+ // include only file
29
+ if (!defined('ABSPATH')) {
30
+ wp_die(__('Do not open this file directly.', 'wp-htaccess-editor'));
31
+ }
32
 
33
 
34
+ class WP_Htaccess_Editor {
35
+ protected static $instance = null;
36
+ public $version = 0;
37
+ public $plugin_url = '';
38
+ public $plugin_basename = '';
39
+ protected $options = array();
40
+ protected $wp_filesystem = null;
41
+ public $backup_folder = 'htaccess-editor-backups';
42
 
43
 
44
+ /**
45
+ * Creates a new WP_Htaccess_Editor object and implements singleton
46
+ *
47
+ * @return WP_Htaccess_Editor
48
+ */
49
+ static function get_instance() {
50
+ if (false == is_a(self::$instance, 'WP_Htaccess_Editor')) {
51
+ self::$instance = new WP_Htaccess_Editor();
52
+ }
53
 
54
+ return self::$instance;
55
+ } // get_instance
 
 
 
 
 
 
 
56
 
 
 
 
 
57
 
58
+ /**
59
+ * Initialize properties, hook to filters and actions
60
+ *
61
+ * @return null
62
+ */
63
+ private function __construct() {
64
+ $this->version = $this->get_plugin_version();
65
+ $this->plugin_url = plugin_dir_url(__FILE__);
66
+ $this->plugin_basename = plugin_basename(__FILE__);
67
 
68
+ $this->load_options();
69
+ $this->setup_wp_filesystem();
70
 
71
+ add_action('admin_menu', array($this, 'admin_menu'));
72
+ add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
73
+ add_action('wp_ajax_wp_htaccess_editor_dismiss_notice', array($this, 'ajax_dismiss_notice'));
74
+ add_action('wp_ajax_wp_htaccess_editor_do_action', array($this, 'ajax_do_action'));
 
 
 
 
 
 
 
 
75
 
76
+ add_filter('plugin_action_links_' . $this->plugin_basename, array($this, 'plugin_action_links'));
77
+ add_filter('plugin_row_meta', array($this, 'plugin_meta_links'), 10, 2);
78
+ add_filter('admin_footer_text', array($this, 'admin_footer_text'));
79
+ } // __construct
80
 
81
 
82
+ /**
83
+ * Get plugin version from file header.
84
+ *
85
+ * @return string
86
+ */
87
+ function get_plugin_version() {
88
+ $plugin_data = get_file_data(__FILE__, array('version' => 'Version'), 'plugin');
89
 
90
+ return $plugin_data['version'];
91
+ } // get_plugin_version
 
92
 
 
 
 
93
 
94
+ /**
95
+ * Add "Edit .htaccess file" action link to plugins table, left side
96
+ *
97
+ * @param array $links Initial list of links.
98
+ *
99
+ * @return array
100
+ */
101
+ function plugin_action_links($links) {
102
+ // whole plugin is for admins only
103
+ if (false === current_user_can('administrator')) {
104
+ return $links;
105
+ }
106
 
107
+ $settings_link = '<a href="' . admin_url('tools.php?page=wp-htaccess-editor') . '" title="' . __('Edit .htaccess file', 'wp-htaccess-editor') . '">' . __('Edit .htaccess file', 'wp-htaccess-editor') . '</a>';
 
 
108
 
109
+ array_unshift($links, $settings_link);
110
 
111
+ return $links;
112
+ } // plugin_action_links
113
 
114
+
115
+ /**
116
+ * Add links to plugin's description in plugins table
117
+ *
118
+ * @param array $links Initial list of links.
119
+ * @param string $file Basename of current plugin.
120
+ *
121
+ * @return array
122
+ */
123
+ function plugin_meta_links($links, $file) {
124
+ if ($file !== $this->plugin_basename) {
125
+ return $links;
126
+ }
127
+
128
+ $support_link = '<a target="_blank" href="https://wordpress.org/support/plugin/wp-htaccess-editor" title="' . __('Get help', 'wp-htaccess-editor') . '">' . __('Support', 'wp-htaccess-editor') . '</a>';
129
+ $rate_link = '<a target="_blank" href="https://wordpress.org/support/plugin/wp-htaccess-editor/reviews/#new-post" title="' . __('Rate the plugin', 'wp-htaccess-editor') . '">' . __('Rate the plugin ★★★★★', 'wp-htaccess-editor') . '</a>';
130
+
131
+ $links[] = $support_link;
132
+ $links[] = $rate_link;
133
+
134
+ return $links;
135
+ } // plugin_meta_links
136
+
137
+
138
+ /**
139
+ * Test if we're on plugin's admin page
140
+ *
141
+ * @return bool
142
+ */
143
+ function is_plugin_page() {
144
+ $current_screen = get_current_screen();
145
+
146
+ if ($current_screen->id === 'tools_page_wp-htaccess-editor') {
147
+ return true;
148
+ } else {
149
+ return false;
150
+ }
151
+ } // is_plugin_page
152
+
153
+
154
+ /**
155
+ * Add powered by text in admin footer
156
+ *
157
+ * @param string $text_org Default footer text.
158
+ *
159
+ * @return string
160
+ */
161
+ function admin_footer_text($text_org) {
162
+ if (false === $this->is_plugin_page()) {
163
+ return $text_org;
164
+ }
165
+
166
+ $text = '<i>WP Htaccess Editor v' . $this->version . ' by <a href="https://www.webfactoryltd.com/" title="' . __('Visit our site to get more great plugins', 'wp-htaccess-editor'). '" target="_blank">WebFactory Ltd</a>.';
167
+ $text .= ' Please <a target="_blank" href="https://wordpress.org/support/plugin/wp-htaccess-editor/reviews/#new-post" title="' . __('Rate the plugin', 'wp-htaccess-editor') . '">' . __('Rate the plugin ★★★★★', 'wp-htaccess-editor') . '</a>.</i> ';
168
+
169
+ return $text . $text_org;
170
+ } // admin_footer_text
171
+
172
+
173
+ /**
174
+ * Loads plugin's translated strings
175
+ *
176
+ * @return null
177
+ */
178
+ function load_textdomain() {
179
+ load_plugin_textdomain('wp-htaccess-editor');
180
+ } // load_textdomain
181
+
182
+
183
+ /**
184
+ * Initialize the WP file system.
185
+ *
186
+ * @return object
187
+ */
188
+ private function setup_wp_filesystem() {
189
+ global $wp_filesystem;
190
+
191
+ if (empty($wp_filesystem)) {
192
+ require_once ABSPATH . '/wp-admin/includes/file.php';
193
+ WP_Filesystem();
194
+ }
195
+
196
+ $this->wp_filesystem = $wp_filesystem;
197
+ return $this->wp_filesystem;
198
+ } // setup_wp_filesystem
199
+
200
+
201
+ /**
202
+ * Get full backup folder path
203
+ *
204
+ * @return string
205
+ */
206
+ function get_backup_folder() {
207
+ $folder = trailingslashit(WP_CONTENT_DIR) . trailingslashit($this->backup_folder);
208
+
209
+ return $folder;
210
+ } // get_backup_folder
211
+
212
+
213
+ /**
214
+ * Get .htaccess file path.
215
+ *
216
+ * @param bool $folder_only Optional. Return folder name only without filename.
217
+ *
218
+ * @return string
219
+ */
220
+ function get_htaccess_path($folder_only = false) {
221
+ $slashed_home = trailingslashit(get_option('home'));
222
+ $base = parse_url($slashed_home, PHP_URL_PATH);
223
+ $document_root_fix = str_replace('\\', '/', realpath($_SERVER['DOCUMENT_ROOT']));
224
+ $abspath_fix = str_replace('\\', '/', ABSPATH);
225
+ $home_path = 0 === strpos($abspath_fix, $document_root_fix) ? $document_root_fix . $base : get_home_path();
226
+
227
+ $filepath = $home_path . '.htaccess';
228
+
229
+ if ($folder_only) {
230
+ return $home_path;
231
+ } else {
232
+ return $filepath;
233
+ }
234
+ } // get_htaccess_path
235
+
236
+
237
+ /**
238
+ * Get .htaccess file content.
239
+ *
240
+ * @return string
241
+ */
242
+ function get_htaccess_content() {
243
+ $content = $this->wp_filesystem->get_contents($this->get_htaccess_path());
244
+
245
+ return $content;
246
+ } // get_htaccess_path
247
+
248
+
249
+ /**
250
+ * Check if .htaccess is writable.
251
+ *
252
+ * @return bool
253
+ */
254
+ function is_htaccess_writable() {
255
+ $htaccess_path = $this->get_htaccess_path();
256
+
257
+ return $this->wp_filesystem->is_writable($htaccess_path);
258
+ } // is_htaccess_writable
259
+
260
+
261
+ /**
262
+ * Check if .htaccess exists and is redable.
263
+ *
264
+ * @return bool
265
+ */
266
+ function is_htaccess_readable() {
267
+ $htaccess_path = $this->get_htaccess_path();
268
+
269
+ return $this->wp_filesystem->is_readable($htaccess_path);
270
+ } // is_htaccess_writable
271
+
272
+
273
+ /**
274
+ * Load and prepare the options array. If needed create a new DB options entry.
275
+ *
276
+ * @return array
277
+ */
278
+ private function load_options() {
279
+ $options = get_option('wp-htaccess-editor', array());
280
+ $change = false;
281
+
282
+ if (empty($options['meta'])) {
283
+ $options['meta'] = array('first_version' => $this->version, 'first_install' => current_time('timestamp', true), 'edits_count' => 0);
284
+ $change = true;
285
+ }
286
+ if (empty($options['dismissed_notices'])) {
287
+ $options['dismissed_notices'] = array();
288
+ $change = true;
289
+ }
290
+ if (empty($options['options'])) {
291
+ $options['options'] = array('last_backup' => '');
292
+ $change = true;
293
+ }
294
+ if ($change) {
295
+ update_option('wp-htaccess-editor', $options, true);
296
+ }
297
+
298
+ $this->options = $options;
299
+ return $options;
300
+ } // load_options
301
+
302
+
303
+ /**
304
+ * Get meta part of plugin options.
305
+ *
306
+ * @return array
307
+ */
308
+ function get_meta() {
309
+ return $this->options['meta'];
310
+ } // get_meta
311
+
312
+
313
+ /**
314
+ * Get all dismissed notices, or check for one specific notice.
315
+ *
316
+ * @param string $notice_name Optional. Check if specified notice is dismissed.
317
+ *
318
+ * @return bool|array
319
+ */
320
+ function get_dismissed_notices($notice_name = '') {
321
+ $notices = $this->options['dismissed_notices'];
322
+
323
+ if (empty($notice_name)) {
324
+ return $notices;
325
+ } else {
326
+ if (empty($notices[$notice_name])) {
327
+ return false;
328
+ } else {
329
+ return true;
330
+ }
331
+ }
332
+ } // get_dismissed_notices
333
+
334
+
335
+ /**
336
+ * Get all options or a single option key.
337
+ *
338
+ * @param string $option_key Optional.
339
+ *
340
+ * @return array
341
+ */
342
+ function get_options($option_key = '') {
343
+ if (empty($option_key)) {
344
+ return $this->options['options'];
345
+ } else {
346
+ if (isset($this->options['options'][$option_key])) {
347
+ return $this->options['options'][$option_key];
348
+ } else {
349
+ return null;
350
+ }
351
+ }
352
+ } // get_options
353
+
354
+
355
+ /**
356
+ * Update plugin options array
357
+ *
358
+ * @param string $key Option key.
359
+ * @param string $data Data to save.
360
+ *
361
+ * @return bool
362
+ */
363
+ private function update_options($key, $data) {
364
+ if (false === in_array($key, array('options', 'meta', 'dismissed_notices'))) {
365
+ trigger_error('Unknown option key used in update_options($key, $data) function.', E_USER_ERROR);
366
+ return false;
367
+ }
368
+
369
+ $this->options[$key] = $data;
370
+ $tmp = update_option('wp-htaccess-editor', $this->options);
371
+
372
+ return $tmp;
373
+ } // set_options
374
+
375
+
376
+ /**
377
+ * Add plugin menu entry under Tools menu
378
+ *
379
+ * @return null
380
+ */
381
+ function admin_menu() {
382
+ add_management_page(__('WP Htaccess Editor', 'wp-htaccess-editor'), __('WP Htaccess Editor', 'wp-htaccess-editor'), 'administrator', 'wp-htaccess-editor', array($this, 'plugin_page'));
383
+ } // admin_menu
384
+
385
+
386
+ /**
387
+ * Dismiss notice via AJAX call
388
+ *
389
+ * @return null
390
+ */
391
+ function ajax_dismiss_notice() {
392
+ check_ajax_referer('wp-htaccess-editor_dismiss_notice');
393
+
394
+ // complete plugin is for admins only
395
+ if (false === current_user_can('administrator')) {
396
+ wp_send_json_error(__('You are not allowed to perform this action.', 'wp-htaccess-editor'));
397
+ }
398
+
399
+ if (empty($_GET['notice_name'])) {
400
+ wp_send_json_error(__('Notice name is undefined.', 'wp-htaccess-editor'));
401
+ } else {
402
+ $notice_name = substr(sanitize_key($_GET['notice_name']), 0, 64);
403
+ }
404
+
405
+ if (!$this->dismiss_notice($notice_name)) {
406
+ wp_send_json_error(__('Notice is already dismissed.', 'wp-htaccess-editor'));
407
+ } else {
408
+ wp_send_json_success();
409
+ }
410
+ } // ajax_dismiss_notice
411
+
412
+
413
+ /**
414
+ * Dismiss notice by adding it to dismissed_notices options array
415
+ *
416
+ * @param string $notice_name Notice to dismiss.
417
+ *
418
+ * @return bool
419
+ */
420
+ function dismiss_notice($notice_name) {
421
+ if ($this->get_dismissed_notices($notice_name)) {
422
+ return false;
423
+ } else {
424
+ $notices = $this->get_dismissed_notices();
425
+ $notices[$notice_name] = true;
426
+ $this->update_options('dismissed_notices', $notices);
427
+ return true;
428
+ }
429
+ } // dismiss_notice
430
+
431
+
432
+ /**
433
+ * Returns all WP pointers
434
+ *
435
+ * @return array
436
+ */
437
+ function get_pointers() {
438
+ $pointers = array();
439
+
440
+ // TODO: reformat & prepare for translation
441
+ $pointers['welcome'] = array('target' => '#menu-tools', 'edge' => 'left', 'align' => 'right', 'content' => 'Thank you for using the <b style="font-weight: 700;">WP Htaccess Editor</b> plugin.<br>Open <a href="' . admin_url('tools.php?page=wp-htaccess-editor'). '">Tools - WP Htaccess Editor</a> to access the editor and start editing the <i>.htaccess</i> file.');
442
+
443
+ return $pointers;
444
+ } // get_pointers
445
+
446
+
447
+ /**
448
+ * Enqueue CSS and JS files
449
+ *
450
+ * @param string $hook Page hook name.
451
+ *
452
+ * @return null
453
+ */
454
+ function admin_enqueue_scripts($hook) {
455
+ // welcome pointer is shown on all pages except WPHE, only to admins, until dismissed
456
+ $pointers = $this->get_pointers();
457
+ $dismissed_notices = $this->get_dismissed_notices();
458
+
459
+ foreach ($dismissed_notices as $notice_name => $tmp) {
460
+ if ($tmp) {
461
+ unset($pointers[$notice_name]);
462
+ }
463
+ } // foreach
464
+
465
+ if (current_user_can('administrator') && !empty($pointers) && 'tools_page_wp-htaccess-editor' != $hook) {
466
+ $pointers['_nonce_dismiss_pointer'] = wp_create_nonce('wp-htaccess-editor_dismiss_notice');
467
+
468
+ wp_enqueue_style('wp-pointer');
469
+
470
+ wp_enqueue_script('wp-htaccess-editor-pointers', $this->plugin_url . 'js/wp-htaccess-editor-pointers.js', array('jquery'), $this->version, true);
471
+ wp_enqueue_script('wp-pointer');
472
+ wp_localize_script('wp-pointer', 'wp_htaccess_editor_pointers', $pointers);
473
+ }
474
+
475
+ // exit early if not on WPHE page
476
+ if ('tools_page_wp-htaccess-editor' != $hook) {
477
+ return;
478
+ }
479
+
480
+ $options = $this->get_options();
481
+ $editor_settings['codeEditor'] = wp_enqueue_code_editor(array($this->get_htaccess_path()));
482
+ $editor_settings['codeEditor']['codemirror']['mode'] = 'nginx';
483
+
484
+ $js_localize = array('undocumented_error' => __('An undocumented error has occurred. Please refresh the page and try again.', 'wp-htaccess-editor'),
485
+ 'documented_error' => __('An error has occurred.', 'wp-htaccess-editor'),
486
+ 'plugin_name' => __('WP Htaccess Editor', 'wp-htaccess-editor'),
487
+ 'home_url' => get_home_url(),
488
+ 'settings_url' => admin_url('tools.php?page=wp-htaccess-editor'),
489
+ 'loading_icon_url' => $this->plugin_url . 'img/loading-icon.png',
490
+ 'cancel_button' => __('Cancel', 'wp-htaccess-editor'),
491
+ 'ok_button' => __('OK', 'wp-htaccess-editor'),
492
+ 'saving' => __('Saving in progress. Please wait.', 'wp-htaccess-editor'),
493
+ 'restoring' => __('Restoring in progress. Please wait.', 'wp-htaccess-editor'),
494
+ 'save_success' => __('Changes have been saved.', 'wp-htaccess-editor'),
495
+ 'restore_message' => __('This will restore the last saved backup of .htaccess. There is NO UNDO.', 'wp-htaccess-editor'),
496
+ 'restore_title' => __('Restore last backup?', 'wp-htaccess-editor'),
497
+ 'restore_button' => __('Restore Last Saved Backup of .htaccess', 'wp-htaccess-editor'),
498
+ 'restore_success' => __('Backup has been successfully restored. Click OK to reload the page.', 'wp-htaccess-editor'),
499
+ 'site_error' => __('There is an error in the .htaccess file and your site is probably no longer accessible.<br><br>DO NOT panic or reload this page. Close this message. First, try the "Restore Last Backup" button. If it doesn\'t work read instruction on this very page on how to restore the site.', 'wp-htaccess-editor'),
500
+ 'nonce_dismiss_notice' => wp_create_nonce('wp-htaccess-editor_dismiss_notice'),
501
+ 'nonce_do_action' => wp_create_nonce('wp-htaccess-editor_do_action'),
502
+ 'cm_settings' => $editor_settings);
503
+
504
+ wp_enqueue_style('wp-codemirror');
505
+ wp_enqueue_style('wp-htaccess-editor', $this->plugin_url . 'css/wp-htaccess-editor.css', array(), $this->version);
506
+ wp_enqueue_style('wp-htaccess-editor-sweetalert2', $this->plugin_url . 'css/sweetalert2.min.css', array(), $this->version);
507
+
508
+ wp_enqueue_script('jquery-ui-tabs');
509
+ wp_enqueue_script('wp-htaccess-editor-sweetalert2', $this->plugin_url . 'js/sweetalert2.min.js', array('jquery'), $this->version, true);
510
+ wp_enqueue_script('wp-theme-plugin-editor');
511
+ wp_enqueue_script('wp-htaccess-editor', $this->plugin_url . 'js/wp-htaccess-editor.js', array('jquery'), $this->version, true);
512
+ wp_localize_script('wp-htaccess-editor', 'wp_htaccess_editor', $js_localize);
513
+
514
+ // fix for aggressive plugins that include their CSS files on all pages
515
+ wp_dequeue_style('uiStyleSheet');
516
+ wp_dequeue_style('wpcufpnAdmin' );
517
+ wp_dequeue_style('unifStyleSheet' );
518
+ wp_dequeue_style('wpcufpn_codemirror');
519
+ wp_dequeue_style('wpcufpn_codemirrorTheme');
520
+ wp_dequeue_style('collapse-admin-css');
521
+ wp_dequeue_style('jquery-ui-css');
522
+ wp_dequeue_style('tribe-common-admin');
523
+ wp_dequeue_style('file-manager__jquery-ui-css');
524
+ wp_dequeue_style('file-manager__jquery-ui-css-theme');
525
+ wp_dequeue_style('wpmegmaps-jqueryui');
526
+ wp_dequeue_style('wp-botwatch-css');
527
+ } // admin_enqueue_scripts
528
+
529
+
530
+ /**
531
+ * Run an action via AJAX call.
532
+ *
533
+ * @return null
534
+ */
535
+ function ajax_do_action() {
536
+ check_ajax_referer('wp-htaccess-editor_do_action');
537
+
538
+ if (false === current_user_can('administrator')) {
539
+ wp_send_json_error(__('You are not allowed to perform this action.', 'wp-htaccess-editor'));
540
+ }
541
+
542
+ if (empty($_POST['subaction'])) {
543
+ wp_send_json_error(__('Subaction name is undefined.', 'wp-htaccess-editor'));
544
+ } else {
545
+ $subaction = substr(sanitize_key($_POST['subaction']), 0, 64);
546
+ }
547
+
548
+ if ($subaction == 'save_htaccess') {
549
+ if (false == $this->create_htaccess_backup(true, true)) {
550
+ wp_send_json_error(__('Unable to create .htaccess backup in /wp-content/. Please check file permissions.', 'wp-htaccess-editor'));
551
+ }
552
+
553
+ // since we're working with code it's hard/impossible to sanitize input
554
+ // WP core doesn't sanitize either for plugin/theme editor so it should be OK
555
+ // nonce is in place and user permissions are double checked
556
+ $new_content = wp_unslash(trim($_POST['new_content']));
557
+ if (false == $this->is_htaccess_writable() || false == $this->write_htaccess($new_content)) {
558
+ wp_send_json_error(__('Could not write .htaccess file. Please check file permissions.', 'wp-htaccess-editor'));
559
+ }
560
+
561
+ wp_send_json_success();
562
+ } elseif ($subaction == 'restore_htaccess_from_db') {
563
+ if ($this->restore_db_backup()) {
564
+ wp_send_json_success();
565
+ } else {
566
+ wp_send_json_error();
567
+ }
568
+ } else {
569
+ wp_send_json_error(__('Unknown subaction.', 'wp-htaccess-editor'));
570
+ }
571
+ } // ajax_do_action
572
+
573
+
574
+ /**
575
+ * Write new content to .htaccess
576
+ *
577
+ * @param string $new_content New content for .htaccess file.
578
+ *
579
+ * @return bool
580
+ */
581
+ function write_htaccess($new_content) {
582
+ $htaccess_path = $this->get_htaccess_path();
583
+ $result = $this->wp_filesystem->put_contents($htaccess_path, $new_content);
584
+ @clearstatcache();
585
+
586
+ if (true === $result) {
587
+ $meta = $this->get_meta();
588
+ $meta['edits_count']++;
589
+ $this->update_options('meta', $meta);
590
+ return true;
591
+ } else{
592
+ return false;
593
+ }
594
+ } // write_htaccess
595
+
596
+
597
+ /**
598
+ * Backup .htaccess file.
599
+ *
600
+ * @param bool $db_save Create backup in DB.
601
+ * @param bool $file_save Create backup in FS.
602
+ *
603
+ * @return bool
604
+ */
605
+ function create_htaccess_backup($db_save = true, $file_save = true) {
606
+ $success = false;
607
+ $orig_path = $this->get_htaccess_path();
608
+
609
+ if ($this->is_htaccess_readable()) {
610
+ $htaccess_content_orig = $this->wp_filesystem->get_contents($orig_path);
611
+ } else {
612
+ // .htaccess doesn't exists, nothing to backup
613
+ return true;
614
+ }
615
+
616
+ if ($db_save) {
617
+ $tmp = $this->get_options();
618
+ $tmp['last_backup'] = $htaccess_content_orig;
619
+ $this->update_options('options', $tmp);
620
+ $success = true;
621
+ }
622
+
623
+ if ($file_save) {
624
+ if (!$this->create_secure_backup_folder()) {
625
+ return false;
626
+ }
627
+
628
+ $backup_path = trailingslashit(WP_CONTENT_DIR) . $this->backup_folder . '/htaccess-' . date('Y-m-d-H-i-s', current_time('timestamp')) . '.backup';
629
+ $success = $this->wp_filesystem->put_contents($backup_path, $htaccess_content_orig);
630
+ }
631
+
632
+ if ($success) {
633
+ return true;
634
+ } else{
635
+ return false;
636
+ }
637
+ } // create_htaccess_backup
638
+
639
+
640
+ /**
641
+ * Create .htaccess backup folder and secure it.
642
+ *
643
+ * @return bool
644
+ */
645
+ function create_secure_backup_folder() {
646
+ @clearstatcache();
647
+ $secure_path = $this->get_backup_folder() . '.htaccess';
648
+ $secure_text = trim('
649
+ # WP Htaccess Editor - secure backups
650
+ <files *.*>
651
+ order allow,deny
652
+ deny from all
653
+ </files>');
654
+
655
+ if (false == $this->wp_filesystem->is_dir($this->get_backup_folder())) {
656
+ $new_folder = $this->wp_filesystem->mkdir($this->get_backup_folder());
657
+ if (!$new_folder) {
658
+ return false;
659
+ }
660
+ }
661
+
662
+ if ($this->wp_filesystem->exists($secure_path)) {
663
+ return true;
664
+ } else {
665
+ $write = $this->wp_filesystem->put_contents($secure_path, $secure_text);
666
+ if ($write){
667
+ return true;
668
+ } else {
669
+ return false;
670
+ }
671
+ }
672
+ } // create_secure_backup_folder
673
+
674
+
675
+ /**
676
+ * Restore last .htaccess backup from DB.
677
+ *
678
+ * @return bool
679
+ */
680
+ function restore_db_backup() {
681
+ $htaccess_path = $this->get_htaccess_path();
682
+
683
+ $backup_contents = $this->get_options('last_backup');
684
+ if (!empty($backup_contents)) {
685
+ @clearstatcache();
686
+ $write = $this->wp_filesystem->put_contents($htaccess_path, $backup_contents);
687
+ @clearstatcache();
688
+ if ($write) {
689
+ return true;
690
+ } else {
691
+ return false;
692
+ }
693
+ } else {
694
+ return false;
695
+ }
696
+ } // restore_db_backup
697
+
698
+
699
+ /**
700
+ * Outputs complete plugin's admin page
701
+ *
702
+ * @return null
703
+ */
704
+ function plugin_page() {
705
+ $notice_shown = false;
706
+ $meta = $this->get_meta();
707
+ $notices = $this->get_dismissed_notices();
708
+
709
+ $htaccess_content = $this->get_htaccess_content();
710
+
711
+ // double check for admin priv
712
+ if (!current_user_can('administrator')) {
713
+ wp_die(__('Sorry, you are not allowed to access this page.', 'wp-htaccess-editor'));
714
+ }
715
+
716
+ settings_errors();
717
+ echo '<div class="wrap">';
718
+ echo '<h1>' . __('WP Htaccess Editor', 'wp-htaccess-editor') . '</h1>';
719
+ echo '<form id="wp-htaccess-editor-form" action="' . admin_url('tools.php?page=wp-htaccess-editor') . '" method="post" autocomplete="off">';
720
+
721
+ // TODO: properly mark for translation
722
+ if (false === $this->is_htaccess_readable()) {
723
+ echo '<div class="card notice-wrapper notice-error">';
724
+ echo '<h2>' . __('.htaccess file does not exist!', 'wp-htaccess-editor') . '</h2>';
725
+ echo '<p>We couldn\'t locate your .htaccess file on the default location <code>' . $this->get_htaccess_path() . '</code>. We\'ll attempt to create the file when you make the first save with the editor.<br>We recommend opening <a href="' . admin_url('options-permalink.php') . '">Settings - Permalinks</a> and setting a URL structure other than default which will create the default WP .htaccess file.</p>';
726
+ echo '</div>';
727
+ $notice_shown = true;
728
+ }
729
+
730
+ // TODO: properly mark for translation
731
+ if (false === $this->is_htaccess_writable() && false === $notice_shown) {
732
+ echo '<div class="card notice-wrapper notice-error">';
733
+ echo '<h2>' . __('.htaccess file is not writable!', 'wp-htaccess-editor') . '</h2>';
734
+ echo '<p>Your .htaccess file located in <code>' . $this->get_htaccess_path() . '</code> can\'t be edited by WordPress or this plugin. You can only edit it via FTP.<br>If you want to edit it via WordPress check the file permissions and set them to 644.</p>';
735
+ echo '</div>';
736
+ $notice_shown = true;
737
+ }
738
+
739
+ if (false === $notice_shown && is_multisite()) {
740
+ echo '<div class="card notice-wrapper notice-error">';
741
+ echo '<h2>' . __('WP Htaccess Editor may not be compatible with multisite!', 'wp-htaccess-editor') . '</h2>';
742
+ echo '<p>' . __('Please be careful when using WP Htaccess Editor with multisite enabled. We\'re working on testing it and making fully compatible with WP-MU. <b>Till then please be careful.</b> Thank you for understanding.', 'wp-htaccess-editor') . '</p>';
743
+ echo '</div>';
744
+ $notice_shown = true;
745
+ }
746
+
747
+ // ask for rating after a few saves
748
+ if ($meta['edits_count'] > 2 && false === $notice_shown && false == $this->get_dismissed_notices('rate')) {
749
+ echo '<div class="card notice-wrapper">';
750
+ echo '<h2>' . __('Please help us keep the plugin free &amp; up-to-date', 'wp-htaccess-editor') . '</h2>';
751
+ echo '<p>' . __('If you use &amp; enjoy WP Htaccess Editor, <b>please rate it on WordPress.org</b>. It only takes a second and helps us keep the plugin free and maintained. Thank you!', 'wp-htaccess-editor') . '</p>';
752
+ echo '<p><a class="button-primary button" title="' . __('Rate WP Htaccess Editor', 'wp-htaccess-editor') . '" target="_blank" href="https://wordpress.org/support/plugin/wp-htaccess-editor/reviews/#new-post">' . __('Help keep the plugin free - rate it!', 'wp-htaccess-editor') . '</a> <a href="#" class="wphe-dismiss-notice dismiss-notice-rate" data-notice="rate">' . __('I\'ve already rated it', 'wp-htaccess-editor') . '</a></p>';
753
+ echo '</div>';
754
+ $notice_shown = true;
755
+ }
756
+
757
+ // TODO: properly mark for translation
758
+ echo '<div class="card" id="card-description">';
759
+ echo '<a class="toggle-card" href="#" title="' . __('Collapse / expand box', 'wp-htaccess-editor') . '"><span class="dashicons dashicons-arrow-up-alt2"></span></a>';
760
+ echo '<h2>' . __('Please read carefully before proceeding', 'wp-htaccess-editor') . '</h2>';
761
+ echo '<p>There is nothing wrong with editing the .htaccess file. However, <b>in case you make a mistake while editing it, there is a possibility you\'ll need FTP access to restore your site to a working state</b>. That\'s why this plugin makes automatic backups, and we have described in detail how to recover from such incidents in the paragraphs below.<br>';
762
+
763
+ echo 'For more details about .htaccess syntax and examples, please visit the <a href="http://httpd.apache.org/docs/current/howto/htaccess.html" target="_blank">official Apache Tutorial</a>.</p>';
764
+
765
+ echo '<b>How to restore the site in case of error 500 or white screen caused by .htaccess</b>';
766
+ echo '<p>Do not panic. No data is lost, and your site will be up again in minutes. FTP to your site or open the server\'s control panel such as cPanel to locate the .htaccess file in <code>' . $this->get_htaccess_path() . '</code>. Once you find the file there are several options to restore the site.<br>The first option is to edit the file to fix the errors you made.<br>The second one is to delete the file. Obviously, any custom rules in it will be gone, and in order for permalinks to work again you have to visit WP Admin - Options - Permalinks and click "Save Changes". This will rebuild the default .htaccess file.<br>Third (and preferred) way of fixing is to restore the file from the backup which you\'ll find in the <code>' . $this->get_backup_folder() . '</code> folder. The folder will probably contain multiple backup files. Locate the latest one by looking at the timestamp in the filename. Once located copy the file to <code>' . $this->get_htaccess_path(true) . '</code> and rename it to .htaccess.</p>';
767
+
768
+ echo '<b>How to restore .htaccess in case of a non-white-screen error</b>';
769
+ echo '<p>Click the "Restore Last Saved Backup" button below the editor and .htaccess will be restored to the version before the last save. Please note that this method only works if the error in the file is logical, not syntactical. For instance, if you banned the wrong IP you can undo. But if you misspelled "RewriteCond" you have to use the method above as the only way to recover is via FTP or cPanel.</p>';
770
+
771
+ echo '<b>Support</b>';
772
+ echo '<p>For additional support and questions, please visit the <a href="https://wordpress.org/support/plugin/wp-htaccess-editor" target="_blank">official support forum</a> or <a href="mailto:support@webfactoryltd.com?subject=WP Htaccess Editor problems">email us</a> if the issue can\'t be discussed publically.</p>';
773
+ echo '</div>';
774
+
775
+ echo '<div id="htaccess-editor-wrap">';
776
+ if (false == $this->get_dismissed_notices('editor-warning')) {
777
+ echo '<div id="enable-editor-notice" class="notice-wrapper"><h3><strong>Please be careful when editing the .htaccess file!</strong><br>This plugin makes automatic backups every time you make a change. Detailed instructions on how to restore backups are available in the box above.</h3><br><a href="#" data-notice="editor-warning" class="wphe-dismiss-notice button button-secondary">I understand. Enable the editor.</a></div>';
778
+ }
779
+ echo '<textarea cols="70" rows="20" name="newcontent" id="newcontent" aria-describedby="editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4">' . esc_textarea($htaccess_content) . '</textarea>';
780
+ echo '</div>';
781
+
782
+ echo '<p id="wphe-buttons" style="' . ($this->get_dismissed_notices('editor-warning')? '': 'display: none;') .'"><a id="wphe_save_htaccess" href="#" class="button button-primary">Save Changes</a> <a id="wphe_restore_htaccess" href="#" class="button button-secondary">Restore Last Backup</a></p>';
783
+
784
+ echo '</form>';
785
+ echo '</div>'; // wrap
786
+ } // plugin_page
787
+
788
+
789
+ /**
790
+ * Clean up on uninstall; no action on deactive at the moment.
791
+ *
792
+ * @return null
793
+ */
794
+ static function uninstall() {
795
+ delete_option('wp-htaccess-editor');
796
+ } // uninstall
797
+
798
+
799
+ /**
800
+ * Disabled; we use singleton pattern so magic functions need to be disabled.
801
+ *
802
+ * @return null
803
+ */
804
+ private function __clone() {}
805
+
806
+
807
+ /**
808
+ * Disabled; we use singleton pattern so magic functions need to be disabled.
809
+ *
810
+ * @return null
811
+ */
812
+ private function __sleep() {}
813
+
814
+
815
+ /**
816
+ * Disabled; we use singleton pattern so magic functions need to be disabled.
817
+ *
818
+ * @return null
819
+ */
820
+ private function __wakeup() {}
821
+ } // WP_Htaccess_Editor class
822
+
823
+
824
+ // Create plugin instance and hook things up
825
+ // TODO: load everything only in admin!
826
+ global $wp_htaccess_editor;
827
+ $wp_htaccess_editor = WP_Htaccess_Editor::get_instance();
828
+ add_action('plugins_loaded', array($wp_htaccess_editor, 'load_textdomain'));
829
+ register_uninstall_hook(__FILE__, array('WP_Htaccess_Editor', 'uninstall'));