Version Description
- Fixed: Uncaught Error: Call to a member function stats()
- Cloud API: added block by country.
- Refactoring.
Download this release
Release Info
Developer | wpchefgadget |
Plugin | Limit Login Attempts Reloaded |
Version | 2.21.1 |
Comparing to | |
See all releases |
Code changes from version 2.21.0 to 2.21.1
- assets/css/limit-login-attempts.css +1 -1
- assets/sass/limit-login-attempts.scss +64 -0
- core/App.php +38 -0
- core/Helpers.php +12 -0
- core/LimitLoginAttempts.php +111 -8
- limit-login-attempts-reloaded.php +1 -1
- readme.txt +6 -1
- views/app-widgets/acl-rules.php +155 -0
- views/app-widgets/active-lockouts.php +114 -0
- views/app-widgets/country-access-rules.php +139 -0
- views/app-widgets/event-log.php +143 -0
- views/tab-dashboard.php +3 -2
- views/tab-logs-custom.php +4 -401
assets/css/limit-login-attempts.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.limit-login-page-settings .field-col{display:inline-block;margin-right:20px}.limit-login-page-settings .limit-login-log table{background-color:#fff}.limit-login-page-settings .limit-login-log table th,.limit-login-page-settings .limit-login-log table td{padding:10px}.limit-login-page-settings .limit-login-log table tr:nth-child(even){background-color:rgba(0,0,0,0.09)}.limit-login-page-settings #limit-login-app-setup-code{width:85%}.limit-login-page-settings .nav-tab-wrapper{position:relative}.limit-login-page-settings .nav-tab-wrapper .llar-failover-link{font-size:14px;float:right;line-height:2}.limit-login-page-settings .limit-login-app-dashboard .llar-table-scroll-wrap{max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .form-table{background-color:#fff;border:1px solid #f4f4f4;border-top:3px solid #3c8dbc;position:relative}.limit-login-page-settings .limit-login-app-dashboard .form-table.llar-preloader:before{content:"";display:block;width:100%;height:100%;background-color:rgba(255,255,255,0.7);z-index:999;position:absolute;top:0;left:0}.limit-login-page-settings .limit-login-app-dashboard .form-table th{font-weight:bold;border-bottom:1px solid #dbdbdb !important}.limit-login-page-settings .limit-login-app-dashboard .form-table th,.limit-login-page-settings .limit-login-app-dashboard .form-table td{padding:10px;border:1px solid #b9b9b9}.limit-login-page-settings .limit-login-app-dashboard .form-table th.llar-col-nowrap,.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-col-nowrap{white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .form-table td button{line-height:1;margin-right:5px}.limit-login-page-settings .limit-login-app-dashboard .form-table td button:last-child{margin-right:0}.limit-login-page-settings .limit-login-app-dashboard .form-table td button .dashicons{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn{display:inline-block;line-height:20px;cursor:pointer}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn i{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn:hover i{color:#3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .form-table tr:nth-child(even){background-color:#f9f9f9}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination>a{font-size:16px;line-height:1.625}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination .spinner{float:none}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col{-webkit-box-flex:0;-ms-flex:0 0 49%;flex:0 0 49%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table select{width:100%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-action-col{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-pass{background-color:#cffbe8}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-allow{background-color:#abdfff}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-deny{background-color:#fd2c2c3d}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-remove{color:crimson;border-color:crimson}.limit-login-page-settings .llar-app-notice{background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);padding:15px;border-radius:3px;margin-top:20px;margin-bottom:20px;font-size:14px;border-left:5px solid #ffba00}.limit-login-page-settings .llar-app-notice.success{border-color:#46b450}.limit-login-page-settings .llar-app-notice p{font-size:inherit;margin:0 0 20px}.limit-login-page-settings .llar-app-notice p:last-child{margin-bottom:0}.limit-login-page-settings input[name="admin_notify_email"]{min-width:243px}.limit-login-page-settings .llar-protect-notice{font-size:15px;color:#848484;margin-left:10px}.limit-login-page-settings .llar-protect-notice a{color:#222222;text-decoration:none;border-bottom:1px dashed}.limit-login-page-settings .llar-show-app-fields{position:absolute;right:15px;top:15px;color:#bdbdbd}.limit-login-page-settings .llar-show-app-fields:hover{color:#222}.limit-login-page-settings .llar-app-field{display:none}.limit-login-page-settings .llar-app-field.active{display:table-row}.llar-notice-review,.llar-notice-notify{display:-webkit-box;display:-ms-flexbox;display:flex;padding:15px 20px 0 !important;border-left:4px solid #333 !important}.llar-notice-review .llar-review-image img,.llar-notice-notify .llar-review-image img{margin-top:10px;margin-bottom:20px}.llar-notice-review .llar-review-image span,.llar-notice-notify .llar-review-image span{font-size:80px;color:orange;width:80px;height:auto;margin-bottom:20px}.llar-notice-review .llar-review-info,.llar-notice-notify .llar-review-info{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:30px}.llar-notice-review .llar-review-info .llar-buttons,.llar-notice-notify .llar-review-info .llar-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.llar-notice-review .llar-review-info .llar-buttons li,.llar-notice-notify .llar-review-info .llar-buttons li{margin-right:10px}.llar-notice-review .llar-review-info .llar-buttons li .dashicons,.llar-notice-notify .llar-review-info .llar-buttons li .dashicons{margin-right:5px}.llar-accordion .ui-accordion-header{font-weight:bold;background:#778899;color:#fff}.llar-accordion .ui-accordion-header.ui-accordion-header-active{background:#87CEFA}.custom-app-tab{position:relative}.custom-app-tab .spinner{float:none}.custom-app-tab .llar-app-ajax-msg{font-size:13px;margin-top:5px;display:block}.custom-app-tab .llar-app-ajax-msg.error{color:red}.custom-app-tab .llar-app-ajax-msg.success{color:green}.custom-app-tab .llar-delete-app{color:#dc3232;position:absolute;bottom:15px;right:15px}.custom-app-tab .llar-delete-app:hover{opacity:0.8}.custom-app-tab .llar-why-use-premium-text{margin-top:20px}.custom-app-tab .llar-why-use-premium-text .title{font-weight:bold;font-size:16px;color:#4d4d4d}.custom-app-tab .llar-why-use-premium-text ul li .dashicons{color:#3ab54a;font-size:25px;width:25px;top:-2px;position:relative}#llar-progress-bar{position:fixed;top:0;height:6px;left:0;width:100%;z-index:999999;background-color:#eee}#llar-progress-bar span{height:100%;position:absolute;display:block;width:0;background-color:#00b357;-webkit-transition:width 0.4s;transition:width 0.4s}#llar-header-upgrade-message{text-align:center;background-color:#f5f0c0;color:#222;padding:10px;margin-left:-20px;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.2);box-shadow:0 0 3px rgba(0,0,0,0.2)}#llar-header-upgrade-message p{margin:0}#llar-header-upgrade-message p .dashicons{color:#f2a64c;margin-right:5px}.settings_page_limit-login-attempts .update-nag{display:none}#llar-welcome-page{padding:50px 0}#llar-welcome-page img{max-width:100%;height:auto}#llar-welcome-page .llar-welcome-page-container{width:100%;max-width:760px;margin:0 auto 30px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 0 4px rgba(0,0,0,0.1);box-shadow:0 0 4px rgba(0,0,0,0.1)}#llar-welcome-page .llar-welcome-page-container.llar-premium{border-top:5px solid #50c1cd}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section{padding:20px;text-align:center}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section .llar-logo{text-align:center;margin-top:20px;margin-bottom:30px}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h2{font-size:2.4em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h3{font-size:1.5em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section p{font-size:17px;color:#444}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-video-wrap img{width:100%;height:auto;cursor:pointer}#llar-welcome-page .llar-welcome-page-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0 15px;counter-reset:cnt1}#llar-welcome-page .llar-welcome-page-features .llar-feature-item{-webkit-box-flex:0;-ms-flex:0 0 24%;flex:0 0 24%;text-align:center;margin-bottom:40px;position:relative;padding-bottom:60px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:before{content:counter(cnt1);counter-increment:cnt1;position:absolute;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);bottom:0;font-size:1em;font-weight:600;width:40px;height:40px;line-height:40px;text-align:center;border-radius:50%;background-color:#ecedef;color:#979aaa}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:after{position:absolute;content:'';left:-39%;width:69%;height:1px;bottom:1.4em;background-color:#ecedef}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:nth-child(4n+1):after{display:none}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-image{margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-title{font-weight:bold;margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-desc{color:#979aaa}@media (max-width: 768px){#llar-welcome-page .llar-welcome-page-features{display:block}}#llar-welcome-page .llar-why-recommend{text-align:left;font-size:17px}#llar-welcome-page .llar-why-recommend ul li span{margin-right:5px;width:auto;height:auto;font-size:25px;vertical-align:middle;color:green}#llar-welcome-page .llar-welcome-list{font-size:17px;text-align:left;line-height:1.4;list-style:none}#llar-welcome-page .llar-welcome-list li span{margin-right:10px;width:auto;height:auto;font-size:22px;vertical-align:top;color:orange}#llar-welcome-page .llar-upgrade-btn-wrap{padding:20px}#llar-welcome-page .llar-upgrade-btn-wrap a{display:inline-block;background-color:#e27800;color:#fff;font-size:22px;padding:20px;text-decoration:none;font-weight:600}#llar-welcome-page .llar-upgrade-btn-wrap a:hover{background-color:#af5d00}#llar-welcome-page .llar-upgrade-questions{font-size:17px}.dashboard_page_llar-welcome .update-nag,.dashboard_page_llar-welcome .notice,.toplevel_page_limit-login-attempts .update-nag,.toplevel_page_limit-login-attempts .notice{display:none}.dashboard_page_llar-welcome .video-container,.toplevel_page_limit-login-attempts .video-container{position:relative;padding-bottom:56.1%;height:0;overflow:hidden}.dashboard_page_llar-welcome .video-container iframe,.toplevel_page_limit-login-attempts .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.jconfirm .jconfirm-box div.jconfirm-closeIcon{top:-2px !important;right:-2px !important}.llar-tooltip{text-decoration:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted;cursor:pointer;position:relative}.llar-tooltip:before{content:attr(data-text);position:absolute;width:200px;padding:5px;background-color:rgba(0,0,0,0.8);color:#fff;font-size:13px;top:100%;z-index:999;visibility:hidden;opacity:0;-webkit-transition:all .2s;transition:all .2s;font-weight:300;cursor:auto}.llar-tooltip:hover:before{visibility:visible;opacity:1}#toplevel_page_limit-login-attempts .wp-menu-image.svg{background-size:25px auto !important;margin-top:7px}#llar-dashboard-page{padding-top:10px}#llar-dashboard-page *{-webkit-box-sizing:border-box;box-sizing:border-box}#llar-dashboard-page ul,#llar-dashboard-page ol{margin-left:0}#llar-dashboard-page ul li,#llar-dashboard-page ol li{list-style-position:inside}#llar-dashboard-page .dashboard-header{background-color:#0071a0;color:#fff;text-align:center;padding:15px}#llar-dashboard-page .dashboard-header h1{color:#fff}#llar-dashboard-page .section-title{font-weight:bold;padding:15px;border-bottom:1px solid #e4e4e4;font-size:14px;text-align:left}#llar-dashboard-page .section-content{padding:15px}#llar-dashboard-page .dashboard-section-1{margin-bottom:20px;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]{text-align:center;-webkit-box-flex:0;-ms-flex:0 0 33.333%;flex:0 0 33.333%;max-width:33.333%;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]:last-child{border:0}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"] .title{font-weight:600;font-size:16px;line-height:1.5;margin-bottom:10px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart{max-width:300px;position:relative;margin-bottom:15px;margin-left:auto;margin-right:auto}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .llar-retries-count{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);font-size:28px;font-weight:bold}#llar-dashboard-page .dashboard-section-1 .info-box-1 .desc{font-size:15px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .actions{margin-top:5px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap canvas{height:300px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .chart-stats-legend{text-align:center;margin-top:10px}#llar-dashboard-page .dashboard-section-1 .info-box-3{text-align:left}#llar-dashboard-page .dashboard-section-1 .info-box-3 .desc{margin-bottom:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions{text-align:center;padding-top:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions a{text-transform:uppercase;font-size:16px;margin-bottom:5px}#llar-dashboard-page .dashboard-section-1.custom .info-box-2{-webkit-box-flex:0;-ms-flex:0 0 66.666%;flex:0 0 66.666%;max-width:66.666%}#llar-dashboard-page .dashboard-section-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-2 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list{padding:0;margin:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li{margin:0;border-bottom:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li:last-child{border:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a{text-decoration:none;padding:15px;font-size:15px;display:block}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a:hover{background-color:#f9f9f9}#llar-dashboard-page .dashboard-section-2 .info-box-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon .dashicons{color:#0073a0;font-size:50px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.5}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-3{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:#fff;margin-bottom:20px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:30px 15px 30px 0;-webkit-box-flex:1;-ms-flex:1;flex:1;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon .dashicons{color:#a1a2a2;font-size:60px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.3}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title a{text-decoration:none}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-4 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table{width:100%;border-collapse:collapse}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th,#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td{padding:10px;border:1px solid #cecece}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th{background-color:#000;color:#fff;text-align:left}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr:nth-child(odd) td{background-color:#eff0ef}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td .flag-icon{width:24px;vertical-align:middle;margin-right:10px}#llar-dashboard-page .dashboard-section-4 .info-box-1 .countries-table-info{color:#a7a7a7;font-weight:400;margin-top:5px;margin-bottom:0}#llar-dashboard-page .dashboard-section-4 .info-box-2{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap canvas{height:300px}
|
1 |
+
.limit-login-page-settings .field-col{display:inline-block;margin-right:20px}.limit-login-page-settings .limit-login-log table{background-color:#fff}.limit-login-page-settings .limit-login-log table th,.limit-login-page-settings .limit-login-log table td{padding:10px}.limit-login-page-settings .limit-login-log table tr:nth-child(even){background-color:rgba(0,0,0,0.09)}.limit-login-page-settings #limit-login-app-setup-code{width:85%}.limit-login-page-settings .nav-tab-wrapper{position:relative}.limit-login-page-settings .nav-tab-wrapper .llar-failover-link{font-size:14px;float:right;line-height:2}.limit-login-page-settings .limit-login-app-dashboard .llar-table-scroll-wrap{max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .form-table{background-color:#fff;border:1px solid #f4f4f4;border-top:3px solid #3c8dbc;position:relative}.limit-login-page-settings .limit-login-app-dashboard .form-table.llar-preloader:before{content:"";display:block;width:100%;height:100%;background-color:rgba(255,255,255,0.7);z-index:999;position:absolute;top:0;left:0}.limit-login-page-settings .limit-login-app-dashboard .form-table th{font-weight:bold;border-bottom:1px solid #dbdbdb !important}.limit-login-page-settings .limit-login-app-dashboard .form-table th,.limit-login-page-settings .limit-login-app-dashboard .form-table td{padding:10px;border:1px solid #b9b9b9}.limit-login-page-settings .limit-login-app-dashboard .form-table th.llar-col-nowrap,.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-col-nowrap{white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .form-table td button{line-height:1;margin-right:5px}.limit-login-page-settings .limit-login-app-dashboard .form-table td button:last-child{margin-right:0}.limit-login-page-settings .limit-login-app-dashboard .form-table td button .dashicons{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn{display:inline-block;line-height:20px;cursor:pointer}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn i{vertical-align:middle}.limit-login-page-settings .limit-login-app-dashboard .form-table td.llar-app-log-actions .llar-app-log-action-btn:hover i{color:#3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .form-table tr:nth-child(even){background-color:#f9f9f9}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination>a{font-size:16px;line-height:1.625}.limit-login-page-settings .limit-login-app-dashboard .llar-app-log-pagination .spinner{float:none}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col{-webkit-box-flex:0;-ms-flex:0 0 49%;flex:0 0 49%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table select{width:100%}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-action-col{text-align:center}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-pass{background-color:#cffbe8}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-allow{background-color:#abdfff}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-rule-deny{background-color:#fd2c2c3d}.limit-login-page-settings .limit-login-app-dashboard .llar-app-acl-rules .app-rules-col .form-table .llar-app-acl-remove{color:crimson;border-color:crimson}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section{background-color:#fff;padding:15px;border:1px solid #b9b9b9;border-top:3px solid #3c8dbc}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-mode{display:inline-block;margin-right:5px;vertical-align:top}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-toggle-countries-list{-webkit-text-decoration-style:dotted;text-decoration-style:dotted;vertical-align:middle;line-height:1.6}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;max-height:400px;overflow-y:auto}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list:first-child{margin-top:0}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country{-webkit-box-flex:0;-ms-flex:0 0 10%;flex:0 0 10%}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list .llar-country label{padding-bottom:10px;display:inline-block}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected{display:inline;vertical-align:middle;overflow:hidden}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country{margin-bottom:0;display:inline-block;margin-right:10px}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-selected .llar-country label{padding-bottom:0;white-space:nowrap}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list{display:none;margin:10px 0}.limit-login-page-settings .limit-login-app-dashboard .llar-block-country-section .llar-block-country-list.llar-all-countries-list.visible{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #dddada;padding-top:10px}.limit-login-page-settings .llar-app-notice{background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);padding:15px;border-radius:3px;margin-top:20px;margin-bottom:20px;font-size:14px;border-left:5px solid #ffba00}.limit-login-page-settings .llar-app-notice.success{border-color:#46b450}.limit-login-page-settings .llar-app-notice p{font-size:inherit;margin:0 0 20px}.limit-login-page-settings .llar-app-notice p:last-child{margin-bottom:0}.limit-login-page-settings input[name="admin_notify_email"]{min-width:243px}.limit-login-page-settings .llar-protect-notice{font-size:15px;color:#848484;margin-left:10px}.limit-login-page-settings .llar-protect-notice a{color:#222222;text-decoration:none;border-bottom:1px dashed}.limit-login-page-settings .llar-show-app-fields{position:absolute;right:15px;top:15px;color:#bdbdbd}.limit-login-page-settings .llar-show-app-fields:hover{color:#222}.limit-login-page-settings .llar-app-field{display:none}.limit-login-page-settings .llar-app-field.active{display:table-row}.llar-notice-review,.llar-notice-notify{display:-webkit-box;display:-ms-flexbox;display:flex;padding:15px 20px 0 !important;border-left:4px solid #333 !important}.llar-notice-review .llar-review-image img,.llar-notice-notify .llar-review-image img{margin-top:10px;margin-bottom:20px}.llar-notice-review .llar-review-image span,.llar-notice-notify .llar-review-image span{font-size:80px;color:orange;width:80px;height:auto;margin-bottom:20px}.llar-notice-review .llar-review-info,.llar-notice-notify .llar-review-info{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:30px}.llar-notice-review .llar-review-info .llar-buttons,.llar-notice-notify .llar-review-info .llar-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.llar-notice-review .llar-review-info .llar-buttons li,.llar-notice-notify .llar-review-info .llar-buttons li{margin-right:10px}.llar-notice-review .llar-review-info .llar-buttons li .dashicons,.llar-notice-notify .llar-review-info .llar-buttons li .dashicons{margin-right:5px}.llar-accordion .ui-accordion-header{font-weight:bold;background:#778899;color:#fff}.llar-accordion .ui-accordion-header.ui-accordion-header-active{background:#87CEFA}.custom-app-tab{position:relative}.custom-app-tab .spinner{float:none}.custom-app-tab .llar-app-ajax-msg{font-size:13px;margin-top:5px;display:block}.custom-app-tab .llar-app-ajax-msg.error{color:red}.custom-app-tab .llar-app-ajax-msg.success{color:green}.custom-app-tab .llar-delete-app{color:#dc3232;position:absolute;bottom:15px;right:15px}.custom-app-tab .llar-delete-app:hover{opacity:0.8}.custom-app-tab .llar-why-use-premium-text{margin-top:20px}.custom-app-tab .llar-why-use-premium-text .title{font-weight:bold;font-size:16px;color:#4d4d4d}.custom-app-tab .llar-why-use-premium-text ul li .dashicons{color:#3ab54a;font-size:25px;width:25px;top:-2px;position:relative}#llar-progress-bar{position:fixed;top:0;height:6px;left:0;width:100%;z-index:999999;background-color:#eee}#llar-progress-bar span{height:100%;position:absolute;display:block;width:0;background-color:#00b357;-webkit-transition:width 0.4s;transition:width 0.4s}#llar-header-upgrade-message{text-align:center;background-color:#f5f0c0;color:#222;padding:10px;margin-left:-20px;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.2);box-shadow:0 0 3px rgba(0,0,0,0.2)}#llar-header-upgrade-message p{margin:0}#llar-header-upgrade-message p .dashicons{color:#f2a64c;margin-right:5px}.settings_page_limit-login-attempts .update-nag{display:none}#llar-welcome-page{padding:50px 0}#llar-welcome-page img{max-width:100%;height:auto}#llar-welcome-page .llar-welcome-page-container{width:100%;max-width:760px;margin:0 auto 30px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 0 4px rgba(0,0,0,0.1);box-shadow:0 0 4px rgba(0,0,0,0.1)}#llar-welcome-page .llar-welcome-page-container.llar-premium{border-top:5px solid #50c1cd}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section{padding:20px;text-align:center}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section .llar-logo{text-align:center;margin-top:20px;margin-bottom:30px}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h2{font-size:2.4em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section h3{font-size:1.5em;line-height:1.4}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-section p{font-size:17px;color:#444}#llar-welcome-page .llar-welcome-page-container .llar-welcome-page-video-wrap img{width:100%;height:auto;cursor:pointer}#llar-welcome-page .llar-welcome-page-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0 15px;counter-reset:cnt1}#llar-welcome-page .llar-welcome-page-features .llar-feature-item{-webkit-box-flex:0;-ms-flex:0 0 24%;flex:0 0 24%;text-align:center;margin-bottom:40px;position:relative;padding-bottom:60px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:before{content:counter(cnt1);counter-increment:cnt1;position:absolute;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);bottom:0;font-size:1em;font-weight:600;width:40px;height:40px;line-height:40px;text-align:center;border-radius:50%;background-color:#ecedef;color:#979aaa}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:after{position:absolute;content:'';left:-39%;width:69%;height:1px;bottom:1.4em;background-color:#ecedef}#llar-welcome-page .llar-welcome-page-features .llar-feature-item:nth-child(4n+1):after{display:none}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-image{margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-title{font-weight:bold;margin-bottom:15px}#llar-welcome-page .llar-welcome-page-features .llar-feature-item .llar-feature-info .llar-feature-desc{color:#979aaa}@media (max-width: 768px){#llar-welcome-page .llar-welcome-page-features{display:block}}#llar-welcome-page .llar-why-recommend{text-align:left;font-size:17px}#llar-welcome-page .llar-why-recommend ul li span{margin-right:5px;width:auto;height:auto;font-size:25px;vertical-align:middle;color:green}#llar-welcome-page .llar-welcome-list{font-size:17px;text-align:left;line-height:1.4;list-style:none}#llar-welcome-page .llar-welcome-list li span{margin-right:10px;width:auto;height:auto;font-size:22px;vertical-align:top;color:orange}#llar-welcome-page .llar-upgrade-btn-wrap{padding:20px}#llar-welcome-page .llar-upgrade-btn-wrap a{display:inline-block;background-color:#e27800;color:#fff;font-size:22px;padding:20px;text-decoration:none;font-weight:600}#llar-welcome-page .llar-upgrade-btn-wrap a:hover{background-color:#af5d00}#llar-welcome-page .llar-upgrade-questions{font-size:17px}.dashboard_page_llar-welcome .update-nag,.dashboard_page_llar-welcome .notice,.toplevel_page_limit-login-attempts .update-nag,.toplevel_page_limit-login-attempts .notice{display:none}.dashboard_page_llar-welcome .video-container,.toplevel_page_limit-login-attempts .video-container{position:relative;padding-bottom:56.1%;height:0;overflow:hidden}.dashboard_page_llar-welcome .video-container iframe,.toplevel_page_limit-login-attempts .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.jconfirm .jconfirm-box div.jconfirm-closeIcon{top:-2px !important;right:-2px !important}.llar-tooltip{text-decoration:underline;-webkit-text-decoration-style:dotted;text-decoration-style:dotted;cursor:pointer;position:relative}.llar-tooltip:before{content:attr(data-text);position:absolute;width:200px;padding:5px;background-color:rgba(0,0,0,0.8);color:#fff;font-size:13px;top:100%;z-index:999;visibility:hidden;opacity:0;-webkit-transition:all .2s;transition:all .2s;font-weight:300;cursor:auto}.llar-tooltip:hover:before{visibility:visible;opacity:1}#toplevel_page_limit-login-attempts .wp-menu-image.svg{background-size:25px auto !important;margin-top:7px}#llar-dashboard-page{padding-top:10px}#llar-dashboard-page *{-webkit-box-sizing:border-box;box-sizing:border-box}#llar-dashboard-page ul,#llar-dashboard-page ol{margin-left:0}#llar-dashboard-page ul li,#llar-dashboard-page ol li{list-style-position:inside}#llar-dashboard-page .dashboard-header{background-color:#0071a0;color:#fff;text-align:center;padding:15px}#llar-dashboard-page .dashboard-header h1{color:#fff}#llar-dashboard-page .section-title{font-weight:bold;padding:15px;border-bottom:1px solid #e4e4e4;font-size:14px;text-align:left}#llar-dashboard-page .section-content{padding:15px}#llar-dashboard-page .dashboard-section-1{margin-bottom:20px;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]{text-align:center;-webkit-box-flex:0;-ms-flex:0 0 33.333%;flex:0 0 33.333%;max-width:33.333%;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"]:last-child{border:0}#llar-dashboard-page .dashboard-section-1>[class^="info-box-"] .title{font-weight:600;font-size:16px;line-height:1.5;margin-bottom:10px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart{max-width:300px;position:relative;margin-bottom:15px;margin-left:auto;margin-right:auto}#llar-dashboard-page .dashboard-section-1 .info-box-1 .chart .llar-retries-count{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);font-size:28px;font-weight:bold}#llar-dashboard-page .dashboard-section-1 .info-box-1 .desc{font-size:15px}#llar-dashboard-page .dashboard-section-1 .info-box-1 .actions{margin-top:5px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-1 .info-box-2 .llar-chart-wrap canvas{height:300px}#llar-dashboard-page .dashboard-section-1 .info-box-2 .chart-stats-legend{text-align:center;margin-top:10px}#llar-dashboard-page .dashboard-section-1 .info-box-3{text-align:left}#llar-dashboard-page .dashboard-section-1 .info-box-3 .desc{margin-bottom:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions{text-align:center;padding-top:20px}#llar-dashboard-page .dashboard-section-1 .info-box-3 .actions a{text-transform:uppercase;font-size:16px;margin-bottom:5px}#llar-dashboard-page .dashboard-section-1.custom .info-box-2{-webkit-box-flex:0;-ms-flex:0 0 66.666%;flex:0 0 66.666%;max-width:66.666%}#llar-dashboard-page .dashboard-section-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-2>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-2 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list{padding:0;margin:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li{margin:0;border-bottom:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li:last-child{border:0}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a{text-decoration:none;padding:15px;font-size:15px;display:block}#llar-dashboard-page .dashboard-section-2 .info-box-1 .notifications-list li a:hover{background-color:#f9f9f9}#llar-dashboard-page .dashboard-section-2 .info-box-2{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-icon .dashicons{color:#0073a0;font-size:50px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.5}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-2 .info-box-2 .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-3{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:#fff;margin-bottom:20px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:30px 15px 30px 0;-webkit-box-flex:1;-ms-flex:1;flex:1;border-right:1px solid #e4e4e4}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon{-webkit-box-flex:0;-ms-flex:0 0 100px;flex:0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-icon .dashicons{color:#a1a2a2;font-size:60px;width:auto;height:auto}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content{-webkit-box-flex:1;-ms-flex:1;flex:1}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title{font-size:20px;font-weight:bold;margin-bottom:10px;line-height:1.3}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .title a{text-decoration:none}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .desc{font-size:15px;margin-bottom:15px}#llar-dashboard-page .dashboard-section-3>[class^="info-box-"] .info-box-content .actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - 10px);flex:0 0 calc(50% - 10px);min-height:100px;background-color:#fff;border:1px solid #e4e4e4;padding:15px}#llar-dashboard-page .dashboard-section-4>[class^="info-box-"]:last-child{margin-right:0}#llar-dashboard-page .dashboard-section-4 .info-box-1{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-1 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table{width:100%;border-collapse:collapse}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th,#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td{padding:10px;border:1px solid #cecece}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr th{background-color:#000;color:#fff;text-align:left}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr:nth-child(odd) td{background-color:#eff0ef}#llar-dashboard-page .dashboard-section-4 .info-box-1 .lockouts-by-country-table tr td .flag-icon{width:24px;vertical-align:middle;margin-right:10px}#llar-dashboard-page .dashboard-section-4 .info-box-1 .countries-table-info{color:#a7a7a7;font-weight:400;margin-top:5px;margin-bottom:0}#llar-dashboard-page .dashboard-section-4 .info-box-2{padding:0}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}#llar-dashboard-page .dashboard-section-4 .info-box-2 .section-title .section-title-info{color:#a7a7a7;font-weight:400}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap{width:100%;max-width:80%;margin:0 auto;clear:both}#llar-dashboard-page .dashboard-section-4 .info-box-2 .llar-chart-wrap canvas{height:300px}
|
assets/sass/limit-login-attempts.scss
CHANGED
@@ -147,6 +147,70 @@
|
|
147 |
}
|
148 |
}
|
149 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
}
|
151 |
|
152 |
.llar-app-notice {
|
147 |
}
|
148 |
}
|
149 |
}
|
150 |
+
|
151 |
+
.llar-block-country-section {
|
152 |
+
background-color: #fff;
|
153 |
+
padding: 15px;
|
154 |
+
border:1px solid #b9b9b9;
|
155 |
+
border-top: 3px solid #3c8dbc;
|
156 |
+
|
157 |
+
.llar-block-country-mode {
|
158 |
+
display: inline-block;
|
159 |
+
margin-right: 5px;
|
160 |
+
vertical-align: top;
|
161 |
+
}
|
162 |
+
.llar-toggle-countries-list {
|
163 |
+
text-decoration-style: dotted;
|
164 |
+
vertical-align: middle;
|
165 |
+
line-height: 1.6;
|
166 |
+
}
|
167 |
+
.llar-block-country-list {
|
168 |
+
display: flex;
|
169 |
+
flex-wrap: wrap;
|
170 |
+
max-height: 400px;
|
171 |
+
overflow-y: auto;
|
172 |
+
|
173 |
+
&:first-child {
|
174 |
+
margin-top: 0;
|
175 |
+
}
|
176 |
+
|
177 |
+
.llar-country {
|
178 |
+
flex: 0 0 10%;
|
179 |
+
|
180 |
+
label {
|
181 |
+
padding-bottom: 10px;
|
182 |
+
display: inline-block;
|
183 |
+
}
|
184 |
+
}
|
185 |
+
|
186 |
+
&.llar-all-countries-selected {
|
187 |
+
display: inline;
|
188 |
+
vertical-align: middle;
|
189 |
+
overflow: hidden;
|
190 |
+
|
191 |
+
.llar-country {
|
192 |
+
margin-bottom: 0;
|
193 |
+
display: inline-block;
|
194 |
+
margin-right: 10px;
|
195 |
+
|
196 |
+
label {
|
197 |
+
padding-bottom: 0;
|
198 |
+
white-space: nowrap;
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}
|
202 |
+
&.llar-all-countries-list {
|
203 |
+
display: none;
|
204 |
+
margin: 10px 0;
|
205 |
+
|
206 |
+
&.visible {
|
207 |
+
display: flex;
|
208 |
+
border-top: 1px solid #dddada;
|
209 |
+
padding-top: 10px;
|
210 |
+
}
|
211 |
+
}
|
212 |
+
}
|
213 |
+
}
|
214 |
}
|
215 |
|
216 |
.llar-app-notice {
|
core/App.php
CHANGED
@@ -189,6 +189,44 @@ class LLAR_App {
|
|
189 |
return $this->request( 'acl/delete', 'post', $data );
|
190 |
}
|
191 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
192 |
/**
|
193 |
* @param $data
|
194 |
* @return bool|mixed
|
189 |
return $this->request( 'acl/delete', 'post', $data );
|
190 |
}
|
191 |
|
192 |
+
/**
|
193 |
+
* @return bool|mixed
|
194 |
+
* @throws Exception
|
195 |
+
*/
|
196 |
+
public function country() {
|
197 |
+
|
198 |
+
return $this->request( 'country', 'get' );
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* @param $data
|
203 |
+
* @return bool|mixed
|
204 |
+
* @throws Exception
|
205 |
+
*/
|
206 |
+
public function country_add( $data ) {
|
207 |
+
|
208 |
+
return $this->request( 'country/add', 'post', $data );
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* @param $data
|
213 |
+
* @return bool|mixed
|
214 |
+
* @throws Exception
|
215 |
+
*/
|
216 |
+
public function country_remove( $data ) {
|
217 |
+
|
218 |
+
return $this->request( 'country/remove', 'post', $data );
|
219 |
+
}
|
220 |
+
|
221 |
+
/**
|
222 |
+
* @param $data
|
223 |
+
* @return bool|mixed
|
224 |
+
*/
|
225 |
+
public function country_rule( $data ) {
|
226 |
+
|
227 |
+
return $this->request( 'country/rule', 'post', $data );
|
228 |
+
}
|
229 |
+
|
230 |
/**
|
231 |
* @param $data
|
232 |
* @return bool|mixed
|
core/Helpers.php
CHANGED
@@ -60,4 +60,16 @@ class LLA_Helpers {
|
|
60 |
|
61 |
return $new_log;
|
62 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
}
|
60 |
|
61 |
return $new_log;
|
62 |
}
|
63 |
+
|
64 |
+
public static function get_countries_list() {
|
65 |
+
|
66 |
+
if( ! ( $countries = require LLA_PLUGIN_DIR . '/resources/countries.php' ) ) {
|
67 |
+
|
68 |
+
return array();
|
69 |
+
}
|
70 |
+
|
71 |
+
asort($countries);
|
72 |
+
|
73 |
+
return $countries;
|
74 |
+
}
|
75 |
}
|
core/LimitLoginAttempts.php
CHANGED
@@ -115,13 +115,16 @@ class Limit_Login_Attempts {
|
|
115 |
add_action( 'wp_ajax_dismiss_notify_notice', array( $this, 'dismiss_notify_notice_callback' ) );
|
116 |
add_action( 'wp_ajax_enable_notify', array( $this, 'enable_notify_callback' ) );
|
117 |
add_action( 'wp_ajax_app_config_save', array( $this, 'app_config_save_callback' ));
|
118 |
-
add_action( 'wp_ajax_app_setup', array( $this, 'app_setup_callback' ));
|
119 |
-
add_action( 'wp_ajax_app_log_action', array( $this, 'app_log_action_callback' ));
|
120 |
-
add_action( 'wp_ajax_app_load_log', array( $this, 'app_load_log_callback' ));
|
121 |
-
add_action( 'wp_ajax_app_load_lockouts', array( $this, 'app_load_lockouts_callback' ));
|
122 |
-
add_action( 'wp_ajax_app_load_acl_rules', array( $this, 'app_load_acl_rules_callback' ));
|
123 |
-
add_action( '
|
124 |
-
add_action( '
|
|
|
|
|
|
|
125 |
|
126 |
add_action( 'admin_print_scripts-toplevel_page_limit-login-attempts', array( $this, 'load_admin_scripts' ) );
|
127 |
add_action( 'admin_print_scripts-settings_page_limit-login-attempts', array( $this, 'load_admin_scripts' ) );
|
@@ -2253,7 +2256,7 @@ class Limit_Login_Attempts {
|
|
2253 |
</tr>
|
2254 |
<?php endforeach; ?>
|
2255 |
<?php else : ?>
|
2256 |
-
<tr class="empty-row"><td colspan="
|
2257 |
<?php endif; ?>
|
2258 |
<?php
|
2259 |
|
@@ -2392,6 +2395,106 @@ class Limit_Login_Attempts {
|
|
2392 |
}
|
2393 |
}
|
2394 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2395 |
public function get_custom_app_config() {
|
2396 |
|
2397 |
return $this->get_option( 'app_config' );
|
115 |
add_action( 'wp_ajax_dismiss_notify_notice', array( $this, 'dismiss_notify_notice_callback' ) );
|
116 |
add_action( 'wp_ajax_enable_notify', array( $this, 'enable_notify_callback' ) );
|
117 |
add_action( 'wp_ajax_app_config_save', array( $this, 'app_config_save_callback' ));
|
118 |
+
add_action( 'wp_ajax_app_setup', array( $this, 'app_setup_callback' ) );
|
119 |
+
add_action( 'wp_ajax_app_log_action', array( $this, 'app_log_action_callback' ) );
|
120 |
+
add_action( 'wp_ajax_app_load_log', array( $this, 'app_load_log_callback' ) );
|
121 |
+
add_action( 'wp_ajax_app_load_lockouts', array( $this, 'app_load_lockouts_callback' ) );
|
122 |
+
add_action( 'wp_ajax_app_load_acl_rules', array( $this, 'app_load_acl_rules_callback' ) );
|
123 |
+
add_action( 'wp_ajax_app_load_country_access_rules', array( $this, 'app_load_country_access_rules_callback' ) );
|
124 |
+
add_action( 'wp_ajax_app_toggle_country', array( $this, 'app_toggle_country_callback' ) );
|
125 |
+
add_action( 'wp_ajax_app_country_rule', array( $this, 'app_country_rule_callback' ) );
|
126 |
+
add_action( 'wp_ajax_app_acl_add_rule', array( $this, 'app_acl_add_rule_callback' ) );
|
127 |
+
add_action( 'wp_ajax_app_acl_remove_rule', array( $this, 'app_acl_remove_rule_callback' ) );
|
128 |
|
129 |
add_action( 'admin_print_scripts-toplevel_page_limit-login-attempts', array( $this, 'load_admin_scripts' ) );
|
130 |
add_action( 'admin_print_scripts-settings_page_limit-login-attempts', array( $this, 'load_admin_scripts' ) );
|
2256 |
</tr>
|
2257 |
<?php endforeach; ?>
|
2258 |
<?php else : ?>
|
2259 |
+
<tr class="empty-row"><td colspan="100%" style="text-align: center"><?php _e('No events yet.', 'limit-login-attempts-reloaded' ); ?></td></tr>
|
2260 |
<?php endif; ?>
|
2261 |
<?php
|
2262 |
|
2395 |
}
|
2396 |
}
|
2397 |
|
2398 |
+
public function app_load_country_access_rules_callback() {
|
2399 |
+
|
2400 |
+
if ( !current_user_can('activate_plugins') ) {
|
2401 |
+
|
2402 |
+
wp_send_json_error(array());
|
2403 |
+
}
|
2404 |
+
|
2405 |
+
check_ajax_referer('llar-action', 'sec');
|
2406 |
+
|
2407 |
+
$country_rules = $this->app->country();
|
2408 |
+
|
2409 |
+
if( $country_rules ) {
|
2410 |
+
|
2411 |
+
wp_send_json_success($country_rules);
|
2412 |
+
} else {
|
2413 |
+
|
2414 |
+
wp_send_json_error(array(
|
2415 |
+
'msg' => 'Something wrong.'
|
2416 |
+
));
|
2417 |
+
}
|
2418 |
+
}
|
2419 |
+
|
2420 |
+
public function app_toggle_country_callback() {
|
2421 |
+
|
2422 |
+
if ( !current_user_can('activate_plugins') ) {
|
2423 |
+
|
2424 |
+
wp_send_json_error(array());
|
2425 |
+
}
|
2426 |
+
|
2427 |
+
check_ajax_referer('llar-action', 'sec');
|
2428 |
+
|
2429 |
+
$code = sanitize_text_field( $_POST['code'] );
|
2430 |
+
$action_type = sanitize_text_field( $_POST['type'] );
|
2431 |
+
|
2432 |
+
if( !$code ) {
|
2433 |
+
|
2434 |
+
wp_send_json_error(array(
|
2435 |
+
'msg' => 'Wrong country code.'
|
2436 |
+
));
|
2437 |
+
}
|
2438 |
+
|
2439 |
+
$result = false;
|
2440 |
+
|
2441 |
+
if( $action_type === 'add' ) {
|
2442 |
+
|
2443 |
+
$result = $this->app->country_add(array(
|
2444 |
+
'code' => $code
|
2445 |
+
));
|
2446 |
+
|
2447 |
+
} else if ( $action_type === 'remove' ) {
|
2448 |
+
|
2449 |
+
$result = $this->app->country_remove(array(
|
2450 |
+
'code' => $code
|
2451 |
+
));
|
2452 |
+
}
|
2453 |
+
|
2454 |
+
if( $result ) {
|
2455 |
+
|
2456 |
+
wp_send_json_success(array());
|
2457 |
+
} else {
|
2458 |
+
|
2459 |
+
wp_send_json_error(array(
|
2460 |
+
'msg' => 'Something wrong.'
|
2461 |
+
));
|
2462 |
+
}
|
2463 |
+
}
|
2464 |
+
|
2465 |
+
public function app_country_rule_callback() {
|
2466 |
+
|
2467 |
+
if ( !current_user_can('activate_plugins') ) {
|
2468 |
+
|
2469 |
+
wp_send_json_error(array());
|
2470 |
+
}
|
2471 |
+
|
2472 |
+
check_ajax_referer('llar-action', 'sec');
|
2473 |
+
|
2474 |
+
$rule = sanitize_text_field( $_POST['rule'] );
|
2475 |
+
|
2476 |
+
if( empty( $rule ) || !in_array( $rule, array( 'allow', 'deny' ) ) ) {
|
2477 |
+
|
2478 |
+
wp_send_json_error(array(
|
2479 |
+
'msg' => 'Wrong rule.'
|
2480 |
+
));
|
2481 |
+
}
|
2482 |
+
|
2483 |
+
$result = $this->app->country_rule(array(
|
2484 |
+
'rule' => $rule
|
2485 |
+
));
|
2486 |
+
|
2487 |
+
if( $result ) {
|
2488 |
+
|
2489 |
+
wp_send_json_success(array());
|
2490 |
+
} else {
|
2491 |
+
|
2492 |
+
wp_send_json_error(array(
|
2493 |
+
'msg' => 'Something wrong.'
|
2494 |
+
));
|
2495 |
+
}
|
2496 |
+
}
|
2497 |
+
|
2498 |
public function get_custom_app_config() {
|
2499 |
|
2500 |
return $this->get_option( 'app_config' );
|
limit-login-attempts-reloaded.php
CHANGED
@@ -5,7 +5,7 @@ Description: Limit the rate of login attempts for each IP address.
|
|
5 |
Author: Limit Login Attempts Reloaded
|
6 |
Author URI: https://www.limitloginattempts.com/
|
7 |
Text Domain: limit-login-attempts-reloaded
|
8 |
-
Version: 2.21.
|
9 |
|
10 |
Copyright 2008 - 2012 Johan Eenfeldt, 2016 - 2021 Limit Login Attempts Reloaded
|
11 |
*/
|
5 |
Author: Limit Login Attempts Reloaded
|
6 |
Author URI: https://www.limitloginattempts.com/
|
7 |
Text Domain: limit-login-attempts-reloaded
|
8 |
+
Version: 2.21.1
|
9 |
|
10 |
Copyright 2008 - 2012 Johan Eenfeldt, 2016 - 2021 Limit Login Attempts Reloaded
|
11 |
*/
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/donate?hosted_button_id=FKD4MYFCMNVQQ
|
|
4 |
Tags: brute force, login, security, firewall, protection
|
5 |
Requires at least: 3.0
|
6 |
Tested up to: 5.7
|
7 |
-
Stable tag: 2.21.
|
8 |
|
9 |
Reloaded version of the original Limit Login Attempts plugin for Login Protection by a team of WordPress developers. GDPR compliant.
|
10 |
|
@@ -98,6 +98,11 @@ Please follow this link: <a href="https://www.limitloginattempts.com/resources/"
|
|
98 |
|
99 |
== Changelog ==
|
100 |
|
|
|
|
|
|
|
|
|
|
|
101 |
= 2.21.0 =
|
102 |
* GDPR compliance: IPs obfuscation replaced with a customizable consent message on the login page.
|
103 |
* Cloud API: fixed removing of blocked IPs from the access lists under certain conditions.
|
4 |
Tags: brute force, login, security, firewall, protection
|
5 |
Requires at least: 3.0
|
6 |
Tested up to: 5.7
|
7 |
+
Stable tag: 2.21.1
|
8 |
|
9 |
Reloaded version of the original Limit Login Attempts plugin for Login Protection by a team of WordPress developers. GDPR compliant.
|
10 |
|
98 |
|
99 |
== Changelog ==
|
100 |
|
101 |
+
= 2.21.1 =
|
102 |
+
* Fixed: Uncaught Error: Call to a member function stats()
|
103 |
+
* Cloud API: added block by country.
|
104 |
+
* Refactoring.
|
105 |
+
|
106 |
= 2.21.0 =
|
107 |
* GDPR compliance: IPs obfuscation replaced with a customizable consent message on the login page.
|
108 |
* Cloud API: fixed removing of blocked IPs from the access lists under certain conditions.
|
views/app-widgets/acl-rules.php
ADDED
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if( !defined( 'ABSPATH' ) ) exit();
|
3 |
+
?>
|
4 |
+
|
5 |
+
<div class="llar-app-acl-rules">
|
6 |
+
<div class="app-rules-col">
|
7 |
+
<h3><?php _e( 'Login Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
|
8 |
+
<table class="form-table llar-app-login-access-rules-table">
|
9 |
+
<tr>
|
10 |
+
<th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
|
11 |
+
<th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
|
12 |
+
<th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
|
13 |
+
</tr>
|
14 |
+
</table>
|
15 |
+
</div>
|
16 |
+
<div class="app-rules-col">
|
17 |
+
<h3><?php _e( 'IP Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
|
18 |
+
<table class="form-table llar-app-ip-access-rules-table">
|
19 |
+
<tr>
|
20 |
+
<th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
|
21 |
+
<th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
|
22 |
+
<th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
|
23 |
+
</tr>
|
24 |
+
</table>
|
25 |
+
</div>
|
26 |
+
|
27 |
+
<script type="text/javascript">
|
28 |
+
;(function($){
|
29 |
+
|
30 |
+
$(document).ready(function () {
|
31 |
+
|
32 |
+
var $app_acl_rules = $('.llar-app-acl-rules');
|
33 |
+
|
34 |
+
load_rules_data('login');
|
35 |
+
load_rules_data('ip');
|
36 |
+
|
37 |
+
$app_acl_rules
|
38 |
+
.on('click', '.llar-app-acl-remove', function(e){
|
39 |
+
e.preventDefault();
|
40 |
+
|
41 |
+
if(!confirm('Are you sure?')) {
|
42 |
+
return false;
|
43 |
+
}
|
44 |
+
|
45 |
+
var $this = $(this),
|
46 |
+
pattern = $this.data('pattern');
|
47 |
+
|
48 |
+
if(!pattern) {
|
49 |
+
|
50 |
+
console.log('Wrong pattern');
|
51 |
+
return false;
|
52 |
+
}
|
53 |
+
|
54 |
+
llar.progressbar.start();
|
55 |
+
|
56 |
+
$.post(ajaxurl, {
|
57 |
+
action: 'app_acl_remove_rule',
|
58 |
+
pattern: pattern,
|
59 |
+
type: $this.data('type'),
|
60 |
+
sec: '<?php echo esc_js( wp_create_nonce( "llar-action" ) ); ?>'
|
61 |
+
}, function(response){
|
62 |
+
|
63 |
+
llar.progressbar.stop();
|
64 |
+
|
65 |
+
if(response.success) {
|
66 |
+
|
67 |
+
$this.closest('tr').fadeOut(300, function(){
|
68 |
+
$this.closest('tr').remove();
|
69 |
+
})
|
70 |
+
|
71 |
+
}
|
72 |
+
|
73 |
+
});
|
74 |
+
|
75 |
+
})
|
76 |
+
.on('click', '.llar-app-acl-add-rule', function(e){
|
77 |
+
e.preventDefault();
|
78 |
+
|
79 |
+
var $this = $(this),
|
80 |
+
pattern = $this.closest('tr').find('.llar-app-acl-pattern').val().trim(),
|
81 |
+
rule = $this.closest('tr').find('.llar-app-acl-rule').val(),
|
82 |
+
type = $this.data('type');
|
83 |
+
|
84 |
+
if(!pattern) {
|
85 |
+
|
86 |
+
alert('Pattern can\'t be empty!');
|
87 |
+
return false;
|
88 |
+
}
|
89 |
+
|
90 |
+
var row_exist = {};
|
91 |
+
$this.closest('table').find('.rule-pattern').each(function(i, el){
|
92 |
+
var res = el.innerText.localeCompare(pattern);
|
93 |
+
if(res === 0) {
|
94 |
+
row_exist = $(el).closest('tr');
|
95 |
+
}
|
96 |
+
});
|
97 |
+
|
98 |
+
if(row_exist.length) {
|
99 |
+
|
100 |
+
$this.closest('tr').find('.llar-app-acl-pattern').val('');
|
101 |
+
row_exist.remove();
|
102 |
+
}
|
103 |
+
|
104 |
+
llar.progressbar.start();
|
105 |
+
|
106 |
+
$.post(ajaxurl, {
|
107 |
+
action: 'app_acl_add_rule',
|
108 |
+
pattern: pattern,
|
109 |
+
rule: rule,
|
110 |
+
type: type,
|
111 |
+
sec: '<?php echo esc_js( wp_create_nonce( "llar-action" ) ); ?>'
|
112 |
+
}, function(response){
|
113 |
+
|
114 |
+
llar.progressbar.stop();
|
115 |
+
|
116 |
+
if(response.success) {
|
117 |
+
|
118 |
+
$this.closest('table').find('.empty-row').remove();
|
119 |
+
|
120 |
+
$this.closest('tr').after('<tr class="llar-app-rule-'+rule+'">' +
|
121 |
+
'<td class="rule-pattern">'+pattern+'</td>' +
|
122 |
+
'<td>'+rule+'</td>' +
|
123 |
+
'<td class="llar-app-acl-action-col" scope="col"><button class="button llar-app-acl-remove" data-type="'+type+'" data-pattern="'+pattern+'"><span class="dashicons dashicons-no"></span></button></td>' +
|
124 |
+
'</tr>');
|
125 |
+
|
126 |
+
}
|
127 |
+
|
128 |
+
});
|
129 |
+
|
130 |
+
});
|
131 |
+
|
132 |
+
});
|
133 |
+
|
134 |
+
function load_rules_data(type) {
|
135 |
+
|
136 |
+
llar.progressbar.start();
|
137 |
+
|
138 |
+
$.post(ajaxurl, {
|
139 |
+
action: 'app_load_acl_rules',
|
140 |
+
type: type,
|
141 |
+
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
142 |
+
}, function(response){
|
143 |
+
|
144 |
+
llar.progressbar.stop();
|
145 |
+
|
146 |
+
if(response.success) {
|
147 |
+
|
148 |
+
$('.llar-app-'+type+'-access-rules-table').html(response.data.html);
|
149 |
+
}
|
150 |
+
});
|
151 |
+
}
|
152 |
+
|
153 |
+
})(jQuery);
|
154 |
+
</script>
|
155 |
+
</div>
|
views/app-widgets/active-lockouts.php
ADDED
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if( !defined( 'ABSPATH' ) ) exit();
|
3 |
+
?>
|
4 |
+
|
5 |
+
<h3><?php _e( 'Active Lockouts', 'limit-login-attempts-reloaded' ); ?></h3>
|
6 |
+
|
7 |
+
<div class="llar-app-lockouts-pagination">
|
8 |
+
<a class="llar-prev-page button disabled" href="#">
|
9 |
+
<span aria-hidden="true">‹</span>
|
10 |
+
</a>
|
11 |
+
<a class="llar-next-page button disabled" href="#">
|
12 |
+
<span aria-hidden="true">›</span>
|
13 |
+
</a>
|
14 |
+
</div>
|
15 |
+
|
16 |
+
<table class="form-table llar-table-app-lockouts">
|
17 |
+
<tr>
|
18 |
+
<th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
|
19 |
+
<th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
|
20 |
+
<th scope="col"><?php _e( "Count", 'limit-login-attempts-reloaded' ); ?></th>
|
21 |
+
<th scope="col"><?php _e( "Expires in (minutes)", 'limit-login-attempts-reloaded' ); ?></th>
|
22 |
+
</tr>
|
23 |
+
</table>
|
24 |
+
|
25 |
+
<script type="text/javascript">
|
26 |
+
;(function($){
|
27 |
+
|
28 |
+
$(document).ready(function () {
|
29 |
+
|
30 |
+
var $log_table = $('.llar-table-app-lockouts'),
|
31 |
+
current_page = 0,
|
32 |
+
page_offsets = [''];
|
33 |
+
|
34 |
+
load_lockouts_data();
|
35 |
+
|
36 |
+
$('.llar-app-lockouts-pagination').on('click', '.llar-prev-page:not(.disabled)', function(e){
|
37 |
+
e.preventDefault();
|
38 |
+
|
39 |
+
load_lockouts_data(page_offsets[--current_page]);
|
40 |
+
|
41 |
+
toggle_next_btn(true);
|
42 |
+
});
|
43 |
+
|
44 |
+
$('.llar-app-lockouts-pagination').on('click', '.llar-next-page:not(.disabled)', function(e){
|
45 |
+
e.preventDefault();
|
46 |
+
|
47 |
+
load_lockouts_data(page_offsets[++current_page]);
|
48 |
+
});
|
49 |
+
|
50 |
+
function toggle_prev_btn(enable) {
|
51 |
+
if(enable) {
|
52 |
+
|
53 |
+
$('.llar-app-lockouts-pagination .llar-prev-page').removeClass('disabled');
|
54 |
+
} else {
|
55 |
+
|
56 |
+
$('.llar-app-lockouts-pagination .llar-prev-page').addClass('disabled');
|
57 |
+
}
|
58 |
+
}
|
59 |
+
function toggle_next_btn(enable) {
|
60 |
+
if(enable) {
|
61 |
+
|
62 |
+
$('.llar-app-lockouts-pagination .llar-next-page').removeClass('disabled');
|
63 |
+
} else {
|
64 |
+
|
65 |
+
$('.llar-app-lockouts-pagination .llar-next-page').addClass('disabled');
|
66 |
+
}
|
67 |
+
}
|
68 |
+
|
69 |
+
function load_lockouts_data(offset) {
|
70 |
+
|
71 |
+
llar.progressbar.start();
|
72 |
+
|
73 |
+
$.post(ajaxurl, {
|
74 |
+
action: 'app_load_lockouts',
|
75 |
+
offset: offset,
|
76 |
+
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
77 |
+
}, function(response){
|
78 |
+
|
79 |
+
llar.progressbar.stop();
|
80 |
+
|
81 |
+
if(response.success) {
|
82 |
+
|
83 |
+
$log_table.html(response.data.html);
|
84 |
+
|
85 |
+
if(current_page > 0) {
|
86 |
+
toggle_prev_btn(true);
|
87 |
+
} else {
|
88 |
+
toggle_prev_btn(false);
|
89 |
+
|
90 |
+
}
|
91 |
+
|
92 |
+
if(response.data.offset) {
|
93 |
+
page_offsets.push(response.data.offset);
|
94 |
+
toggle_next_btn(true);
|
95 |
+
} else {
|
96 |
+
toggle_next_btn(false);
|
97 |
+
}
|
98 |
+
|
99 |
+
} else {
|
100 |
+
|
101 |
+
if(response.data.error_notice) {
|
102 |
+
$('.limit-login-app-dashboard').find('.llar-app-notice').remove();
|
103 |
+
$('.limit-login-app-dashboard').prepend(response.data.error_notice);
|
104 |
+
}
|
105 |
+
|
106 |
+
}
|
107 |
+
|
108 |
+
});
|
109 |
+
|
110 |
+
}
|
111 |
+
});
|
112 |
+
|
113 |
+
})(jQuery);
|
114 |
+
</script>
|
views/app-widgets/country-access-rules.php
ADDED
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if( !defined( 'ABSPATH' ) ) exit();
|
3 |
+
?>
|
4 |
+
|
5 |
+
<div class="llar-block-country-wrap" style="display:none;">
|
6 |
+
<h3><?php _e( 'Country Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
|
7 |
+
|
8 |
+
<?php
|
9 |
+
$countries_list = LLA_Helpers::get_countries_list();
|
10 |
+
?>
|
11 |
+
<div class="llar-block-country-section">
|
12 |
+
<div class="llar-block-country-selected-wrap">
|
13 |
+
<div class="llar-block-country-mode">
|
14 |
+
<span><?php _e( 'these countries:', 'limit-login-attempts-reloaded' ); ?></span>
|
15 |
+
</div>
|
16 |
+
<div class="llar-block-country-list llar-all-countries-selected"></div>
|
17 |
+
<a href="#" class="llar-toggle-countries-list"><?php _e( 'Add', 'limit-login-attempts-reloaded' ); ?></a>
|
18 |
+
</div>
|
19 |
+
<div class="llar-block-country-list llar-all-countries-list"></div>
|
20 |
+
</div>
|
21 |
+
</div>
|
22 |
+
<script type="text/javascript">
|
23 |
+
;(function($){
|
24 |
+
const countries = <?php echo json_encode( ( !empty( $countries_list ) ) ? $countries_list : array() ); ?>;
|
25 |
+
$(document).ready(function(){
|
26 |
+
|
27 |
+
llar.progressbar.start();
|
28 |
+
|
29 |
+
$.post(ajaxurl, {
|
30 |
+
action: 'app_load_country_access_rules',
|
31 |
+
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
32 |
+
}, function(response){
|
33 |
+
|
34 |
+
llar.progressbar.stop();
|
35 |
+
|
36 |
+
if(response.success && response.data.codes) {
|
37 |
+
|
38 |
+
const rule = response.data.rule || 'deny';
|
39 |
+
|
40 |
+
$('.llar-block-country-mode').prepend(`<select>
|
41 |
+
<option value="deny"`+(rule === 'deny' ? 'selected' : '')+`>Deny</option>
|
42 |
+
<option value="allow"`+(rule === 'allow' ? 'selected' : '')+`>Allow only</option>
|
43 |
+
</select>`);
|
44 |
+
|
45 |
+
let selected_countries = '';
|
46 |
+
let all_countries = '';
|
47 |
+
|
48 |
+
for(const code in countries) {
|
49 |
+
|
50 |
+
const is_selected = response.data.codes.includes(code);
|
51 |
+
|
52 |
+
if(is_selected) {
|
53 |
+
selected_countries += `<div class="llar-country" data-country="${countries[code]}"><label><input type="checkbox" value="${code}" checked>${countries[code]}</label></div>`;
|
54 |
+
}
|
55 |
+
|
56 |
+
all_countries += `<div class="llar-country llar-country-${code}"`+(is_selected ? ` style="display:none;"` : ``)+`><label><input type="checkbox" value="${code}">${countries[code]}</label></div>`;
|
57 |
+
}
|
58 |
+
|
59 |
+
$('.llar-all-countries-selected').html(selected_countries);
|
60 |
+
$('.llar-all-countries-list').html(all_countries);
|
61 |
+
$('.llar-block-country-wrap').show();
|
62 |
+
}
|
63 |
+
});
|
64 |
+
|
65 |
+
$('.llar-toggle-countries-list').on('click', function(e){
|
66 |
+
e.preventDefault();
|
67 |
+
|
68 |
+
$('.llar-all-countries-list').toggleClass('visible');
|
69 |
+
})
|
70 |
+
|
71 |
+
$('.llar-block-country-list').on('change', 'input[type="checkbox"]', function(){
|
72 |
+
|
73 |
+
llar.progressbar.start();
|
74 |
+
|
75 |
+
const $this = $(this);
|
76 |
+
const is_checked = $this.prop('checked');
|
77 |
+
const country_code = $this.val();
|
78 |
+
|
79 |
+
if(!is_checked) {
|
80 |
+
$('.llar-all-countries-list').find('.llar-country-'+country_code).replaceWith(`<div class="llar-country llar-country-${country_code}"><label><input type="checkbox" value="${country_code}">${countries[country_code]}</label></div>`);
|
81 |
+
$(this).closest('.llar-country').remove();
|
82 |
+
} else {
|
83 |
+
|
84 |
+
$this.closest('.llar-country').hide();
|
85 |
+
|
86 |
+
const $selected_countries_div = $('.llar-all-countries-selected');
|
87 |
+
|
88 |
+
$selected_countries_div.append(`<div class="llar-country" data-country="${countries[country_code]}"><label><input type="checkbox" value="${country_code}" checked>${countries[country_code]}</label></div>`);
|
89 |
+
|
90 |
+
const sort_items = $selected_countries_div.find('.llar-country').get();
|
91 |
+
|
92 |
+
sort_items.sort(function(a, b) {
|
93 |
+
return $(a).attr('data-country').toUpperCase().localeCompare($(b).attr('data-country').toUpperCase());
|
94 |
+
});
|
95 |
+
|
96 |
+
$.each(sort_items, function(index, item) {
|
97 |
+
$selected_countries_div.append(item);
|
98 |
+
});
|
99 |
+
|
100 |
+
}
|
101 |
+
|
102 |
+
$.post(ajaxurl, {
|
103 |
+
action: 'app_toggle_country',
|
104 |
+
code: country_code,
|
105 |
+
type: (is_checked) ? 'add' : 'remove',
|
106 |
+
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
107 |
+
}, function(response){
|
108 |
+
|
109 |
+
llar.progressbar.stop();
|
110 |
+
|
111 |
+
if(response.success) {
|
112 |
+
|
113 |
+
}
|
114 |
+
});
|
115 |
+
})
|
116 |
+
|
117 |
+
$('.llar-block-country-mode').on('change', 'select', function(){
|
118 |
+
|
119 |
+
llar.progressbar.start();
|
120 |
+
|
121 |
+
const $this = $(this);
|
122 |
+
|
123 |
+
$.post(ajaxurl, {
|
124 |
+
action: 'app_country_rule',
|
125 |
+
rule: $this.val(),
|
126 |
+
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
127 |
+
}, function(response){
|
128 |
+
|
129 |
+
llar.progressbar.stop();
|
130 |
+
|
131 |
+
if(response.success) {
|
132 |
+
|
133 |
+
}
|
134 |
+
});
|
135 |
+
})
|
136 |
+
|
137 |
+
});
|
138 |
+
})(jQuery)
|
139 |
+
</script>
|
views/app-widgets/event-log.php
ADDED
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if( !defined( 'ABSPATH' ) ) exit();
|
3 |
+
?>
|
4 |
+
|
5 |
+
<h3><?php _e( 'Event Log', 'limit-login-attempts-reloaded' ); ?></h3>
|
6 |
+
|
7 |
+
<div class="llar-app-log-pagination">
|
8 |
+
<a class="llar-prev-page button disabled" href="#">
|
9 |
+
<span aria-hidden="true">‹</span>
|
10 |
+
</a>
|
11 |
+
<a class="llar-next-page button disabled" href="#">
|
12 |
+
<span aria-hidden="true">›</span>
|
13 |
+
</a>
|
14 |
+
</div>
|
15 |
+
|
16 |
+
<div class="llar-table-scroll-wrap">
|
17 |
+
<table class="form-table llar-table-app-log">
|
18 |
+
<tr>
|
19 |
+
<th scope="col"><?php _e( "Time", 'limit-login-attempts-reloaded' ); ?></th>
|
20 |
+
<th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
|
21 |
+
<th scope="col"><?php _e( "Gateway", 'limit-login-attempts-reloaded' ); ?></th>
|
22 |
+
<th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
|
23 |
+
<th scope="col"><?php _e( "Rule", 'limit-login-attempts-reloaded' ); ?></th>
|
24 |
+
<th scope="col"><?php _e( "Reason", 'limit-login-attempts-reloaded' ); ?></th>
|
25 |
+
<th scope="col"><?php _e( "Pattern", 'limit-login-attempts-reloaded' ); ?></th>
|
26 |
+
<th scope="col"><?php _e( "Attempts Left", 'limit-login-attempts-reloaded' ); ?></th>
|
27 |
+
<th scope="col"><?php _e( "Lockout Duration", 'limit-login-attempts-reloaded' ); ?></th>
|
28 |
+
<th scope="col"><?php _e( "Actions", 'limit-login-attempts-reloaded' ); ?></th>
|
29 |
+
</tr>
|
30 |
+
</table>
|
31 |
+
</div>
|
32 |
+
<script type="text/javascript">
|
33 |
+
;(function($){
|
34 |
+
|
35 |
+
$(document).ready(function () {
|
36 |
+
|
37 |
+
var $log_table = $('.llar-table-app-log'),
|
38 |
+
current_page = 0,
|
39 |
+
page_offsets = [''];
|
40 |
+
|
41 |
+
load_log_data();
|
42 |
+
|
43 |
+
$('.llar-app-log-pagination').on('click', '.llar-prev-page:not(.disabled)', function(e){
|
44 |
+
e.preventDefault();
|
45 |
+
|
46 |
+
load_log_data(page_offsets[--current_page]);
|
47 |
+
|
48 |
+
toggle_next_btn(true);
|
49 |
+
});
|
50 |
+
|
51 |
+
$('.llar-app-log-pagination').on('click', '.llar-next-page:not(.disabled)', function(e){
|
52 |
+
e.preventDefault();
|
53 |
+
|
54 |
+
load_log_data(page_offsets[++current_page]);
|
55 |
+
});
|
56 |
+
|
57 |
+
$log_table.on('click', '.js-app-log-action', function (e) {
|
58 |
+
e.preventDefault();
|
59 |
+
|
60 |
+
var $this = $(this),
|
61 |
+
method = $this.data('method'),
|
62 |
+
params = $this.data('params');
|
63 |
+
|
64 |
+
if(!confirm('Are you sure?')) return;
|
65 |
+
|
66 |
+
llar.progressbar.start();
|
67 |
+
|
68 |
+
$.post(ajaxurl, {
|
69 |
+
action: 'app_log_action',
|
70 |
+
method: method,
|
71 |
+
params: params,
|
72 |
+
sec: '<?php echo esc_js( wp_create_nonce( "llar-action" ) ); ?>'
|
73 |
+
}, function(response){
|
74 |
+
|
75 |
+
llar.progressbar.stop();
|
76 |
+
|
77 |
+
console.log(response);
|
78 |
+
if(response.success) {
|
79 |
+
|
80 |
+
|
81 |
+
}
|
82 |
+
|
83 |
+
});
|
84 |
+
});
|
85 |
+
|
86 |
+
function toggle_prev_btn(enable) {
|
87 |
+
if(enable) {
|
88 |
+
|
89 |
+
$('.llar-app-log-pagination .llar-prev-page').removeClass('disabled');
|
90 |
+
} else {
|
91 |
+
|
92 |
+
$('.llar-app-log-pagination .llar-prev-page').addClass('disabled');
|
93 |
+
}
|
94 |
+
}
|
95 |
+
function toggle_next_btn(enable) {
|
96 |
+
if(enable) {
|
97 |
+
|
98 |
+
$('.llar-app-log-pagination .llar-next-page').removeClass('disabled');
|
99 |
+
} else {
|
100 |
+
|
101 |
+
$('.llar-app-log-pagination .llar-next-page').addClass('disabled');
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
function load_log_data(offset) {
|
106 |
+
|
107 |
+
llar.progressbar.start();
|
108 |
+
|
109 |
+
$.post(ajaxurl, {
|
110 |
+
action: 'app_load_log',
|
111 |
+
offset: offset,
|
112 |
+
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
113 |
+
}, function(response){
|
114 |
+
|
115 |
+
llar.progressbar.stop();
|
116 |
+
|
117 |
+
if(response.success) {
|
118 |
+
|
119 |
+
$log_table.html(response.data.html);
|
120 |
+
|
121 |
+
if(current_page > 0) {
|
122 |
+
toggle_prev_btn(true);
|
123 |
+
} else {
|
124 |
+
toggle_prev_btn(false);
|
125 |
+
|
126 |
+
}
|
127 |
+
|
128 |
+
if(response.data.offset) {
|
129 |
+
page_offsets.push(response.data.offset);
|
130 |
+
toggle_next_btn(true);
|
131 |
+
} else {
|
132 |
+
toggle_next_btn(false);
|
133 |
+
}
|
134 |
+
|
135 |
+
}
|
136 |
+
|
137 |
+
});
|
138 |
+
|
139 |
+
}
|
140 |
+
});
|
141 |
+
|
142 |
+
})(jQuery);
|
143 |
+
</script>
|
views/tab-dashboard.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
if( !defined( 'ABSPATH' ) ) exit();
|
4 |
|
5 |
$active_app = $this->get_option( 'active_app' );
|
|
|
6 |
|
7 |
$retries_chart_title = '';
|
8 |
$retries_chart_desc = '';
|
@@ -338,8 +339,8 @@ if( $active_app === 'local' ) {
|
|
338 |
|
339 |
$stats_global_dates[] = date( $date_format, $timest );
|
340 |
}
|
341 |
-
|
342 |
-
$countries_list =
|
343 |
?>
|
344 |
<div class="info-box-1">
|
345 |
<div class="section-title">
|
3 |
if( !defined( 'ABSPATH' ) ) exit();
|
4 |
|
5 |
$active_app = $this->get_option( 'active_app' );
|
6 |
+
$active_app = ($active_app === 'custom' && $this->app) ? 'custom' : 'local';
|
7 |
|
8 |
$retries_chart_title = '';
|
9 |
$retries_chart_desc = '';
|
339 |
|
340 |
$stats_global_dates[] = date( $date_format, $timest );
|
341 |
}
|
342 |
+
|
343 |
+
$countries_list = LLA_Helpers::get_countries_list();
|
344 |
?>
|
345 |
<div class="info-box-1">
|
346 |
<div class="section-title">
|
views/tab-logs-custom.php
CHANGED
@@ -9,406 +9,9 @@ if( !defined( 'ABSPATH' ) ) exit();
|
|
9 |
|
10 |
<div class="limit-login-app-dashboard">
|
11 |
|
12 |
-
|
|
|
|
|
|
|
13 |
|
14 |
-
<div class="llar-app-lockouts-pagination">
|
15 |
-
<a class="llar-prev-page button disabled" href="#">
|
16 |
-
<span aria-hidden="true">‹</span>
|
17 |
-
</a>
|
18 |
-
<a class="llar-next-page button disabled" href="#">
|
19 |
-
<span aria-hidden="true">›</span>
|
20 |
-
</a>
|
21 |
-
</div>
|
22 |
-
|
23 |
-
<table class="form-table llar-table-app-lockouts">
|
24 |
-
<tr>
|
25 |
-
<th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
|
26 |
-
<th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
|
27 |
-
<th scope="col"><?php _e( "Count", 'limit-login-attempts-reloaded' ); ?></th>
|
28 |
-
<th scope="col"><?php _e( "Expires in (minutes)", 'limit-login-attempts-reloaded' ); ?></th>
|
29 |
-
</tr>
|
30 |
-
</table>
|
31 |
-
|
32 |
-
<script type="text/javascript">
|
33 |
-
;(function($){
|
34 |
-
|
35 |
-
$(document).ready(function () {
|
36 |
-
|
37 |
-
var $log_table = $('.llar-table-app-lockouts'),
|
38 |
-
current_page = 0,
|
39 |
-
page_offsets = [''];
|
40 |
-
|
41 |
-
load_lockouts_data();
|
42 |
-
|
43 |
-
$('.llar-app-lockouts-pagination').on('click', '.llar-prev-page:not(.disabled)', function(e){
|
44 |
-
e.preventDefault();
|
45 |
-
|
46 |
-
load_lockouts_data(page_offsets[--current_page]);
|
47 |
-
|
48 |
-
toggle_next_btn(true);
|
49 |
-
});
|
50 |
-
|
51 |
-
$('.llar-app-lockouts-pagination').on('click', '.llar-next-page:not(.disabled)', function(e){
|
52 |
-
e.preventDefault();
|
53 |
-
|
54 |
-
load_lockouts_data(page_offsets[++current_page]);
|
55 |
-
});
|
56 |
-
|
57 |
-
function toggle_prev_btn(enable) {
|
58 |
-
if(enable) {
|
59 |
-
|
60 |
-
$('.llar-app-lockouts-pagination .llar-prev-page').removeClass('disabled');
|
61 |
-
} else {
|
62 |
-
|
63 |
-
$('.llar-app-lockouts-pagination .llar-prev-page').addClass('disabled');
|
64 |
-
}
|
65 |
-
}
|
66 |
-
function toggle_next_btn(enable) {
|
67 |
-
if(enable) {
|
68 |
-
|
69 |
-
$('.llar-app-lockouts-pagination .llar-next-page').removeClass('disabled');
|
70 |
-
} else {
|
71 |
-
|
72 |
-
$('.llar-app-lockouts-pagination .llar-next-page').addClass('disabled');
|
73 |
-
}
|
74 |
-
}
|
75 |
-
|
76 |
-
function load_lockouts_data(offset) {
|
77 |
-
|
78 |
-
llar.progressbar.start();
|
79 |
-
|
80 |
-
$.post(ajaxurl, {
|
81 |
-
action: 'app_load_lockouts',
|
82 |
-
offset: offset,
|
83 |
-
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
84 |
-
}, function(response){
|
85 |
-
|
86 |
-
llar.progressbar.stop();
|
87 |
-
|
88 |
-
if(response.success) {
|
89 |
-
|
90 |
-
$log_table.html(response.data.html);
|
91 |
-
|
92 |
-
if(current_page > 0) {
|
93 |
-
toggle_prev_btn(true);
|
94 |
-
} else {
|
95 |
-
toggle_prev_btn(false);
|
96 |
-
|
97 |
-
}
|
98 |
-
|
99 |
-
if(response.data.offset) {
|
100 |
-
page_offsets.push(response.data.offset);
|
101 |
-
toggle_next_btn(true);
|
102 |
-
} else {
|
103 |
-
toggle_next_btn(false);
|
104 |
-
}
|
105 |
-
|
106 |
-
} else {
|
107 |
-
|
108 |
-
if(response.data.error_notice) {
|
109 |
-
$('.limit-login-app-dashboard').find('.llar-app-notice').remove();
|
110 |
-
$('.limit-login-app-dashboard').prepend(response.data.error_notice);
|
111 |
-
}
|
112 |
-
|
113 |
-
}
|
114 |
-
|
115 |
-
});
|
116 |
-
|
117 |
-
}
|
118 |
-
});
|
119 |
-
|
120 |
-
})(jQuery);
|
121 |
-
</script>
|
122 |
-
|
123 |
-
<h3><?php _e( 'Event Log', 'limit-login-attempts-reloaded' ); ?></h3>
|
124 |
-
|
125 |
-
<div class="llar-app-log-pagination">
|
126 |
-
<a class="llar-prev-page button disabled" href="#">
|
127 |
-
<span aria-hidden="true">‹</span>
|
128 |
-
</a>
|
129 |
-
<a class="llar-next-page button disabled" href="#">
|
130 |
-
<span aria-hidden="true">›</span>
|
131 |
-
</a>
|
132 |
-
</div>
|
133 |
-
|
134 |
-
<div class="llar-table-scroll-wrap">
|
135 |
-
<table class="form-table llar-table-app-log">
|
136 |
-
<tr>
|
137 |
-
<th scope="col"><?php _e( "Time", 'limit-login-attempts-reloaded' ); ?></th>
|
138 |
-
<th scope="col"><?php _e( "IP", 'limit-login-attempts-reloaded' ); ?></th>
|
139 |
-
<th scope="col"><?php _e( "Gateway", 'limit-login-attempts-reloaded' ); ?></th>
|
140 |
-
<th scope="col"><?php _e( "Login", 'limit-login-attempts-reloaded' ); ?></th>
|
141 |
-
<th scope="col"><?php _e( "Rule", 'limit-login-attempts-reloaded' ); ?></th>
|
142 |
-
<th scope="col"><?php _e( "Reason", 'limit-login-attempts-reloaded' ); ?></th>
|
143 |
-
<th scope="col"><?php _e( "Pattern", 'limit-login-attempts-reloaded' ); ?></th>
|
144 |
-
<th scope="col"><?php _e( "Attempts Left", 'limit-login-attempts-reloaded' ); ?></th>
|
145 |
-
<th scope="col"><?php _e( "Lockout Duration", 'limit-login-attempts-reloaded' ); ?></th>
|
146 |
-
<th scope="col"><?php _e( "Actions", 'limit-login-attempts-reloaded' ); ?></th>
|
147 |
-
</tr>
|
148 |
-
</table>
|
149 |
-
</div>
|
150 |
-
<script type="text/javascript">
|
151 |
-
;(function($){
|
152 |
-
|
153 |
-
$(document).ready(function () {
|
154 |
-
|
155 |
-
var $log_table = $('.llar-table-app-log'),
|
156 |
-
current_page = 0,
|
157 |
-
page_offsets = [''];
|
158 |
-
|
159 |
-
load_log_data();
|
160 |
-
|
161 |
-
$('.llar-app-log-pagination').on('click', '.llar-prev-page:not(.disabled)', function(e){
|
162 |
-
e.preventDefault();
|
163 |
-
|
164 |
-
load_log_data(page_offsets[--current_page]);
|
165 |
-
|
166 |
-
toggle_next_btn(true);
|
167 |
-
});
|
168 |
-
|
169 |
-
$('.llar-app-log-pagination').on('click', '.llar-next-page:not(.disabled)', function(e){
|
170 |
-
e.preventDefault();
|
171 |
-
|
172 |
-
load_log_data(page_offsets[++current_page]);
|
173 |
-
});
|
174 |
-
|
175 |
-
$log_table.on('click', '.js-app-log-action', function (e) {
|
176 |
-
e.preventDefault();
|
177 |
-
|
178 |
-
var $this = $(this),
|
179 |
-
method = $this.data('method'),
|
180 |
-
params = $this.data('params');
|
181 |
-
|
182 |
-
if(!confirm('Are you sure?')) return;
|
183 |
-
|
184 |
-
llar.progressbar.start();
|
185 |
-
|
186 |
-
$.post(ajaxurl, {
|
187 |
-
action: 'app_log_action',
|
188 |
-
method: method,
|
189 |
-
params: params,
|
190 |
-
sec: '<?php echo esc_js( wp_create_nonce( "llar-action" ) ); ?>'
|
191 |
-
}, function(response){
|
192 |
-
|
193 |
-
llar.progressbar.stop();
|
194 |
-
|
195 |
-
console.log(response);
|
196 |
-
if(response.success) {
|
197 |
-
|
198 |
-
|
199 |
-
}
|
200 |
-
|
201 |
-
});
|
202 |
-
});
|
203 |
-
|
204 |
-
function toggle_prev_btn(enable) {
|
205 |
-
if(enable) {
|
206 |
-
|
207 |
-
$('.llar-app-log-pagination .llar-prev-page').removeClass('disabled');
|
208 |
-
} else {
|
209 |
-
|
210 |
-
$('.llar-app-log-pagination .llar-prev-page').addClass('disabled');
|
211 |
-
}
|
212 |
-
}
|
213 |
-
function toggle_next_btn(enable) {
|
214 |
-
if(enable) {
|
215 |
-
|
216 |
-
$('.llar-app-log-pagination .llar-next-page').removeClass('disabled');
|
217 |
-
} else {
|
218 |
-
|
219 |
-
$('.llar-app-log-pagination .llar-next-page').addClass('disabled');
|
220 |
-
}
|
221 |
-
}
|
222 |
-
|
223 |
-
function load_log_data(offset) {
|
224 |
-
|
225 |
-
llar.progressbar.start();
|
226 |
-
|
227 |
-
$.post(ajaxurl, {
|
228 |
-
action: 'app_load_log',
|
229 |
-
offset: offset,
|
230 |
-
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
231 |
-
}, function(response){
|
232 |
-
|
233 |
-
llar.progressbar.stop();
|
234 |
-
|
235 |
-
if(response.success) {
|
236 |
-
|
237 |
-
$log_table.html(response.data.html);
|
238 |
-
|
239 |
-
if(current_page > 0) {
|
240 |
-
toggle_prev_btn(true);
|
241 |
-
} else {
|
242 |
-
toggle_prev_btn(false);
|
243 |
-
|
244 |
-
}
|
245 |
-
|
246 |
-
if(response.data.offset) {
|
247 |
-
page_offsets.push(response.data.offset);
|
248 |
-
toggle_next_btn(true);
|
249 |
-
} else {
|
250 |
-
toggle_next_btn(false);
|
251 |
-
}
|
252 |
-
|
253 |
-
}
|
254 |
-
|
255 |
-
});
|
256 |
-
|
257 |
-
}
|
258 |
-
});
|
259 |
-
|
260 |
-
})(jQuery);
|
261 |
-
</script>
|
262 |
-
|
263 |
-
<div class="llar-app-acl-rules">
|
264 |
-
<div class="app-rules-col">
|
265 |
-
<h3><?php _e( 'Login Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
|
266 |
-
<table class="form-table llar-app-login-access-rules-table">
|
267 |
-
<tr>
|
268 |
-
<th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
|
269 |
-
<th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
|
270 |
-
<th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
|
271 |
-
</tr>
|
272 |
-
</table>
|
273 |
-
</div>
|
274 |
-
<div class="app-rules-col">
|
275 |
-
<h3><?php _e( 'IP Access Rules', 'limit-login-attempts-reloaded' ); ?></h3>
|
276 |
-
<table class="form-table llar-app-ip-access-rules-table">
|
277 |
-
<tr>
|
278 |
-
<th scope="col"><?php _e( 'Pattern', 'limit-login-attempts-reloaded' ); ?></th>
|
279 |
-
<th scope="col"><?php _e( 'Rule', 'limit-login-attempts-reloaded' ); ?></th>
|
280 |
-
<th class="llar-app-acl-action-col" scope="col"><?php _e( 'Action', 'limit-login-attempts-reloaded' ); ?></th>
|
281 |
-
</tr>
|
282 |
-
</table>
|
283 |
-
</div>
|
284 |
-
|
285 |
-
<script type="text/javascript">
|
286 |
-
;(function($){
|
287 |
-
|
288 |
-
$(document).ready(function () {
|
289 |
-
|
290 |
-
var $app_acl_rules = $('.llar-app-acl-rules');
|
291 |
-
|
292 |
-
load_rules_data('login');
|
293 |
-
load_rules_data('ip');
|
294 |
-
|
295 |
-
$app_acl_rules
|
296 |
-
.on('click', '.llar-app-acl-remove', function(e){
|
297 |
-
e.preventDefault();
|
298 |
-
|
299 |
-
if(!confirm('Are you sure?')) {
|
300 |
-
return false;
|
301 |
-
}
|
302 |
-
|
303 |
-
var $this = $(this),
|
304 |
-
pattern = $this.data('pattern');
|
305 |
-
|
306 |
-
if(!pattern) {
|
307 |
-
|
308 |
-
console.log('Wrong pattern');
|
309 |
-
return false;
|
310 |
-
}
|
311 |
-
|
312 |
-
llar.progressbar.start();
|
313 |
-
|
314 |
-
$.post(ajaxurl, {
|
315 |
-
action: 'app_acl_remove_rule',
|
316 |
-
pattern: pattern,
|
317 |
-
type: $this.data('type'),
|
318 |
-
sec: '<?php echo esc_js( wp_create_nonce( "llar-action" ) ); ?>'
|
319 |
-
}, function(response){
|
320 |
-
|
321 |
-
llar.progressbar.stop();
|
322 |
-
|
323 |
-
if(response.success) {
|
324 |
-
|
325 |
-
$this.closest('tr').fadeOut(300, function(){
|
326 |
-
$this.closest('tr').remove();
|
327 |
-
})
|
328 |
-
|
329 |
-
}
|
330 |
-
|
331 |
-
});
|
332 |
-
|
333 |
-
})
|
334 |
-
.on('click', '.llar-app-acl-add-rule', function(e){
|
335 |
-
e.preventDefault();
|
336 |
-
|
337 |
-
var $this = $(this),
|
338 |
-
pattern = $this.closest('tr').find('.llar-app-acl-pattern').val().trim(),
|
339 |
-
rule = $this.closest('tr').find('.llar-app-acl-rule').val(),
|
340 |
-
type = $this.data('type');
|
341 |
-
|
342 |
-
if(!pattern) {
|
343 |
-
|
344 |
-
alert('Pattern can\'t be empty!');
|
345 |
-
return false;
|
346 |
-
}
|
347 |
-
|
348 |
-
var row_exist = {};
|
349 |
-
$this.closest('table').find('.rule-pattern').each(function(i, el){
|
350 |
-
var res = el.innerText.localeCompare(pattern);
|
351 |
-
if(res === 0) {
|
352 |
-
row_exist = $(el).closest('tr');
|
353 |
-
}
|
354 |
-
});
|
355 |
-
|
356 |
-
if(row_exist.length) {
|
357 |
-
|
358 |
-
$this.closest('tr').find('.llar-app-acl-pattern').val('');
|
359 |
-
row_exist.remove();
|
360 |
-
}
|
361 |
-
|
362 |
-
llar.progressbar.start();
|
363 |
-
|
364 |
-
$.post(ajaxurl, {
|
365 |
-
action: 'app_acl_add_rule',
|
366 |
-
pattern: pattern,
|
367 |
-
rule: rule,
|
368 |
-
type: type,
|
369 |
-
sec: '<?php echo esc_js( wp_create_nonce( "llar-action" ) ); ?>'
|
370 |
-
}, function(response){
|
371 |
-
|
372 |
-
llar.progressbar.stop();
|
373 |
-
|
374 |
-
if(response.success) {
|
375 |
-
|
376 |
-
$this.closest('table').find('.empty-row').remove();
|
377 |
-
|
378 |
-
$this.closest('tr').after('<tr class="llar-app-rule-'+rule+'">' +
|
379 |
-
'<td class="rule-pattern">'+pattern+'</td>' +
|
380 |
-
'<td>'+rule+'</td>' +
|
381 |
-
'<td class="llar-app-acl-action-col" scope="col"><button class="button llar-app-acl-remove" data-type="'+type+'" data-pattern="'+pattern+'"><span class="dashicons dashicons-no"></span></button></td>' +
|
382 |
-
'</tr>');
|
383 |
-
|
384 |
-
}
|
385 |
-
|
386 |
-
});
|
387 |
-
|
388 |
-
});
|
389 |
-
|
390 |
-
});
|
391 |
-
|
392 |
-
function load_rules_data(type) {
|
393 |
-
|
394 |
-
llar.progressbar.start();
|
395 |
-
|
396 |
-
$.post(ajaxurl, {
|
397 |
-
action: 'app_load_acl_rules',
|
398 |
-
type: type,
|
399 |
-
sec: '<?php echo wp_create_nonce( "llar-action" ); ?>'
|
400 |
-
}, function(response){
|
401 |
-
|
402 |
-
llar.progressbar.stop();
|
403 |
-
|
404 |
-
if(response.success) {
|
405 |
-
|
406 |
-
$('.llar-app-'+type+'-access-rules-table').html(response.data.html);
|
407 |
-
}
|
408 |
-
});
|
409 |
-
}
|
410 |
-
|
411 |
-
})(jQuery);
|
412 |
-
</script>
|
413 |
-
</div>
|
414 |
</div>
|
9 |
|
10 |
<div class="limit-login-app-dashboard">
|
11 |
|
12 |
+
<?php include_once( LLA_PLUGIN_DIR.'views/app-widgets/active-lockouts.php'); ?>
|
13 |
+
<?php include_once( LLA_PLUGIN_DIR.'views/app-widgets/event-log.php'); ?>
|
14 |
+
<?php include_once( LLA_PLUGIN_DIR.'views/app-widgets/country-access-rules.php'); ?>
|
15 |
+
<?php include_once( LLA_PLUGIN_DIR.'views/app-widgets/acl-rules.php'); ?>
|
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
</div>
|