Limit Login Attempts Reloaded - Version 2.21.1

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 Icon 128x128 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 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( 'wp_ajax_app_acl_add_rule', array( $this, 'app_acl_add_rule_callback' ));
124
- add_action( 'wp_ajax_app_acl_remove_rule', array( $this, 'app_acl_remove_rule_callback' ));
 
 
 
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="9" style="text-align: center"><?php _e('No events yet.', 'limit-login-attempts-reloaded' ); ?></td></tr>
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.0
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.0
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 = require LLA_PLUGIN_DIR . '/resources/countries.php';
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
- <h3><?php _e( 'Active Lockouts', 'limit-login-attempts-reloaded' ); ?></h3>
 
 
 
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>