All In One WP Security & Firewall - Version 4.3.8.1

Version Description

  • Minor bug fix - added missing check to enqueue recaptcha script only if that feature is enabled.
Download this release

Release Info

Developer wpsolutions
Plugin Icon 128x128 All In One WP Security & Firewall
Version 4.3.8.1
Comparing to
See all releases

Code changes from version 4.3.7.2 to 4.3.8.1

Files changed (296) hide show
  1. {tags/4.3.7.1/trunk/admin → admin}/general/wp-security-list-table.php +0 -0
  2. {tags/2.0/admin → admin}/index.html +0 -0
  3. {tags/1.0/admin → admin}/index.php +0 -0
  4. {tags/4.3.7.1/trunk/admin → admin}/wp-security-admin-init.php +0 -0
  5. {tags/4.3.7.1/trunk/admin → admin}/wp-security-admin-menu.php +0 -0
  6. {tags/4.3.7.1/trunk/admin → admin}/wp-security-blacklist-menu.php +0 -0
  7. {tags/4.3.7.1/trunk/admin → admin}/wp-security-brute-force-menu.php +0 -0
  8. {tags/4.3.7.1/trunk/admin → admin}/wp-security-dashboard-menu.php +0 -0
  9. {tags/4.3.7.1/trunk/admin → admin}/wp-security-database-menu.php +0 -0
  10. {tags/4.3.7.1/trunk/admin → admin}/wp-security-filescan-menu.php +0 -0
  11. admin/wp-security-filesystem-menu.php +505 -0
  12. {tags/4.3.1/admin → admin}/wp-security-firewall-menu.php +0 -0
  13. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-404.php +0 -0
  14. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-acct-activity.php +0 -0
  15. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-comment-spammer-ip.php +0 -0
  16. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-locked-ip.php +0 -0
  17. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-logged-in-users.php +0 -0
  18. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-login-fails.php +0 -0
  19. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-permanent-blocked-ip.php +0 -0
  20. {tags/4.3.7.1/trunk/admin → admin}/wp-security-list-registered-users.php +0 -0
  21. {tags/4.3.7.1/trunk/admin → admin}/wp-security-maintenance-menu.php +0 -0
  22. {tags/4.3.7.1/trunk/admin → admin}/wp-security-misc-options-menu.php +0 -0
  23. {trunk/admin → admin}/wp-security-settings-menu.php +0 -0
  24. {tags/4.3.7.1/trunk/admin → admin}/wp-security-spam-menu.php +0 -0
  25. {tags/4.3.7.1/trunk/admin → admin}/wp-security-user-accounts-menu.php +0 -0
  26. {tags/4.3.7.1/trunk/admin → admin}/wp-security-user-login-menu.php +0 -0
  27. {tags/4.3.7.1/trunk/admin → admin}/wp-security-user-registration-menu.php +0 -0
  28. {tags/4.3.7.1/trunk/admin → admin}/wp-security-whois-menu.php +0 -0
  29. assets/banner-1544x500.png +0 -0
  30. assets/banner-772x250.png +0 -0
  31. assets/icon-128x128.png +0 -0
  32. {tags/2.0/backups → backups}/index.html +0 -0
  33. {tags/4.3.7.1/trunk/classes → classes}/grade-system/wp-security-feature-item-manager.php +0 -0
  34. {tags/4.0.1/classes → classes}/grade-system/wp-security-feature-item.php +0 -0
  35. {tags/2.0/classes → classes}/index.html +0 -0
  36. {tags/1.0/classes → classes}/index.php +0 -0
  37. {tags/4.3.7.1/trunk/classes → classes}/wp-security-backup.php +0 -0
  38. {tags/4.3.7.1/trunk/classes → classes}/wp-security-blocking.php +0 -0
  39. {tags/4.3.7.1/trunk/classes → classes}/wp-security-bot-protection.php +0 -0
  40. {tags/4.3.7.1/trunk/classes → classes}/wp-security-captcha.php +0 -0
  41. {tags/4.3.7.1/trunk/classes → classes}/wp-security-config.php +0 -0
  42. {tags/4.3.7.1/trunk/classes → classes}/wp-security-configure-settings.php +0 -0
  43. {tags/4.3.7.1/trunk/classes → classes}/wp-security-cronjob-handler.php +0 -0
  44. {tags/4.3.7.1/trunk/classes → classes}/wp-security-deactivation-tasks.php +0 -0
  45. {tags/4.3.7.1/trunk/classes → classes}/wp-security-debug-logger.php +0 -0
  46. {tags/4.3.7.1/trunk/classes → classes}/wp-security-file-scan.php +0 -0
  47. classes/wp-security-general-init-tasks.php +616 -0
  48. classes/wp-security-installer.php +206 -0
  49. classes/wp-security-process-renamed-login-page.php +243 -0
  50. classes/wp-security-user-login.php +607 -0
  51. {tags/4.3.7.1/trunk/classes → classes}/wp-security-user-registration.php +0 -0
  52. {tags/4.3.7.1/trunk/classes → classes}/wp-security-utility-file.php +0 -0
  53. {trunk/classes → classes}/wp-security-utility-htaccess.php +0 -0
  54. {tags/4.3.7.1/trunk/classes → classes}/wp-security-utility-ip-address.php +0 -0
  55. {tags/4.3.7.1/trunk/classes → classes}/wp-security-utility.php +0 -0
  56. classes/wp-security-wp-footer-content.php +93 -0
  57. {tags/4.3.7.1/trunk/classes → classes}/wp-security-wp-loaded-tasks.php +0 -0
  58. {tags/2.0/css → css}/index.html +0 -0
  59. {tags/4.0.8/css → css}/wp-security-admin-styles.css +0 -0
  60. {tags/1.8/css → css}/wp-security-site-lockout-page.css +0 -0
  61. {tags/1.7/images → images}/arrow.png +0 -0
  62. {tags/1.0/images → images}/error.png +0 -0
  63. {tags/1.0/images → images}/feature-difficulty-badge-bg.png +0 -0
  64. {tags/1.0/images → images}/feature-points-badge-bg.png +0 -0
  65. {tags/1.7/images → images}/form_bg.png +0 -0
  66. {tags/2.0/images → images}/index.html +0 -0
  67. {tags/1.0/images → images}/info-icon.png +0 -0
  68. {tags/1.0/images → images}/loading.gif +0 -0
  69. {tags/1.0/images → images}/plugin-icon.png +0 -0
  70. {tags/1.0/images → images}/plugin-icon2.png +0 -0
  71. {tags/1.0/images → images}/shield-info-icon-36.png +0 -0
  72. {tags/1.0/images → images}/shield-security-icon-36.png +0 -0
  73. {tags/1.0/images → images}/success.png +0 -0
  74. tags/2.0/index.html → index.html +0 -0
  75. {tags/2.0/js → js}/index.html +0 -0
  76. {tags/3.7.5/js → js}/masonry.pkgd.min.js +0 -0
  77. {tags/1.7/js → js}/password-strength-tool.js +0 -0
  78. {tags/4.1.0/js → js}/wp-security-admin-script.js +0 -0
  79. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-de_DE.mo +0 -0
  80. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-de_DE.po +0 -0
  81. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-es_ES.mo +0 -0
  82. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-es_ES.po +0 -0
  83. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-fa_IR.mo +0 -0
  84. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-fa_IR.po +0 -0
  85. {tags/4.1.0/languages → languages}/all-in-one-wp-security-and-firewall-fr_FR.mo +0 -0
  86. {tags/4.1.4/languages → languages}/all-in-one-wp-security-and-firewall-fr_FR.po +0 -0
  87. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-hu_HU.mo +0 -0
  88. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-hu_HU.po +0 -0
  89. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-it_IT.mo +0 -0
  90. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-it_IT.po +0 -0
  91. languages/all-in-one-wp-security-and-firewall-nl_NL.mo +0 -0
  92. languages/all-in-one-wp-security-and-firewall-nl_NL.po +4786 -0
  93. {tags/4.0.8/languages → languages}/all-in-one-wp-security-and-firewall-pt_BR.mo +0 -0
  94. {tags/4.0.8/languages → languages}/all-in-one-wp-security-and-firewall-pt_BR.po +0 -0
  95. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-ru_RU.mo +0 -0
  96. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-ru_RU.po +0 -0
  97. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-sv_SE.mo +0 -0
  98. {tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-sv_SE.po +0 -0
  99. {tags/4.2.8/languages → languages}/all-in-one-wp-security-and-firewall-zh_CN.mo +0 -0
  100. {tags/4.2.8/languages → languages}/all-in-one-wp-security-and-firewall-zh_CN.po +0 -0
  101. {tags/4.3.7.1/trunk/languages → languages}/all-in-one-wp-security-and-firewall.pot +0 -0
  102. {tags/2.0/lib → languages}/index.html +0 -0
  103. {tags/2.0/logs → lib}/index.html +0 -0
  104. {tags/1.0/lib → lib}/whois/LICENSE +0 -0
  105. {tags/1.0/lib → lib}/whois/handler.template.php +0 -0
  106. {tags/1.0/lib → lib}/whois/npdata.ser +0 -0
  107. {tags/1.0/lib → lib}/whois/whois.ae.php +0 -0
  108. {tags/1.0/lib → lib}/whois/whois.aero.php +0 -0
  109. {tags/1.0/lib → lib}/whois/whois.ag.php +0 -0
  110. {tags/1.0/lib → lib}/whois/whois.asia.php +0 -0
  111. {tags/1.0/lib → lib}/whois/whois.at.php +0 -0
  112. {tags/1.0/lib → lib}/whois/whois.au.php +0 -0
  113. {tags/1.0/lib → lib}/whois/whois.be.php +0 -0
  114. {tags/1.0/lib → lib}/whois/whois.biz.php +0 -0
  115. {tags/1.0/lib → lib}/whois/whois.br.php +0 -0
  116. {tags/1.0/lib → lib}/whois/whois.ca.php +0 -0
  117. {tags/1.0/lib → lib}/whois/whois.cat.php +0 -0
  118. {tags/1.0/lib → lib}/whois/whois.ch.php +0 -0
  119. {tags/4.3.1/lib → lib}/whois/whois.cl.php +0 -0
  120. {tags/4.3.1/lib → lib}/whois/whois.client.php +0 -0
  121. {tags/1.0/lib → lib}/whois/whois.cn.php +0 -0
  122. {tags/1.0/lib → lib}/whois/whois.co.php +0 -0
  123. {tags/1.0/lib → lib}/whois/whois.co.za.php +0 -0
  124. {tags/1.0/lib → lib}/whois/whois.coop.php +0 -0
  125. {tags/1.0/lib → lib}/whois/whois.cz.php +0 -0
  126. {tags/4.3.1/lib → lib}/whois/whois.de.php +0 -0
  127. {tags/1.0/lib → lib}/whois/whois.edu.php +0 -0
  128. {tags/1.0/lib → lib}/whois/whois.eu.php +0 -0
  129. {tags/1.0/lib → lib}/whois/whois.fi.php +0 -0
  130. {tags/1.0/lib → lib}/whois/whois.fj.php +0 -0
  131. {tags/1.0/lib → lib}/whois/whois.fm.php +0 -0
  132. {tags/1.0/lib → lib}/whois/whois.fr.php +0 -0
  133. {tags/1.0/lib → lib}/whois/whois.gtld.afternic.php +0 -0
  134. {tags/1.0/lib → lib}/whois/whois.gtld.alldomains.php +0 -0
  135. {tags/1.0/lib → lib}/whois/whois.gtld.ascio.php +0 -0
  136. {tags/1.0/lib → lib}/whois/whois.gtld.assorted.php +0 -0
  137. {tags/1.0/lib → lib}/whois/whois.gtld.corporatedomains.php +0 -0
  138. {tags/1.0/lib → lib}/whois/whois.gtld.directnic.php +0 -0
  139. {tags/1.0/lib → lib}/whois/whois.gtld.domaindiscover.php +0 -0
  140. {tags/1.0/lib → lib}/whois/whois.gtld.domainpeople.php +0 -0
  141. {tags/1.0/lib → lib}/whois/whois.gtld.dotster.php +0 -0
  142. {tags/1.0/lib → lib}/whois/whois.gtld.dreamhost.php +0 -0
  143. {tags/1.0/lib → lib}/whois/whois.gtld.enom.php +0 -0
  144. {tags/1.0/lib → lib}/whois/whois.gtld.fabulous.php +0 -0
  145. {tags/1.0/lib → lib}/whois/whois.gtld.fastdomain.php +0 -0
  146. {tags/1.0/lib → lib}/whois/whois.gtld.gandi.php +0 -0
  147. {tags/1.0/lib → lib}/whois/whois.gtld.genericb.php +0 -0
  148. {tags/1.0/lib → lib}/whois/whois.gtld.godaddy.php +0 -0
  149. {tags/1.0/lib → lib}/whois/whois.gtld.iana.php +0 -0
  150. {tags/1.0/lib → lib}/whois/whois.gtld.interdomain.php +0 -0
  151. {tags/1.0/lib → lib}/whois/whois.gtld.itsyourdomain.php +0 -0
  152. {tags/1.0/lib → lib}/whois/whois.gtld.joker.php +0 -0
  153. {tags/1.0/lib → lib}/whois/whois.gtld.markmonitor.php +0 -0
  154. {tags/1.0/lib → lib}/whois/whois.gtld.melbourneit.php +0 -0
  155. {tags/1.0/lib → lib}/whois/whois.gtld.moniker.php +0 -0
  156. {tags/4.3.1/lib → lib}/whois/whois.gtld.namejuice.php +0 -0
  157. {tags/1.0/lib → lib}/whois/whois.gtld.nameking.php +0 -0
  158. {tags/1.0/lib → lib}/whois/whois.gtld.names4ever.php +0 -0
  159. {tags/1.0/lib → lib}/whois/whois.gtld.namevault.php +0 -0
  160. {tags/1.0/lib → lib}/whois/whois.gtld.networksolutions.php +0 -0
  161. {tags/1.0/lib → lib}/whois/whois.gtld.nicco.php +0 -0
  162. {tags/1.0/lib → lib}/whois/whois.gtld.nicline.php +0 -0
  163. {tags/1.0/lib → lib}/whois/whois.gtld.onlinenic.php +0 -0
  164. {tags/1.0/lib → lib}/whois/whois.gtld.opensrs.php +0 -0
  165. {tags/1.0/lib → lib}/whois/whois.gtld.ovh.php +0 -0
  166. {tags/1.0/lib → lib}/whois/whois.gtld.php +0 -0
  167. {tags/1.0/lib → lib}/whois/whois.gtld.psiusa.php +0 -0
  168. {tags/1.0/lib → lib}/whois/whois.gtld.publicdomainregistry.php +0 -0
  169. {tags/1.0/lib → lib}/whois/whois.gtld.register.php +0 -0
  170. {tags/1.0/lib → lib}/whois/whois.gtld.rrpproxy.php +0 -0
  171. {tags/1.0/lib → lib}/whois/whois.gtld.schlund.php +0 -0
  172. {tags/1.0/lib → lib}/whois/whois.gtld.srsplus.php +0 -0
  173. {tags/1.0/lib → lib}/whois/whois.gtld.tmagnic.php +0 -0
  174. {tags/1.0/lib → lib}/whois/whois.gtld.tvcorp.php +0 -0
  175. {tags/1.0/lib → lib}/whois/whois.gtld.wildwestdomains.php +0 -0
  176. {tags/1.0/lib → lib}/whois/whois.hu.php +0 -0
  177. {tags/1.0/lib → lib}/whois/whois.icon.png +0 -0
  178. {tags/4.2.8/lib → lib}/whois/whois.idna.php +0 -0
  179. {tags/1.0/lib → lib}/whois/whois.ie.php +0 -0
  180. {tags/1.0/lib → lib}/whois/whois.in.php +0 -0
  181. {tags/1.0/lib → lib}/whois/whois.info.php +0 -0
  182. {tags/1.0/lib → lib}/whois/whois.int.php +0 -0
  183. {tags/1.0/lib → lib}/whois/whois.ip.afrinic.php +0 -0
  184. {tags/1.0/lib → lib}/whois/whois.ip.apnic.php +0 -0
  185. {tags/1.0/lib → lib}/whois/whois.ip.arin.php +0 -0
  186. {tags/1.0/lib → lib}/whois/whois.ip.krnic.php +0 -0
  187. {tags/1.0/lib → lib}/whois/whois.ip.lacnic.php +0 -0
  188. {tags/4.3.1/lib → lib}/whois/whois.ip.lib.php +0 -0
  189. {tags/4.3.1/lib → lib}/whois/whois.ip.php +0 -0
  190. {tags/1.0/lib → lib}/whois/whois.ip.ripe.php +0 -0
  191. {tags/1.0/lib → lib}/whois/whois.ir.php +0 -0
  192. {tags/1.0/lib → lib}/whois/whois.is.php +0 -0
  193. {tags/1.0/lib → lib}/whois/whois.it.php +0 -0
  194. {tags/1.0/lib → lib}/whois/whois.jp.php +0 -0
  195. {tags/1.0/lib → lib}/whois/whois.lt.php +0 -0
  196. {tags/1.0/lib → lib}/whois/whois.lu.php +0 -0
  197. {tags/1.0/lib → lib}/whois/whois.ly.php +0 -0
  198. {tags/4.2.8/lib → lib}/whois/whois.main.php +0 -0
  199. {tags/1.0/lib → lib}/whois/whois.me.php +0 -0
  200. {tags/4.3.1/lib → lib}/whois/whois.mobi.php +0 -0
  201. {tags/1.0/lib → lib}/whois/whois.museum.php +0 -0
  202. {tags/1.0/lib → lib}/whois/whois.mx.php +0 -0
  203. {tags/1.0/lib → lib}/whois/whois.name.php +0 -0
  204. {tags/4.3.1/lib → lib}/whois/whois.nl.php +0 -0
  205. {tags/1.0/lib → lib}/whois/whois.nu.php +0 -0
  206. {tags/4.3.1/lib → lib}/whois/whois.nz.php +0 -0
  207. {tags/4.3.1/lib → lib}/whois/whois.org.php +0 -0
  208. {tags/1.0/lib → lib}/whois/whois.org.za.php +0 -0
  209. {tags/4.3.1/lib → lib}/whois/whois.parser.php +0 -0
  210. {tags/1.0/lib → lib}/whois/whois.pl.php +0 -0
  211. {tags/1.0/lib → lib}/whois/whois.pro.php +0 -0
  212. {tags/1.0/lib → lib}/whois/whois.pt.php +0 -0
  213. {tags/1.0/lib → lib}/whois/whois.ro.php +0 -0
  214. {tags/1.0/lib → lib}/whois/whois.ru.php +0 -0
  215. {tags/1.0/lib → lib}/whois/whois.rwhois.php +0 -0
  216. {tags/4.3.1/lib → lib}/whois/whois.sc.php +0 -0
  217. {tags/1.0/lib → lib}/whois/whois.se.php +0 -0
  218. {tags/4.3.1/lib → lib}/whois/whois.servers.php +0 -0
  219. {tags/4.3.1/lib → lib}/whois/whois.si.php +0 -0
  220. {tags/1.0/lib → lib}/whois/whois.su.php +0 -0
  221. {tags/1.0/lib → lib}/whois/whois.tel.php +0 -0
  222. {tags/1.0/lib → lib}/whois/whois.travel.php +0 -0
  223. {tags/1.0/lib → lib}/whois/whois.uk.php +0 -0
  224. {tags/1.0/lib → lib}/whois/whois.us.php +0 -0
  225. {tags/4.3.1/lib → lib}/whois/whois.utils.php +0 -0
  226. {tags/4.3.1/lib → lib}/whois/whois.ve.php +0 -0
  227. {tags/1.0/lib → lib}/whois/whois.ws.php +0 -0
  228. {tags/1.0/lib → lib}/whois/whois.zanet.php +0 -0
  229. tags/1.0/license.txt → license.txt +0 -0
  230. {tags/4.2.8/logs → logs}/.htaccess +0 -0
  231. {tags/2.0/other-includes → logs}/index.html +0 -0
  232. {tags/1.0/logs → logs}/wp-security-log-cron-job.txt +0 -0
  233. {tags/1.0/logs → logs}/wp-security-log.txt +0 -0
  234. {tags/2.1.1/admin → other-includes}/index.html +0 -0
  235. other-includes/wp-security-rename-login-feature.php +1136 -0
  236. {tags/4.3.7.1/trunk/other-includes → other-includes}/wp-security-stop-users-enumeration.php +0 -0
  237. {tags/4.3.7.1/trunk/other-includes → other-includes}/wp-security-unlock-request.php +0 -0
  238. {tags/1.8/other-includes → other-includes}/wp-security-visitor-lockout-page.php +0 -0
  239. readme.txt +836 -0
  240. tags/1.0/admin/general/wp-security-list-table.php +0 -907
  241. tags/1.0/admin/wp-security-admin-init.php +0 -167
  242. tags/1.0/admin/wp-security-admin-menu.php +0 -93
  243. tags/1.0/admin/wp-security-blacklist-menu.php +0 -332
  244. tags/1.0/admin/wp-security-dashboard-menu.php +0 -304
  245. tags/1.0/admin/wp-security-database-menu.php +0 -463
  246. tags/1.0/admin/wp-security-filesystem-menu.php +0 -500
  247. tags/1.0/admin/wp-security-firewall-menu.php +0 -445
  248. tags/1.0/admin/wp-security-list-acct-activity.php +0 -159
  249. tags/1.0/admin/wp-security-list-comment-spammer-ip.php +0 -195
  250. tags/1.0/admin/wp-security-list-locked-ip.php +0 -194
  251. tags/1.0/admin/wp-security-list-login-fails.php +0 -158
  252. tags/1.0/admin/wp-security-settings-menu.php +0 -433
  253. tags/1.0/admin/wp-security-user-accounts-menu.php +0 -289
  254. tags/1.0/admin/wp-security-user-login-menu.php +0 -435
  255. tags/1.0/admin/wp-security-whois-menu.php +0 -126
  256. tags/1.0/classes/grade-system/wp-security-feature-item-manager.php +0 -388
  257. tags/1.0/classes/grade-system/wp-security-feature-item.php +0 -40
  258. tags/1.0/classes/wp-security-backup.php +0 -191
  259. tags/1.0/classes/wp-security-config.php +0 -54
  260. tags/1.0/classes/wp-security-configure-settings.php +0 -70
  261. tags/1.0/classes/wp-security-cronjob-handler.php +0 -27
  262. tags/1.0/classes/wp-security-debug-logger.php +0 -100
  263. tags/1.0/classes/wp-security-installer.php +0 -73
  264. tags/1.0/classes/wp-security-user-login.php +0 -373
  265. tags/1.0/classes/wp-security-utility-file.php +0 -230
  266. tags/1.0/classes/wp-security-utility-htaccess.php +0 -783
  267. tags/1.0/classes/wp-security-utility-ip-address.php +0 -146
  268. tags/1.0/classes/wp-security-utility.php +0 -105
  269. tags/1.0/css/wp-security-admin-styles.css +0 -255
  270. tags/1.0/js/wp-security-admin-script.js +0 -39
  271. tags/1.0/lib/whois/whois.cl.php +0 -56
  272. tags/1.0/lib/whois/whois.client.php +0 -595
  273. tags/1.0/lib/whois/whois.de.php +0 -78
  274. tags/1.0/lib/whois/whois.gtld.namejuice.php +0 -53
  275. tags/1.0/lib/whois/whois.idna.php +0 -969
  276. tags/1.0/lib/whois/whois.ip.lib.php +0 -120
  277. tags/1.0/lib/whois/whois.ip.php +0 -285
  278. tags/1.0/lib/whois/whois.main.php +0 -327
  279. tags/1.0/lib/whois/whois.mobi.php +0 -47
  280. tags/1.0/lib/whois/whois.nl.php +0 -88
  281. tags/1.0/lib/whois/whois.nz.php +0 -102
  282. tags/1.0/lib/whois/whois.org.php +0 -47
  283. tags/1.0/lib/whois/whois.parser.php +0 -873
  284. tags/1.0/lib/whois/whois.sc.php +0 -45
  285. tags/1.0/lib/whois/whois.servers.php +0 -252
  286. tags/1.0/lib/whois/whois.si.php +0 -55
  287. tags/1.0/lib/whois/whois.utils.php +0 -152
  288. tags/1.0/lib/whois/whois.ve.php +0 -75
  289. tags/1.0/readme.txt +0 -109
  290. tags/1.0/wp-security-core.php +0 -204
  291. tags/1.0/wp-security.php +0 -26
  292. tags/1.1/admin/general/wp-security-list-table.php +0 -907
  293. tags/1.1/admin/index.php +0 -5
  294. tags/1.1/admin/wp-security-admin-init.php +0 -167
  295. tags/1.1/admin/wp-security-admin-menu.php +0 -93
  296. tags/1.1/admin/wp-security-blacklist-menu.php +0 -64
{tags/4.3.7.1/trunk/admin → admin}/general/wp-security-list-table.php RENAMED
File without changes
{tags/2.0/admin → admin}/index.html RENAMED
File without changes
{tags/1.0/admin → admin}/index.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-admin-init.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-admin-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-blacklist-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-brute-force-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-dashboard-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-database-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-filescan-menu.php RENAMED
File without changes
admin/wp-security-filesystem-menu.php ADDED
@@ -0,0 +1,505 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( !defined( 'ABSPATH' ) ) { exit; } // Prevent direct access to file
3
+ class AIOWPSecurity_Filesystem_Menu extends AIOWPSecurity_Admin_Menu
4
+ {
5
+ var $menu_page_slug = AIOWPSEC_FILESYSTEM_MENU_SLUG;
6
+
7
+ /* Specify all the tabs of this menu in the following array */
8
+ var $menu_tabs;
9
+
10
+ var $menu_tabs_handler = array(
11
+ 'tab1' => 'render_tab1',
12
+ 'tab2' => 'render_tab2',
13
+ 'tab3' => 'render_tab3',
14
+ 'tab4' => 'render_tab4',
15
+ );
16
+
17
+ function __construct()
18
+ {
19
+ $this->render_menu_page();
20
+ add_action( 'admin_footer', array( &$this, 'filesystem_menu_footer_code' ) );
21
+ }
22
+
23
+ function set_menu_tabs()
24
+ {
25
+ $this->menu_tabs = array(
26
+ 'tab1' => __('File Permissions','all-in-one-wp-security-and-firewall'),
27
+ 'tab2' => __('PHP File Editing','all-in-one-wp-security-and-firewall'),
28
+ 'tab3' => __('WP File Access','all-in-one-wp-security-and-firewall'),
29
+ 'tab4' => __('Host System Logs','all-in-one-wp-security-and-firewall'),
30
+ );
31
+ }
32
+
33
+ function get_current_tab()
34
+ {
35
+ $tab_keys = array_keys($this->menu_tabs);
36
+ $tab = isset( $_GET['tab'] ) ? sanitize_text_field($_GET['tab']) : $tab_keys[0];
37
+ return $tab;
38
+ }
39
+
40
+ /*
41
+ * Renders our tabs of this menu as nav items
42
+ */
43
+ function render_menu_tabs()
44
+ {
45
+ $current_tab = $this->get_current_tab();
46
+
47
+ echo '<h2 class="nav-tab-wrapper">';
48
+ foreach ( $this->menu_tabs as $tab_key => $tab_caption )
49
+ {
50
+ $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
51
+ echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
52
+ }
53
+ echo '</h2>';
54
+ }
55
+
56
+ /*
57
+ * The menu rendering goes here
58
+ */
59
+ function render_menu_page()
60
+ {
61
+ echo '<div class="wrap">';
62
+ echo '<h2>'.__('Filesystem Security','all-in-one-wp-security-and-firewall').'</h2>';//Interface title
63
+ $this->set_menu_tabs();
64
+ $tab = $this->get_current_tab();
65
+ $this->render_menu_tabs();
66
+ ?>
67
+ <div id="poststuff"><div id="post-body">
68
+ <?php
69
+ //$tab_keys = array_keys($this->menu_tabs);
70
+ call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
71
+ ?>
72
+ </div></div>
73
+ </div><!-- end of wrap -->
74
+ <?php
75
+ }
76
+
77
+ function render_tab1()
78
+ {
79
+ //if this is the case there is no need to display a "fix permissions" button
80
+ global $wpdb, $aio_wp_security;
81
+ if (isset($_POST['aiowps_fix_permissions']))
82
+ {
83
+ $nonce=$_REQUEST['_wpnonce'];
84
+ if (!wp_verify_nonce($nonce, 'aiowpsec-fix-permissions-nonce'))
85
+ {
86
+ $aio_wp_security->debug_logger->log_debug("Nonce check failed for manual DB backup operation!",4);
87
+ die(__('Nonce check failed for manual DB backup operation!','all-in-one-wp-security-and-firewall'));
88
+ }
89
+ if (isset($_POST['aiowps_permission_chg_file']))
90
+ {
91
+ $folder_or_file = $_POST['aiowps_permission_chg_file'];
92
+ $rec_perm_oct_string = $_POST['aiowps_recommended_permissions']; //Convert the octal string to dec so the chmod func will accept it
93
+ $rec_perm_dec = octdec($rec_perm_oct_string); //Convert the octal string to dec so the chmod func will accept it
94
+ $perm_result = @chmod($_POST['aiowps_permission_chg_file'], $rec_perm_dec);
95
+ if ($perm_result === true)
96
+ {
97
+ $msg = sprintf( __('The permissions for %s were succesfully changed to %s', 'all-in-one-wp-security-and-firewall'), $folder_or_file, $rec_perm_oct_string);
98
+ $this->show_msg_updated($msg);
99
+ }else if($perm_result === false)
100
+ {
101
+ $msg = sprintf( __('Unable to change permissions for %s!', 'all-in-one-wp-security-and-firewall'), $folder_or_file);
102
+ $this->show_msg_error($msg);
103
+ }
104
+ }
105
+ }
106
+ ?>
107
+ <h2><?php _e('File Permissions Scan', 'all-in-one-wp-security-and-firewall')?></h2>
108
+ <div class="aio_blue_box">
109
+ <?php
110
+ echo '<p>'.__('Your WordPress file and folder permission settings govern the accessability and read/write privileges of the files and folders which make up your WP installation.', 'all-in-one-wp-security-and-firewall').'
111
+ <br />'.__('Your WP installation already comes with reasonably secure file permission settings for the filesystem.', 'all-in-one-wp-security-and-firewall').'
112
+ <br />'.__('However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values.', 'all-in-one-wp-security-and-firewall').'
113
+ <br />'.__('This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure.', 'all-in-one-wp-security-and-firewall').'
114
+ </p>';
115
+ ?>
116
+ </div>
117
+ <?php
118
+ $detected_os = strtoupper(PHP_OS);
119
+ if(strpos($detected_os, "WIN") !== false && $detected_os != "DARWIN"){
120
+ echo '<div class="aio_yellow_box">';
121
+ echo '<p>'.__('This plugin has detected that your site is running on a Windows server.', 'all-in-one-wp-security-and-firewall').'
122
+ <br />'.__('This feature is not applicable for Windows server installations.', 'all-in-one-wp-security-and-firewall').'
123
+ </p>';
124
+ echo '</div>';
125
+ }else{
126
+ ?>
127
+ <div class="postbox">
128
+ <h3 class="hndle"><label for="title"><?php _e('WP Directory and File Permissions Scan Results', 'all-in-one-wp-security-and-firewall'); ?></label></h3>
129
+ <div class="inside">
130
+ <?php
131
+ //Display security info badge
132
+ global $aiowps_feature_mgr;
133
+ $aiowps_feature_mgr->output_feature_details_badge("filesystem-file-permissions");
134
+ ?>
135
+ <form action="" method="POST">
136
+ <?php wp_nonce_field('aiowpsec-fix-permissions-nonce'); ?>
137
+ <table class="widefat file_permission_table">
138
+ <thead>
139
+ <tr>
140
+ <th><?php _e('Name', 'all-in-one-wp-security-and-firewall') ?></th>
141
+ <th><?php _e('File/Folder', 'all-in-one-wp-security-and-firewall') ?></th>
142
+ <th><?php _e('Current Permissions', 'all-in-one-wp-security-and-firewall') ?></th>
143
+ <th><?php _e('Recommended Permissions', 'all-in-one-wp-security-and-firewall') ?></th>
144
+ <th><?php _e('Recommended Action', 'all-in-one-wp-security-and-firewall') ?></th>
145
+ </tr>
146
+ </thead>
147
+ <tbody>
148
+ <?php
149
+ $util = new AIOWPSecurity_Utility_File;
150
+ $files_dirs_to_check = $util->files_and_dirs_to_check;
151
+ foreach ($files_dirs_to_check as $file_or_dir)
152
+ {
153
+ $this->show_wp_filesystem_permission_status($file_or_dir['name'],$file_or_dir['path'],$file_or_dir['permissions']);
154
+ }
155
+ ?>
156
+ </tbody>
157
+ <tfoot>
158
+ <tr>
159
+ <th><?php _e('Name', 'all-in-one-wp-security-and-firewall') ?></th>
160
+ <th><?php _e('File/Folder', 'all-in-one-wp-security-and-firewall') ?></th>
161
+ <th><?php _e('Current Permissions', 'all-in-one-wp-security-and-firewall') ?></th>
162
+ <th><?php _e('Recommended Permissions', 'all-in-one-wp-security-and-firewall') ?></th>
163
+ <th><?php _e('Recommended Action', 'all-in-one-wp-security-and-firewall') ?></th>
164
+ </tfoot>
165
+ </table>
166
+ </form>
167
+ </div></div>
168
+ <?php
169
+ }
170
+ }
171
+
172
+ function render_tab2()
173
+ {
174
+ global $aio_wp_security;
175
+ global $aiowps_feature_mgr;
176
+
177
+ if(isset($_POST['aiowps_disable_file_edit']))//Do form submission tasks
178
+ {
179
+ $nonce=$_REQUEST['_wpnonce'];
180
+ if (!wp_verify_nonce($nonce, 'aiowpsec-disable-file-edit-nonce'))
181
+ {
182
+ $aio_wp_security->debug_logger->log_debug("Nonce check failed on disable PHP file edit options save!",4);
183
+ die("Nonce check failed on disable PHP file edit options save!");
184
+ }
185
+
186
+ if(isset($_POST['aiowps_disable_file_editing']))
187
+ {
188
+
189
+ $res = AIOWPSecurity_Utility::disable_file_edits();//$this->disable_file_edits();
190
+ } else
191
+ {
192
+ $res = AIOWPSecurity_Utility::enable_file_edits();//$this->enable_file_edits();
193
+ }
194
+ if ($res)
195
+ {
196
+ //Save settings if no errors
197
+ $aio_wp_security->configs->set_value('aiowps_disable_file_editing',isset($_POST["aiowps_disable_file_editing"])?'1':'');
198
+ $aio_wp_security->configs->save_config();
199
+
200
+ //Recalculate points after the feature status/options have been altered
201
+ $aiowps_feature_mgr->check_feature_status_and_recalculate_points();
202
+ $this->show_msg_updated(__('Your PHP file editing settings were saved successfully.', 'all-in-one-wp-security-and-firewall'));
203
+ }
204
+ else
205
+ {
206
+ $this->show_msg_error(__('Operation failed! Unable to modify or make a backup of wp-config.php file!', 'all-in-one-wp-security-and-firewall'));
207
+ }
208
+ //$this->show_msg_settings_updated();
209
+
210
+ }
211
+ else {
212
+ // Make sure the setting value is up-to-date with current value in WP config
213
+ $aio_wp_security->configs->set_value('aiowps_disable_file_editing', defined('DISALLOW_FILE_EDIT') && DISALLOW_FILE_EDIT ? '1' : '');
214
+ $aio_wp_security->configs->save_config();
215
+ //Recalculate points after the feature status/options have been altered
216
+ $aiowps_feature_mgr->check_feature_status_and_recalculate_points();
217
+ }
218
+ ?>
219
+ <h2><?php _e('File Editing', 'all-in-one-wp-security-and-firewall')?></h2>
220
+ <div class="aio_blue_box">
221
+ <?php
222
+ echo '<p>'.__('The Wordpress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files.', 'all-in-one-wp-security-and-firewall').'
223
+ <br />'.__('This is often the first tool an attacker will use if able to login, since it allows code execution.', 'all-in-one-wp-security-and-firewall').'
224
+ <br />'.__('This feature will disable the ability for people to edit PHP files via the dashboard.', 'all-in-one-wp-security-and-firewall').'
225
+ </p>';
226
+ ?>
227
+ </div>
228
+
229
+ <div class="postbox">
230
+ <h3 class="hndle"><label for="title"><?php _e('Disable PHP File Editing', 'all-in-one-wp-security-and-firewall'); ?></label></h3>
231
+ <div class="inside">
232
+ <?php
233
+ //Display security info badge
234
+ global $aiowps_feature_mgr;
235
+ $aiowps_feature_mgr->output_feature_details_badge("filesystem-file-editing");
236
+ ?>
237
+
238
+ <form action="" method="POST">
239
+ <?php wp_nonce_field('aiowpsec-disable-file-edit-nonce'); ?>
240
+ <table class="form-table">
241
+ <tr valign="top">
242
+ <th scope="row"><?php _e('Disable Ability To Edit PHP Files', 'all-in-one-wp-security-and-firewall')?>:</th>
243
+ <td>
244
+ <input name="aiowps_disable_file_editing" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_disable_file_editing')=='1') echo ' checked="checked"'; ?> value="1"/>
245
+ <span class="description"><?php _e('Check this if you want to remove the ability for people to edit PHP files via the WP dashboard', 'all-in-one-wp-security-and-firewall'); ?></span>
246
+ </td>
247
+ </tr>
248
+ </table>
249
+ <input type="submit" name="aiowps_disable_file_edit" value="<?php _e('Save Settings', 'all-in-one-wp-security-and-firewall')?>" class="button-primary" />
250
+ </form>
251
+ </div></div>
252
+ <?php
253
+ }
254
+
255
+ function render_tab3()
256
+ {
257
+ global $aio_wp_security;
258
+ global $aiowps_feature_mgr;
259
+ if(isset($_POST['aiowps_save_wp_file_access_settings']))//Do form submission tasks
260
+ {
261
+ $nonce=$_REQUEST['_wpnonce'];
262
+ if (!wp_verify_nonce($nonce, 'aiowpsec-prevent-default-wp-file-access-nonce'))
263
+ {
264
+ $aio_wp_security->debug_logger->log_debug("Nonce check failed on enable basic firewall settings!",4);
265
+ die("Nonce check failed on enable basic firewall settings!");
266
+ }
267
+
268
+ //Save settings
269
+ if(isset($_POST['aiowps_prevent_default_wp_file_access']))
270
+ {
271
+ $aio_wp_security->configs->set_value('aiowps_prevent_default_wp_file_access','1');
272
+ }
273
+ else
274
+ {
275
+ $aio_wp_security->configs->set_value('aiowps_prevent_default_wp_file_access','');
276
+ }
277
+
278
+ //Commit the config settings
279
+ $aio_wp_security->configs->save_config();
280
+
281
+ //Recalculate points after the feature status/options have been altered
282
+ $aiowps_feature_mgr->check_feature_status_and_recalculate_points();
283
+
284
+ //Now let's write the applicable rules to the .htaccess file
285
+ $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess();
286
+
287
+ if ($res)
288
+ {
289
+ $this->show_msg_updated(__('You have successfully saved the Prevent Access to Default WP Files configuration.', 'all-in-one-wp-security-and-firewall'));
290
+ }
291
+ else
292
+ {
293
+ $this->show_msg_error(__('Could not write to the .htaccess file. Please check the file permissions.', 'all-in-one-wp-security-and-firewall'));
294
+ }
295
+ }
296
+
297
+ ?>
298
+ <h2><?php _e('WordPress Files', 'all-in-one-wp-security-and-firewall')?></h2>
299
+ <div class="aio_blue_box">
300
+ <?php
301
+ $info_msg = sprintf( __('This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations.', 'all-in-one-wp-security-and-firewall'), 'readme.html', 'license.txt', 'wp-config-sample.php');
302
+ echo '<p>'.$info_msg.'</p>'.'<p>'.__('By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers.', 'all-in-one-wp-security-and-firewall').'</p>';
303
+ ?>
304
+ </div>
305
+
306
+ <div class="postbox">
307
+ <h3 class="hndle"><label for="title"><?php _e('Prevent Access to Default WP Files', 'all-in-one-wp-security-and-firewall'); ?></label></h3>
308
+ <div class="inside">
309
+ <?php
310
+ //Display security info badge
311
+ global $aiowps_feature_mgr;
312
+ $aiowps_feature_mgr->output_feature_details_badge("block-wp-files-access");
313
+ ?>
314
+ <form action="" method="POST">
315
+ <?php wp_nonce_field('aiowpsec-prevent-default-wp-file-access-nonce'); ?>
316
+ <table class="form-table">
317
+ <tr valign="top">
318
+ <th scope="row"><?php _e('Prevent Access to WP Default Install Files', 'all-in-one-wp-security-and-firewall')?>:</th>
319
+ <td>
320
+ <input name="aiowps_prevent_default_wp_file_access" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_prevent_default_wp_file_access')=='1') echo ' checked="checked"'; ?> value="1"/>
321
+ <span class="description"><?php _e('Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php.', 'all-in-one-wp-security-and-firewall'); ?></span>
322
+ </td>
323
+ </tr>
324
+ </table>
325
+ <input type="submit" name="aiowps_save_wp_file_access_settings" value="<?php _e('Save Setting', 'all-in-one-wp-security-and-firewall')?>" class="button-primary" />
326
+ </form>
327
+ </div></div>
328
+ <?php
329
+ }
330
+
331
+ function render_tab4()
332
+ {
333
+ global $aio_wp_security;
334
+
335
+ if (isset($_POST['aiowps_system_log_file'])){
336
+ if ($_POST['aiowps_system_log_file'] != NULL){
337
+ $sys_log_file = esc_html($_POST['aiowps_system_log_file']);
338
+ $aio_wp_security->configs->set_value('aiowps_system_log_file',$sys_log_file);
339
+ }else{
340
+ $sys_log_file = 'error_log';
341
+ $aio_wp_security->configs->set_value('aiowps_system_log_file',$sys_log_file);
342
+ }
343
+ $aio_wp_security->configs->save_config();
344
+ }else{
345
+ $sys_log_file = $aio_wp_security->configs->get_value('aiowps_system_log_file');
346
+ }
347
+
348
+ ?>
349
+ <h2><?php _e('System Logs', 'all-in-one-wp-security-and-firewall')?></h2>
350
+ <div class="aio_blue_box">
351
+ <?php
352
+ echo '<p>'.__('Sometimes your hosting platform will produce error or warning logs in a file called "error_log".', 'all-in-one-wp-security-and-firewall').'
353
+ <br />'.__('Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation.', 'all-in-one-wp-security-and-firewall').'
354
+ <br />'.__('By occassionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address.', 'all-in-one-wp-security-and-firewall').'
355
+ </p>';
356
+ ?>
357
+ </div>
358
+
359
+ <div class="postbox">
360
+ <h3 class="hndle"><label for="title"><?php _e('View System Logs', 'all-in-one-wp-security-and-firewall'); ?></label></h3>
361
+ <div class="inside">
362
+ <p>Please click the button below to view the latest system logs:</p>
363
+ <form action="" method="POST">
364
+ <?php wp_nonce_field('aiowpsec-view-system-logs-nonce'); ?>
365
+ <div><?php _e('Enter System Log File Name', 'all-in-one-wp-security-and-firewall')?>:
366
+ <input type="text" size="25" name="aiowps_system_log_file" value="<?php echo esc_html($sys_log_file); ?>" />
367
+ <span class="description"><?php _e('Enter your system log file name. (Defaults to error_log)', 'all-in-one-wp-security-and-firewall'); ?></span>
368
+ </div>
369
+ <div class="aio_spacer_15"></div>
370
+ <input type="submit" name="aiowps_search_error_files" value="<?php _e('View Latest System Logs', 'all-in-one-wp-security-and-firewall'); ?>" class="button-primary search-error-files" />
371
+ <span class="aiowps_loading_1">
372
+ <img src="<?php echo AIO_WP_SECURITY_URL.'/images/loading.gif'; ?>" alt="<?php __('Loading...', 'all-in-one-wp-security-and-firewall'); ?>" />
373
+ </span>
374
+ </form>
375
+ </div></div>
376
+ <?php
377
+ if (isset($_POST['aiowps_search_error_files']))
378
+ {
379
+ $nonce=$_REQUEST['_wpnonce'];
380
+ if (!wp_verify_nonce($nonce, 'aiowpsec-view-system-logs-nonce'))
381
+ {
382
+ $aio_wp_security->debug_logger->log_debug("Nonce check failed on view system log operation!",4);
383
+ die("Nonce check failed on view system log operation!");
384
+ }
385
+
386
+ $logResults = AIOWPSecurity_Utility_File::recursive_file_search($sys_log_file, 0, ABSPATH);
387
+ if (empty($logResults) || $logResults == NULL || $logResults == '' || $logResults === FALSE)
388
+ {
389
+ $this->show_msg_updated(__('No system logs were found!', 'all-in-one-wp-security-and-firewall'));
390
+ }
391
+ else
392
+ {
393
+ foreach($logResults as $file)
394
+ {
395
+ $this->display_system_logs_in_table($file);
396
+ }
397
+ }
398
+ }
399
+ }
400
+
401
+ /*
402
+ * Scans WP key core files and directory permissions and populates a wp wide_fat table
403
+ * Displays a red background entry with a "Fix" button for permissions which are "777"
404
+ * Displays a yellow background entry with a "Fix" button for permissions which are less secure than the recommended
405
+ * Displays a green entry for permissions which are as secure or better than the recommended
406
+ */
407
+ function show_wp_filesystem_permission_status($name,$path,$recommended)
408
+ {
409
+ $fix = false;
410
+ $configmod = AIOWPSecurity_Utility_File::get_file_permission($path);
411
+ if ($configmod == "0777"){
412
+ $trclass = "aio_table_row_red"; //Display a red background if permissions are set as least secure ("777")
413
+ $fix = true;
414
+ }
415
+ else if($configmod != $recommended)
416
+ {
417
+ //$res = $this->is_file_permission_secure($recommended, $configmod);
418
+ $res = AIOWPSecurity_Utility_File::is_file_permission_secure($recommended, $configmod);
419
+ if ($res)
420
+ {
421
+ $trclass = "aio_table_row_green"; //If the current permissions are even tighter than recommended then display a green row
422
+ $fix = true;
423
+ }
424
+ else
425
+ {
426
+ $trclass = "aio_table_row_yellow"; //Display a yellow background if permissions are set to something different than recommended
427
+ $fix = true;
428
+ }
429
+ }
430
+ else
431
+ {
432
+ $trclass = "aio_table_row_green";
433
+ }
434
+ echo "<tr class=".$trclass.">";
435
+ echo '<td>' . $name . "</td>";
436
+ echo '<td>'. $path ."</td>";
437
+ echo '<td>' . $configmod . '</td>';
438
+ echo '<td>' . $recommended . '</td>';
439
+ if ($fix)
440
+ {
441
+ echo '<td>
442
+ <input type="submit" name="aiowps_fix_permissions" value="'.__('Set Recommended Permissions','all-in-one-wp-security-and-firewall').'" class="button-secondary" />
443
+ <input type="hidden" name="aiowps_permission_chg_file" value="'.$path.'"/>
444
+ <input type="hidden" name="aiowps_recommended_permissions" value="'.$recommended.'"/>
445
+ </td>';
446
+ } else
447
+ {
448
+ echo '<td>'.__('No Action Required', 'all-in-one-wp-security-and-firewall').'</td>';
449
+ }
450
+ echo "</tr>";
451
+ }
452
+
453
+
454
+
455
+ function filesystem_menu_footer_code()
456
+ {
457
+ ?>
458
+ <script type="text/javascript">
459
+ /* <![CDATA[ */
460
+ jQuery(document).ready(function($) {
461
+ loading_span = $('.aiowps_loading_1');
462
+ loading_span.hide(); //hide the spinner gif after page has successfully loaded
463
+ $('.search-error-files').on("click",function(){
464
+ loading_span.show();
465
+ });
466
+ });
467
+ /* ]]> */
468
+ </script>
469
+ <?php
470
+ }
471
+
472
+ function display_system_logs_in_table($filepath)
473
+ {
474
+ global $aio_wp_security;
475
+ //Get contents of the error_log file
476
+ $error_file_contents = file($filepath);
477
+ if (!$error_file_contents)
478
+ {
479
+ //TODO - error could not read file, display notice???
480
+ $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Filesystem_Menu - Unable to read file: ".$filepath,4);
481
+
482
+ }
483
+ $last_50_entries = array_slice($error_file_contents, -50); //extract the last 50 entries
484
+ ?>
485
+ <table class="widefat file_permission_table">
486
+ <thead>
487
+ <tr>
488
+ <th><?php echo(sprintf(__('Showing latest entries of error_log file: %s', 'all-in-one-wp-security-and-firewall'),'<strong>'.$filepath.'</strong>')); ?></th>
489
+ </tr>
490
+ </thead>
491
+ <tbody>
492
+ <?php
493
+ foreach ($last_50_entries as $entry)
494
+ {
495
+ echo "<tr>";
496
+ echo '<td>' . $entry . "</td>";
497
+ echo "</tr>";
498
+ }
499
+ ?>
500
+ </tbody>
501
+ </table>
502
+ <?php
503
+
504
+ }
505
+ } //end class
{tags/4.3.1/admin → admin}/wp-security-firewall-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-404.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-acct-activity.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-comment-spammer-ip.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-locked-ip.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-logged-in-users.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-login-fails.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-permanent-blocked-ip.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-list-registered-users.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-maintenance-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-misc-options-menu.php RENAMED
File without changes
{trunk/admin → admin}/wp-security-settings-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-spam-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-user-accounts-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-user-login-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-user-registration-menu.php RENAMED
File without changes
{tags/4.3.7.1/trunk/admin → admin}/wp-security-whois-menu.php RENAMED
File without changes
assets/banner-1544x500.png DELETED
Binary file
assets/banner-772x250.png DELETED
Binary file
assets/icon-128x128.png DELETED
Binary file
{tags/2.0/backups → backups}/index.html RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/grade-system/wp-security-feature-item-manager.php RENAMED
File without changes
{tags/4.0.1/classes → classes}/grade-system/wp-security-feature-item.php RENAMED
File without changes
{tags/2.0/classes → classes}/index.html RENAMED
File without changes
{tags/1.0/classes → classes}/index.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-backup.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-blocking.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-bot-protection.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-captcha.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-config.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-configure-settings.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-cronjob-handler.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-deactivation-tasks.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-debug-logger.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-file-scan.php RENAMED
File without changes
classes/wp-security-general-init-tasks.php ADDED
@@ -0,0 +1,616 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(!defined('ABSPATH')){
3
+ exit;//Exit if accessed directly
4
+ }
5
+
6
+ class AIOWPSecurity_General_Init_Tasks
7
+ {
8
+ function __construct(){
9
+ global $aio_wp_security;
10
+
11
+ if ($aio_wp_security->configs->get_value('aiowps_disable_xmlrpc_pingback_methods') == '1') {
12
+ add_filter( 'xmlrpc_methods', array(&$this, 'aiowps_disable_xmlrpc_pingback_methods') );
13
+ add_filter( 'wp_headers', array(&$this, 'aiowps_remove_x_pingback_header') );
14
+ }
15
+
16
+ add_action( 'permalink_structure_changed', array(&$this, 'refresh_firewall_rules' ), 10, 2);
17
+
18
+ if ($aio_wp_security->configs->get_value('aiowps_enable_autoblock_spam_ip') == '1') {
19
+ AIOWPSecurity_Blocking::check_visitor_ip_and_perform_blocking();
20
+
21
+ //add_action( 'spammed_comment', array(&$this, 'process_spammed_comment' )); //this hook gets fired when admin marks comment as spam
22
+ //add_action( 'akismet_submit_spam_comment', array(&$this, 'process_akismet_submit_spam_comment' ), 10, 2); //this hook gets fired when akismet marks a comment as spam
23
+ add_action( 'comment_post', array(&$this, 'spam_detect_process_comment_post' ), 10, 2); //this hook gets fired just after comment is saved to DB
24
+ add_action( 'transition_comment_status', array(&$this, 'process_transition_comment_status' ), 10, 3); //this hook gets fired when a comment's status changes
25
+ }
26
+
27
+ if ($aio_wp_security->configs->get_value('aiowps_enable_rename_login_page') == '1') {
28
+ add_action( 'widgets_init', array(&$this, 'remove_standard_wp_meta_widget' ));
29
+ add_filter( 'retrieve_password_message', array(&$this, 'decode_reset_pw_msg'), 10, 4); //Fix for non decoded html entities in password reset link
30
+ }
31
+
32
+ add_action('admin_notices', array(&$this,'reapply_htaccess_rules_notice'));
33
+ if(isset($_REQUEST['aiowps_reapply_htaccess'])){
34
+ if(strip_tags($_REQUEST['aiowps_reapply_htaccess']) == 1){
35
+ include_once ('wp-security-installer.php');
36
+ if(AIOWPSecurity_Installer::reactivation_tasks()){
37
+ $aio_wp_security->debug_logger->log_debug("The AIOWPS .htaccess rules were successfully re-inserted!");
38
+ $_SESSION['reapply_htaccess_rules_action_result'] = '1';//Success indicator.
39
+ //Can't echo to the screen here. It will create an header already sent error.
40
+ }else{
41
+ $aio_wp_security->debug_logger->log_debug("AIOWPS encountered an error when trying to write to your .htaccess file. Please check the logs.", 5);
42
+ $_SESSION['reapply_htaccess_rules_action_result'] = '2';//fail indicator.
43
+ //Can't echo to the screen here. It will create an header already sent error.
44
+ }
45
+
46
+ }elseif(strip_tags($_REQUEST['aiowps_reapply_htaccess']) == 2){
47
+ //Don't re-write the rules and just delete the temp config item
48
+ delete_option('aiowps_temp_configs');
49
+ }
50
+ }
51
+
52
+ if($aio_wp_security->configs->get_value('aiowps_prevent_site_display_inside_frame') == '1'){
53
+ send_frame_options_header(); //send X-Frame-Options: SAMEORIGIN in HTTP header
54
+ }
55
+
56
+ if($aio_wp_security->configs->get_value('aiowps_remove_wp_generator_meta_info') == '1'){
57
+ add_filter('the_generator', array(&$this,'remove_wp_generator_meta_info'));
58
+ add_filter('style_loader_src', array(&$this,'remove_wp_css_js_meta_info'));
59
+ add_filter('script_loader_src', array(&$this,'remove_wp_css_js_meta_info'));
60
+ }
61
+
62
+ //For the cookie based brute force prevention feature
63
+ if($aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention') == 1){
64
+ $bfcf_secret_word = $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word');
65
+ if(isset($_GET[$bfcf_secret_word])){
66
+ //If URL contains secret word in query param then set cookie and then redirect to the login page
67
+ AIOWPSecurity_Utility::set_cookie_value($bfcf_secret_word, "1");
68
+ AIOWPSecurity_Utility::redirect_to_url(AIOWPSEC_WP_URL."/wp-admin");
69
+ }
70
+ }
71
+
72
+ //Stop users enumeration feature
73
+ if( $aio_wp_security->configs->get_value('aiowps_prevent_users_enumeration') == 1) {
74
+ include_once(AIO_WP_SECURITY_PATH.'/other-includes/wp-security-stop-users-enumeration.php');
75
+ }
76
+
77
+ //REST API security
78
+ if( $aio_wp_security->configs->get_value('aiowps_disallow_unauthorized_rest_requests') == 1) {
79
+ add_action('rest_api_init', array(&$this, 'check_rest_api_requests'), 10 ,1);
80
+ }
81
+
82
+ //For user unlock request feature
83
+ if(isset($_POST['aiowps_unlock_request']) || isset($_POST['aiowps_wp_submit_unlock_request'])){
84
+ nocache_headers();
85
+ remove_action('wp_head','head_addons',7);
86
+ include_once(AIO_WP_SECURITY_PATH.'/other-includes/wp-security-unlock-request.php');
87
+ exit();
88
+ }
89
+
90
+ if(isset($_GET['aiowps_auth_key'])){
91
+ //If URL contains unlock key in query param then process the request
92
+ $unlock_key = sanitize_text_field($_GET['aiowps_auth_key']);
93
+ AIOWPSecurity_User_Login::process_unlock_request($unlock_key);
94
+ }
95
+
96
+ //For honeypot feature
97
+ if(isset($_POST['aio_special_field'])){
98
+ $special_field_value = sanitize_text_field($_POST['aio_special_field']);
99
+ if(!empty($special_field_value)){
100
+ //This means a robot has submitted the login form!
101
+ //Redirect back to its localhost
102
+ AIOWPSecurity_Utility::redirect_to_url('http://127.0.0.1');
103
+ }
104
+ }
105
+
106
+ //For 404 IP lockout feature
107
+ if($aio_wp_security->configs->get_value('aiowps_enable_404_IP_lockout') == '1'){
108
+ if (!is_user_logged_in() || !current_user_can('administrator')) {
109
+ $this->do_404_lockout_tasks();
110
+ }
111
+ }
112
+
113
+
114
+ //For login captcha feature
115
+ if($aio_wp_security->configs->get_value('aiowps_enable_login_captcha') == '1'){
116
+ if (!is_user_logged_in()) {
117
+ add_action('login_form', array(&$this, 'insert_captcha_question_form'));
118
+ }
119
+ }
120
+
121
+ //For woo form captcha features
122
+ $woo_captcha_enabled = false;
123
+ if($aio_wp_security->configs->get_value('aiowps_enable_woo_login_captcha') == '1' &&
124
+ !is_user_logged_in()) {
125
+ $woo_captcha_enabled = true;
126
+ add_action('woocommerce_login_form', array(&$this, 'insert_captcha_question_form'));
127
+ }
128
+
129
+ if($aio_wp_security->configs->get_value('aiowps_enable_woo_register_captcha') == '1' &&
130
+ !is_user_logged_in()) {
131
+ $woo_captcha_enabled = true;
132
+ add_action('woocommerce_register_form', array(&$this, 'insert_captcha_question_form'));
133
+ }
134
+
135
+ if($woo_captcha_enabled){
136
+ add_filter('woocommerce_process_login_errors', array(&$this, 'aiowps_validate_woo_login_with_captcha'), 10, 3);
137
+ }
138
+
139
+ //For bbpress new topic form captcha
140
+ if($aio_wp_security->configs->get_value('aiowps_enable_bbp_new_topic_captcha') == '1'){
141
+ if (!is_user_logged_in()) {
142
+ add_action('bbp_theme_before_topic_form_submit_wrapper', array(&$this, 'insert_captcha_question_form'));
143
+ }
144
+ }
145
+
146
+ //For custom login form captcha feature, ie, when wp_login_form() function is used to generate login form
147
+ if($aio_wp_security->configs->get_value('aiowps_enable_custom_login_captcha') == '1'){
148
+ if (!is_user_logged_in()) {
149
+ add_filter( 'login_form_middle', array(&$this, 'insert_captcha_custom_login'), 10, 2); //For cases where the WP wp_login_form() function is used
150
+ }
151
+ }
152
+
153
+ //For honeypot feature
154
+ if($aio_wp_security->configs->get_value('aiowps_enable_login_honeypot') == '1'){
155
+ if (!is_user_logged_in()) {
156
+ add_action('login_form', array(&$this, 'insert_honeypot_hidden_field'));
157
+ }
158
+ }
159
+
160
+ //For registration honeypot feature
161
+ if($aio_wp_security->configs->get_value('aiowps_enable_registration_honeypot') == '1'){
162
+ if (!is_user_logged_in()) {
163
+ add_action('register_form', array(&$this, 'insert_honeypot_hidden_field'));
164
+ }
165
+ }
166
+
167
+ //For lost password captcha feature
168
+ if($aio_wp_security->configs->get_value('aiowps_enable_lost_password_captcha') == '1'){
169
+ if (!is_user_logged_in()) {
170
+ add_action('lostpassword_form', array(&$this, 'insert_captcha_question_form'));
171
+ add_action('lostpassword_post', array(&$this, 'process_lost_password_form_post'));
172
+ }
173
+ }
174
+
175
+ //For registration manual approval feature
176
+ if($aio_wp_security->configs->get_value('aiowps_enable_manual_registration_approval') == '1'){
177
+ add_filter('wp_login_errors', array(&$this, 'modify_registration_page_messages'),10, 2);
178
+ }
179
+
180
+ //For registration page captcha feature
181
+ if (AIOWPSecurity_Utility::is_multisite_install()){
182
+ $blog_id = get_current_blog_id();
183
+ switch_to_blog($blog_id);
184
+ if($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1'){
185
+ if (!is_user_logged_in()) {
186
+ add_action('signup_extra_fields', array(&$this, 'insert_captcha_question_form_multi'));
187
+ //add_action('preprocess_signup_form', array(&$this, 'process_signup_form_multi'));
188
+ add_filter( 'wpmu_validate_user_signup', array(&$this, 'process_signup_form_multi') );
189
+
190
+ }
191
+ }
192
+ restore_current_blog();
193
+ }else{
194
+ if($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1'){
195
+ if (!is_user_logged_in()) {
196
+ add_action('register_form', array(&$this, 'insert_captcha_question_form'));
197
+ }
198
+ }
199
+ }
200
+
201
+ //For comment captcha feature
202
+ if (AIOWPSecurity_Utility::is_multisite_install()){
203
+ $blog_id = get_current_blog_id();
204
+ switch_to_blog($blog_id);
205
+ if($aio_wp_security->configs->get_value('aiowps_enable_comment_captcha') == '1'){
206
+ if (!is_user_logged_in()) {
207
+ if($aio_wp_security->configs->get_value('aiowps_default_recaptcha')) {
208
+ add_action('wp_head', array(&$this, 'add_recaptcha_script'));
209
+ }
210
+ add_action( 'comment_form_after_fields', array(&$this, 'insert_captcha_question_form'), 1 );
211
+ add_action( 'comment_form_logged_in_after', array(&$this, 'insert_captcha_question_form'), 1 );
212
+ add_filter( 'preprocess_comment', array(&$this, 'process_comment_post') );
213
+ }
214
+ }
215
+ restore_current_blog();
216
+ }else{
217
+ if($aio_wp_security->configs->get_value('aiowps_enable_comment_captcha') == '1'){
218
+ if (!is_user_logged_in()) {
219
+ if($aio_wp_security->configs->get_value('aiowps_default_recaptcha')) {
220
+ add_action('wp_head', array(&$this, 'add_recaptcha_script'));
221
+ }
222
+ add_action( 'comment_form_after_fields', array(&$this, 'insert_captcha_question_form'), 1 );
223
+ add_action( 'comment_form_logged_in_after', array(&$this, 'insert_captcha_question_form'), 1 );
224
+ add_filter( 'preprocess_comment', array(&$this, 'process_comment_post') );
225
+ }
226
+ }
227
+ }
228
+
229
+ //For buddypress registration captcha feature
230
+ if($aio_wp_security->configs->get_value('aiowps_enable_bp_register_captcha') == '1'){
231
+ add_action('bp_account_details_fields', array(&$this, 'insert_captcha_question_form'));
232
+ add_action('bp_signup_validate', array(&$this, 'buddy_press_signup_validate_captcha'));
233
+ }
234
+
235
+
236
+ //For feature which displays logged in users
237
+ $this->update_logged_in_user_transient();
238
+
239
+ //For block fake googlebots feature
240
+ if($aio_wp_security->configs->get_value('aiowps_block_fake_googlebots') == '1'){
241
+ include_once(AIO_WP_SECURITY_PATH.'/classes/wp-security-bot-protection.php');
242
+ AIOWPSecurity_Fake_Bot_Protection::block_fake_googlebots();
243
+ }
244
+
245
+ //For 404 event logging
246
+ if($aio_wp_security->configs->get_value('aiowps_enable_404_logging') == '1'){
247
+ add_action('wp_head', array(&$this, 'check_404_event'));
248
+ }
249
+
250
+ //Add more tasks that need to be executed at init time
251
+
252
+ }
253
+
254
+ function aiowps_disable_xmlrpc_pingback_methods( $methods ) {
255
+ unset( $methods['pingback.ping'] );
256
+ unset( $methods['pingback.extensions.getPingbacks'] );
257
+ return $methods;
258
+ }
259
+
260
+ function aiowps_remove_x_pingback_header( $headers ) {
261
+ unset( $headers['X-Pingback'] );
262
+ return $headers;
263
+ }
264
+
265
+ /**
266
+ * Refreshes the firewall rules in .htaccess file
267
+ * eg: if permalink settings changed and white list enabled
268
+ * @param $old_permalink_structure
269
+ * @param $permalink_structure
270
+ */
271
+ function refresh_firewall_rules($old_permalink_structure, $permalink_structure){
272
+ global $aio_wp_security;
273
+ //If white list enabled need to re-adjust the .htaccess rules
274
+ if ($aio_wp_security->configs->get_value('aiowps_enable_whitelisting') == '1') {
275
+ $write_result = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); //now let's write to the .htaccess file
276
+ if ( !$write_result )
277
+ {
278
+ $this->show_msg_error(__('The plugin was unable to write to the .htaccess file. Please edit file manually.','all-in-one-wp-security-and-firewall'));
279
+ $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_whitelist_Menu - The plugin was unable to write to the .htaccess file.");
280
+ }
281
+ }
282
+ }
283
+
284
+ function spam_detect_process_comment_post($comment_id, $comment_approved)
285
+ {
286
+ if($comment_approved === "spam"){
287
+ $this->block_comment_ip($comment_id);
288
+ }
289
+
290
+ }
291
+
292
+ function process_transition_comment_status($new_status, $old_status, $comment)
293
+ {
294
+ if($new_status == 'spam'){
295
+ $this->block_comment_ip($comment->comment_ID);
296
+ }
297
+
298
+ }
299
+
300
+ /**
301
+ * Will check auto-spam blocking settings and will add IP to blocked table accordingly
302
+ * @param $comment_id
303
+ */
304
+ function block_comment_ip($comment_id)
305
+ {
306
+ global $aio_wp_security, $wpdb;
307
+ $comment_obj = get_comment( $comment_id );
308
+ $comment_ip = $comment_obj->comment_author_IP;
309
+ //Get number of spam comments from this IP
310
+ $sql = $wpdb->prepare("SELECT * FROM $wpdb->comments
311
+ WHERE comment_approved = 'spam'
312
+ AND comment_author_IP = %s
313
+ ", $comment_ip);
314
+ $comment_data = $wpdb->get_results($sql, ARRAY_A);
315
+ $spam_count = count($comment_data);
316
+ $min_comment_before_block = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block');
317
+ if(!empty($min_comment_before_block) && $spam_count >= ($min_comment_before_block - 1)){
318
+ AIOWPSecurity_Blocking::add_ip_to_block_list($comment_ip, 'spam');
319
+ }
320
+ }
321
+
322
+ function remove_standard_wp_meta_widget()
323
+ {
324
+ unregister_widget('WP_Widget_Meta');
325
+ }
326
+
327
+ function remove_wp_generator_meta_info()
328
+ {
329
+ return '';
330
+ }
331
+
332
+ function remove_wp_css_js_meta_info($src) {
333
+ global $wp_version;
334
+ static $wp_version_hash = null; // Cache hash value for all function calls
335
+
336
+ // Replace only version number of assets with WP version
337
+ if ( strpos($src, 'ver=' . $wp_version) !== false ) {
338
+ if ( !$wp_version_hash ) {
339
+ $wp_version_hash = wp_hash($wp_version);
340
+ }
341
+ // Replace version number with computed hash
342
+ $src = add_query_arg('ver', $wp_version_hash, $src);
343
+ }
344
+ return $src;
345
+ }
346
+
347
+ function do_404_lockout_tasks(){
348
+ global $aio_wp_security;
349
+ $redirect_url = $aio_wp_security->configs->get_value('aiowps_404_lock_redirect_url'); //This is the redirect URL for blocked users
350
+
351
+ $visitor_ip = AIOWPSecurity_Utility_IP::get_user_ip_address();
352
+
353
+ $is_locked = AIOWPSecurity_Utility::check_locked_ip($visitor_ip);
354
+
355
+ if($is_locked){
356
+ //redirect blocked user to configured URL
357
+ AIOWPSecurity_Utility::redirect_to_url($redirect_url);
358
+ }else{
359
+ //allow through
360
+ }
361
+ }
362
+
363
+ function update_logged_in_user_transient(){
364
+ if(is_user_logged_in()){
365
+ $current_user_ip = AIOWPSecurity_Utility_IP::get_user_ip_address();
366
+ // get the logged in users list from transients entry
367
+ $logged_in_users = (AIOWPSecurity_Utility::is_multisite_install() ? get_site_transient('users_online') : get_transient('users_online'));
368
+ $current_user = wp_get_current_user();
369
+ $current_user = $current_user->ID;
370
+ $current_time = current_time('timestamp');
371
+
372
+ $current_user_info = array("user_id" => $current_user, "last_activity" => $current_time, "ip_address" => $current_user_ip); //We will store last activity time and ip address in transient entry
373
+
374
+ if($logged_in_users === false || $logged_in_users == NULL){
375
+ $logged_in_users = array();
376
+ $logged_in_users[] = $current_user_info;
377
+ AIOWPSecurity_Utility::is_multisite_install() ? set_site_transient('users_online', $logged_in_users, 30 * 60) : set_transient('users_online', $logged_in_users, 30 * 60);
378
+ }
379
+ else
380
+ {
381
+ $key = 0;
382
+ $do_nothing = false;
383
+ $update_existing = false;
384
+ $item_index = 0;
385
+ foreach ($logged_in_users as $value)
386
+ {
387
+ if($value['user_id'] == $current_user && strcmp($value['ip_address'], $current_user_ip) == 0)
388
+ {
389
+ if ($value['last_activity'] < ($current_time - (15 * 60)))
390
+ {
391
+ $update_existing = true;
392
+ $item_index = $key;
393
+ break;
394
+ }else{
395
+ $do_nothing = true;
396
+ break;
397
+ }
398
+ }
399
+ $key++;
400
+ }
401
+
402
+ if($update_existing)
403
+ {
404
+ //Update transient if the last activity was less than 15 min ago for this user
405
+ $logged_in_users[$item_index] = $current_user_info;
406
+ AIOWPSecurity_Utility::is_multisite_install() ? set_site_transient('users_online', $logged_in_users, 30 * 60) : set_transient('users_online', $logged_in_users, 30 * 60);
407
+ }else if($do_nothing){
408
+ //Do nothing
409
+ }else{
410
+ $logged_in_users[] = $current_user_info;
411
+ AIOWPSecurity_Utility::is_multisite_install() ? set_site_transient('users_online', $logged_in_users, 30 * 60) : set_transient('users_online', $logged_in_users, 30 * 60);
412
+ }
413
+ }
414
+ }
415
+ }
416
+
417
+ function insert_captcha_custom_login($cust_html_code, $args)
418
+ {
419
+ global $aio_wp_security;
420
+ $cap_form = '<p class="aiowps-captcha"><label>'.__('Please enter an answer in digits:','all-in-one-wp-security-and-firewall').'</label>';
421
+ $cap_form .= '<div class="aiowps-captcha-equation"><strong>';
422
+ $maths_question_output = $aio_wp_security->captcha_obj->generate_maths_question();
423
+ $cap_form .= $maths_question_output . '</strong></div></p>';
424
+
425
+ $cust_html_code .= $cap_form;
426
+ return $cust_html_code;
427
+ }
428
+
429
+ function insert_captcha_question_form_multi($error)
430
+ {
431
+ global $aio_wp_security;
432
+ $aio_wp_security->captcha_obj->display_captcha_form();
433
+ }
434
+
435
+ function process_signup_form_multi($result)
436
+ {
437
+ global $aio_wp_security;
438
+ //Check if captcha enabled
439
+ $verify_captcha = $aio_wp_security->captcha_obj->maybe_verify_captcha();
440
+ if ( $verify_captcha === false ) {
441
+ // wrong answer was entered
442
+ $result['errors']->add('generic', __('<strong>ERROR</strong>: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'));
443
+ }
444
+ return $result;
445
+ }
446
+
447
+ function insert_captcha_question_form(){
448
+ global $aio_wp_security;
449
+
450
+ if($aio_wp_security->configs->get_value('aiowps_default_recaptcha')) {
451
+
452
+ // Woocommerce "my account" page needs special consideration, ie,
453
+ // need to display two Google reCaptcha forms on same page (for login and register forms)
454
+ // For this case we use the "explicit" recaptcha display
455
+ $calling_hook = current_filter();
456
+ $site_key = esc_html( $aio_wp_security->configs->get_value('aiowps_recaptcha_site_key') );
457
+ if ( $calling_hook == 'woocommerce_login_form' ) {
458
+ echo '<div class="g-recaptcha-wrap" style="padding:10px 0 10px 0"><div id="woo_recaptcha_1" class="g-recaptcha" data-sitekey="'.$site_key.'"></div></div>';
459
+ return;
460
+ }
461
+
462
+ if ( $calling_hook == 'woocommerce_register_form' ) {
463
+ echo '<div class="g-recaptcha-wrap" style="padding:10px 0 10px 0"><div id="woo_recaptcha_2" class="g-recaptcha" data-sitekey="'.$site_key.'"></div></div>';
464
+ return;
465
+ }
466
+
467
+ // For all other forms simply display google recaptcha as per normal
468
+ $aio_wp_security->captcha_obj->display_recaptcha_form();
469
+ } else {
470
+ // display plain maths captcha form
471
+ $aio_wp_security->captcha_obj->display_captcha_form();
472
+ }
473
+
474
+ }
475
+
476
+ function insert_honeypot_hidden_field(){
477
+ $honey_input = '<p style="display: none;"><label>'.__('Enter something special:','all-in-one-wp-security-and-firewall').'</label>';
478
+ $honey_input .= '<input name="aio_special_field" type="text" id="aio_special_field" class="aio_special_field" value="" /></p>';
479
+ echo $honey_input;
480
+ }
481
+
482
+ function process_comment_post( $comment )
483
+ {
484
+ global $aio_wp_security;
485
+ if (is_user_logged_in()) {
486
+ return $comment;
487
+ }
488
+
489
+ //Don't process captcha for comment replies inside admin menu
490
+ if (isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'replyto-comment' &&
491
+ (check_ajax_referer('replyto-comment', '_ajax_nonce', false) || check_ajax_referer('replyto-comment', '_ajax_nonce-replyto-comment', false))) {
492
+ return $comment;
493
+ }
494
+
495
+ //Don't do captcha for pingback/trackback
496
+ if ($comment['comment_type'] != '' && $comment['comment_type'] != 'comment') {
497
+ return $comment;
498
+ }
499
+
500
+ $verify_captcha = $aio_wp_security->captcha_obj->maybe_verify_captcha();
501
+ if($verify_captcha === false) {
502
+ //Wrong answer
503
+ wp_die( __('Error: You entered an incorrect CAPTCHA answer. Please go back and try again.', 'all-in-one-wp-security-and-firewall'));
504
+ } else {
505
+ return($comment);
506
+ }
507
+ }
508
+
509
+ function process_lost_password_form_post()
510
+ {
511
+ global $aio_wp_security;
512
+
513
+ $verify_captcha = $aio_wp_security->captcha_obj->maybe_verify_captcha();
514
+ if ( $verify_captcha === false ) {
515
+ add_filter('allow_password_reset', array(&$this, 'add_lostpassword_captcha_error_msg'));
516
+ }
517
+ }
518
+
519
+ function add_lostpassword_captcha_error_msg()
520
+ {
521
+ //Insert an error just before the password reset process kicks in
522
+ return new WP_Error('aiowps_captcha_error',__('<strong>ERROR</strong>: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'));
523
+ }
524
+
525
+ function check_404_event()
526
+ {
527
+ if(is_404()){
528
+ //This means a 404 event has occurred - let's log it!
529
+ AIOWPSecurity_Utility::event_logger('404');
530
+ }
531
+
532
+ }
533
+
534
+ function buddy_press_signup_validate_captcha($errors)
535
+ {
536
+ global $bp, $aio_wp_security;
537
+ //Check captcha if required
538
+ $verify_captcha = $aio_wp_security->captcha_obj->maybe_verify_captcha();
539
+ if($verify_captcha === false) {
540
+ // wrong answer was entered
541
+ $bp->signup->errors['aiowps-captcha-answer'] = __('Your CAPTCHA answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall');
542
+ }
543
+ return;
544
+ }
545
+
546
+ function aiowps_validate_woo_login_with_captcha( $errors, $username, $password ) {
547
+ global $aio_wp_security;
548
+
549
+ $locked = $aio_wp_security->user_login_obj->check_locked_user();
550
+ if($locked == null){
551
+ //user is not locked continue
552
+ } else {
553
+ $errors->add('authentication_failed', __('<strong>ERROR</strong>: You are not allowed to register because your IP address is currently locked!', 'all-in-one-wp-security-and-firewall'));
554
+ return $errors;
555
+ }
556
+ $verify_captcha = $aio_wp_security->captcha_obj->maybe_verify_captcha();
557
+
558
+ if($verify_captcha === false) {
559
+ // wrong answer was entered
560
+ $errors->add('authentication_failed', __('<strong>ERROR</strong>: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'));
561
+ }
562
+ return $errors;
563
+
564
+ }
565
+
566
+ /**
567
+ * Displays a notice message if the plugin was reactivated after being initially deactivated
568
+ * Gives users option of re-applying the aiowps rules which were deleted from the .htaccess after deactivation.
569
+ */
570
+ function reapply_htaccess_rules_notice()
571
+ {
572
+ if (get_option('aiowps_temp_configs') !== FALSE){
573
+ echo '<div class="updated"><p>'.__('Would you like All In One WP Security & Firewall to re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?', 'all-in-one-wp-security-and-firewall').'&nbsp;&nbsp;<a href="admin.php?page='.AIOWPSEC_MENU_SLUG_PREFIX.'&aiowps_reapply_htaccess=1" class="button-primary">Yes</a>&nbsp;&nbsp;<a href="admin.php?page='.AIOWPSEC_MENU_SLUG_PREFIX.'&aiowps_reapply_htaccess=2" class="button-primary">No</a></p></div>';
574
+ }
575
+ }
576
+
577
+ //This is a fix for cases when the password reset URL in the email was not decoding all html entities properly
578
+ function decode_reset_pw_msg($message, $key, $user_login, $user_data)
579
+ {
580
+ global $aio_wp_security;
581
+ $message = html_entity_decode($message);
582
+ return $message;
583
+ }
584
+
585
+ function modify_registration_page_messages($errors, $redirect_to)
586
+ {
587
+ if( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] ){
588
+ if(is_wp_error($errors)){
589
+ $errors->remove('registered');
590
+ $pending_approval_msg = __('Your registration is pending approval.', 'all-in-one-wp-security-and-firewall');
591
+ $pending_approval_msg = apply_filters('aiowps_pending_registration_message', $pending_approval_msg);
592
+ $errors->add('registered', $pending_approval_msg, array('registered'=>'message'));
593
+ }
594
+ }
595
+ return $errors;
596
+ }
597
+
598
+ /*
599
+ * Re-wrote code which checks for REST API requests
600
+ * Below uses the "rest_api_init" action hook to check for REST requests.
601
+ * The code will block "unauthorized" requests whilst allowing genuine requests.
602
+ * (P. Petreski June 2018)
603
+ */
604
+ function check_rest_api_requests($rest_server_object){
605
+ $rest_user = wp_get_current_user();
606
+ if(empty($rest_user->ID)){
607
+ $error_message = apply_filters('aiowps_rest_api_error_message', __('You are not authorized to perform this action.', 'disable-wp-rest-api'));
608
+ wp_die($error_message);
609
+ }
610
+ }
611
+
612
+ function add_recaptcha_script()
613
+ {
614
+ wp_enqueue_script( 'google-recaptcha', 'https://www.google.com/recaptcha/api.js', false );
615
+ }
616
+ }
classes/wp-security-installer.php ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(!defined('ABSPATH')){
3
+ exit;//Exit if accessed directly
4
+ }
5
+
6
+ include_once(dirname(__FILE__) . '/wp-security-configure-settings.php');//Allows activating via wp-cli
7
+
8
+ class AIOWPSecurity_Installer
9
+ {
10
+ static function run_installer($networkwide='')
11
+ {
12
+ global $wpdb;
13
+ if (function_exists('is_multisite') && is_multisite() && $networkwide) {
14
+ // check if it is a network activation - if so, run the activation function for each blog id
15
+ $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
16
+ foreach ($blogids as $blog_id) {
17
+ switch_to_blog($blog_id);
18
+ AIOWPSecurity_Installer::create_db_tables();
19
+ AIOWPSecurity_Configure_Settings::add_option_values();
20
+ restore_current_blog();
21
+ }
22
+ AIOWPSecurity_Installer::create_db_backup_dir(); //Create a backup dir in the WP uploads directory
23
+ } else {
24
+ AIOWPSecurity_Installer::create_db_tables();
25
+ AIOWPSecurity_Configure_Settings::add_option_values();
26
+ AIOWPSecurity_Installer::create_db_backup_dir(); //Create a backup dir in the WP uploads directory
27
+ }
28
+ }
29
+
30
+ static function create_db_tables()
31
+ {
32
+ global $wpdb;
33
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
34
+
35
+ if (function_exists('is_multisite') && is_multisite()) {
36
+ /*
37
+ * FIX for multisite table creation case:
38
+ * Although each table name is defined in a constant inside the wp-security-core.php,
39
+ * we need to do this step for multisite case because we need to refresh the $wpdb->prefix value
40
+ * otherwise it will contain the original blog id and not the current id we need.
41
+ *
42
+ */
43
+ $lockdown_tbl_name = $wpdb->prefix.'aiowps_login_lockdown';
44
+ $failed_login_tbl_name = $wpdb->prefix.'aiowps_failed_logins';
45
+ $user_login_activity_tbl_name = $wpdb->prefix.'aiowps_login_activity';
46
+ $aiowps_global_meta_tbl_name = $wpdb->prefix.'aiowps_global_meta';
47
+ $aiowps_event_tbl_name = $wpdb->prefix.'aiowps_events';
48
+ $perm_block_tbl_name = $wpdb->prefix.'aiowps_permanent_block';
49
+ } else {
50
+ $lockdown_tbl_name = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
51
+ $failed_login_tbl_name = AIOWPSEC_TBL_FAILED_LOGINS;
52
+ $user_login_activity_tbl_name = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
53
+ $aiowps_global_meta_tbl_name = AIOWPSEC_TBL_GLOBAL_META_DATA;
54
+ $aiowps_event_tbl_name = AIOWPSEC_TBL_EVENTS;
55
+ $perm_block_tbl_name = AIOWPSEC_TBL_PERM_BLOCK;
56
+ }
57
+
58
+ $charset_collate = '';
59
+ if (!empty($wpdb->charset)) {
60
+ $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
61
+ } else {
62
+ $charset_collate = "DEFAULT CHARSET=utf8";
63
+ }
64
+ if (!empty($wpdb->collate)) {
65
+ $charset_collate .= " COLLATE $wpdb->collate";
66
+ }
67
+
68
+ $ld_tbl_sql = "CREATE TABLE " . $lockdown_tbl_name . " (
69
+ id bigint(20) NOT NULL AUTO_INCREMENT,
70
+ user_id bigint(20) NOT NULL,
71
+ user_login VARCHAR(150) NOT NULL,
72
+ lockdown_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
73
+ release_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
74
+ failed_login_ip varchar(100) NOT NULL DEFAULT '',
75
+ lock_reason varchar(128) NOT NULL DEFAULT '',
76
+ unlock_key varchar(128) NOT NULL DEFAULT '',
77
+ PRIMARY KEY (id)
78
+ )" . $charset_collate . ";";
79
+ dbDelta($ld_tbl_sql);
80
+
81
+ $fl_tbl_sql = "CREATE TABLE " . $failed_login_tbl_name . " (
82
+ id bigint(20) NOT NULL AUTO_INCREMENT,
83
+ user_id bigint(20) NOT NULL,
84
+ user_login VARCHAR(150) NOT NULL,
85
+ failed_login_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
86
+ login_attempt_ip varchar(100) NOT NULL DEFAULT '',
87
+ PRIMARY KEY (id)
88
+ )" . $charset_collate . ";";
89
+ dbDelta($fl_tbl_sql);
90
+
91
+ $ula_tbl_sql = "CREATE TABLE " . $user_login_activity_tbl_name . " (
92
+ id bigint(20) NOT NULL AUTO_INCREMENT,
93
+ user_id bigint(20) NOT NULL,
94
+ user_login VARCHAR(150) NOT NULL,
95
+ login_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
96
+ logout_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
97
+ login_ip varchar(100) NOT NULL DEFAULT '',
98
+ login_country varchar(150) NOT NULL DEFAULT '',
99
+ browser_type varchar(150) NOT NULL DEFAULT '',
100
+ PRIMARY KEY (id)
101
+ )" . $charset_collate . ";";
102
+ dbDelta($ula_tbl_sql);
103
+
104
+ $gm_tbl_sql = "CREATE TABLE " . $aiowps_global_meta_tbl_name . " (
105
+ meta_id bigint(20) NOT NULL auto_increment,
106
+ date_time datetime NOT NULL default '0000-00-00 00:00:00',
107
+ meta_key1 varchar(255) NOT NULL,
108
+ meta_key2 varchar(255) NOT NULL,
109
+ meta_key3 varchar(255) NOT NULL,
110
+ meta_key4 varchar(255) NOT NULL,
111
+ meta_key5 varchar(255) NOT NULL,
112
+ meta_value1 varchar(255) NOT NULL,
113
+ meta_value2 text NOT NULL,
114
+ meta_value3 text NOT NULL,
115
+ meta_value4 longtext NOT NULL,
116
+ meta_value5 longtext NOT NULL,
117
+ PRIMARY KEY (meta_id)
118
+ )" . $charset_collate . ";";
119
+ dbDelta($gm_tbl_sql);
120
+
121
+ $evt_tbl_sql = "CREATE TABLE " . $aiowps_event_tbl_name . " (
122
+ id bigint(20) NOT NULL AUTO_INCREMENT,
123
+ event_type VARCHAR(150) NOT NULL DEFAULT '',
124
+ username VARCHAR(150),
125
+ user_id bigint(20),
126
+ event_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
127
+ ip_or_host varchar(100),
128
+ referer_info varchar(255),
129
+ url varchar(255),
130
+ country_code varchar(50),
131
+ event_data longtext,
132
+ PRIMARY KEY (id)
133
+ )" . $charset_collate . ";";
134
+ dbDelta($evt_tbl_sql);
135
+
136
+ $pb_tbl_sql = "CREATE TABLE " . $perm_block_tbl_name . " (
137
+ id bigint(20) NOT NULL AUTO_INCREMENT,
138
+ blocked_ip varchar(100) NOT NULL DEFAULT '',
139
+ block_reason varchar(128) NOT NULL DEFAULT '',
140
+ country_origin varchar(50) NOT NULL DEFAULT '',
141
+ blocked_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
142
+ unblock tinyint(1) NOT NULL DEFAULT '0',
143
+ PRIMARY KEY (id)
144
+ )" . $charset_collate . ";";
145
+ dbDelta($pb_tbl_sql);
146
+
147
+ update_option("aiowpsec_db_version", AIO_WP_SECURITY_DB_VERSION);
148
+ }
149
+
150
+ static function create_db_backup_dir()
151
+ {
152
+ global $aio_wp_security;
153
+ //Create our folder in the "wp-content" directory
154
+ $aiowps_dir = WP_CONTENT_DIR . '/' . AIO_WP_SECURITY_BACKUPS_DIR_NAME;
155
+ if (!is_dir($aiowps_dir)) {
156
+ mkdir($aiowps_dir, 0755, true);
157
+ //Let's also create an empty index.html file in this folder
158
+ $index_file = $aiowps_dir . '/index.html';
159
+ $handle = fopen($index_file, 'w'); //or die('Cannot open file: '.$index_file);
160
+ fclose($handle);
161
+ }
162
+ $server_type = AIOWPSecurity_Utility::get_server_type();
163
+ //Only create .htaccess if server is the right type
164
+ if ($server_type == 'apache' || $server_type == 'litespeed') {
165
+ $file = $aiowps_dir . '/.htaccess';
166
+ if (!file_exists($file)) {
167
+ //Create an .htacces file
168
+ //Write some rules which will only allow people originating from wp admin page to download the DB backup
169
+ $rules = '';
170
+ $rules .= 'order deny,allow' . PHP_EOL;
171
+ $rules .= 'deny from all' . PHP_EOL;
172
+ $write_result = file_put_contents($file, $rules);
173
+ if ($write_result === false) {
174
+ $aio_wp_security->debug_logger->log_debug("Creation of .htaccess file in " . AIO_WP_SECURITY_BACKUPS_DIR_NAME . " directory failed!", 4);
175
+ }
176
+ }
177
+ }
178
+ }
179
+
180
+ static function reactivation_tasks()
181
+ {
182
+ global $aio_wp_security;
183
+ $temp_cfgs = get_option('aiowps_temp_configs');
184
+ if ($temp_cfgs !== FALSE) {
185
+ //Case where previously installed plugin was reactivated
186
+ //Let's copy the original configs back to the options table
187
+ $updated = update_option('aio_wp_security_configs', $temp_cfgs);
188
+ if (!$updated) {
189
+ $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Installer::run_installer() - Update of option settings failed upon plugin activation!", 4);
190
+ }
191
+ $aio_wp_security->configs->configs = $temp_cfgs; //copy the original configs to memory
192
+ //Now let's write any rules to the .htaccess file if necessary
193
+ $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess();
194
+
195
+ if ( !$res ) {
196
+ $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Deactivation::run_deactivation_tasks() - Could not write to the .htaccess file. Please check the file permissions.", 4);
197
+ return false;
198
+ }
199
+ delete_option('aiowps_temp_configs');
200
+ return true;
201
+ } else {
202
+ $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Deactivation::run_deactivation_tasks() - Original config settings not found!", 4);
203
+ return false;
204
+ }
205
+ }
206
+ }
classes/wp-security-process-renamed-login-page.php ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(!defined('ABSPATH')){
3
+ exit;//Exit if accessed directly
4
+ }
5
+
6
+ class AIOWPSecurity_Process_Renamed_Login_Page
7
+ {
8
+
9
+ function __construct()
10
+ {
11
+ add_action('login_init', array(&$this, 'aiowps_login_init'));
12
+ add_filter('site_url', array(&$this, 'aiowps_site_url'), 10, 2);
13
+ add_filter('network_site_url', array(&$this, 'aiowps_site_url'), 10, 2);
14
+ add_filter('wp_redirect', array(&$this, 'aiowps_wp_redirect'), 10, 2);
15
+ add_filter('register', array(&$this, 'register_link'));
16
+ add_filter('user_request_action_email_content', array(&$this, 'aiowps_user_request_email_content'), 10, 2);
17
+ remove_action('template_redirect', 'wp_redirect_admin_locations', 1000); //To prevent redirect to login page when people type "login" at end of home URL
18
+
19
+ }
20
+
21
+ function aiowps_login_init()
22
+ {
23
+ if (strpos($_SERVER['REQUEST_URI'], 'wp-login') !== false){
24
+ $referer = wp_get_referer();
25
+ if($referer && strpos($referer, 'wp-activate.php') !== false){
26
+ $parsed_referer = parse_url($referer);
27
+ if($parsed_referer && !empty($parsed_referer['query'])){
28
+ parse_str($parsed_referer['query'], $referer);
29
+ if (!empty($parsed_referer['key'])){
30
+ $result = wpmu_activate_signup($parsed_referer['key']); //MS site creation
31
+ if($result && is_wp_error($result) && ($result->get_error_code() === 'already_active' || $result->get_error_code() === 'blog_taken')){
32
+ $aiowps_new_login_url = AIOWPSecurity_Process_Renamed_Login_Page::new_login_url();
33
+ wp_safe_redirect($aiowps_new_login_url . (!empty($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : ''));
34
+ die;
35
+ }
36
+ }
37
+ }
38
+ }
39
+ AIOWPSecurity_Process_Renamed_Login_Page::aiowps_set_404();
40
+ }
41
+
42
+ }
43
+
44
+ function aiowps_site_url($url, $path)
45
+ {
46
+ return $this->aiowps_filter_wp_login_file($url);
47
+ }
48
+
49
+ function aiowps_wp_redirect($location, $status)
50
+ {
51
+ return $this->aiowps_filter_wp_login_file($location);
52
+ }
53
+
54
+ //Filter register link on the login page
55
+ function register_link($registration_url)
56
+ {
57
+ return $this->aiowps_filter_wp_login_file($registration_url);
58
+ }
59
+
60
+ // Filter confirm link so we hide the secret login slug in the export_personal_data email
61
+ function aiowps_user_request_email_content($email_text, $email_data)
62
+ {
63
+ global $aio_wp_security;
64
+ if(isset($email_data['request']) && isset($email_data['request']->action_name)) {
65
+ if($email_data['request']->action_name == 'export_personal_data') {
66
+ $confirm_url = $email_data['confirm_url'];
67
+ $login_slug = $aio_wp_security->configs->get_value('aiowps_login_page_slug');
68
+ if(get_option('permalink_structure')) {
69
+ $new_confirm_url = str_replace( $login_slug, 'wp-login.php', $confirm_url );
70
+ } else {
71
+ $search_pattern = '?'.$login_slug.'&action';
72
+ $new_confirm_url = str_replace( $search_pattern, '/wp-login.php/?action', $confirm_url );
73
+ }
74
+
75
+ $email_text_modified = str_replace( '###CONFIRM_URL###', esc_url_raw( $new_confirm_url ), $email_text );
76
+ return $email_text_modified;
77
+ }
78
+ }
79
+ return $email_text;
80
+ }
81
+
82
+ //Filter all login url strings on the login page
83
+ function aiowps_filter_wp_login_file($url)
84
+ {
85
+ if (strpos($url, 'wp-login.php') !== false){
86
+ $args = explode( '?', $url );
87
+ if (isset($args[1])){
88
+ if (strpos($args[1], 'action=postpass') !== FALSE){
89
+ return $url; //Don't reveal the secret URL in the post password action url
90
+ }
91
+ parse_str($args[1], $args);
92
+ $url = esc_url(add_query_arg($args, AIOWPSecurity_Process_Renamed_Login_Page::new_login_url()));
93
+ $url = html_entity_decode($url);
94
+ }else{
95
+ $url = AIOWPSecurity_Process_Renamed_Login_Page::new_login_url();
96
+ }
97
+ }
98
+ return $url;
99
+ }
100
+
101
+ static function renamed_login_init_tasks()
102
+ {
103
+ global $aio_wp_security;
104
+
105
+ //The following will process the native wordpress post password protection form
106
+ //Normally this is done by wp-login.php file but we cannot use that since the login page has been renamed
107
+ $action = isset($_GET['action'])?strip_tags($_GET['action']):'';
108
+ if(isset($_POST['post_password']) && $action == 'postpass'){
109
+ require_once ABSPATH . 'wp-includes/class-phpass.php';
110
+ $hasher = new PasswordHash( 8, true );
111
+
112
+ /**
113
+ * Filter the life span of the post password cookie.
114
+ *
115
+ * By default, the cookie expires 10 days from creation. To turn this
116
+ * into a session cookie, return 0.
117
+ *
118
+ * @since 3.7.0
119
+ *
120
+ * @param int $expires The expiry time, as passed to setcookie().
121
+ */
122
+ $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );
123
+ setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH );
124
+
125
+ wp_safe_redirect( wp_get_referer() );
126
+ exit();
127
+ }
128
+
129
+ //case where someone attempting to reach wp-admin
130
+ if (is_admin() && !is_user_logged_in() && !defined('DOING_AJAX') && basename( $_SERVER["SCRIPT_FILENAME"] ) !== 'admin-post.php'){
131
+ //Fix to prevent fatal error caused by some themes and Yoast SEO
132
+ do_action('aiowps_before_wp_die_renamed_login');
133
+ wp_die( __( 'Not available.', 'all-in-one-wp-security-and-firewall' ), 403 );
134
+ }
135
+
136
+ //case where someone attempting to reach wp-login
137
+ if(isset($_SERVER['REQUEST_URI']) && strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) && !is_user_logged_in()){
138
+
139
+ // Handle export personal data request for rename login case
140
+ if(isset($_GET['request_id'])) {
141
+ $request_id = (int) $_GET['request_id'];
142
+ $result = '';
143
+ if ( isset( $_GET['confirm_key'] ) ) {
144
+ $key = sanitize_text_field( wp_unslash( $_GET['confirm_key'] ) );
145
+ $result = wp_validate_user_request_key( $request_id, $key );
146
+ } else {
147
+ $result = new WP_Error( 'invalid_key', __( 'Invalid key' ) );
148
+ }
149
+
150
+ if ( is_wp_error( $result ) ) {
151
+ wp_die( $result );
152
+ }else if(!empty($result)) {
153
+ _wp_privacy_account_request_confirmed($request_id);
154
+ $message = _wp_privacy_account_request_confirmed_message( $request_id );
155
+ login_header( __( 'User action confirmed.' ), $message );
156
+ login_footer();
157
+ exit;
158
+ }
159
+ }
160
+
161
+ //Check if the maintenance (lockout) mode is active - if so prevent access to site by not displaying 404 page!
162
+ if($aio_wp_security->configs->get_value('aiowps_site_lockout') == '1'){
163
+ AIOWPSecurity_WP_Loaded_Tasks::site_lockout_tasks();
164
+ }else{
165
+ AIOWPSecurity_Process_Renamed_Login_Page::aiowps_set_404();
166
+ }
167
+ }
168
+
169
+ //case where someone attempting to reach the standard register or signup pages
170
+ if(isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], 'wp-register.php' ) ||
171
+ isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], 'wp-signup.php' )){
172
+ //Check if the maintenance (lockout) mode is active - if so prevent access to site by not displaying 404 page!
173
+ if($aio_wp_security->configs->get_value('aiowps_site_lockout') == '1'){
174
+ AIOWPSecurity_WP_Loaded_Tasks::site_lockout_tasks();
175
+ }else{
176
+ AIOWPSecurity_Process_Renamed_Login_Page::aiowps_set_404();
177
+ }
178
+ }
179
+
180
+ $parsed_url = parse_url($_SERVER['REQUEST_URI']);
181
+
182
+ $login_slug = $aio_wp_security->configs->get_value('aiowps_login_page_slug');
183
+ $home_url_with_slug = home_url($login_slug, 'relative');
184
+
185
+ /*
186
+ * Compatibility fix for WPML plugin
187
+ */
188
+ if (function_exists('icl_object_id') && strpos($home_url_with_slug,$login_slug)){
189
+ $home_url_with_slug = home_url($login_slug);
190
+ function qtranxf_init_language() {}
191
+ }
192
+
193
+ /*
194
+ * *** Compatibility fix for qTranslate-X plugin ***
195
+ * qTranslate-X plugin modifies the result for the following command by adding the protocol and host to the url path:
196
+ * home_url($login_slug, 'relative');
197
+ * Therefore we will remove the protocol and host for the following cases:
198
+ * qTranslate-X is active AND the URL being accessed contains the secret slug
199
+ */
200
+ if (function_exists('qtranxf_init_language') && strpos($home_url_with_slug,$login_slug)){
201
+ $parsed_home_url_with_slug = parse_url($home_url_with_slug);
202
+ $home_url_with_slug = $parsed_home_url_with_slug['path']; //this will return just the path minus the protocol and host
203
+ }
204
+
205
+ if(untrailingslashit($parsed_url['path']) === $home_url_with_slug
206
+ || (!get_option('permalink_structure') && isset($_GET[$login_slug]))){
207
+ if(empty($action) && is_user_logged_in()){
208
+ //if user is already logged in but tries to access the renamed login page, send them to the dashboard
209
+ AIOWPSecurity_Utility::redirect_to_url(AIOWPSEC_WP_URL."/wp-admin");
210
+ }else{
211
+ status_header( 200 );
212
+ require_once(AIO_WP_SECURITY_PATH . '/other-includes/wp-security-rename-login-feature.php' );
213
+ die;
214
+ }
215
+ }
216
+ }
217
+
218
+ static function new_login_url()
219
+ {
220
+ global $aio_wp_security;
221
+ $login_slug = $aio_wp_security->configs->get_value('aiowps_login_page_slug');
222
+ if(get_option('permalink_structure')){
223
+ return trailingslashit(trailingslashit(home_url()) . $login_slug);
224
+ }else{
225
+ return trailingslashit(home_url()) . '?' . $login_slug;
226
+ }
227
+ }
228
+
229
+ static function aiowps_set_404()
230
+ {
231
+ global $wp_query;
232
+ do_action('aiopws_before_set_404'); //This hook is for themes which produce a fatal error when the rename login feature is enabled and someone visits "wp-admin" slug directly
233
+
234
+ status_header(404);
235
+ $wp_query->set_404();
236
+ if ((($template = get_404_template()) || ($template = get_index_template()))
237
+ && ($template = apply_filters('template_include', $template))){
238
+ include($template);
239
+ }
240
+ die;
241
+ }
242
+
243
+ }
classes/wp-security-user-login.php ADDED
@@ -0,0 +1,607 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(!defined('ABSPATH')){
3
+ exit;//Exit if accessed directly
4
+ }
5
+
6
+ class AIOWPSecurity_User_Login
7
+ {
8
+ /**
9
+ * This will store a URI query string key for passing messages to the login form
10
+ * @var string
11
+ */
12
+ var $key_login_msg;
13
+ function __construct()
14
+ {
15
+ $this->key_login_msg = 'aiowps_login_msg_id';
16
+ // As a first authentication step, check if user's IP is locked.
17
+ add_filter('authenticate', array($this, 'block_ip_if_locked'), 1, 1);
18
+ // Check whether user needs to be manually approved after default WordPress authenticate hooks (with priority 20).
19
+ add_filter('authenticate', array($this, 'check_manual_registration_approval'), 30, 1);
20
+ // Check login captcha
21
+ add_filter('authenticate', array($this, 'check_captcha'), 1, 1);
22
+ // As a last authentication step, perform post authentication steps
23
+ add_filter('authenticate', array($this, 'post_authenticate'), 100, 3);
24
+ add_action('aiowps_force_logout_check', array($this, 'aiowps_force_logout_action_handler'));
25
+ add_action('clear_auth_cookie', array($this, 'wp_logout_action_handler'));
26
+ add_filter('login_message', array($this, 'aiowps_login_message')); //WP filter to add or modify messages on the login page
27
+ }
28
+ /**
29
+ * Terminate the execution via wp_die with 503 status code, if current
30
+ * user's IP is currently locked.
31
+ *
32
+ * @global AIO_WP_Security $aio_wp_security
33
+ * @param WP_Error|WP_User $user
34
+ * @return WP_User
35
+ */
36
+ function block_ip_if_locked($user)
37
+ {
38
+ global $aio_wp_security;
39
+ $user_locked = $this->check_locked_user();
40
+ if ( $user_locked != NULL ) {
41
+ $aio_wp_security->debug_logger->log_debug("Login attempt from blocked IP range - ".$user_locked['failed_login_ip'],2);
42
+ // Allow the error message to be filtered.
43
+ $error_msg = apply_filters( 'aiowps_ip_blocked_error_msg', __('<strong>ERROR</strong>: Access from your IP address has been blocked for security reasons. Please contact the administrator.', 'all-in-one-wp-security-and-firewall') );
44
+ // If unlock requests are allowed, add the "Request Unlock" button to the message.
45
+ $unlock_form = '';
46
+ if( $aio_wp_security->configs->get_value('aiowps_allow_unlock_requests') == '1' )
47
+ {
48
+ $unlock_form = $this->get_unlock_request_form();
49
+ $error_msg .= $unlock_form;
50
+ }
51
+ $error_msg = apply_filters('aiowps_ip_blocked_output_page', $error_msg, $unlock_form); //filter the complete output of the locked page
52
+ wp_die($error_msg, __('Service Temporarily Unavailable', 'all-in-one-wp-security-and-firewall'), 503);
53
+ } else {
54
+ return $user;
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Check login captcha (if enabled).
60
+ * @global AIO_WP_Security $aio_wp_security
61
+ * @param WP_Error|WP_User $user
62
+ * @return WP_Error|WP_User
63
+ */
64
+ function check_captcha($user)
65
+ {
66
+ global $aio_wp_security;
67
+ if ( is_wp_error($user) ) {
68
+ // Authentication has failed already at some earlier step.
69
+ return $user;
70
+ }
71
+
72
+ if ( ! (isset($_POST['log']) && isset($_POST['pwd'])) ) {
73
+ // XML-RPC authentication (not via wp-login.php), nothing to do here.
74
+ return $user;
75
+ }
76
+
77
+ if ( $aio_wp_security->configs->get_value('aiowps_enable_login_captcha') != '1' ) {
78
+ // Captcha not enabled, nothing to do here.
79
+ return $user;
80
+ }
81
+ $captcha_error = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall'));
82
+ $verify_captcha = $aio_wp_security->captcha_obj->maybe_verify_captcha();
83
+ if ( $verify_captcha === false ) {
84
+ return $captcha_error;
85
+ }
86
+ return $user;
87
+ }
88
+ /**
89
+ * Check, whether $user needs to be manually approved by site admin yet.
90
+ * @global AIO_WP_Security $aio_wp_security
91
+ * @param WP_Error|WP_User $user
92
+ * @param string $username
93
+ * @param string $password
94
+ * @return WP_Error|WP_User
95
+ */
96
+ function check_manual_registration_approval($user)
97
+ {
98
+ global $aio_wp_security;
99
+ if ( !($user instanceof WP_User) ) {
100
+ // Not a WP_User - nothing to do here.
101
+ return $user;
102
+ }
103
+ //Check if auto pending new account status feature is enabled
104
+ if ($aio_wp_security->configs->get_value('aiowps_enable_manual_registration_approval') == '1')
105
+ {
106
+ $aiowps_account_status = get_user_meta($user->ID, 'aiowps_account_status', TRUE);
107
+ if ($aiowps_account_status == 'pending') {
108
+ // Account needs to be activated yet
109
+ return new WP_Error('account_pending', __('<strong>ACCOUNT PENDING</strong>: Your account is currently not active. An administrator needs to activate your account before you can login.', 'all-in-one-wp-security-and-firewall'));
110
+ }
111
+ }
112
+ return $user;
113
+ }
114
+ /**
115
+ * Handle post authentication steps (in case of failed login):
116
+ * - increment number of failed logins for $username
117
+ * - (optionally) lock the user
118
+ * - (optionally) display a generic error message
119
+ * @global AIO_WP_Security $aio_wp_security
120
+ * @param WP_Error|WP_User $user
121
+ * @param string $username
122
+ * @param string $password
123
+ * @return WP_Error|WP_User
124
+ */
125
+ function post_authenticate($user, $username, $password)
126
+ {
127
+ global $aio_wp_security;
128
+ if ( !is_wp_error($user) ) {
129
+ // Authentication has been successful, there's nothing to do here.
130
+ return $user;
131
+ }
132
+ if ( empty($username) || empty($password) ) {
133
+ // Neither log nor block login attempts with empty username or password.
134
+ return $user;
135
+ }
136
+ if ( $user->get_error_code() === 'account_pending' ) {
137
+ // Neither log nor block users attempting to log in before their registration is approved.
138
+ return $user;
139
+ }
140
+ // Login failed for non-trivial reason
141
+ $this->increment_failed_logins($username);
142
+ if ( $aio_wp_security->configs->get_value('aiowps_enable_login_lockdown') == '1' )
143
+ {
144
+ $is_whitelisted = false;
145
+ //check if lockdown whitelist enabled
146
+ if ( $aio_wp_security->configs->get_value('aiowps_lockdown_enable_whitelisting') == '1' ){
147
+ $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user
148
+ $whitelisted_ips = $aio_wp_security->configs->get_value('aiowps_lockdown_allowed_ip_addresses');
149
+ $is_whitelisted = AIOWPSecurity_Utility_IP::is_ip_whitelisted($ip, $whitelisted_ips);
150
+ }
151
+
152
+ if($is_whitelisted === false){
153
+ // Too many failed logins from user's IP?
154
+ $login_attempts_permitted = absint($aio_wp_security->configs->get_value('aiowps_max_login_attempts'));
155
+ $too_many_failed_logins = $login_attempts_permitted <= $this->get_login_fail_count();
156
+ // Is an invalid username or email the reason for login error?
157
+ $invalid_username = ($user->get_error_code() === 'invalid_username' || $user->get_error_code() == 'invalid_email');
158
+ // Should an invalid username be immediately locked?
159
+ $invalid_username_lockdown = $aio_wp_security->configs->get_value('aiowps_enable_invalid_username_lockdown') == '1';
160
+ $lock_invalid_username = $invalid_username && $invalid_username_lockdown;
161
+ // Should an invalid username be blocked as per blacklist?
162
+ $instant_lockout_users_list = $aio_wp_security->configs->get_value('aiowps_instantly_lockout_specific_usernames');
163
+ if ( !is_array($instant_lockout_users_list) ) {
164
+ $instant_lockout_users_list = array();
165
+ }
166
+ $username_blacklisted = $invalid_username && in_array($username, $instant_lockout_users_list);
167
+ if ( $too_many_failed_logins || $lock_invalid_username || $username_blacklisted )
168
+ {
169
+ $this->lock_the_user($username, 'login_fail');
170
+ }
171
+ }
172
+ }
173
+
174
+ if ( $aio_wp_security->configs->get_value('aiowps_set_generic_login_msg') == '1' )
175
+ {
176
+ // Return generic error message if configured
177
+ return new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid login credentials.', 'all-in-one-wp-security-and-firewall'));
178
+ }
179
+ return $user;
180
+ }
181
+ /*
182
+ * This function queries the aiowps_login_lockdown table.
183
+ * If the release_date has not expired AND the current visitor IP addr matches
184
+ * it will return a record
185
+ */
186
+ function check_locked_user()
187
+ {
188
+ global $wpdb;
189
+ $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
190
+ $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user
191
+ if(empty($ip)) return false;
192
+ $now = current_time( 'mysql' );
193
+ $locked_user = $wpdb->get_row("SELECT * FROM $login_lockdown_table " .
194
+ "WHERE release_date > '".$now."' AND " .
195
+ "failed_login_ip = '" . esc_sql($ip) . "'", ARRAY_A);
196
+ return $locked_user;
197
+ }
198
+ /*
199
+ * This function queries the aiowps_failed_logins table and returns the number of failures for current IP range within allowed failure period
200
+ */
201
+ function get_login_fail_count()
202
+ {
203
+ global $wpdb, $aio_wp_security;
204
+ $failed_logins_table = AIOWPSEC_TBL_FAILED_LOGINS;
205
+ $login_retry_interval = $aio_wp_security->configs->get_value('aiowps_retry_time_period');
206
+ $now = current_time( 'mysql' );
207
+ $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user
208
+ if(empty($ip)) return false;
209
+ $login_failures = $wpdb->get_var("SELECT COUNT(ID) FROM $failed_logins_table " .
210
+ "WHERE failed_login_date + INTERVAL " .
211
+ $login_retry_interval . " MINUTE > '" . esc_sql($now) . "' AND " .
212
+ "login_attempt_ip = '" . esc_sql($ip) . "'");
213
+ return $login_failures;
214
+ }
215
+ /**
216
+ * Adds an entry to the `aiowps_login_lockdown` table.
217
+ * @param string $username User's username or email
218
+ * @param string $lock_reason
219
+ */
220
+ function lock_the_user($username, $lock_reason='login_fail')
221
+ {
222
+ global $wpdb, $aio_wp_security;
223
+ $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
224
+ $lockout_time_length = $aio_wp_security->configs->get_value('aiowps_lockout_time_length');
225
+ $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user
226
+ if(empty($ip)) return;
227
+ $ip_range = AIOWPSecurity_Utility_IP::get_sanitized_ip_range($ip); //Get the IP range of the current user
228
+ $user = is_email($username) ? get_user_by('email', $username) : get_user_by('login', $username); //Returns WP_User object if exists
229
+ $ip_range = apply_filters('aiowps_before_lockdown', $ip_range);
230
+ if ($user)
231
+ {
232
+ //If the login attempt was made using a valid user set variables for DB storage later on
233
+ $user_id = $user->ID;
234
+ } else {
235
+ //If the login attempt was made using a non-existent user then let's set user_id to blank and record the attempted user login name for DB storage later on
236
+ $user_id = 0;
237
+ }
238
+ $ip_range_str = esc_sql($ip_range).'.*';
239
+
240
+ $lock_time = current_time( 'mysql' );
241
+ $lock_minutes = $lockout_time_length;
242
+ $newtimestamp = strtotime($lock_time.' + '.$lock_minutes.' minute');
243
+ $release_time = date('Y-m-d H:i:s', $newtimestamp);
244
+ $data = array('user_id' => $user_id, 'user_login' => $username, 'lockdown_date' => $lock_time, 'release_date' => $release_time, 'failed_login_IP' => $ip, 'lock_reason' => $lock_reason);
245
+ $format = array('%d', '%s', '%s', '%s', '%s', '%s');
246
+ $result = $wpdb->insert($login_lockdown_table, $data, $format);
247
+
248
+ if ($result === FALSE)
249
+ {
250
+ $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_lockdown_table,4);//Log the highly unlikely event of DB error
251
+ }
252
+ else
253
+ {
254
+ do_action('aiowps_lockdown_event', $ip_range, $username);
255
+ $this->send_ip_lock_notification_email($username, $ip_range, $ip);
256
+ $aio_wp_security->debug_logger->log_debug("The following IP address range has been locked out for exceeding the maximum login attempts: ".$ip_range,2);//Log the lockdown event
257
+ }
258
+ }
259
+ /**
260
+ * Adds an entry to the `aiowps_failed_logins` table.
261
+ * @param string $username User's username or email
262
+ */
263
+ function increment_failed_logins($username)
264
+ {
265
+ global $wpdb, $aio_wp_security;
266
+ $login_fails_table = AIOWPSEC_TBL_FAILED_LOGINS;
267
+ $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user
268
+ if(empty($ip)) return;
269
+ $user = is_email($username) ? get_user_by('email', $username) : get_user_by('login', $username); //Returns WP_User object if it exists
270
+ if ($user)
271
+ {
272
+ //If the login attempt was made using a valid user set variables for DB storage later on
273
+ $user_id = $user->ID;
274
+ } else {
275
+ //If the login attempt was made using a non-existent user then let's set user_id to blank and record the attempted user login name for DB storage later on
276
+ $user_id = 0;
277
+ }
278
+ $ip_str = esc_sql($ip);
279
+ $now = current_time( 'mysql' );
280
+ $data = array('user_id' => $user_id, 'user_login' => $username, 'failed_login_date' => $now, 'login_attempt_ip' => $ip_str);
281
+ $format = array('%d', '%s', '%s', '%s');
282
+ $result = $wpdb->insert($login_fails_table, $data, $format);
283
+ if ($result === FALSE)
284
+ {
285
+ $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_fails_table,4);//Log the highly unlikely event of DB error
286
+ }
287
+ }
288
+ /**
289
+ * @param string $username User's username or email
290
+ */
291
+ function send_ip_lock_notification_email($username, $ip_range, $ip)
292
+ {
293
+ global $aio_wp_security;
294
+ $email_notification_enabled = $aio_wp_security->configs->get_value('aiowps_enable_email_notify');
295
+ if ($email_notification_enabled == 1)
296
+ {
297
+ $to_email_address = $aio_wp_security->configs->get_value('aiowps_email_address');
298
+ $subject = '['.get_option('home').'] '. __('Site Lockout Notification','all-in-one-wp-security-and-firewall');
299
+ $email_msg = __('A lockdown event has occurred due to too many failed login attempts or invalid username:','all-in-one-wp-security-and-firewall')."\n";
300
+ $email_msg .= __('Username:', 'all-in-one-wp-security-and-firewall') . ' ' . $username . "\n";
301
+ $email_msg .= __('IP Address:', 'all-in-one-wp-security-and-firewall') . ' ' . $ip . "\n\n";
302
+ $email_msg .= __('IP Range:', 'all-in-one-wp-security-and-firewall') . ' ' . $ip_range . '.*' . "\n\n";
303
+ $email_msg .= __("Log into your site's WordPress administration panel to see the duration of the lockout or to unlock the user.",'all-in-one-wp-security-and-firewall') . "\n";
304
+ $site_title = get_bloginfo( 'name' );
305
+ $from_name = empty($site_title)?'WordPress':$site_title;
306
+ $email_header = 'From: '.$from_name.' <'.get_bloginfo('admin_email').'>' . "\r\n\\";
307
+ $sendMail = wp_mail($to_email_address, $subject, $email_msg, $email_header);
308
+ if(FALSE === $sendMail){
309
+ $aio_wp_security->debug_logger->log_debug("Lockout notification email failed to send to ".$to_email_address." for IP ".$ip,4);
310
+ }
311
+ }
312
+ }
313
+
314
+ /**
315
+ * Generates and returns an unlock request link which will be used to send to the user.
316
+ *
317
+ * @global type $wpdb
318
+ * @global AIO_WP_Security $aio_wp_security
319
+ * @param type $ip_range
320
+ * @return string or FALSE on failure
321
+ */
322
+ static function generate_unlock_request_link($ip_range)
323
+ {
324
+ //Get the locked user row from lockdown table
325
+ global $wpdb, $aio_wp_security;
326
+ $unlock_link = '';
327
+ $lockdown_table_name = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
328
+ $secret_rand_key = (md5(uniqid(rand(), true)));
329
+ $sql = $wpdb->prepare("UPDATE $lockdown_table_name SET unlock_key = '$secret_rand_key' WHERE release_date > now() AND failed_login_ip LIKE %s","%".esc_sql($ip_range)."%");
330
+ $res = $wpdb->query($sql);
331
+ if($res == NULL){
332
+ $aio_wp_security->debug_logger->log_debug("No locked user found with IP range ".$ip_range,4);
333
+ return false;
334
+ }else{
335
+ //Check if unlock requestor submitted from a woocommerce account login page
336
+ if(isset($_POST['aiowps-woo-login'])){
337
+ $date_time = current_time( 'mysql' );
338
+ $data = array('date_time' => $date_time, 'meta_key1' => 'woo_unlock_request_key', 'meta_value1' => $secret_rand_key);
339
+ $result = $wpdb->insert(AIOWPSEC_TBL_GLOBAL_META_DATA, $data);
340
+ if ($result === false){
341
+ $aio_wp_security->debug_logger->log_debug("generate_unlock_request_link() - Error inserting woo_unlock_request_key to AIOWPSEC_TBL_GLOBAL_META_DATA table for secret key ".$secret_rand_key,4);
342
+ }
343
+ }
344
+ $query_param = array('aiowps_auth_key'=>$secret_rand_key);
345
+ $wp_site_url = AIOWPSEC_WP_URL;
346
+ $unlock_link = esc_url(add_query_arg($query_param, $wp_site_url));
347
+ }
348
+ return $unlock_link;
349
+ }
350
+ /*
351
+ * This function will process an unlock request when someone clicks on the special URL
352
+ * It will check if the special random code matches that in lockdown table for the relevant user
353
+ * If so, it will unlock the user
354
+ */
355
+ static function process_unlock_request($unlock_key)
356
+ {
357
+ global $wpdb, $aio_wp_security;
358
+ $lockdown_table_name = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
359
+
360
+ $unlock_command = $wpdb->prepare( "UPDATE ".$lockdown_table_name." SET release_date = now() WHERE unlock_key = %s", $unlock_key );
361
+ $result = $wpdb->query($unlock_command);
362
+ if($result === false)
363
+ {
364
+ $aio_wp_security->debug_logger->log_debug("Error unlocking user with unlock_key ".$unlock_key,4);
365
+ }
366
+ else
367
+ {
368
+ //Now check if this unlock operation is for a woocommerce login
369
+ $aiowps_global_meta_tbl_name = AIOWPSEC_TBL_GLOBAL_META_DATA;
370
+ $sql = $wpdb->prepare("SELECT * FROM $aiowps_global_meta_tbl_name WHERE meta_key1=%s AND meta_value1=%s", 'woo_unlock_request_key', $unlock_key);
371
+ $woo_result = $wpdb->get_row($sql, OBJECT);
372
+ if(empty($woo_result)){
373
+ $woo_unlock = false;
374
+ }else{
375
+ $woo_unlock = true;
376
+ }
377
+ if($aio_wp_security->configs->get_value('aiowps_enable_rename_login_page')=='1'){
378
+ if (get_option('permalink_structure')){
379
+ $home_url = trailingslashit(home_url());
380
+ }else{
381
+ $home_url = trailingslashit(home_url()) . '?';
382
+ }
383
+ if ( $woo_unlock ){
384
+ $login_url = wc_get_page_permalink( 'myaccount' ); //redirect to woo login page if applicable
385
+ //Now let's cleanup after ourselves and delete the woo-related row in the AIOWPSEC_TBL_GLOBAL_META_DATA table
386
+ $delete = $wpdb->delete( $aiowps_global_meta_tbl_name, array( 'meta_key1' => 'woo_unlock_request_key', 'meta_value1' => $unlock_key ) );
387
+ if($delete === false){
388
+ $aio_wp_security->debug_logger->log_debug("process_unlock_request(): Error deleting row from AIOWPSEC_TBL_GLOBAL_META_DATA for meta_key1=woo_unlock_request_key and meta_value1=".$unlock_key,4);
389
+ }
390
+ }else{
391
+ $login_url = $home_url.$aio_wp_security->configs->get_value('aiowps_login_page_slug');
392
+ }
393
+
394
+ AIOWPSecurity_Utility::redirect_to_url($login_url);
395
+ }else{
396
+ AIOWPSecurity_Utility::redirect_to_url(wp_login_url());
397
+ }
398
+ }
399
+ }
400
+
401
+ /*
402
+ * This function sends an unlock request email to a locked out user
403
+ */
404
+ static function send_unlock_request_email($email, $unlock_link)
405
+ {
406
+ global $aio_wp_security;
407
+ $subject = '['.get_option('siteurl').'] '. __('Unlock Request Notification','all-in-one-wp-security-and-firewall');
408
+ $email_msg
409
+ = sprintf(__('You have requested for the account with email address %s to be unlocked. Please click the link below to unlock your account:','all-in-one-wp-security-and-firewall'), $email) . "\n"
410
+ . sprintf(__('Unlock link: %s', 'all-in-one-wp-security-and-firewall'), $unlock_link) . "\n\n"
411
+ . __('After clicking the above link you will be able to login to the WordPress administration panel.', 'all-in-one-wp-security-and-firewall') . "\n"
412
+ ;
413
+ $site_title = get_bloginfo( 'name' );
414
+ $from_name = empty($site_title)?'WordPress':$site_title;
415
+ $email_header = 'From: '.$from_name.' <'.get_bloginfo('admin_email').'>' . "\r\n\\";
416
+ $sendMail = wp_mail($email, $subject, $email_msg, $email_header);
417
+ if ( false === $sendMail ) {
418
+ $aio_wp_security->debug_logger->log_debug("Unlock Request Notification email failed to send to " . $email, 4);
419
+ }
420
+ }
421
+
422
+ /*
423
+ * This function will check the settings and log the user after the configured time period
424
+ */
425
+ function aiowps_force_logout_action_handler()
426
+ {
427
+ global $aio_wp_security;
428
+ //$aio_wp_security->debug_logger->log_debug("Force Logout - Checking if any user need to be logged out...");
429
+ if($aio_wp_security->configs->get_value('aiowps_enable_forced_logout')=='1') //if this feature is enabled then do something
430
+ {
431
+ if(is_user_logged_in())
432
+ {
433
+ $current_user = wp_get_current_user();
434
+ $user_id = $current_user->ID;
435
+ $current_time = current_time( 'mysql' );
436
+ $login_time = $this->get_wp_user_last_login_time($user_id);
437
+ $diff = strtotime($current_time) - strtotime($login_time);
438
+ $logout_time_interval_value = $aio_wp_security->configs->get_value('aiowps_logout_time_period');
439
+ $logout_time_interval_val_seconds = $logout_time_interval_value * 60;
440
+ if($diff > $logout_time_interval_val_seconds)
441
+ {
442
+ $aio_wp_security->debug_logger->log_debug("Force Logout - This user logged in more than (".$logout_time_interval_value.") minutes ago. Doing a force log out for the user with username: ".$current_user->user_login);
443
+ $this->wp_logout_action_handler(); //this will register the logout time/date in the logout_date column
444
+
445
+ $curr_page_url = AIOWPSecurity_Utility::get_current_page_url();
446
+ $after_logout_payload = array('redirect_to'=>$curr_page_url, 'msg'=>$this->key_login_msg.'=session_expired');
447
+ //Save some of the logout redirect data to a transient
448
+ AIOWPSecurity_Utility::is_multisite_install() ? set_site_transient('aiowps_logout_payload', $after_logout_payload, 30 * 60) : set_transient('aiowps_logout_payload', $after_logout_payload, 30 * 60);
449
+ $logout_url = AIOWPSEC_WP_URL.'?aiowpsec_do_log_out=1';
450
+ $logout_url = AIOWPSecurity_Utility::add_query_data_to_url($logout_url, 'al_additional_data', '1');
451
+ AIOWPSecurity_Utility::redirect_to_url($logout_url);
452
+ }
453
+ }
454
+ }
455
+ }
456
+
457
+ function get_wp_user_last_login_time($user_id)
458
+ {
459
+ $last_login = get_user_meta($user_id, 'last_login_time', true);
460
+ return $last_login;
461
+ }
462
+ static function wp_login_action_handler($user_login, $user='')
463
+ {
464
+ global $wpdb, $aio_wp_security;
465
+ $login_activity_table = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
466
+
467
+ if ($user == ''){
468
+ //Try and get user object
469
+ $user = get_user_by('login', $user_login); //This should return WP_User obj
470
+ if (!$user){
471
+ $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_User_Login::wp_login_action_handler: Unable to get WP_User object for login ".$user_login,4);
472
+ return;
473
+ }
474
+ }
475
+ $login_date_time = current_time( 'mysql' );
476
+ update_user_meta($user->ID, 'last_login_time', $login_date_time); //store last login time in meta table
477
+ $curr_ip_address = AIOWPSecurity_Utility_IP::get_user_ip_address();
478
+ $insert = "INSERT INTO " . $login_activity_table . " (user_id, user_login, login_date, login_ip) " .
479
+ "VALUES ('" . $user->ID . "', '" . $user_login . "', '" . $login_date_time . "', '" . $curr_ip_address . "')";
480
+ $result = $wpdb->query($insert);
481
+ if ($result === FALSE)
482
+ {
483
+ $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_activity_table,4);//Log the highly unlikely event of DB error
484
+ }
485
+
486
+ }
487
+ /**
488
+ * The handler for logout events, ie, uses the WP "clear_auth_cookies" action.
489
+
490
+ * Modifies the login activity record for the current user by registering the logout time/date in the logout_date column.
491
+ * (NOTE: Because of the way we are doing a force logout, the "clear_auth_cookies" hook does not fire.
492
+ * upon auto logout. The current workaround is to call this function directly from the aiowps_force_logout_action_handler() when
493
+ * an auto logout occurs due to the "force logout" feature).
494
+ *
495
+ */
496
+ function wp_logout_action_handler()
497
+ {
498
+ global $wpdb, $aio_wp_security;
499
+ $current_user = wp_get_current_user();
500
+ $ip_addr = AIOWPSecurity_Utility_IP::get_user_ip_address();
501
+ $user_id = $current_user->ID;
502
+ //Clean up transients table
503
+ $this->update_user_online_transient($user_id, $ip_addr);
504
+ $login_activity_table = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
505
+ $logout_date_time = current_time( 'mysql' );
506
+ $data = array('logout_date' => $logout_date_time);
507
+ $where = array('user_id' => $user_id,
508
+ 'login_ip' => $ip_addr,
509
+ 'logout_date' => '0000-00-00 00:00:00');
510
+ $result = $wpdb->update($login_activity_table, $data, $where);
511
+ if ($result === FALSE)
512
+ {
513
+ $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_activity_table,4);//Log the highly unlikely event of DB error
514
+ }
515
+ }
516
+ /**
517
+ * This will clean up the "users_online" transient entry for the current user.
518
+ *
519
+ */
520
+ function update_user_online_transient($user_id, $ip_addr)
521
+ {
522
+ global $aio_wp_security;
523
+ $logged_in_users = (AIOWPSecurity_Utility::is_multisite_install() ? get_site_transient('users_online') : get_transient('users_online'));
524
+ //$logged_in_users = get_transient('users_online');
525
+ if ($logged_in_users === false || $logged_in_users == NULL)
526
+ {
527
+ return;
528
+ }
529
+ $j = 0;
530
+ foreach ($logged_in_users as $value)
531
+ {
532
+ if ($value['user_id'] == $user_id && strcmp($value['ip_address'], $ip_addr) == 0)
533
+ {
534
+ unset($logged_in_users[$j]);
535
+ break;
536
+ }
537
+ $j++;
538
+ }
539
+ //Save the transient
540
+ AIOWPSecurity_Utility::is_multisite_install() ? set_site_transient('users_online', $logged_in_users, 30 * 60) : set_transient('users_online', $logged_in_users, 30 * 60);
541
+ //set_transient('users_online', $logged_in_users, 30 * 60); //Set transient with the data obtained above and also set the expiry to 30min
542
+ return;
543
+ }
544
+
545
+ /**
546
+ * The handler for the WP "login_message" filter
547
+ * Adds custom messages to the other messages that appear above the login form.
548
+ *
549
+ * NOTE: This method is automatically called by WordPress for displaying
550
+ * text above the login form.
551
+ *
552
+ * @param string $message the output from earlier login_message filters
553
+ * @return string
554
+ *
555
+ */
556
+ function aiowps_login_message($message = '')
557
+ {
558
+ global $aio_wp_security;
559
+ $msg = '';
560
+ if(isset($_GET[$this->key_login_msg]) && !empty($_GET[$this->key_login_msg]))
561
+ {
562
+ $logout_msg = strip_tags($_GET[$this->key_login_msg]);
563
+ }
564
+ if (!empty($logout_msg))
565
+ {
566
+ switch ($logout_msg) {
567
+ case 'session_expired':
568
+ $msg = sprintf(__('Your session has expired because it has been over %d minutes since your last login.', 'all-in-one-wp-security-and-firewall'), $aio_wp_security->configs->get_value('aiowps_logout_time_period'));
569
+ $msg .= ' ' . __('Please log back in to continue.', 'all-in-one-wp-security-and-firewall');
570
+ break;
571
+ case 'admin_user_changed':
572
+ $msg = __('You were logged out because you just changed the "admin" username.', 'all-in-one-wp-security-and-firewall');
573
+ $msg .= ' ' . __('Please log back in to continue.', 'all-in-one-wp-security-and-firewall');
574
+ break;
575
+ default:
576
+ }
577
+ }
578
+ if (!empty($msg))
579
+ {
580
+ $msg = htmlspecialchars($msg, ENT_QUOTES, 'UTF-8');
581
+ $message .= '<p class="login message">'. $msg . '</p>';
582
+ }
583
+ return $message;
584
+ }
585
+ /**
586
+ * This function will generate an unlock request form to be inserted inside
587
+ * error message when user gets locked out.
588
+ *
589
+ * @return string
590
+ */
591
+ function get_unlock_request_form()
592
+ {
593
+ global $aio_wp_security;
594
+ $unlock_request_form = '';
595
+ //Let's encode some hidden data and make a form
596
+ $unlock_secret_string = $aio_wp_security->configs->get_value('aiowps_unlock_request_secret_key');
597
+ $current_time = time();
598
+ $enc_result = base64_encode($current_time.$unlock_secret_string);
599
+ $unlock_request_form .= '<form method="post" action=""><div style="padding-bottom:10px;"><input type="hidden" name="aiowps-unlock-string-info" id="aiowps-unlock-string-info" value="'.$enc_result.'" />';
600
+ $unlock_request_form .= '<input type="hidden" name="aiowps-unlock-temp-string" id="aiowps-unlock-temp-string" value="'.$current_time.'" />';
601
+ if(isset($_POST['woocommerce-login-nonce'])){
602
+ $unlock_request_form .= '<input type="hidden" name="aiowps-woo-login" id="aiowps-woo-login" value="1" />';
603
+ }
604
+ $unlock_request_form .= '<button type="submit" name="aiowps_unlock_request" id="aiowps_unlock_request" class="button">'.__('Request Unlock', 'all-in-one-wp-security-and-firewall').'</button></div></form>';
605
+ return $unlock_request_form;
606
+ }
607
+ }
{tags/4.3.7.1/trunk/classes → classes}/wp-security-user-registration.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-utility-file.php RENAMED
File without changes
{trunk/classes → classes}/wp-security-utility-htaccess.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-utility-ip-address.php RENAMED
File without changes
{tags/4.3.7.1/trunk/classes → classes}/wp-security-utility.php RENAMED
File without changes
classes/wp-security-wp-footer-content.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(!defined('ABSPATH')){
3
+ exit;//Exit if accessed directly
4
+ }
5
+
6
+ class AIOWPSecurity_WP_Footer_Content {
7
+
8
+ function __construct() {
9
+ //Add content that need to be outputted in the footer area.
10
+
11
+ global $aio_wp_security;
12
+ if($aio_wp_security->configs->get_value('aiowps_default_recaptcha')) {
13
+ $this->print_google_recaptcha_api();
14
+ }
15
+
16
+ // Activate the copy protection feature for non-admin users
17
+ $copy_protection_active = $aio_wp_security->configs->get_value('aiowps_copy_protection') == '1';
18
+ if ( $copy_protection_active && !current_user_can(AIOWPSEC_MANAGEMENT_PERMISSION) ) {
19
+ $this->output_copy_protection_code();
20
+ }
21
+
22
+ //TODO - add other footer output content here
23
+ }
24
+
25
+ /**
26
+ * For Woocommerce my account page - display two separate Google reCaptcha forms "explicitly"
27
+ * @global type $aio_wp_security
28
+ */
29
+ function print_google_recaptcha_api() {
30
+ global $aio_wp_security;
31
+ $site_key = esc_html( $aio_wp_security->configs->get_value('aiowps_recaptcha_site_key') );
32
+ ?>
33
+ <script type="text/javascript">
34
+ var verifyCallback = function(response) {
35
+ alert(response);
36
+ };
37
+ var onloadCallback = function() {
38
+ if ( jQuery('#woo_recaptcha_1').length ) {
39
+ grecaptcha.render('woo_recaptcha_1', {
40
+ 'sitekey' : '<?php echo $site_key; ?>',
41
+ });
42
+ }
43
+ if ( jQuery('#woo_recaptcha_2').length ) {
44
+ grecaptcha.render('woo_recaptcha_2', {
45
+ 'sitekey' : '<?php echo $site_key; ?>',
46
+ });
47
+ }
48
+ };
49
+ </script>
50
+ <script src='https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit' async defer></script>
51
+ <?php
52
+ }
53
+
54
+ function output_copy_protection_code() {
55
+ ?>
56
+ <meta http-equiv="imagetoolbar" content="no"><!-- disable image toolbar (if any) -->
57
+ <script type="text/javascript">
58
+ /*<![CDATA[*/
59
+ document.oncontextmenu = function() {
60
+ return false;
61
+ };
62
+ document.onselectstart = function() {
63
+ if (event.srcElement.type != "text" && event.srcElement.type != "textarea" && event.srcElement.type != "password") {
64
+ return false;
65
+ }
66
+ else {
67
+ return true;
68
+ }
69
+ };
70
+ if (window.sidebar) {
71
+ document.onmousedown = function(e) {
72
+ var obj = e.target;
73
+ if (obj.tagName.toUpperCase() == 'SELECT'
74
+ || obj.tagName.toUpperCase() == "INPUT"
75
+ || obj.tagName.toUpperCase() == "TEXTAREA"
76
+ || obj.tagName.toUpperCase() == "PASSWORD") {
77
+ return true;
78
+ }
79
+ else {
80
+ return false;
81
+ }
82
+ };
83
+ }
84
+ document.ondragstart = function() {
85
+ return false;
86
+ };
87
+ /*]]>*/
88
+ </script>
89
+ <?php
90
+ }
91
+
92
+ }
93
+ //End of class
{tags/4.3.7.1/trunk/classes → classes}/wp-security-wp-loaded-tasks.php RENAMED
File without changes
{tags/2.0/css → css}/index.html RENAMED
File without changes
{tags/4.0.8/css → css}/wp-security-admin-styles.css RENAMED
File without changes
{tags/1.8/css → css}/wp-security-site-lockout-page.css RENAMED
File without changes
{tags/1.7/images → images}/arrow.png RENAMED
File without changes
{tags/1.0/images → images}/error.png RENAMED
File without changes
{tags/1.0/images → images}/feature-difficulty-badge-bg.png RENAMED
File without changes
{tags/1.0/images → images}/feature-points-badge-bg.png RENAMED
File without changes
{tags/1.7/images → images}/form_bg.png RENAMED
File without changes
{tags/2.0/images → images}/index.html RENAMED
File without changes
{tags/1.0/images → images}/info-icon.png RENAMED
File without changes
{tags/1.0/images → images}/loading.gif RENAMED
File without changes
{tags/1.0/images → images}/plugin-icon.png RENAMED
File without changes
{tags/1.0/images → images}/plugin-icon2.png RENAMED
File without changes
{tags/1.0/images → images}/shield-info-icon-36.png RENAMED
File without changes
{tags/1.0/images → images}/shield-security-icon-36.png RENAMED
File without changes
{tags/1.0/images → images}/success.png RENAMED
File without changes
tags/2.0/index.html → index.html RENAMED
File without changes
{tags/2.0/js → js}/index.html RENAMED
File without changes
{tags/3.7.5/js → js}/masonry.pkgd.min.js RENAMED
File without changes
{tags/1.7/js → js}/password-strength-tool.js RENAMED
File without changes
{tags/4.1.0/js → js}/wp-security-admin-script.js RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-de_DE.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-de_DE.po RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-es_ES.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-es_ES.po RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-fa_IR.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-fa_IR.po RENAMED
File without changes
{tags/4.1.0/languages → languages}/all-in-one-wp-security-and-firewall-fr_FR.mo RENAMED
File without changes
{tags/4.1.4/languages → languages}/all-in-one-wp-security-and-firewall-fr_FR.po RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-hu_HU.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-hu_HU.po RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-it_IT.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-it_IT.po RENAMED
File without changes
languages/all-in-one-wp-security-and-firewall-nl_NL.mo ADDED
Binary file
languages/all-in-one-wp-security-and-firewall-nl_NL.po ADDED
@@ -0,0 +1,4786 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: All In One WP Security vv3.7.2\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: \n"
6
+ "PO-Revision-Date: 2018-12-16 16:01+0100\n"
7
+ "Last-Translator: CBO\n"
8
+ "Language-Team: \n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
13
+ "X-Generator: Poedit 2.2\n"
14
+ "X-Poedit-SourceCharset: utf-8\n"
15
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
16
+ "X-Poedit-Basepath: ..\n"
17
+ "X-Textdomain-Support: yes\n"
18
+ "Language: nl_NL\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+
21
+ # @ default
22
+ #: admin/general/wp-security-list-table.php:178
23
+ msgid "No items found."
24
+ msgstr "Geen items gevonden."
25
+
26
+ # @ default
27
+ #: admin/general/wp-security-list-table.php:281
28
+ msgid "Bulk Actions"
29
+ msgstr "Bulkacties"
30
+
31
+ # @ default
32
+ #: admin/general/wp-security-list-table.php:291
33
+ msgid "Apply"
34
+ msgstr "Toepassen"
35
+
36
+ # @ default
37
+ #: admin/general/wp-security-list-table.php:365
38
+ msgid "Show all dates"
39
+ msgstr "Toon alle data"
40
+
41
+ # @ default
42
+ #. translators: 1: month name, 2: 4-digit year
43
+ #: admin/general/wp-security-list-table.php:378
44
+ #, php-format
45
+ msgid "%1$s %2$d"
46
+ msgstr "%1$s %2$d"
47
+
48
+ # @ default
49
+ #: admin/general/wp-security-list-table.php:394
50
+ msgid "List View"
51
+ msgstr "Lijst weergave"
52
+
53
+ # @ default
54
+ #: admin/general/wp-security-list-table.php:395
55
+ msgid "Excerpt View"
56
+ msgstr "Uittreksel weergave"
57
+
58
+ # @ default
59
+ #: admin/general/wp-security-list-table.php:421
60
+ #, php-format
61
+ msgid "%s pending"
62
+ msgstr "%s in afwachting"
63
+
64
+ # @ default
65
+ #: admin/general/wp-security-list-table.php:477
66
+ #: admin/general/wp-security-list-table.php:881
67
+ #, php-format
68
+ msgid "1 item"
69
+ msgid_plural "%s items"
70
+ msgstr[0] "1 item"
71
+ msgstr[1] "%s items"
72
+
73
+ # @ default
74
+ #: admin/general/wp-security-list-table.php:495
75
+ msgid "Go to the first page"
76
+ msgstr "Ga naar de eerste pagina"
77
+
78
+ # @ default
79
+ #: admin/general/wp-security-list-table.php:502
80
+ msgid "Go to the previous page"
81
+ msgstr "Ga naar de vorige pagina"
82
+
83
+ # @ default
84
+ #: admin/general/wp-security-list-table.php:511
85
+ msgid "Current page"
86
+ msgstr "Huidige pagina"
87
+
88
+ # @ default
89
+ #: admin/general/wp-security-list-table.php:517
90
+ #, php-format
91
+ msgctxt "paging"
92
+ msgid "%1$s of %2$s"
93
+ msgstr "%1$s of %2$s"
94
+
95
+ # @ default
96
+ #: admin/general/wp-security-list-table.php:521
97
+ msgid "Go to the next page"
98
+ msgstr "Ga naar de volgende pagina"
99
+
100
+ # @ default
101
+ #: admin/general/wp-security-list-table.php:528
102
+ msgid "Go to the last page"
103
+ msgstr "Ga naar de laatste pagina"
104
+
105
+ # @ default
106
+ #: admin/general/wp-security-list-table.php:653
107
+ msgid "Select All"
108
+ msgstr "Alles selecteren"
109
+
110
+ # @ all-in-one-wp-security-and-firewall
111
+ #: admin/wp-security-admin-init.php:157
112
+ msgid "WP Security"
113
+ msgstr "WP beveiliging"
114
+
115
+ # @ all-in-one-wp-security-and-firewall
116
+ #: admin/wp-security-admin-init.php:158 admin/wp-security-dashboard-menu.php:23
117
+ msgid "Dashboard"
118
+ msgstr "Dashboard"
119
+
120
+ # @ all-in-one-wp-security-and-firewall
121
+ #: admin/wp-security-admin-init.php:159
122
+ msgid "Settings"
123
+ msgstr "Instellingen"
124
+
125
+ # @ all-in-one-wp-security-and-firewall
126
+ #: admin/wp-security-admin-init.php:160
127
+ msgid "User Accounts"
128
+ msgstr "Gebruiker account"
129
+
130
+ # @ all-in-one-wp-security-and-firewall
131
+ #: admin/wp-security-admin-init.php:161
132
+ msgid "User Login"
133
+ msgstr "Gebruiker login"
134
+
135
+ # @ all-in-one-wp-security-and-firewall
136
+ #: admin/wp-security-admin-init.php:162
137
+ msgid "User Registration"
138
+ msgstr "Gebruiker registratie"
139
+
140
+ # @ all-in-one-wp-security-and-firewall
141
+ #: admin/wp-security-admin-init.php:163
142
+ msgid "Database Security"
143
+ msgstr "Database beveiliging"
144
+
145
+ # @ all-in-one-wp-security-and-firewall
146
+ #: admin/wp-security-admin-init.php:167
147
+ msgid "Filesystem Security"
148
+ msgstr "Bestanden beveiliging"
149
+
150
+ # @ all-in-one-wp-security-and-firewall
151
+ #: admin/wp-security-admin-init.php:169
152
+ msgid "WHOIS Lookup"
153
+ msgstr "WHOIS opzoeken"
154
+
155
+ # @ all-in-one-wp-security-and-firewall
156
+ #: admin/wp-security-admin-init.php:173
157
+ msgid "Blacklist Manager"
158
+ msgstr "Blacklist manager"
159
+
160
+ # @ all-in-one-wp-security-and-firewall
161
+ #: admin/wp-security-admin-init.php:178
162
+ msgid "Firewall"
163
+ msgstr "Firewall"
164
+
165
+ # @ all-in-one-wp-security-and-firewall
166
+ #: admin/wp-security-admin-init.php:183
167
+ msgid "Brute Force"
168
+ msgstr "Brute force"
169
+
170
+ # @ all-in-one-wp-security-and-firewall
171
+ #: admin/wp-security-admin-init.php:185
172
+ msgid "SPAM Prevention"
173
+ msgstr "Anti-spam"
174
+
175
+ # @ all-in-one-wp-security-and-firewall
176
+ #: admin/wp-security-admin-init.php:189
177
+ msgid "Scanner"
178
+ msgstr "Scanner"
179
+
180
+ # @ all-in-one-wp-security-and-firewall
181
+ #: admin/wp-security-admin-init.php:191
182
+ msgid "Maintenance"
183
+ msgstr "Onderhoud"
184
+
185
+ # @ all-in-one-wp-security-and-firewall
186
+ #: admin/wp-security-admin-init.php:322
187
+ msgid "Miscellaneous"
188
+ msgstr "Diversen"
189
+
190
+ # @ all-in-one-wp-security-and-firewall
191
+ #: admin/wp-security-admin-menu.php:43
192
+ msgid "Settings successfully updated."
193
+ msgstr "Instellingen succesvol bijgewerkt."
194
+
195
+ # @ all-in-one-wp-security-and-firewall
196
+ #: admin/wp-security-admin-menu.php:50
197
+ msgid "The selected record(s) deleted successfully!"
198
+ msgstr "De geselecteerde record (s) met succes verwijderd!"
199
+
200
+ # @ all-in-one-wp-security-and-firewall
201
+ #: admin/wp-security-blacklist-menu.php:22
202
+ msgid "Ban Users"
203
+ msgstr "Blokkeer gebruikers"
204
+
205
+ # @ all-in-one-wp-security-and-firewall
206
+ #: admin/wp-security-blacklist-menu.php:80
207
+ msgid "Nonce check failed for save blacklist settings!"
208
+ msgstr "Nonce controle mislukt voor het opslaan van blacklist-instellingen!"
209
+
210
+ # @ all-in-one-wp-security-and-firewall
211
+ #: admin/wp-security-blacklist-menu.php:132
212
+ #: admin/wp-security-brute-force-menu.php:608
213
+ #: admin/wp-security-list-comment-spammer-ip.php:147
214
+ msgid "The plugin was unable to write to the .htaccess file. Please edit file manually."
215
+ msgstr "De plug-in kon niet naar het .htaccess-bestand schrijven. Bewerk het bestand aub handmatig."
216
+
217
+ # @ all-in-one-wp-security-and-firewall
218
+ #: admin/wp-security-blacklist-menu.php:139
219
+ msgid "Ban IPs or User Agents"
220
+ msgstr "IP's of gebruikersagenten blokkeren"
221
+
222
+ # @ all-in-one-wp-security-and-firewall
223
+ #: admin/wp-security-blacklist-menu.php:142
224
+ msgid "The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents."
225
+ msgstr "De All In One WP Security Blacklist-functie biedt u de mogelijkheid bepaalde host-IP-adressen of bereiken en ook user-agents te blokkeren."
226
+
227
+ # @ all-in-one-wp-security-and-firewall
228
+ #: admin/wp-security-blacklist-menu.php:143
229
+ msgid "This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below."
230
+ msgstr "Met deze functie wordt de volledige sitetoegang voor gebruikers met IP-adressen of gebruikersagenten uitgesloten die overeenkomen met de gebruikers die u hebt geconfigureerd in de onderstaande instellingen."
231
+
232
+ # @ all-in-one-wp-security-and-firewall
233
+ #: admin/wp-security-blacklist-menu.php:144
234
+ msgid "The plugin achieves this by making appropriate modifications to your .htaccess file."
235
+ msgstr "De plug-in doet dit door de juiste wijzigingen aan te brengen in uw .htaccess-bestand."
236
+
237
+ # @ all-in-one-wp-security-and-firewall
238
+ #: admin/wp-security-blacklist-menu.php:145
239
+ msgid "By blocking people via the .htaccess file your are using the most secure first line of defence which denies all access to blacklisted visitors as soon as they hit your hosting server."
240
+ msgstr "Door mensen te blokkeren via het .htaccess-bestand, gebruikt u de veiligste eerste verdedigingslinie die alle toegang tot op de zwarte lijst geplaatste bezoekers tegenhout zodra ze uw hostingserver bezoeken."
241
+
242
+ # @ all-in-one-wp-security-and-firewall
243
+ #: admin/wp-security-blacklist-menu.php:151
244
+ msgid "IP Hosts and User Agent Blacklist Settings"
245
+ msgstr "IP-hosts en User Agent Blacklist-instellingen"
246
+
247
+ # @ all-in-one-wp-security-and-firewall
248
+ #: admin/wp-security-blacklist-menu.php:162
249
+ msgid "Enable IP or User Agent Blacklisting"
250
+ msgstr "Schakel Blacklisting voor IP of User Agent in"
251
+
252
+ # @ all-in-one-wp-security-and-firewall
253
+ #: admin/wp-security-blacklist-menu.php:165
254
+ msgid "Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below"
255
+ msgstr "Schakel dit selectievakje in als u de blokkering (of blacklisting) van geselecteerde IP-adressen en / of user-agents wilt inschakelen die zijn opgegeven in de onderstaande instellingen"
256
+
257
+ # @ all-in-one-wp-security-and-firewall
258
+ #: admin/wp-security-blacklist-menu.php:169
259
+ msgid "Enter IP Addresses:"
260
+ msgstr "Voer IP-adressen in:"
261
+
262
+ # @ all-in-one-wp-security-and-firewall
263
+ #: admin/wp-security-blacklist-menu.php:173
264
+ msgid "Enter one or more IP addresses or IP ranges."
265
+ msgstr "Voer een of meer IP-adressen of IP-bereiken in."
266
+
267
+ # @ all-in-one-wp-security-and-firewall
268
+ #: admin/wp-security-blacklist-menu.php:174
269
+ #: admin/wp-security-blacklist-menu.php:194
270
+ #: admin/wp-security-brute-force-menu.php:343
271
+ #: admin/wp-security-brute-force-menu.php:377
272
+ #: admin/wp-security-brute-force-menu.php:400
273
+ #: admin/wp-security-brute-force-menu.php:421
274
+ #: admin/wp-security-brute-force-menu.php:664
275
+ #: admin/wp-security-filescan-menu.php:291
276
+ #: admin/wp-security-filescan-menu.php:308
277
+ #: admin/wp-security-firewall-menu.php:165
278
+ #: admin/wp-security-firewall-menu.php:195
279
+ #: admin/wp-security-firewall-menu.php:326
280
+ #: admin/wp-security-firewall-menu.php:356
281
+ #: admin/wp-security-firewall-menu.php:387
282
+ #: admin/wp-security-firewall-menu.php:415
283
+ #: admin/wp-security-firewall-menu.php:444
284
+ #: admin/wp-security-firewall-menu.php:532
285
+ #: admin/wp-security-firewall-menu.php:622
286
+ #: admin/wp-security-firewall-menu.php:824
287
+ #: admin/wp-security-firewall-menu.php:847 admin/wp-security-spam-menu.php:174
288
+ #: admin/wp-security-spam-menu.php:259
289
+ msgid "More Info"
290
+ msgstr "Meer informatie"
291
+
292
+ # @ all-in-one-wp-security-and-firewall
293
+ #: admin/wp-security-blacklist-menu.php:177
294
+ #: admin/wp-security-brute-force-menu.php:667
295
+ msgid "Each IP address must be on a new line."
296
+ msgstr "Elk IP-adres moet op een nieuwe regel staan."
297
+
298
+ # @ all-in-one-wp-security-and-firewall
299
+ #: admin/wp-security-blacklist-menu.php:178
300
+ #: admin/wp-security-brute-force-menu.php:668
301
+ msgid "To specify an IP range use a wildcard \"*\" character. Acceptable ways to use wildcards is shown in the examples below:"
302
+ msgstr "Gebruik een jokerteken \"*\" om een IP-bereik op te geven. Aanvaardbare manieren om jokertekens te gebruiken, worden weergegeven in de onderstaande voorbeelden:"
303
+
304
+ # @ all-in-one-wp-security-and-firewall
305
+ #: admin/wp-security-blacklist-menu.php:179
306
+ #: admin/wp-security-brute-force-menu.php:669
307
+ msgid "Example 1: 195.47.89.*"
308
+ msgstr "Voorbeeld 1: 195.47.89. *"
309
+
310
+ # @ all-in-one-wp-security-and-firewall
311
+ #: admin/wp-security-blacklist-menu.php:180
312
+ #: admin/wp-security-brute-force-menu.php:670
313
+ msgid "Example 2: 195.47.*.*"
314
+ msgstr "Example 2: 195.47.*.*"
315
+
316
+ # @ all-in-one-wp-security-and-firewall
317
+ #: admin/wp-security-blacklist-menu.php:181
318
+ #: admin/wp-security-brute-force-menu.php:671
319
+ msgid "Example 3: 195.*.*.*"
320
+ msgstr "Voorbeeld 3: 195. *. *. *"
321
+
322
+ # @ all-in-one-wp-security-and-firewall
323
+ #: admin/wp-security-blacklist-menu.php:188
324
+ msgid "Enter User Agents:"
325
+ msgstr "Voer gebruikers in:"
326
+
327
+ # @ all-in-one-wp-security-and-firewall
328
+ #: admin/wp-security-blacklist-menu.php:193
329
+ msgid "Enter one or more user agent strings."
330
+ msgstr "Voer een of meer gebruikers gegevens in."
331
+
332
+ # @ all-in-one-wp-security-and-firewall
333
+ #: admin/wp-security-blacklist-menu.php:197
334
+ msgid "Each user agent string must be on a new line."
335
+ msgstr "Elke gebruikers gegeven moet zich op een nieuwe regel bevinden."
336
+
337
+ # @ all-in-one-wp-security-and-firewall
338
+ #: admin/wp-security-blacklist-menu.php:198
339
+ msgid "Example 1 - A single user agent string to block:"
340
+ msgstr "Voorbeeld 1 - Van enkele gebruiker gegevens om te blokkeren:"
341
+
342
+ # @ all-in-one-wp-security-and-firewall
343
+ #: admin/wp-security-blacklist-menu.php:200
344
+ msgid "Example 2 - A list of more than 1 user agent strings to block"
345
+ msgstr "Voorbeeld 2 - Een lijst met meer dan 1 gebruiker gegevens die moet worden geblokkeerd"
346
+
347
+ # @ all-in-one-wp-security-and-firewall
348
+ #: admin/wp-security-blacklist-menu.php:208
349
+ #: admin/wp-security-brute-force-menu.php:188
350
+ #: admin/wp-security-brute-force-menu.php:544
351
+ #: admin/wp-security-brute-force-menu.php:678
352
+ #: admin/wp-security-database-menu.php:356
353
+ #: admin/wp-security-filescan-menu.php:329
354
+ #: admin/wp-security-filesystem-menu.php:231
355
+ #: admin/wp-security-firewall-menu.php:700
356
+ #: admin/wp-security-firewall-menu.php:866
357
+ #: admin/wp-security-settings-menu.php:493 admin/wp-security-spam-menu.php:189
358
+ #: admin/wp-security-user-login-menu.php:239
359
+ #: admin/wp-security-user-login-menu.php:407
360
+ #: admin/wp-security-user-registration-menu.php:146
361
+ #: admin/wp-security-user-registration-menu.php:221
362
+ msgid "Save Settings"
363
+ msgstr "Instellingen opslaan"
364
+
365
+ # @ all-in-one-wp-security-and-firewall
366
+ #: admin/wp-security-brute-force-menu.php:25
367
+ #: admin/wp-security-dashboard-menu.php:344
368
+ #: admin/wp-security-dashboard-menu.php:353
369
+ msgid "Rename Login Page"
370
+ msgstr "Wijzig de inlogpagina"
371
+
372
+ # @ all-in-one-wp-security-and-firewall
373
+ #: admin/wp-security-brute-force-menu.php:26
374
+ msgid "Cookie Based Brute Force Prevention"
375
+ msgstr "Op cookies gebaseerde bruut geweldpreventie"
376
+
377
+ # @ all-in-one-wp-security-and-firewall
378
+ #: admin/wp-security-brute-force-menu.php:27
379
+ #: classes/grade-system/wp-security-feature-item-manager.php:44
380
+ msgid "Login Captcha"
381
+ msgstr "Login Captcha"
382
+
383
+ # @ all-in-one-wp-security-and-firewall
384
+ #: admin/wp-security-brute-force-menu.php:28
385
+ #: admin/wp-security-brute-force-menu.php:615
386
+ msgid "Login Whitelist"
387
+ msgstr "Login niet geblokkeerde lijst"
388
+
389
+ # @ all-in-one-wp-security-and-firewall
390
+ #: admin/wp-security-brute-force-menu.php:99
391
+ msgid "Please enter a value for your login page slug."
392
+ msgstr "Voer een waarde in voor uw inlogpagina."
393
+
394
+ # @ all-in-one-wp-security-and-firewall
395
+ #: admin/wp-security-brute-force-menu.php:103
396
+ msgid "You cannot use the value \"wp-admin\" for your login page slug."
397
+ msgstr "U kunt de waarde \"wp-admin\" niet gebruiken voor uw inlogpagina."
398
+
399
+ # @ all-in-one-wp-security-and-firewall
400
+ #: admin/wp-security-brute-force-menu.php:108
401
+ #: admin/wp-security-database-menu.php:271
402
+ #: admin/wp-security-filescan-menu.php:169
403
+ #: admin/wp-security-firewall-menu.php:769 admin/wp-security-spam-menu.php:219
404
+ #: admin/wp-security-user-login-menu.php:123
405
+ #: admin/wp-security-user-login-menu.php:360
406
+ msgid "Attention!"
407
+ msgstr "Aandacht!"
408
+
409
+ # @ all-in-one-wp-security-and-firewall
410
+ #: admin/wp-security-brute-force-menu.php:127
411
+ msgid "Could not delete the Cookie-based directives from the .htaccess file. Please check the file permissions."
412
+ msgstr "Kon de op Cookie gebaseerde richtlijnen niet verwijderen uit het .htaccess-bestand. Controleer de bestandsrechten."
413
+
414
+ # @ all-in-one-wp-security-and-firewall
415
+ #: admin/wp-security-brute-force-menu.php:137
416
+ msgid "An effective Brute Force prevention technique is to change the default WordPress login page URL."
417
+ msgstr "Een effectieve brute force-preventietechniek is het wijzigen van de standaard WordPress-URL van de inlogpagina."
418
+
419
+ # @ all-in-one-wp-security-and-firewall
420
+ #: admin/wp-security-brute-force-menu.php:138
421
+ msgid "Normally if you wanted to login to WordPress you would type your site's home URL followed by wp-login.php."
422
+ msgstr "Normaal gesproken zou u, als u inlogde bij WordPress, de URL van uw site typen gevolgd door wp-login.php."
423
+
424
+ # @ all-in-one-wp-security-and-firewall
425
+ #: admin/wp-security-brute-force-menu.php:139
426
+ msgid "This feature allows you to change the login URL by setting your own slug and renaming the last portion of the login URL which contains the <strong>wp-login.php</strong> to any string that you like."
427
+ msgstr "Met deze functie kunt u de aanmeldings-URL wijzigen door uw eigen slug in te stellen en het laatste gedeelte van de aanmeldings-URL die de <strong> wp-login.php </ strong> bevat naar elke gewenste tekenreeks te hernoemen."
428
+
429
+ # @ all-in-one-wp-security-and-firewall
430
+ #: admin/wp-security-brute-force-menu.php:140
431
+ msgid "By doing this, malicious bots and hackers will not be able to access your login page because they will not know the correct login page URL."
432
+ msgstr "Door dit te doen, hebben kwaadwillende bots en hackers geen toegang tot uw inlogpagina omdat ze niet de juiste inlogpagina-URL weten."
433
+
434
+ # @ all-in-one-wp-security-and-firewall
435
+ #: admin/wp-security-brute-force-menu.php:142
436
+ msgid "You may also be interested in the following alternative brute force prevention features:"
437
+ msgstr "Mogelijk bent u ook geïnteresseerd in de volgende alternatieve brute force-preventiefuncties:"
438
+
439
+ # @ all-in-one-wp-security-and-firewall
440
+ #: admin/wp-security-brute-force-menu.php:153
441
+ msgid "Your WordPress login page URL has been renamed."
442
+ msgstr "Uw WordPress-URL van de inlogpagina is hernoemd."
443
+
444
+ # @ all-in-one-wp-security-and-firewall
445
+ #: admin/wp-security-brute-force-menu.php:154
446
+ msgid "Your current login URL is:"
447
+ msgstr "Uw huidige inlog-URL is:"
448
+
449
+ # @ all-in-one-wp-security-and-firewall
450
+ #: admin/wp-security-brute-force-menu.php:156
451
+ msgid "NOTE: If you already had the Cookie-Based Brute Force Prevention feature active, the plugin has automatically deactivated it because only one of these features can be active at any one time."
452
+ msgstr "OPMERKING: als u de functie Cookie-gebaseerde brute forcepreventie al had geactiveerd, heeft de plug-in deze automatisch gedeactiveerd omdat slechts een van deze functies op elk willekeurig moment actief kan zijn."
453
+
454
+ # @ all-in-one-wp-security-and-firewall
455
+ #: admin/wp-security-brute-force-menu.php:163
456
+ msgid "Rename Login Page Settings"
457
+ msgstr "Wijzig de instellingen van de aanmeldingspagina"
458
+
459
+ # @ all-in-one-wp-security-and-firewall
460
+ #: admin/wp-security-brute-force-menu.php:175
461
+ msgid "Enable Rename Login Page Feature"
462
+ msgstr "Schakel de functie hernoemen inlogpagina in"
463
+
464
+ # @ all-in-one-wp-security-and-firewall
465
+ #: admin/wp-security-brute-force-menu.php:178
466
+ msgid "Check this if you want to enable the rename login page feature"
467
+ msgstr "Selecteer dit als u de functie voor het wijzigen van de inlogpagina wilt inschakelen"
468
+
469
+ # @ all-in-one-wp-security-and-firewall
470
+ #: admin/wp-security-brute-force-menu.php:182
471
+ msgid "Login Page URL"
472
+ msgstr "URL van aanmeldingspagina"
473
+
474
+ # @ all-in-one-wp-security-and-firewall
475
+ #: admin/wp-security-brute-force-menu.php:184
476
+ msgid "Enter a string which will represent your secure login page slug. You are enouraged to choose something which is hard to guess and only you will remember."
477
+ msgstr "Voer een tekenreeks in die uw beveiligde inlogpagina-slug vertegenwoordigt. Je wordt aangemoedigd om iets te kiezen dat moeilijk te raden is en dat alleen jij zult onthouden."
478
+
479
+ # @ all-in-one-wp-security-and-firewall
480
+ #: admin/wp-security-brute-force-menu.php:217
481
+ msgid "Settings have not been saved - your secret word must consist only of alphanumeric characters, ie, letters and/or numbers only!"
482
+ msgstr "Instellingen zijn niet opgeslagen - uw geheime woord mag alleen bestaan uit alfanumerieke tekens, dat wil zeggen alleen letters en / of cijfers!"
483
+
484
+ # @ all-in-one-wp-security-and-firewall
485
+ #: admin/wp-security-brute-force-menu.php:236
486
+ msgid "You have successfully enabled the cookie based brute force prevention feature"
487
+ msgstr "U hebt de op cookies gebaseerde brute force-preventiefunctie geactiveerd"
488
+
489
+ # @ all-in-one-wp-security-and-firewall
490
+ #: admin/wp-security-brute-force-menu.php:237
491
+ msgid "From now on you will need to log into your WP Admin using the following URL:"
492
+ msgstr "Vanaf nu moet u inloggen op uw WP-beheerder met behulp van de volgende URL:"
493
+
494
+ # @ all-in-one-wp-security-and-firewall
495
+ #: admin/wp-security-brute-force-menu.php:239
496
+ msgid "It is important that you save this URL value somewhere in case you forget it, OR,"
497
+ msgstr "Het is belangrijk dat u deze URL-waarde ergens opslaat voor het geval u het vergeet, OF,"
498
+
499
+ # @ all-in-one-wp-security-and-firewall
500
+ #: admin/wp-security-brute-force-menu.php:240
501
+ #, php-format
502
+ msgid "simply remember to add a \"?%s=1\" to your current site URL address."
503
+ msgstr "vergeet niet om een \"?% s = 1\" toe te voegen aan uw huidige site-URL-adres."
504
+
505
+ # @ all-in-one-wp-security-and-firewall
506
+ #: admin/wp-security-brute-force-menu.php:246
507
+ msgid "You have successfully saved cookie based brute force prevention feature settings."
508
+ msgstr "Je hebt met succes instellingen voor brute forcepreventie op basis van cookies opgeslagen."
509
+
510
+ # @ all-in-one-wp-security-and-firewall
511
+ #: admin/wp-security-brute-force-menu.php:281
512
+ #: admin/wp-security-filesystem-menu.php:275
513
+ #: admin/wp-security-firewall-menu.php:119
514
+ #: admin/wp-security-firewall-menu.php:287
515
+ #: admin/wp-security-firewall-menu.php:498
516
+ #: admin/wp-security-firewall-menu.php:667 admin/wp-security-spam-menu.php:106
517
+ msgid "Could not write to the .htaccess file. Please check the file permissions."
518
+ msgstr "Kon het .htaccess-bestand niet schrijven. Controleer de bestandsrechten."
519
+
520
+ # @ all-in-one-wp-security-and-firewall
521
+ #: admin/wp-security-brute-force-menu.php:291
522
+ msgid "Brute Force Prevention Firewall Settings"
523
+ msgstr "Brute Kracht Preventie Firewall-instellingen"
524
+
525
+ # @ all-in-one-wp-security-and-firewall
526
+ #: admin/wp-security-brute-force-menu.php:296
527
+ msgid "A Brute Force Attack is when a hacker tries many combinations of usernames and passwords until they succeed in guessing the right combination."
528
+ msgstr "Een Brute force aanval is wanneer een hacker vele combinaties van gebruikersnamen en wachtwoorden probeert totdat hij erin slaagt de juiste combinatie te raden."
529
+
530
+ # @ all-in-one-wp-security-and-firewall
531
+ #: admin/wp-security-brute-force-menu.php:297
532
+ msgid "Due to the fact that at any one time there may be many concurrent login attempts occurring on your site via malicious automated robots, this also has a negative impact on your server's memory and performance."
533
+ msgstr "Vanwege het feit dat er op enig moment meerdere gelijktijdige inlogpogingen kunnen plaatsvinden op uw site via kwaadwillende geautomatiseerde robots, heeft dit ook een negatieve invloed op het geheugen en de prestaties van uw server."
534
+
535
+ # @ all-in-one-wp-security-and-firewall
536
+ #: admin/wp-security-brute-force-menu.php:298
537
+ msgid "The features in this tab will stop the majority of Brute Force Login Attacks at the .htaccess level thus providing even better protection for your WP login page and also reducing the load on your server because the system does not have to run PHP code to process the login attempts."
538
+ msgstr "De functies op dit tabblad zullen het grootste deel van Brute force Login aanval op het. Htaccess-niveau stoppen en bieden zo een nog betere bescherming voor uw WP-inlogpagina en verminderen ook de belasting van uw server omdat het systeem geen PHP-code hoeft te draaien om de inlogpogingen."
539
+
540
+ # @ all-in-one-wp-security-and-firewall
541
+ #: admin/wp-security-brute-force-menu.php:305
542
+ #, php-format
543
+ msgid "Even though this feature should not have any impact on your site's general functionality <strong>you are strongly encouraged to take a %s of your .htaccess file before proceeding</strong>."
544
+ msgstr "Hoewel deze functie geen invloed zou moeten hebben op de algemene functionaliteit van uw site <strong> wordt u sterk aangeraden om een %s van uw .htaccess-bestand te nemen voordat u verdergaat </ strong>."
545
+
546
+ # @ all-in-one-wp-security-and-firewall
547
+ #: admin/wp-security-brute-force-menu.php:306
548
+ msgid "If this feature is not used correctly, you can get locked out of your site. A backed up .htaccess file will come in handy if that happens."
549
+ msgstr "Als deze functie niet correct wordt gebruikt, kunt u worden buitengesloten van uw site. Een back-up van een .htaccess-bestand is handig als dat gebeurt."
550
+
551
+ # @ all-in-one-wp-security-and-firewall
552
+ #: admin/wp-security-brute-force-menu.php:307
553
+ #, php-format
554
+ msgid "To learn more about how to use this feature please watch the following %s."
555
+ msgstr "Lees de volgende %s voor meer informatie over het gebruik van deze functie."
556
+
557
+ # @ all-in-one-wp-security-and-firewall
558
+ #: admin/wp-security-brute-force-menu.php:320
559
+ msgid "NOTE: If you already had the Rename Login Page feature active, the plugin has automatically deactivated it because only one of these features can be active at any one time."
560
+ msgstr ""
561
+
562
+ # @ all-in-one-wp-security-and-firewall
563
+ #: admin/wp-security-brute-force-menu.php:328
564
+ msgid "Cookie Based Brute Force Login Prevention"
565
+ msgstr "Op cookies gebaseerde brute force-inlogpreventie"
566
+
567
+ # @ all-in-one-wp-security-and-firewall
568
+ #: admin/wp-security-brute-force-menu.php:339
569
+ #: classes/grade-system/wp-security-feature-item-manager.php:87
570
+ msgid "Enable Brute Force Attack Prevention"
571
+ msgstr "Schakel de brute force aanval preventie in"
572
+
573
+ # @ all-in-one-wp-security-and-firewall
574
+ #: admin/wp-security-brute-force-menu.php:342
575
+ msgid "Check this if you want to protect your login page from Brute Force Attack."
576
+ msgstr "Vink dit aan als je je inlogpagina wilt beschermen tegen Brute force aanval."
577
+
578
+ # @ all-in-one-wp-security-and-firewall
579
+ #: admin/wp-security-brute-force-menu.php:347
580
+ msgid "This feature will deny access to your WordPress login page for all people except those who have a special cookie in their browser."
581
+ msgstr "Deze functie zal de toegang tot uw WordPress inlogpagina voor alle personen weigeren, behalve degenen die een speciale cookie in hun browser hebben."
582
+
583
+ # @ all-in-one-wp-security-and-firewall
584
+ #: admin/wp-security-brute-force-menu.php:349
585
+ msgid "To use this feature do the following:"
586
+ msgstr "Om deze functie te gebruiken, doet u het volgende:"
587
+
588
+ # @ all-in-one-wp-security-and-firewall
589
+ #: admin/wp-security-brute-force-menu.php:351
590
+ msgid "1) Enable the checkbox."
591
+ msgstr "1) Schakel het selectievakje in."
592
+
593
+ # @ all-in-one-wp-security-and-firewall
594
+ #: admin/wp-security-brute-force-menu.php:353
595
+ msgid "2) Enter a secret word consisting of alphanumeric characters which will be difficult to guess. This secret word will be useful whenever you need to know the special URL which you will use to access the login page (see point below)."
596
+ msgstr "2) Voer een geheim woord in dat bestaat uit alfanumerieke tekens die moeilijk te raden zijn. Dit geheime woord is nuttig wanneer u de speciale URL moet weten die u gaat gebruiken om toegang te krijgen tot de inlogpagina (zie punt hieronder)."
597
+
598
+ # @ all-in-one-wp-security-and-firewall
599
+ #: admin/wp-security-brute-force-menu.php:355
600
+ msgid "3) You will then be provided with a special login URL. You will need to use this URL to login to your WordPress site instead of the usual login URL. NOTE: The system will deposit a special cookie in your browser which will allow you access to the WordPress administration login page."
601
+ msgstr "3) U ontvangt dan een speciale inlog-URL. U moet deze URL gebruiken om u aan te melden bij uw WordPress-site in plaats van de gebruikelijke inlog-URL. OPMERKING: Het systeem zal een speciale cookie in uw browser plaatsen die u toegang geeft tot de aanmeldingspagina van WordPress administratie."
602
+
603
+ # @ all-in-one-wp-security-and-firewall
604
+ #: admin/wp-security-brute-force-menu.php:357
605
+ msgid "Any person trying to access your login page who does not have the special cookie in their browser will be automatically blocked."
606
+ msgstr "Iedereen die probeert toegang te krijgen tot uw inlogpagina die niet over de speciale cookie in zijn browser beschikt, wordt automatisch geblokkeerd."
607
+
608
+ # @ all-in-one-wp-security-and-firewall
609
+ #: admin/wp-security-brute-force-menu.php:364
610
+ msgid "Secret Word"
611
+ msgstr "Geheim woord"
612
+
613
+ # @ all-in-one-wp-security-and-firewall
614
+ #: admin/wp-security-brute-force-menu.php:366
615
+ msgid "Choose a secret word consisting of alphanumeric characters which you can use to access your special URL. Your are highly encouraged to choose a word which will be difficult to guess."
616
+ msgstr "Kies een geheim woord bestaande uit alfanumerieke tekens dat u kunt gebruiken om toegang te krijgen tot uw speciale URL. U wordt sterk aangemoedigd om een woord te kiezen dat moeilijk te raden is."
617
+
618
+ # @ all-in-one-wp-security-and-firewall
619
+ #: admin/wp-security-brute-force-menu.php:370
620
+ msgid "Re-direct URL"
621
+ msgstr "Omleidings-URL"
622
+
623
+ # @ all-in-one-wp-security-and-firewall
624
+ #: admin/wp-security-brute-force-menu.php:374
625
+ msgid "Specify a URL to redirect a hacker to when they try to access your WordPress login page."
626
+ msgstr "Geef een URL op waarmee een hacker wordt omgeleid wanneer deze toegang probeert te krijgen tot uw WordPress-aanmeldingspagina."
627
+
628
+ # @ all-in-one-wp-security-and-firewall
629
+ #: admin/wp-security-brute-force-menu.php:381
630
+ msgid "The URL specified here can be any site's URL and does not have to be your own. For example you can be as creative as you like and send hackers to the CIA or NSA home page."
631
+ msgstr "De hier opgegeven URL kan de URL van elke site zijn en hoeft niet de uwe te zijn. U kunt bijvoorbeeld zo creatief zijn als u wilt en hackers naar de startpagina van de CIA of NSA sturen."
632
+
633
+ # @ all-in-one-wp-security-and-firewall
634
+ #: admin/wp-security-brute-force-menu.php:383
635
+ msgid "This field will default to: http://127.0.0.1 if you do not enter a value."
636
+ msgstr "In dit veld wordt standaard ingesteld op: http://127.0.0.1 als u geen waarde invoert."
637
+
638
+ # @ all-in-one-wp-security-and-firewall
639
+ #: admin/wp-security-brute-force-menu.php:385
640
+ msgid "Useful Tip:"
641
+ msgstr "Handige tip:"
642
+
643
+ # @ all-in-one-wp-security-and-firewall
644
+ #: admin/wp-security-brute-force-menu.php:387
645
+ msgid "It's a good idea to not redirect attempted brute force login attempts to your site because it increases the load on your server."
646
+ msgstr "Het is een goed idee om poging tot brute force-inlogpogingen naar uw site niet om te leiden, omdat dit de belasting van uw server verhoogt."
647
+
648
+ # @ all-in-one-wp-security-and-firewall
649
+ #: admin/wp-security-brute-force-menu.php:389
650
+ msgid "Redirecting a hacker or malicious bot back to \"http://127.0.0.1\" is ideal because it deflects them back to their own local host and puts the load on their server instead of yours."
651
+ msgstr "Het omleiden van een hacker of kwaadaardige bot terug naar \"http://127.0.0.1\" is ideaal omdat het ze terugleidt naar hun eigen lokale host en de belasting op hun server zet in plaats van de jouwe."
652
+
653
+ # @ all-in-one-wp-security-and-firewall
654
+ #: admin/wp-security-brute-force-menu.php:396
655
+ msgid "My Site Has Posts Or Pages Which Are Password Protected"
656
+ msgstr "Mijn site heeft berichten of pagina's die met een wachtwoord zijn beveiligd"
657
+
658
+ # @ all-in-one-wp-security-and-firewall
659
+ #: admin/wp-security-brute-force-menu.php:399
660
+ msgid "Check this if you are using the native WordPress password protection feature for some or all of your blog posts or pages."
661
+ msgstr "Vink dit aan als u de native WordPress-wachtwoordbeveiliging voor sommige of alle blogposts of -pagina's gebruikt."
662
+
663
+ # @ all-in-one-wp-security-and-firewall
664
+ #: admin/wp-security-brute-force-menu.php:404
665
+ msgid "In the cases where you are protecting some of your posts or pages using the in-built WordPress password protection feature, a few extra lines of directives and exceptions need to be added to your .htacces file so that people trying to access pages are not automatically blocked."
666
+ msgstr "In de gevallen waarin u sommige van uw berichten of pagina's beschermt met behulp van de ingebouwde wachtwoordbeveiliging voor WordPress, moeten een paar extra regels met richtlijnen en uitzonderingen aan uw .htacces-bestand worden toegevoegd, zodat mensen die proberen toegang te krijgen tot pagina's niet automatisch zijn geblokkeerd."
667
+
668
+ # @ all-in-one-wp-security-and-firewall
669
+ #: admin/wp-security-brute-force-menu.php:406
670
+ msgid "By enabling this checkbox the plugin will add the necessary rules and exceptions to your .htacces file so that people trying to access these pages are not automatically blocked."
671
+ msgstr "Door dit selectievakje in te schakelen, voegt de plug-in de nodige regels en uitzonderingen toe aan uw. Hacces-bestand, zodat mensen die proberen toegang te krijgen tot deze pagina's niet automatisch worden geblokkeerd."
672
+
673
+ # @ all-in-one-wp-security-and-firewall
674
+ #: admin/wp-security-brute-force-menu.php:408
675
+ msgid "Helpful Tip:"
676
+ msgstr "Handige tip:"
677
+
678
+ # @ all-in-one-wp-security-and-firewall
679
+ #: admin/wp-security-brute-force-menu.php:410
680
+ msgid "If you do not use the WordPress password protection feature for your posts or pages then it is highly recommended that you leave this checkbox disabled."
681
+ msgstr "Als u de wachtwoordbeveiliging van WordPress voor uw berichten of pagina's niet gebruikt, is het ten zeerste aan te raden om dit selectievakje uitgeschakeld te laten."
682
+
683
+ # @ all-in-one-wp-security-and-firewall
684
+ #: admin/wp-security-brute-force-menu.php:417
685
+ msgid "My Site Has a Theme or Plugins Which Use AJAX"
686
+ msgstr "Mijn site heeft een thema of plug-ins die AJAX gebruiken"
687
+
688
+ # @ all-in-one-wp-security-and-firewall
689
+ #: admin/wp-security-brute-force-menu.php:420
690
+ msgid "Check this if your site uses AJAX functionality."
691
+ msgstr "Controleer dit als uw site AJAX-functionaliteit gebruikt."
692
+
693
+ # @ all-in-one-wp-security-and-firewall
694
+ #: admin/wp-security-brute-force-menu.php:425
695
+ msgid "In the cases where your WordPress installation has a theme or plugins which use AJAX, a few extra lines of directives and exceptions need to be added to your .htacces file to prevent AJAX requests from being automatically blocked by the brute force prevention feature."
696
+ msgstr "In de gevallen waar uw WordPress-installatie een thema of plug-ins heeft die AJAX gebruiken, moeten een paar extra regels met richtlijnen en uitzonderingen worden toegevoegd aan uw .htacces-bestand om te voorkomen dat AJAX-verzoeken automatisch worden geblokkeerd door de brute force-preventiefunctie."
697
+
698
+ # @ all-in-one-wp-security-and-firewall
699
+ #: admin/wp-security-brute-force-menu.php:427
700
+ msgid "By enabling this checkbox the plugin will add the necessary rules and exceptions to your .htacces file so that AJAX operations will work as expected."
701
+ msgstr "Door dit selectievakje in te schakelen, voegt de plug-in de nodige regels en uitzonderingen toe aan uw .htacces-bestand, zodat AJAX-bewerkingen naar verwachting zullen werken."
702
+
703
+ # @ all-in-one-wp-security-and-firewall
704
+ #: admin/wp-security-brute-force-menu.php:442
705
+ msgid "The cookie test was successful. You can now enable this feature."
706
+ msgstr "De cookietest was succesvol. U kunt deze functie nu inschakelen."
707
+
708
+ # @ all-in-one-wp-security-and-firewall
709
+ #: admin/wp-security-brute-force-menu.php:445
710
+ msgid "Save Feature Settings"
711
+ msgstr "Bewaar functie-instellingen"
712
+
713
+ # @ all-in-one-wp-security-and-firewall
714
+ #: admin/wp-security-brute-force-menu.php:452
715
+ msgid "The cookie test failed on this server. So this feature cannot be used on this site."
716
+ msgstr "De cookietest is mislukt op deze server. Dus deze functie kan niet worden gebruikt op deze site."
717
+
718
+ # @ all-in-one-wp-security-and-firewall
719
+ #: admin/wp-security-brute-force-menu.php:457
720
+ msgid "Before using this feature you are required to perform a cookie test first. This is to make sure that your browser cookie is working correctly and that you won't lock yourself out."
721
+ msgstr "Voordat u deze functie gebruikt, moet u eerst een cookietest uitvoeren. Dit is om ervoor te zorgen dat uw browsercookie correct werkt en dat u zichzelf niet buitensluit."
722
+
723
+ # @ all-in-one-wp-security-and-firewall
724
+ #: admin/wp-security-brute-force-menu.php:459
725
+ msgid "Perform Cookie Test"
726
+ msgstr "Voer een cookietest uit"
727
+
728
+ # @ all-in-one-wp-security-and-firewall
729
+ #: admin/wp-security-brute-force-menu.php:498
730
+ msgid "This feature allows you to add a captcha form on the WordPress login page."
731
+ msgstr "Met deze functie kunt u een captcha-formulier toevoegen op de aanmeldingspagina van WordPress."
732
+
733
+ # @ all-in-one-wp-security-and-firewall
734
+ #: admin/wp-security-brute-force-menu.php:499
735
+ msgid "Users who attempt to login will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them login even if they entered the correct username and password."
736
+ msgstr "Gebruikers die proberen in te loggen, moeten ook het antwoord op een eenvoudige wiskundige vraag invoeren - als ze een verkeerd antwoord invoeren, staat de plug-in hen niet toe om in te loggen, zelfs als ze de juiste gebruikersnaam en wachtwoord hebben ingevoerd."
737
+
738
+ # @ all-in-one-wp-security-and-firewall
739
+ #: admin/wp-security-brute-force-menu.php:500
740
+ msgid "Therefore, adding a captcha form on the login page is another effective yet simple \"Brute Force\" prevention technique."
741
+ msgstr "Daarom is het toevoegen van een captcha-formulier op de inlogpagina een andere effectieve maar eenvoudige \"Brute force\" -preventietechniek."
742
+
743
+ # @ all-in-one-wp-security-and-firewall
744
+ #: admin/wp-security-brute-force-menu.php:506
745
+ msgid "Login Form Captcha Settings"
746
+ msgstr "Aanmeldingsformulier Captcha-instellingen"
747
+
748
+ # @ all-in-one-wp-security-and-firewall
749
+ #: admin/wp-security-brute-force-menu.php:517
750
+ msgid "Enable Captcha On Login Page"
751
+ msgstr "Schakel Captcha aan op inlogpagina"
752
+
753
+ # @ all-in-one-wp-security-and-firewall
754
+ #: admin/wp-security-brute-force-menu.php:520
755
+ msgid "Check this if you want to insert a captcha form on the login page"
756
+ msgstr "Selecteer dit als u een captcha-formulier wilt invoegen op de inlogpagina"
757
+
758
+ # @ all-in-one-wp-security-and-firewall
759
+ #: admin/wp-security-brute-force-menu.php:526
760
+ msgid "Lost Password Form Captcha Settings"
761
+ msgstr "Wachtwoord vergeten formulier voor Captcha-instellingen"
762
+
763
+ # @ all-in-one-wp-security-and-firewall
764
+ #: admin/wp-security-brute-force-menu.php:536
765
+ msgid "Enable Captcha On Lost Password Page"
766
+ msgstr "Captcha aan op password-pagina inschakelen"
767
+
768
+ # @ all-in-one-wp-security-and-firewall
769
+ #: admin/wp-security-brute-force-menu.php:539
770
+ msgid "Check this if you want to insert a captcha form on the lost password page"
771
+ msgstr "Selecteer dit als u een captcha-formulier wilt invoegen op de pagina voor verloren wachtwoorden"
772
+
773
+ # @ all-in-one-wp-security-and-firewall
774
+ #: admin/wp-security-brute-force-menu.php:561
775
+ msgid "Nonce check failed for save whitelist settings!"
776
+ msgstr "Nonce check mislukt voor het opslaan van witte lijst-instellingen!"
777
+
778
+ # @ all-in-one-wp-security-and-firewall
779
+ #: admin/wp-security-brute-force-menu.php:618
780
+ msgid "The All In One WP Security Whitelist feature gives you the option of only allowing certain IP addresses or ranges to have access to your WordPress login page."
781
+ msgstr "De All in one WP niet geblokkeerde lijst-functie voor beveiliging biedt u de mogelijkheid om alleen bepaalde IP-adressen of bereiken toegang te geven tot uw WordPress-aanmeldingspagina."
782
+
783
+ # @ all-in-one-wp-security-and-firewall
784
+ #: admin/wp-security-brute-force-menu.php:619
785
+ msgid "This feature will deny login access for all IP addresses which are not in your whitelist as configured in the settings below."
786
+ msgstr "Met deze functie wordt inlogtoegang voor alle IP-adressen die niet in uw whitelist staan, zoals geconfigureerd in de onderstaande instellingen, geweigerd."
787
+
788
+ # @ all-in-one-wp-security-and-firewall
789
+ #: admin/wp-security-brute-force-menu.php:620
790
+ msgid "The plugin achieves this by writing the appropriate directives to your .htaccess file."
791
+ msgstr "De plug-in bereikt dit door de juiste richtlijnen naar uw .htaccess-bestand te schrijven."
792
+
793
+ # @ all-in-one-wp-security-and-firewall
794
+ #: admin/wp-security-brute-force-menu.php:621
795
+ msgid "By allowing/blocking IP addresses via the .htaccess file your are using the most secure first line of defence because login access will only be granted to whitelisted IP addresses and other addresses will be blocked as soon as they try to access your login page."
796
+ msgstr "Door IP-adressen toe te staan / te blokkeren via het .htaccess-bestand, gebruikt u de veiligste eerste verdedigingslinie omdat inlogtoegang alleen wordt verleend aan witte IP-adressen en andere adressen worden geblokkeerd zodra ze proberen toegang te krijgen tot uw inlogpagina."
797
+
798
+ # @ all-in-one-wp-security-and-firewall
799
+ #: admin/wp-security-brute-force-menu.php:628
800
+ #, php-format
801
+ msgid "Attention: If in addition to enabling the white list feature, you also have the %s feature enabled, <strong>you will still need to use your secret word in the URL when trying to access your WordPress login page</strong>."
802
+ msgstr "Let op: Als u naast het inschakelen van de witte lijstfunctie ook de %s functie hebt ingeschakeld, <strong>moet u uw geheime woord toch gebruiken in de URL wanneer u probeert toegang te krijgen tot uw WordPress inlogpagina</ strong>."
803
+
804
+ # @ all-in-one-wp-security-and-firewall
805
+ #: admin/wp-security-brute-force-menu.php:629
806
+ msgid "These features are NOT functionally related. Having both of them enabled on your site means you are creating 2 layers of security."
807
+ msgstr "Deze functies zijn NIET functioneel gerelateerd. Als ze beide op uw site zijn ingeschakeld, betekent dit dat u twee beveiligingslagen maakt."
808
+
809
+ # @ all-in-one-wp-security-and-firewall
810
+ #: admin/wp-security-brute-force-menu.php:634
811
+ msgid "Login IP Whitelist Settings"
812
+ msgstr "Inloggen IP niet geblokkeerdelijst instellingen"
813
+
814
+ # @ all-in-one-wp-security-and-firewall
815
+ #: admin/wp-security-brute-force-menu.php:645
816
+ msgid "Enable IP Whitelisting"
817
+ msgstr "IP niet geblokkeerdelijst inschakelen"
818
+
819
+ # @ all-in-one-wp-security-and-firewall
820
+ #: admin/wp-security-brute-force-menu.php:648
821
+ msgid "Check this if you want to enable the whitelisting of selected IP addresses specified in the settings below"
822
+ msgstr "Selecteer dit als u de niet geblokkeerdelijst van de geselecteerde IP-adressen wilt inschakelen die zijn opgegeven in de onderstaande instellingen"
823
+
824
+ # @ all-in-one-wp-security-and-firewall
825
+ #: admin/wp-security-brute-force-menu.php:652
826
+ msgid "Your Current IP Address"
827
+ msgstr "Uw huidige IP-adres"
828
+
829
+ # @ all-in-one-wp-security-and-firewall
830
+ #: admin/wp-security-brute-force-menu.php:655
831
+ msgid "You can copy and paste this address in the text box below if you want to include it in your login whitelist."
832
+ msgstr "U kunt dit adres in het onderstaande tekstvak kopiëren en plakken als u het in uw witte login-login wilt opnemen."
833
+
834
+ # @ all-in-one-wp-security-and-firewall
835
+ #: admin/wp-security-brute-force-menu.php:659
836
+ msgid "Enter Whitelisted IP Addresses:"
837
+ msgstr "Voer IP-adressen op de witte lijst in:"
838
+
839
+ # @ all-in-one-wp-security-and-firewall
840
+ #: admin/wp-security-brute-force-menu.php:663
841
+ msgid "Enter one or more IP addresses or IP ranges you wish to include in your whitelist. Only the addresses specified here will have access to the WordPress login page."
842
+ msgstr "Voer een of meer IP-adressen of IP-reeksen in die u op uw witte lijst wilt opnemen. Alleen de hier opgegeven adressen hebben toegang tot de aanmeldingspagina van WordPress."
843
+
844
+ # @ all-in-one-wp-security-and-firewall
845
+ #: admin/wp-security-dashboard-menu.php:24
846
+ msgid "System Info"
847
+ msgstr "Systeeminformatie"
848
+
849
+ # @ all-in-one-wp-security-and-firewall
850
+ #: admin/wp-security-dashboard-menu.php:25
851
+ #: admin/wp-security-dashboard-menu.php:436
852
+ msgid "Locked IP Addresses"
853
+ msgstr "Geblokkeerde IP-adressen"
854
+
855
+ # @ all-in-one-wp-security-and-firewall
856
+ #: admin/wp-security-dashboard-menu.php:31
857
+ msgid "Permanent Block List"
858
+ msgstr "Permanente blokkeringslijst"
859
+
860
+ # @ all-in-one-wp-security-and-firewall
861
+ #: admin/wp-security-dashboard-menu.php:75
862
+ msgid "For information, updates and documentation, please visit the"
863
+ msgstr "Voor informatie, updates en documentatie bezoekt u de"
864
+
865
+ # @ all-in-one-wp-security-and-firewall
866
+ #: admin/wp-security-dashboard-menu.php:75
867
+ msgid "AIO WP Security & Firewall Plugin"
868
+ msgstr "AIO WP-plug-in voor beveiliging en firewall"
869
+
870
+ # @ all-in-one-wp-security-and-firewall
871
+ #: admin/wp-security-dashboard-menu.php:75
872
+ msgid "Page"
873
+ msgstr "Pagina"
874
+
875
+ # @ all-in-one-wp-security-and-firewall
876
+ #: admin/wp-security-dashboard-menu.php:76
877
+ msgid "Follow us"
878
+ msgstr "Volg ons"
879
+
880
+ # @ all-in-one-wp-security-and-firewall
881
+ #: admin/wp-security-dashboard-menu.php:76
882
+ msgid "Twitter, Google+ or via Email to stay up to date about the new security features of this plugin."
883
+ msgstr "Twitter, Google+ of via e-mail om op de hoogte te blijven van de nieuwe beveiligingsfuncties van deze plug-in."
884
+
885
+ # @ all-in-one-wp-security-and-firewall
886
+ #: admin/wp-security-dashboard-menu.php:477
887
+ msgid "Security Strength Meter"
888
+ msgstr "Veiligheidssterktemeter"
889
+
890
+ # @ all-in-one-wp-security-and-firewall
891
+ #: admin/wp-security-dashboard-menu.php:119
892
+ msgid "Total Achievable Points: "
893
+ msgstr "Totaal behaalde punten: "
894
+
895
+ # @ all-in-one-wp-security-and-firewall
896
+ #: admin/wp-security-dashboard-menu.php:121
897
+ msgid "Current Score of Your Site: "
898
+ msgstr "Huidige score van uw site: "
899
+
900
+ # @ all-in-one-wp-security-and-firewall
901
+ #: admin/wp-security-dashboard-menu.php:478
902
+ msgid "Security Points Breakdown"
903
+ msgstr "Uitsplitsing beveiligingspunten"
904
+
905
+ # @ all-in-one-wp-security-and-firewall
906
+ #: admin/wp-security-dashboard-menu.php:479
907
+ msgid "Spread the Word"
908
+ msgstr "Vertel het verder"
909
+
910
+ # @ all-in-one-wp-security-and-firewall
911
+ #: admin/wp-security-dashboard-menu.php:480
912
+ msgid "Get To Know The Developers"
913
+ msgstr "Maak kennis met de ontwikkelaars"
914
+
915
+ # @ all-in-one-wp-security-and-firewall
916
+ #: admin/wp-security-dashboard-menu.php:604
917
+ msgid "Wanna know more about the developers behind this plugin?"
918
+ msgstr "Wil je meer weten over de ontwikkelaars achter deze plug-in?"
919
+
920
+ # @ all-in-one-wp-security-and-firewall
921
+ #: admin/wp-security-dashboard-menu.php:481
922
+ msgid "Critical Feature Status"
923
+ msgstr "Kritieke functiestatus"
924
+
925
+ # @ all-in-one-wp-security-and-firewall
926
+ #: admin/wp-security-dashboard-menu.php:176
927
+ msgid "Below is the current status of the critical features that you should activate on your site to achieve a minimum level of recommended security"
928
+ msgstr "Hieronder vindt u de huidige status van de kritieke functies die u op uw site moet activeren om een minimaal niveau van aanbevolen beveiliging te bereiken"
929
+
930
+ # @ all-in-one-wp-security-and-firewall
931
+ #: admin/wp-security-dashboard-menu.php:180
932
+ msgid "Admin Username"
933
+ msgstr "Admin-gebruikersnaam"
934
+
935
+ # @ all-in-one-wp-security-and-firewall
936
+ #: admin/wp-security-dashboard-menu.php:195
937
+ #: admin/wp-security-user-login-menu.php:25
938
+ #: classes/grade-system/wp-security-feature-item-manager.php:42
939
+ msgid "Login Lockdown"
940
+ msgstr "Login slot"
941
+
942
+ # @ all-in-one-wp-security-and-firewall
943
+ #: admin/wp-security-dashboard-menu.php:210
944
+ msgid "File Permission"
945
+ msgstr "Bestandsmachtiging"
946
+
947
+ # @ all-in-one-wp-security-and-firewall
948
+ #: admin/wp-security-dashboard-menu.php:225
949
+ msgid "Basic Firewall"
950
+ msgstr "Basis Firewall"
951
+
952
+ # @ all-in-one-wp-security-and-firewall
953
+ #: admin/wp-security-dashboard-menu.php:482
954
+ msgid "Last 5 Logins"
955
+ msgstr "Laatste 5 logins"
956
+
957
+ # @ all-in-one-wp-security-and-firewall
958
+ #: admin/wp-security-dashboard-menu.php:257
959
+ msgid "No data found!"
960
+ msgstr "Geen data gevonden!"
961
+
962
+ # @ all-in-one-wp-security-and-firewall
963
+ #: admin/wp-security-dashboard-menu.php:261
964
+ msgid "Last 5 logins summary:"
965
+ msgstr "Samenvatting laatste 5 logins:"
966
+
967
+ # @ all-in-one-wp-security-and-firewall
968
+ #: admin/wp-security-dashboard-menu.php:486
969
+ msgid "Brute Force Prevention Login Page"
970
+ msgstr "Inlogpagina brute force-preventie"
971
+
972
+ # @ all-in-one-wp-security-and-firewall
973
+ #: admin/wp-security-dashboard-menu.php:265
974
+ msgid "User"
975
+ msgstr "Gebruiker"
976
+
977
+ # @ all-in-one-wp-security-and-firewall
978
+ #: admin/wp-security-dashboard-menu.php:266
979
+ msgid "Date"
980
+ msgstr "Datum"
981
+
982
+ # @ all-in-one-wp-security-and-firewall
983
+ #: admin/wp-security-dashboard-menu.php:267
984
+ msgid "IP"
985
+ msgstr "IP"
986
+
987
+ # @ all-in-one-wp-security-and-firewall
988
+ #: admin/wp-security-dashboard-menu.php:288
989
+ msgid "Maintenance Mode Status"
990
+ msgstr "Status Onderhoudsmodus"
991
+
992
+ # @ all-in-one-wp-security-and-firewall
993
+ #: admin/wp-security-dashboard-menu.php:292
994
+ msgid "Maintenance mode is currently enabled. Remember to turn it off when you are done"
995
+ msgstr "Onderhoudsmodus is momenteel ingeschakeld. Vergeet niet om het uit te schakelen als je klaar bent"
996
+
997
+ # @ all-in-one-wp-security-and-firewall
998
+ #: admin/wp-security-dashboard-menu.php:295
999
+ msgid "Maintenance mode is currently off."
1000
+ msgstr "De onderhoudsmodus is momenteel uitgeschakeld."
1001
+
1002
+ # @ all-in-one-wp-security-and-firewall
1003
+ #: admin/wp-security-dashboard-menu.php:299
1004
+ msgid "Maintenance Mode"
1005
+ msgstr "Onderhoudsstand"
1006
+
1007
+ # @ all-in-one-wp-security-and-firewall
1008
+ #: admin/wp-security-dashboard-menu.php:321
1009
+ msgid "Cookie Based Brute Prevention"
1010
+ msgstr "Op cookies gebaseerde brute preventie"
1011
+
1012
+ # @ all-in-one-wp-security-and-firewall
1013
+ #: admin/wp-security-dashboard-menu.php:324
1014
+ msgid "Cookie-Based Brute Force"
1015
+ msgstr "Op cookies gebaseerde brute kracht"
1016
+
1017
+ # @ all-in-one-wp-security-and-firewall
1018
+ #: admin/wp-security-dashboard-menu.php:328
1019
+ #: admin/wp-security-dashboard-menu.php:356
1020
+ #, php-format
1021
+ msgid "The %s feature is currently active."
1022
+ msgstr "De %s functie is momenteel actief."
1023
+
1024
+ # @ all-in-one-wp-security-and-firewall
1025
+ #: admin/wp-security-dashboard-menu.php:329
1026
+ #: admin/wp-security-dashboard-menu.php:357
1027
+ msgid "Your new WordPress login URL is now:"
1028
+ msgstr "Uw nieuwe WordPress inlog-URL is nu:"
1029
+
1030
+ # @ all-in-one-wp-security-and-firewall
1031
+ #: admin/wp-security-dashboard-menu.php:389
1032
+ #: admin/wp-security-user-login-menu.php:29
1033
+ msgid "Logged In Users"
1034
+ msgstr "Ingelogde gebruikers"
1035
+
1036
+ # @ all-in-one-wp-security-and-firewall
1037
+ #: admin/wp-security-dashboard-menu.php:399
1038
+ msgid "Number of users currently logged in site-wide is:"
1039
+ msgstr "Het aantal gebruikers dat momenteel op de hele site is ingelogd, is:"
1040
+
1041
+ # @ all-in-one-wp-security-and-firewall
1042
+ #: admin/wp-security-dashboard-menu.php:400
1043
+ #: admin/wp-security-dashboard-menu.php:422
1044
+ #: admin/wp-security-dashboard-menu.php:450
1045
+ #, php-format
1046
+ msgid "Go to the %s menu to see more details"
1047
+ msgstr "Ga naar het %s menu voor meer details"
1048
+
1049
+ # @ all-in-one-wp-security-and-firewall
1050
+ #: admin/wp-security-dashboard-menu.php:405
1051
+ msgid "There are no other site-wide users currently logged in."
1052
+ msgstr "Er zijn momenteel geen andere gebruikers op de hele site ingelogd."
1053
+
1054
+ # @ all-in-one-wp-security-and-firewall
1055
+ #: admin/wp-security-dashboard-menu.php:421
1056
+ msgid "Number of users currently logged into your site (including you) is:"
1057
+ msgstr "Het aantal gebruikers dat momenteel op uw site is ingelogd (inclusief uzelf) is:"
1058
+
1059
+ # @ all-in-one-wp-security-and-firewall
1060
+ #: admin/wp-security-dashboard-menu.php:427
1061
+ msgid "There are no other users currently logged in."
1062
+ msgstr "Er zijn momenteel geen andere gebruikers die ingelogd zijn."
1063
+
1064
+ # @ all-in-one-wp-security-and-firewall
1065
+ #: admin/wp-security-dashboard-menu.php:444
1066
+ msgid "There are no IP addresses currently locked out."
1067
+ msgstr "Er zijn momenteel geen IP-adressen geblokkeerd."
1068
+
1069
+ # @ all-in-one-wp-security-and-firewall
1070
+ #: admin/wp-security-dashboard-menu.php:449
1071
+ msgid "Number of temporarily locked out IP addresses: "
1072
+ msgstr "Aantal tijdelijk geblokkeerde IP-adressen: "
1073
+
1074
+ # @ all-in-one-wp-security-and-firewall
1075
+ #: admin/wp-security-dashboard-menu.php:465
1076
+ msgid "We are working hard to make your WordPress site more secure. Please support us, here is how:"
1077
+ msgstr "We doen er alles aan om uw WordPress-site veiliger te maken. Steun ons alsjeblieft, hieronder ziet u hoe:"
1078
+
1079
+ # @ all-in-one-wp-security-and-firewall
1080
+ #: admin/wp-security-dashboard-menu.php:489
1081
+ msgid "Site Info"
1082
+ msgstr "Site informatie"
1083
+
1084
+ # @ all-in-one-wp-security-and-firewall
1085
+ #: admin/wp-security-dashboard-menu.php:491
1086
+ msgid "Plugin Version"
1087
+ msgstr "Plugin-versie"
1088
+
1089
+ # @ all-in-one-wp-security-and-firewall
1090
+ #: admin/wp-security-dashboard-menu.php:492
1091
+ msgid "WP Version"
1092
+ msgstr "WP-versie"
1093
+
1094
+ # @ all-in-one-wp-security-and-firewall
1095
+ #: admin/wp-security-dashboard-menu.php:494
1096
+ #: admin/wp-security-dashboard-menu.php:496
1097
+ #: admin/wp-security-dashboard-menu.php:592
1098
+ msgid "Version"
1099
+ msgstr "Versie"
1100
+
1101
+ # @ all-in-one-wp-security-and-firewall
1102
+ #: admin/wp-security-dashboard-menu.php:495
1103
+ msgid "Table Prefix"
1104
+ msgstr "Tabelvoorvoegsel"
1105
+
1106
+ # @ all-in-one-wp-security-and-firewall
1107
+ #: admin/wp-security-dashboard-menu.php:497
1108
+ msgid "Session Save Path"
1109
+ msgstr "Sessie Opslaan Pad"
1110
+
1111
+ # @ all-in-one-wp-security-and-firewall
1112
+ #: admin/wp-security-dashboard-menu.php:499
1113
+ msgid "Server Name"
1114
+ msgstr "Server naam"
1115
+
1116
+ # @ all-in-one-wp-security-and-firewall
1117
+ #: admin/wp-security-dashboard-menu.php:500
1118
+ msgid "Cookie Domain"
1119
+ msgstr "Cookie-domein"
1120
+
1121
+ # @ all-in-one-wp-security-and-firewall
1122
+ #: admin/wp-security-dashboard-menu.php:501
1123
+ msgid "Library Present"
1124
+ msgstr "Bibliotheek aanwezig"
1125
+
1126
+ # @ all-in-one-wp-security-and-firewall
1127
+ #: admin/wp-security-dashboard-menu.php:502
1128
+ msgid "Debug File Write Permissions"
1129
+ msgstr "Foutopsporingsbestanden Schrijfrechten"
1130
+
1131
+ # @ all-in-one-wp-security-and-firewall
1132
+ #: admin/wp-security-dashboard-menu.php:506
1133
+ msgid "PHP Info"
1134
+ msgstr "PHP informatie"
1135
+
1136
+ # @ all-in-one-wp-security-and-firewall
1137
+ #: admin/wp-security-dashboard-menu.php:508
1138
+ msgid "PHP Version"
1139
+ msgstr "PHP versie"
1140
+
1141
+ # @ all-in-one-wp-security-and-firewall
1142
+ #: admin/wp-security-dashboard-menu.php:509
1143
+ msgid "PHP Memory Usage"
1144
+ msgstr "PHP Geheugengebruik"
1145
+
1146
+ # @ all-in-one-wp-security-and-firewall
1147
+ #: admin/wp-security-dashboard-menu.php:510
1148
+ msgid " MB"
1149
+ msgstr " MB"
1150
+
1151
+ # @ all-in-one-wp-security-and-firewall
1152
+ #: admin/wp-security-dashboard-menu.php:516
1153
+ #: admin/wp-security-dashboard-menu.php:524
1154
+ #: admin/wp-security-dashboard-menu.php:532
1155
+ #: admin/wp-security-dashboard-menu.php:574
1156
+ msgid "N/A"
1157
+ msgstr "N/A"
1158
+
1159
+ # @ all-in-one-wp-security-and-firewall
1160
+ #: admin/wp-security-dashboard-menu.php:519
1161
+ msgid "PHP Memory Limit"
1162
+ msgstr "PHP Geheugenlimiet"
1163
+
1164
+ # @ all-in-one-wp-security-and-firewall
1165
+ #: admin/wp-security-dashboard-menu.php:527
1166
+ msgid "PHP Max Upload Size"
1167
+ msgstr "PHP Maximale uploadgrootte"
1168
+
1169
+ # @ all-in-one-wp-security-and-firewall
1170
+ #: admin/wp-security-dashboard-menu.php:535
1171
+ msgid "PHP Max Post Size"
1172
+ msgstr "PHP Max. Berichtgrootte"
1173
+
1174
+ # @ all-in-one-wp-security-and-firewall
1175
+ #: admin/wp-security-dashboard-menu.php:538
1176
+ #: admin/wp-security-dashboard-menu.php:546
1177
+ #: admin/wp-security-dashboard-menu.php:555
1178
+ #: admin/wp-security-dashboard-menu.php:563
1179
+ msgid "On"
1180
+ msgstr "Aan"
1181
+
1182
+ # @ all-in-one-wp-security-and-firewall
1183
+ #: admin/wp-security-dashboard-menu.php:540
1184
+ #: admin/wp-security-dashboard-menu.php:548
1185
+ #: admin/wp-security-dashboard-menu.php:557
1186
+ #: admin/wp-security-dashboard-menu.php:565
1187
+ msgid "Off"
1188
+ msgstr "Uit"
1189
+
1190
+ # @ all-in-one-wp-security-and-firewall
1191
+ #: admin/wp-security-dashboard-menu.php:543
1192
+ msgid "PHP Safe Mode"
1193
+ msgstr "PHP Veilige modus"
1194
+
1195
+ # @ all-in-one-wp-security-and-firewall
1196
+ #: admin/wp-security-dashboard-menu.php:551
1197
+ msgid "PHP Allow URL fopen"
1198
+ msgstr "PHP Toestaan URL fopen"
1199
+
1200
+ # @ default
1201
+ #: admin/wp-security-dashboard-menu.php:560
1202
+ msgid "PHP Allow URL Include"
1203
+ msgstr "PHP Toestaan URL op te nemen"
1204
+
1205
+ # @ all-in-one-wp-security-and-firewall
1206
+ #: admin/wp-security-dashboard-menu.php:568
1207
+ msgid "PHP Display Errors"
1208
+ msgstr "PHP Fouten weergeven"
1209
+
1210
+ # @ all-in-one-wp-security-and-firewall
1211
+ #: admin/wp-security-dashboard-menu.php:577
1212
+ msgid "PHP Max Script Execution Time"
1213
+ msgstr "PHP Max script uitvoeringstijd"
1214
+
1215
+ # @ default
1216
+ #: admin/wp-security-dashboard-menu.php:577
1217
+ msgid "Seconds"
1218
+ msgstr "Seconden"
1219
+
1220
+ # @ all-in-one-wp-security-and-firewall
1221
+ #: admin/wp-security-dashboard-menu.php:581
1222
+ msgid "Active Plugins"
1223
+ msgstr "Actieve plug-ins"
1224
+
1225
+ # @ all-in-one-wp-security-and-firewall
1226
+ #: admin/wp-security-dashboard-menu.php:591
1227
+ #: admin/wp-security-filesystem-menu.php:130
1228
+ #: admin/wp-security-filesystem-menu.php:149
1229
+ msgid "Name"
1230
+ msgstr "Naam"
1231
+
1232
+ # @ all-in-one-wp-security-and-firewall
1233
+ #: admin/wp-security-dashboard-menu.php:593
1234
+ msgid "Plugin URL"
1235
+ msgstr "Plugin URL"
1236
+
1237
+ # @ all-in-one-wp-security-and-firewall
1238
+ #: admin/wp-security-dashboard-menu.php:629
1239
+ msgid "Currently Locked Out IP Addresses and Ranges"
1240
+ msgstr "Momenteel geblokkeerde IP-adressen en bereiken"
1241
+
1242
+ # @ all-in-one-wp-security-and-firewall
1243
+ #: admin/wp-security-database-menu.php:26
1244
+ #: admin/wp-security-database-menu.php:31
1245
+ #: classes/grade-system/wp-security-feature-item-manager.php:62
1246
+ msgid "DB Backup"
1247
+ msgstr "DB Backup"
1248
+
1249
+ # @ all-in-one-wp-security-and-firewall
1250
+ #: admin/wp-security-database-menu.php:30
1251
+ #: classes/grade-system/wp-security-feature-item-manager.php:60
1252
+ msgid "DB Prefix"
1253
+ msgstr "DB Prefix"
1254
+
1255
+ # @ all-in-one-wp-security-and-firewall
1256
+ #: admin/wp-security-database-menu.php:93
1257
+ msgid "Nonce check failed for DB prefix change operation!"
1258
+ msgstr "Controle nonce is mislukt voor wijziging DB-voorvoegsel!"
1259
+
1260
+ # @ all-in-one-wp-security-and-firewall
1261
+ #: admin/wp-security-database-menu.php:101
1262
+ msgid "The plugin has detected that it cannot write to the wp-config.php file. This feature can only be used if the plugin can successfully write to the wp-config.php file."
1263
+ msgstr "De plug-in heeft gedetecteerd dat het niet naar het bestand wp-config.php kan schrijven. Deze functie kan alleen worden gebruikt als de plug-in succesvol kan schrijven naar het bestand wp-config.php."
1264
+
1265
+ # @ all-in-one-wp-security-and-firewall
1266
+ #: admin/wp-security-database-menu.php:114
1267
+ msgid "Please enter a value for the DB prefix."
1268
+ msgstr "Voer een waarde in voor de DB-prefix."
1269
+
1270
+ # @ all-in-one-wp-security-and-firewall
1271
+ #: admin/wp-security-database-menu.php:123
1272
+ msgid "<strong>ERROR</strong>: The table prefix can only contain numbers, letters, and underscores."
1273
+ msgstr "<strong>FOUT </strong>: het voorvoegsel van de tabel mag alleen cijfers, letters en onderstrepingstekens bevatten."
1274
+
1275
+ # @ all-in-one-wp-security-and-firewall
1276
+ #: admin/wp-security-database-menu.php:131
1277
+ msgid "Change Database Prefix"
1278
+ msgstr "Wijzig database Prefix"
1279
+
1280
+ # @ all-in-one-wp-security-and-firewall
1281
+ #: admin/wp-security-database-menu.php:134
1282
+ msgid "Your WordPress DB is the most important asset of your website because it contains a lot of your site's precious information."
1283
+ msgstr "Uw WordPress DB is het belangrijkste bezit van uw website omdat deze veel waardevolle informatie van uw site bevat."
1284
+
1285
+ # @ all-in-one-wp-security-and-firewall
1286
+ #: admin/wp-security-database-menu.php:135
1287
+ msgid "The DB is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables."
1288
+ msgstr "De DB is ook een doelwit voor hackers via methoden zoals SQL-injecties en schadelijke en geautomatiseerde code die op bepaalde tabellen is gericht."
1289
+
1290
+ # @ all-in-one-wp-security-and-firewall
1291
+ #: admin/wp-security-database-menu.php:136
1292
+ msgid "One way to add a layer of protection for your DB is to change the default WordPress table prefix from \"wp_\" to something else which will be difficult for hackers to guess."
1293
+ msgstr "Een manier om een beveiligingslaag toe te voegen voor uw DB is het standaard WordPress-tabelprefix van 'wp_' te wijzigen in iets anders dat moeilijk te raden is voor hackers."
1294
+
1295
+ # @ all-in-one-wp-security-and-firewall
1296
+ #: admin/wp-security-database-menu.php:137
1297
+ msgid "This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin."
1298
+ msgstr "Met deze functie kunt u eenvoudig het voorvoegsel wijzigen in een waarde naar keuze of een willekeurige waarde instellen door deze plug-in."
1299
+
1300
+ # @ all-in-one-wp-security-and-firewall
1301
+ #: admin/wp-security-database-menu.php:143
1302
+ msgid "DB Prefix Options"
1303
+ msgstr "DB Prefix-opties"
1304
+
1305
+ # @ all-in-one-wp-security-and-firewall
1306
+ #: admin/wp-security-database-menu.php:154
1307
+ #, php-format
1308
+ msgid "It is recommended that you perform a %s before using this feature"
1309
+ msgstr "Het wordt aanbevolen dat u een %s uitvoert voordat u deze functie gebruikt"
1310
+
1311
+ # @ all-in-one-wp-security-and-firewall
1312
+ #: admin/wp-security-database-menu.php:163
1313
+ msgid "Current DB Table Prefix"
1314
+ msgstr "Huidige DB-tabelprefix"
1315
+
1316
+ # @ all-in-one-wp-security-and-firewall
1317
+ #: admin/wp-security-database-menu.php:169
1318
+ msgid ""
1319
+ "Your site is currently using the default WordPress DB prefix value of \"wp_\". \n"
1320
+ " To increase your site's security you should consider changing the DB prefix value to another value."
1321
+ msgstr ""
1322
+ "Uw site gebruikt momenteel de standaard WordPress DB-prefixwaarde \"wp_\".\n"
1323
+ " Als u de beveiliging van uw site wilt verhogen, kunt u overwegen de DB-prefixwaarde te wijzigen in een andere waarde."
1324
+
1325
+ # @ all-in-one-wp-security-and-firewall
1326
+ #: admin/wp-security-database-menu.php:176
1327
+ msgid "Generate New DB Table Prefix"
1328
+ msgstr "Genereer een nieuwe DB-tabelprefix"
1329
+
1330
+ # @ all-in-one-wp-security-and-firewall
1331
+ #: admin/wp-security-database-menu.php:179
1332
+ msgid "Check this if you want the plugin to generate a random 6 character string for the table prefix"
1333
+ msgstr "Schakel dit selectievakje in als u wilt dat de plug-in een willekeurige tekenreeks van 6 tekens genereert voor het voorvoegsel van de tabel"
1334
+
1335
+ # @ all-in-one-wp-security-and-firewall
1336
+ #: admin/wp-security-database-menu.php:180
1337
+ msgid "OR"
1338
+ msgstr "OF"
1339
+
1340
+ # @ all-in-one-wp-security-and-firewall
1341
+ #: admin/wp-security-database-menu.php:182
1342
+ msgid "Choose your own DB prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_"
1343
+ msgstr "Kies uw eigen DB-voorvoegsel door een tekenreeks op te geven die letters en / of cijfers en / of onderstrepingstekens bevat. Voorbeeld: xyz_"
1344
+
1345
+ # @ all-in-one-wp-security-and-firewall
1346
+ #: admin/wp-security-database-menu.php:186
1347
+ msgid "Change DB Prefix"
1348
+ msgstr "Wijzig DB-prefix"
1349
+
1350
+ # @ all-in-one-wp-security-and-firewall
1351
+ #: admin/wp-security-database-menu.php:207
1352
+ #: admin/wp-security-filesystem-menu.php:86
1353
+ msgid "Nonce check failed for manual DB backup operation!"
1354
+ msgstr "Nonce check mislukt voor handmatige DB backup-bewerking!"
1355
+
1356
+ # @ all-in-one-wp-security-and-firewall
1357
+ #: admin/wp-security-database-menu.php:224
1358
+ msgid "DB Backup was successfully completed! You will receive the backup file via email if you have enabled \"Send Backup File Via Email\", otherwise you can retrieve it via FTP from the following directory:"
1359
+ msgstr "DB Backup is succesvol afgerond! U ontvangt het back-upbestand per e-mail als u \"Stuurbestand via e-mail verzenden\" hebt ingeschakeld, anders kunt u het via FTP ophalen uit de volgende map:"
1360
+
1361
+ # @ default
1362
+ #: admin/wp-security-database-menu.php:226
1363
+ msgid "Your DB Backup File location: "
1364
+ msgstr "Uw DB Backup File-locatie: "
1365
+
1366
+ # @ all-in-one-wp-security-and-firewall
1367
+ #: admin/wp-security-database-menu.php:234
1368
+ msgid "DB Backup failed. Please check the permissions of the backup directory."
1369
+ msgstr "DB Backup failed. Please check the permissions of the backup directory."
1370
+
1371
+ # @ all-in-one-wp-security-and-firewall
1372
+ #: admin/wp-security-database-menu.php:251
1373
+ #: admin/wp-security-filescan-menu.php:133
1374
+ msgid "You entered a non numeric value for the \"backup time interval\" field. It has been set to the default value."
1375
+ msgstr "U hebt een niet-numerieke waarde ingevoerd voor het veld \"backup-tijdsinterval\". Het is ingesteld op de standaardwaarde."
1376
+
1377
+ # @ all-in-one-wp-security-and-firewall
1378
+ #: admin/wp-security-database-menu.php:258
1379
+ msgid "You entered a non numeric value for the \"number of backup files to keep\" field. It has been set to the default value."
1380
+ msgstr "U hebt een niet-numerieke waarde ingevoerd voor het veld 'Aantal back-upbestanden behouden'. Het is ingesteld op de standaardwaarde."
1381
+
1382
+ # @ all-in-one-wp-security-and-firewall
1383
+ #: admin/wp-security-database-menu.php:265
1384
+ #: admin/wp-security-filescan-menu.php:163
1385
+ #: admin/wp-security-user-login-menu.php:117
1386
+ msgid "You have entered an incorrect email address format. It has been set to your WordPress admin email as default."
1387
+ msgstr "U hebt een verkeerd e-mailadresindeling ingevoerd. Het is standaard ingesteld op uw WordPress-e-mailadres voor beheerders."
1388
+
1389
+ # @ all-in-one-wp-security-and-firewall
1390
+ #: admin/wp-security-database-menu.php:298
1391
+ msgid "Manual Backup"
1392
+ msgstr "Handmatige back-up"
1393
+
1394
+ # @ all-in-one-wp-security-and-firewall
1395
+ #: admin/wp-security-database-menu.php:304
1396
+ msgid "To create a new DB backup just click on the button below."
1397
+ msgstr "Klik op de onderstaande knop om een nieuwe DB-back-up te maken."
1398
+
1399
+ # @ all-in-one-wp-security-and-firewall
1400
+ #: admin/wp-security-database-menu.php:307
1401
+ msgid "Create DB Backup Now"
1402
+ msgstr "Maak nu DB-back-up"
1403
+
1404
+ # @ all-in-one-wp-security-and-firewall
1405
+ #: admin/wp-security-database-menu.php:311
1406
+ msgid "Automated Scheduled Backups"
1407
+ msgstr "Geautomatiseerde geplande back-ups"
1408
+
1409
+ # @ all-in-one-wp-security-and-firewall
1410
+ #: admin/wp-security-database-menu.php:323
1411
+ msgid "Enable Automated Scheduled Backups"
1412
+ msgstr "Schakel geautomatiseerde geplande back-ups in"
1413
+
1414
+ # @ all-in-one-wp-security-and-firewall
1415
+ #: admin/wp-security-database-menu.php:326
1416
+ msgid "Check this if you want the system to automatically generate backups periodically based on the settings below"
1417
+ msgstr "Selecteer dit als u wilt dat het systeem regelmatig automatisch back-ups genereert op basis van de onderstaande instellingen"
1418
+
1419
+ # @ all-in-one-wp-security-and-firewall
1420
+ #: admin/wp-security-database-menu.php:330
1421
+ msgid "Backup Time Interval"
1422
+ msgstr "Back-up interval tijd"
1423
+
1424
+ # @ all-in-one-wp-security-and-firewall
1425
+ #: admin/wp-security-database-menu.php:333
1426
+ #: admin/wp-security-filescan-menu.php:279
1427
+ msgid "Hours"
1428
+ msgstr "Uren"
1429
+
1430
+ # @ all-in-one-wp-security-and-firewall
1431
+ #: admin/wp-security-database-menu.php:334
1432
+ #: admin/wp-security-filescan-menu.php:280
1433
+ msgid "Days"
1434
+ msgstr "Dagen"
1435
+
1436
+ # @ all-in-one-wp-security-and-firewall
1437
+ #: admin/wp-security-database-menu.php:335
1438
+ #: admin/wp-security-filescan-menu.php:281
1439
+ msgid "Weeks"
1440
+ msgstr "Weken"
1441
+
1442
+ # @ all-in-one-wp-security-and-firewall
1443
+ #: admin/wp-security-database-menu.php:337
1444
+ msgid "Set the value for how often you would like an automated backup to occur"
1445
+ msgstr "Stel de waarde in voor hoe vaak u een automatische back-up wilt laten plaatsvinden"
1446
+
1447
+ # @ all-in-one-wp-security-and-firewall
1448
+ #: admin/wp-security-database-menu.php:341
1449
+ msgid "Number of Backup Files To Keep"
1450
+ msgstr "Aantal back-upbestanden dat moet worden bewaard"
1451
+
1452
+ # @ all-in-one-wp-security-and-firewall
1453
+ #: admin/wp-security-database-menu.php:343
1454
+ msgid "Thie field allows you to choose the number of backup files you would like to keep in the backup directory"
1455
+ msgstr "In dit veld kunt u het aantal back-upbestanden kiezen dat u wilt behouden in de back-upmap"
1456
+
1457
+ # @ all-in-one-wp-security-and-firewall
1458
+ #: admin/wp-security-database-menu.php:347
1459
+ msgid "Send Backup File Via Email"
1460
+ msgstr "Stuur een back-upbestand via e-mail"
1461
+
1462
+ # @ all-in-one-wp-security-and-firewall
1463
+ #: admin/wp-security-database-menu.php:350
1464
+ msgid "Check this if you want the system to email you the backup file after a DB backup has been performed"
1465
+ msgstr "Selecteer dit als u wilt dat het systeem u het back-upbestand e-mailt nadat een DB-back-up is uitgevoerd"
1466
+
1467
+ # @ all-in-one-wp-security-and-firewall
1468
+ #: admin/wp-security-database-menu.php:352
1469
+ #: admin/wp-security-filescan-menu.php:325
1470
+ #: admin/wp-security-user-login-menu.php:235
1471
+ msgid "Enter an email address"
1472
+ msgstr "Voer een e-mail adres in"
1473
+
1474
+ # @ all-in-one-wp-security-and-firewall
1475
+ #: admin/wp-security-database-menu.php:383
1476
+ msgid "Error - Could not get tables or no tables found!"
1477
+ msgstr "Fout - Kan geen tabellen krijgen of geen tabellen gevonden!"
1478
+
1479
+ # @ all-in-one-wp-security-and-firewall
1480
+ #: admin/wp-security-database-menu.php:388
1481
+ msgid "Starting DB prefix change operations....."
1482
+ msgstr "DB-prefix wisseloperaties starten ..."
1483
+
1484
+ # @ all-in-one-wp-security-and-firewall
1485
+ #: admin/wp-security-database-menu.php:390
1486
+ #, php-format
1487
+ msgid "Your WordPress system has a total of %s tables and your new DB prefix will be: %s"
1488
+ msgstr "Uw WordPress-systeem heeft in totaal %s tabellen en uw nieuwe DB-voorvoegsel is: %s"
1489
+
1490
+ # @ all-in-one-wp-security-and-firewall
1491
+ #: admin/wp-security-database-menu.php:396 classes/wp-security-utility.php:206
1492
+ msgid "Failed to make a backup of the wp-config.php file. This operation will not go ahead."
1493
+ msgstr "Kon geen back-up maken van het bestand wp-config.php. Deze operatie zal niet doorgaan."
1494
+
1495
+ # @ all-in-one-wp-security-and-firewall
1496
+ #: admin/wp-security-database-menu.php:400
1497
+ msgid "A backup copy of your wp-config.php file was created successfully!"
1498
+ msgstr "Een reservekopie van uw wp-config.php bestand is succesvol aangemaakt!"
1499
+
1500
+ # @ all-in-one-wp-security-and-firewall
1501
+ #: admin/wp-security-database-menu.php:422
1502
+ #, php-format
1503
+ msgid "%s table name update failed"
1504
+ msgstr "%s tabelnaam bijwerken mislukt"
1505
+
1506
+ # @ all-in-one-wp-security-and-firewall
1507
+ #: admin/wp-security-database-menu.php:434
1508
+ #, php-format
1509
+ msgid "Please change the prefix manually for the above tables to: %s"
1510
+ msgstr "Wijzig de prefixl handmatig voor de bovenstaande tabellen in: %s"
1511
+
1512
+ # @ all-in-one-wp-security-and-firewall
1513
+ #: admin/wp-security-database-menu.php:437
1514
+ #, php-format
1515
+ msgid "%s tables had their prefix updated successfully!"
1516
+ msgstr "%s tabellen hebben de prefix succesvol bijgewerkt!"
1517
+
1518
+ # @ all-in-one-wp-security-and-firewall
1519
+ #: admin/wp-security-database-menu.php:452
1520
+ msgid "wp-config.php file was updated successfully!"
1521
+ msgstr "wp-config.php bestand is succesvol bijgewerkt!"
1522
+
1523
+ # @ all-in-one-wp-security-and-firewall
1524
+ #: admin/wp-security-database-menu.php:455
1525
+ #, php-format
1526
+ msgid ""
1527
+ "The \"wp-config.php\" file was not able to be modified. Please modify this file manually using your favourite editor and search \n"
1528
+ " for variable \"$table_prefix\" and assign the following value to that variable: %s"
1529
+ msgstr ""
1530
+ "Het bestand \"wp-config.php\" kon niet worden gewijzigd. Wijzig dit bestand handmatig met uw favoriete editor en zoek\n"
1531
+ " voor variabele \"$ table_prefix\" en wijs de volgende waarde toe aan die variabele: %s"
1532
+
1533
+ # @ all-in-one-wp-security-and-firewall
1534
+ #: admin/wp-security-database-menu.php:476
1535
+ msgid "There was an error when updating the options table."
1536
+ msgstr "Er is een fout opgetreden bij het bijwerken van de optietabel."
1537
+
1538
+ # @ all-in-one-wp-security-and-firewall
1539
+ #: admin/wp-security-database-menu.php:480
1540
+ msgid "The options table records which had references to the old DB prefix were updated successfully!"
1541
+ msgstr "De optietabelrecords met verwijzingen naar het oude DB-prefix zijn succesvol bijgewerkt!"
1542
+
1543
+ # @ all-in-one-wp-security-and-firewall
1544
+ #: admin/wp-security-database-menu.php:505
1545
+ #, php-format
1546
+ msgid "Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s."
1547
+ msgstr "Fout bij bijwerken van user_meta-tabel waarbij nieuwe meta_key = %s, oude meta_key = %s en user_id = %s."
1548
+
1549
+ # @ all-in-one-wp-security-and-firewall
1550
+ #: admin/wp-security-database-menu.php:511
1551
+ msgid "The usermeta table records which had references to the old DB prefix were updated successfully!"
1552
+ msgstr "De usermeta-tabelrecords die verwijzingen naar het oude DB-prefix hadden, zijn met succes bijgewerkt!"
1553
+
1554
+ # @ all-in-one-wp-security-and-firewall
1555
+ #: admin/wp-security-database-menu.php:513
1556
+ msgid "DB prefix change tasks have been completed."
1557
+ msgstr "Wijzigingen in DB-prefix zijn voltooid."
1558
+
1559
+ # @ all-in-one-wp-security-and-firewall
1560
+ #: admin/wp-security-filescan-menu.php:23
1561
+ #: classes/grade-system/wp-security-feature-item-manager.php:102
1562
+ msgid "File Change Detection"
1563
+ msgstr "Bestanden verander detectie"
1564
+
1565
+ # @ all-in-one-wp-security-and-firewall
1566
+ #: admin/wp-security-filescan-menu.php:24
1567
+ msgid "Malware Scan"
1568
+ msgstr "Malware Scan"
1569
+
1570
+ # @ all-in-one-wp-security-and-firewall
1571
+ #: admin/wp-security-filescan-menu.php:93
1572
+ msgid "There have been no file changes since the last scan."
1573
+ msgstr "Sinds de laatste scan zijn er geen bestandswijzigingen geweest."
1574
+
1575
+ # @ all-in-one-wp-security-and-firewall
1576
+ #: admin/wp-security-filescan-menu.php:103
1577
+ msgid "Nonce check failed for manual file change detection scan operation!"
1578
+ msgstr "Controle nonce is mislukt voor het handmatig scannen van scanbewerkingen voor bestandsverandering!"
1579
+
1580
+ # @ all-in-one-wp-security-and-firewall
1581
+ #: admin/wp-security-filescan-menu.php:110
1582
+ msgid "The plugin has detected that this is your first file change detection scan. The file details from this scan will be used to detect file changes for future scans!"
1583
+ msgstr "De plug-in heeft gedetecteerd dat dit uw eerste detectie-scan voor bestandsverandering is. De bestandsdetails van deze scan worden gebruikt om bestandswijzigingen voor toekomstige scans te detecteren!"
1584
+
1585
+ # @ all-in-one-wp-security-and-firewall
1586
+ #: admin/wp-security-filescan-menu.php:112
1587
+ msgid "Scan Complete - There were no file changes detected!"
1588
+ msgstr "Scannen voltooid - Er zijn geen bestandswijzigingen gedetecteerd!"
1589
+
1590
+ # @ all-in-one-wp-security-and-firewall
1591
+ #: admin/wp-security-filescan-menu.php:201
1592
+ msgid ""
1593
+ "NEW SCAN COMPLETED: The plugin has detected that you have made changes to the \"File Types To Ignore\" or \"Files To Ignore\" fields.\n"
1594
+ " In order to ensure that future scan results are accurate, the old scan data has been refreshed."
1595
+ msgstr ""
1596
+ "NIEUW SCAN VOLTOOID: De plug-in heeft gedetecteerd dat u wijzigingen hebt aangebracht in de velden \"Te negeren bestandstypen\" of \"Te negeren bestanden\".\n"
1597
+ " Om ervoor te zorgen dat toekomstige scanresultaten accuraat zijn, zijn de oude scangegevens vernieuwd."
1598
+
1599
+ # @ all-in-one-wp-security-and-firewall
1600
+ #: admin/wp-security-filescan-menu.php:211
1601
+ msgid "All In One WP Security & Firewall has detected that there was a change in your host's files."
1602
+ msgstr "All In One WP Security & Firewall heeft geconstateerd dat er een wijziging is opgetreden in de bestanden van uw host."
1603
+
1604
+ # @ all-in-one-wp-security-and-firewall
1605
+ #: admin/wp-security-filescan-menu.php:213
1606
+ msgid "View Scan Details & Clear This Message"
1607
+ msgstr "Scaninformatie bekijken & dit bericht wissen"
1608
+
1609
+ # @ all-in-one-wp-security-and-firewall
1610
+ #: admin/wp-security-filescan-menu.php:222
1611
+ msgid "If given an opportunity hackers can insert their code or files into your system which they can then use to carry out malicious acts on your site."
1612
+ msgstr "Als hackers een kans krijgen, kunnen ze hun code of bestanden in uw systeem invoegen die ze vervolgens kunnen gebruiken om kwaadwillende handelingen uit te voeren op uw site."
1613
+
1614
+ # @ all-in-one-wp-security-and-firewall
1615
+ #: admin/wp-security-filescan-menu.php:223
1616
+ msgid "Being informed of any changes in your files can be a good way to quickly prevent a hacker from causing damage to your website."
1617
+ msgstr "Op de hoogte blijven van eventuele wijzigingen in uw bestanden kan een goede manier zijn om snel te voorkomen dat een hacker schade aan uw website veroorzaakt."
1618
+
1619
+ # @ all-in-one-wp-security-and-firewall
1620
+ #: admin/wp-security-filescan-menu.php:224
1621
+ msgid "In general, WordPress core and plugin files and file types such as \".php\" or \".js\" should not change often and when they do, it is important that you are made aware when a change occurs and which file was affected."
1622
+ msgstr "In het algemeen moeten WordPress core- en plugin-bestanden en bestandstypen zoals \".php\" of \".js\" niet vaak veranderen en wanneer dat het geval is, is het belangrijk dat u op de hoogte wordt gesteld wanneer een wijziging plaatsvindt en welk bestand is aangetast."
1623
+
1624
+ # @ all-in-one-wp-security-and-firewall
1625
+ #: admin/wp-security-filescan-menu.php:225
1626
+ msgid "The \"File Change Detection Feature\" will notify you of any file change which occurs on your system, including the addition and deletion of files by performing a regular automated or manual scan of your system's files."
1627
+ msgstr "Met de functie \"Detectie van bestandsverandering\" wordt u op de hoogte gebracht van elke bestandsverandering die zich op uw systeem voordoet, inclusief het toevoegen en verwijderen van bestanden door een regelmatige automatische of handmatige scan van de bestanden van uw systeem uit te voeren."
1628
+
1629
+ # @ all-in-one-wp-security-and-firewall
1630
+ #: admin/wp-security-filescan-menu.php:226
1631
+ msgid "This feature also allows you to exclude certain files or folders from the scan in cases where you know that they change often as part of their normal operation. (For example log files and certain caching plugin files may change often and hence you may choose to exclude such files from the file change detection scan)"
1632
+ msgstr "Met deze functie kunt u ook bepaalde bestanden of mappen uitsluiten van de scan in gevallen waarin u weet dat deze vaak veranderen als onderdeel van hun normale werking. (Logbestanden en bepaalde caching-pluginbestanden kunnen bijvoorbeeld vaak veranderen en daarom kunt u ervoor kiezen dergelijke bestanden uit te sluiten van de scan voor detectie van bestandswijzigingen)"
1633
+
1634
+ # @ all-in-one-wp-security-and-firewall
1635
+ #: admin/wp-security-filescan-menu.php:231
1636
+ msgid "Manual File Change Detection Scan"
1637
+ msgstr "Handmatige detectiescan van een fileverandering"
1638
+
1639
+ # @ all-in-one-wp-security-and-firewall
1640
+ #: admin/wp-security-filescan-menu.php:237
1641
+ msgid "To perform a manual file change detection scan click on the button below."
1642
+ msgstr "Klik op de onderstaande knop om een handmatige detectiescan van bestanden uit te voeren."
1643
+
1644
+ # @ all-in-one-wp-security-and-firewall
1645
+ #: admin/wp-security-filescan-menu.php:240
1646
+ msgid "Perform Scan Now"
1647
+ msgstr "Voer de scans nu uit"
1648
+
1649
+ # @ all-in-one-wp-security-and-firewall
1650
+ #: admin/wp-security-filescan-menu.php:244
1651
+ msgid "View Last Saved File Change Results"
1652
+ msgstr "Laatste resultaten weergeven van het gewijzigde bestand"
1653
+
1654
+ # @ all-in-one-wp-security-and-firewall
1655
+ #: admin/wp-security-filescan-menu.php:250
1656
+ msgid "Click the button below to view the saved file change results from the last scan."
1657
+ msgstr "Klik op de onderstaande knop om de opgeslagen resultaten van de bestandswijziging in de laatste scan te bekijken."
1658
+
1659
+ # @ all-in-one-wp-security-and-firewall
1660
+ #: admin/wp-security-filescan-menu.php:253
1661
+ msgid "View Last File Change"
1662
+ msgstr "Bekijk de laatste bestandswijziging"
1663
+
1664
+ # @ all-in-one-wp-security-and-firewall
1665
+ #: admin/wp-security-filescan-menu.php:257
1666
+ msgid "File Change Detection Settings"
1667
+ msgstr "Instellingen voor een bestandswijzigingsdetectie"
1668
+
1669
+ # @ all-in-one-wp-security-and-firewall
1670
+ #: admin/wp-security-filescan-menu.php:269
1671
+ msgid "Enable Automated File Change Detection Scan"
1672
+ msgstr "Geautomatiseerde detectiesscan inschakelen voor bestands wijzigingen"
1673
+
1674
+ # @ all-in-one-wp-security-and-firewall
1675
+ #: admin/wp-security-filescan-menu.php:272
1676
+ msgid "Check this if you want the system to automatically/periodically scan your files to check for file changes based on the settings below"
1677
+ msgstr "Selecteer dit als u wilt dat het systeem automatisch / periodiek uw bestanden scant om te controleren op bestandswijzigingen op basis van de onderstaande instellingen"
1678
+
1679
+ # @ all-in-one-wp-security-and-firewall
1680
+ #: admin/wp-security-filescan-menu.php:276
1681
+ msgid "Scan Time Interval"
1682
+ msgstr "Scan tijd interval"
1683
+
1684
+ # @ all-in-one-wp-security-and-firewall
1685
+ #: admin/wp-security-filescan-menu.php:283
1686
+ msgid "Set the value for how often you would like a scan to occur"
1687
+ msgstr "Stel de waarde in voor hoe vaak u een scan wilt laten plaatsvinden"
1688
+
1689
+ # @ all-in-one-wp-security-and-firewall
1690
+ #: admin/wp-security-filescan-menu.php:287
1691
+ msgid "File Types To Ignore"
1692
+ msgstr "Bestandstypen die moeten worden genegeerd"
1693
+
1694
+ # @ all-in-one-wp-security-and-firewall
1695
+ #: admin/wp-security-filescan-menu.php:290
1696
+ msgid "Enter each file type or extension on a new line which you wish to exclude from the file change detection scan."
1697
+ msgstr "Voer elk bestandstype of elke extensie in op een nieuwe regel die u wilt uitsluiten van de detectiescan voor bestandsverandering."
1698
+
1699
+ # @ all-in-one-wp-security-and-firewall
1700
+ #: admin/wp-security-filescan-menu.php:294
1701
+ msgid "You can exclude file types from the scan which would not normally pose any security threat if they were changed. These can include things such as image files."
1702
+ msgstr "U kunt bestandstypen uitsluiten van de scan die normaal geen beveiligingsrisico vormen als ze worden gewijzigd. Deze kunnen dingen omvatten zoals afbeeldingsbestanden."
1703
+
1704
+ # @ all-in-one-wp-security-and-firewall
1705
+ #: admin/wp-security-filescan-menu.php:295
1706
+ msgid "Example: If you want the scanner to ignore files of type jpg, png, and bmp, then you would enter the following:"
1707
+ msgstr "Voorbeeld: als u wilt dat de scanner bestanden van het type jpg, png en bmp negeert, voert u het volgende in:"
1708
+
1709
+ # @ all-in-one-wp-security-and-firewall
1710
+ #: admin/wp-security-filescan-menu.php:296
1711
+ msgid "jpg"
1712
+ msgstr "jpg"
1713
+
1714
+ # @ all-in-one-wp-security-and-firewall
1715
+ #: admin/wp-security-filescan-menu.php:297
1716
+ msgid "png"
1717
+ msgstr "png"
1718
+
1719
+ # @ all-in-one-wp-security-and-firewall
1720
+ #: admin/wp-security-filescan-menu.php:298
1721
+ msgid "bmp"
1722
+ msgstr "bmp"
1723
+
1724
+ # @ all-in-one-wp-security-and-firewall
1725
+ #: admin/wp-security-filescan-menu.php:304
1726
+ msgid "Files/Directories To Ignore"
1727
+ msgstr "Bestanden / mappen om te negeren"
1728
+
1729
+ # @ all-in-one-wp-security-and-firewall
1730
+ #: admin/wp-security-filescan-menu.php:307
1731
+ msgid "Enter each file or directory on a new line which you wish to exclude from the file change detection scan."
1732
+ msgstr "Voer elk bestand of elke map in op een nieuwe regel die u wilt uitsluiten van de detectiescan voor bestandsverandering."
1733
+
1734
+ # @ all-in-one-wp-security-and-firewall
1735
+ #: admin/wp-security-filescan-menu.php:311
1736
+ msgid "You can exclude specific files/directories from the scan which would not normally pose any security threat if they were changed. These can include things such as log files."
1737
+ msgstr "U kunt specifieke bestanden / mappen uitsluiten van de scan die normaal geen beveiligingsrisico vormen als ze worden gewijzigd. Deze kunnen dingen omvatten zoals logbestanden."
1738
+
1739
+ # @ all-in-one-wp-security-and-firewall
1740
+ #: admin/wp-security-filescan-menu.php:312
1741
+ msgid "Example: If you want the scanner to ignore certain files in different directories or whole directories, then you would enter the following:"
1742
+ msgstr "Voorbeeld: als u wilt dat de scanner bepaalde bestanden in verschillende mappen of hele mappen negeert, voert u het volgende in:"
1743
+
1744
+ # @ all-in-one-wp-security-and-firewall
1745
+ #: admin/wp-security-filescan-menu.php:313
1746
+ msgid "cache/config/master.php"
1747
+ msgstr "cache/config/master.php"
1748
+
1749
+ # @ all-in-one-wp-security-and-firewall
1750
+ #: admin/wp-security-filescan-menu.php:314
1751
+ msgid "somedirectory"
1752
+ msgstr "een map"
1753
+
1754
+ # @ all-in-one-wp-security-and-firewall
1755
+ #: admin/wp-security-filescan-menu.php:320
1756
+ msgid "Send Email When Change Detected"
1757
+ msgstr "E-mail verzenden bij een gedetecteerde wijziging"
1758
+
1759
+ # @ all-in-one-wp-security-and-firewall
1760
+ #: admin/wp-security-filescan-menu.php:323
1761
+ msgid "Check this if you want the system to email you if a file change was detected"
1762
+ msgstr "Vink dit aan als u wilt dat het systeem u een e-mailstuurt als een bestandsverandering is gedetecteerd"
1763
+
1764
+ # @ all-in-one-wp-security-and-firewall
1765
+ #: admin/wp-security-filescan-menu.php:341
1766
+ msgid "What is Malware?"
1767
+ msgstr "Wat is malware?"
1768
+
1769
+ # @ all-in-one-wp-security-and-firewall
1770
+ #: admin/wp-security-filescan-menu.php:342
1771
+ msgid "The word Malware stands for Malicious Software. It can consist of things like trojan horses, adware, worms, spyware and any other undesirable code which a hacker will try to inject into your website."
1772
+ msgstr "Het woord Malware staat voor Malicious Software. Het kan bestaan uit zaken als trojan horses, adware, worms, spyware en andere ongewenste code die een hacker in uw website zal proberen te injecteren."
1773
+
1774
+ # @ all-in-one-wp-security-and-firewall
1775
+ #: admin/wp-security-filescan-menu.php:343
1776
+ msgid "Often when malware code has been inserted into your site you will normally not notice anything out of the ordinary based on appearances, but it can have a dramatic effect on your site’s search ranking."
1777
+ msgstr "Vaak als malwarecode op uw site is ingevoegd, merkt u normaal gesproken niets buitengewoons op basis van de uiterlijkheden, maar het kan een dramatisch effect hebben op de zoekrangschikking van uw site."
1778
+
1779
+ # @ all-in-one-wp-security-and-firewall
1780
+ #: admin/wp-security-filescan-menu.php:344
1781
+ msgid "This is because the bots and spiders from search engines such as Google have the capability to detect malware when they are indexing the pages on your site, and consequently they can blacklist your website which will in turn affect your search rankings."
1782
+ msgstr "Dit komt omdat de bots en spiders van zoekmachines zoals Google de mogelijkheid hebben om malware te detecteren wanneer ze de pagina's op uw site indexeren, en bijgevolg kunnen zij uw website op een zwarte lijst zetten die op hun beurt van invloed is op uw zoekresultatenrangschikking."
1783
+
1784
+ # @ all-in-one-wp-security-and-firewall
1785
+ #: admin/wp-security-filescan-menu.php:348
1786
+ msgid "Scanning For Malware"
1787
+ msgstr "Scannen op malware"
1788
+
1789
+ # @ all-in-one-wp-security-and-firewall
1790
+ #: admin/wp-security-filescan-menu.php:349
1791
+ msgid "Due to the constantly changing and complex nature of Malware, scanning for such things using a standalone plugin will not work reliably. This is something best done via an external scan of your site regularly."
1792
+ msgstr "Vanwege het voortdurend veranderende en complexe karakter van Malware, zal het scannen van dergelijke dingen met behulp van een stand-alone plug-in niet betrouwbaar werken. Dit is iets dat u best via een externe scan van uw site regelmatig kunt doen."
1793
+
1794
+ # @ all-in-one-wp-security-and-firewall
1795
+ #: admin/wp-security-filescan-menu.php:350
1796
+ msgid "This is why we have created an easy-to-use scanning service which is hosted off our own server which will scan your site for malware once every day and notify you if it finds anything."
1797
+ msgstr "Daarom hebben we een gebruiksvriendelijke scanservice gemaakt die wordt gehost op onze eigen server, die uw site elke dag op malware controleert en u op de hoogte brengt als er iets wordt gevonden."
1798
+
1799
+ # @ all-in-one-wp-security-and-firewall
1800
+ #: admin/wp-security-filescan-menu.php:351
1801
+ msgid "When you sign up for this service you will get the following:"
1802
+ msgstr "Wanneer u zich aanmeldt voor deze service, krijgt u het volgende:"
1803
+
1804
+ # @ all-in-one-wp-security-and-firewall
1805
+ #: admin/wp-security-filescan-menu.php:353
1806
+ msgid "Automatic Daily Scan of 1 Website"
1807
+ msgstr "Automatische dagelijkse scan van 1 website"
1808
+
1809
+ # @ all-in-one-wp-security-and-firewall
1810
+ #: admin/wp-security-filescan-menu.php:354
1811
+ msgid "Automatic Malware & Blacklist Monitoring"
1812
+ msgstr "Automatische Malware & Blacklist Monitoring"
1813
+
1814
+ # @ all-in-one-wp-security-and-firewall
1815
+ #: admin/wp-security-filescan-menu.php:355
1816
+ msgid "Automatic Email Alerting"
1817
+ msgstr "Automatische e-mailwaarschuwing"
1818
+
1819
+ # @ all-in-one-wp-security-and-firewall
1820
+ #: admin/wp-security-filescan-menu.php:356
1821
+ msgid "Site uptime monitoring"
1822
+ msgstr "Site uptime monitoring"
1823
+
1824
+ # @ all-in-one-wp-security-and-firewall
1825
+ #: admin/wp-security-filescan-menu.php:357
1826
+ msgid "Site response time monitoring"
1827
+ msgstr "Bewaking van reactietijd van de site"
1828
+
1829
+ # @ all-in-one-wp-security-and-firewall
1830
+ #: admin/wp-security-filescan-menu.php:358
1831
+ msgid "Malware Cleanup"
1832
+ msgstr "Malware opruimen"
1833
+
1834
+ # @ all-in-one-wp-security-and-firewall
1835
+ #: admin/wp-security-filescan-menu.php:359
1836
+ msgid "Blacklist Removal"
1837
+ msgstr "Blacklist verwijderen"
1838
+
1839
+ # @ all-in-one-wp-security-and-firewall
1840
+ #: admin/wp-security-filescan-menu.php:360
1841
+ msgid "No Contract (Cancel Anytime)"
1842
+ msgstr "Geen contract (op elk moment annuleren)"
1843
+
1844
+ # @ all-in-one-wp-security-and-firewall
1845
+ #: admin/wp-security-filescan-menu.php:362
1846
+ #, php-format
1847
+ msgid "To learn more please %s."
1848
+ msgstr "Voor meer informatie kunt u %s."
1849
+
1850
+ # @ all-in-one-wp-security-and-firewall
1851
+ #: admin/wp-security-filescan-menu.php:391
1852
+ msgid "Latest File Change Scan Results"
1853
+ msgstr "Laatste scanresultaten van een bestand wijziging"
1854
+
1855
+ # @ all-in-one-wp-security-and-firewall
1856
+ #: admin/wp-security-filescan-menu.php:400
1857
+ msgid "The following files were added to your host."
1858
+ msgstr "De volgende bestanden zijn aan uw host toegevoegd."
1859
+
1860
+ # @ all-in-one-wp-security-and-firewall
1861
+ #: admin/wp-security-filescan-menu.php:403
1862
+ #: admin/wp-security-filescan-menu.php:424
1863
+ #: admin/wp-security-filescan-menu.php:448
1864
+ #: admin/wp-security-settings-menu.php:26
1865
+ #: admin/wp-security-settings-menu.php:27
1866
+ msgid "File"
1867
+ msgstr "Bestand"
1868
+
1869
+ # @ all-in-one-wp-security-and-firewall
1870
+ #: admin/wp-security-filescan-menu.php:404
1871
+ #: admin/wp-security-filescan-menu.php:425
1872
+ #: admin/wp-security-filescan-menu.php:449
1873
+ msgid "File Size"
1874
+ msgstr "Bestandsgrootte"
1875
+
1876
+ # @ all-in-one-wp-security-and-firewall
1877
+ #: admin/wp-security-filescan-menu.php:405
1878
+ #: admin/wp-security-filescan-menu.php:426
1879
+ #: admin/wp-security-filescan-menu.php:450
1880
+ msgid "File Modified"
1881
+ msgstr "Bestand gewijzigd"
1882
+
1883
+ # @ all-in-one-wp-security-and-firewall
1884
+ #: admin/wp-security-filescan-menu.php:421
1885
+ msgid "The following files were removed from your host."
1886
+ msgstr "De volgende bestanden zijn van uw host verwijderd."
1887
+
1888
+ # @ all-in-one-wp-security-and-firewall
1889
+ #: admin/wp-security-filescan-menu.php:445
1890
+ msgid "The following files were changed on your host."
1891
+ msgstr "De volgende bestanden zijn gewijzigd op uw host."
1892
+
1893
+ # @ all-in-one-wp-security-and-firewall
1894
+ #: admin/wp-security-filesystem-menu.php:26
1895
+ #: classes/grade-system/wp-security-feature-item-manager.php:66
1896
+ msgid "File Permissions"
1897
+ msgstr "Bestandsrechten"
1898
+
1899
+ # @ all-in-one-wp-security-and-firewall
1900
+ #: admin/wp-security-filesystem-menu.php:27
1901
+ msgid "PHP File Editing"
1902
+ msgstr "PHP Bestand bewerken"
1903
+
1904
+ # @ all-in-one-wp-security-and-firewall
1905
+ #: admin/wp-security-filesystem-menu.php:28
1906
+ msgid "WP File Access"
1907
+ msgstr "WP Toegang tot bestanden"
1908
+
1909
+ # @ all-in-one-wp-security-and-firewall
1910
+ #: admin/wp-security-filesystem-menu.php:29
1911
+ msgid "Host System Logs"
1912
+ msgstr "Logboeken van het hostsysteem"
1913
+
1914
+ # @ all-in-one-wp-security-and-firewall
1915
+ #: admin/wp-security-filesystem-menu.php:96
1916
+ #, php-format
1917
+ msgid "The permissions for %s were succesfully changed to %s"
1918
+ msgstr "De rechten voor %s zijn met succes gewijzigd in %s"
1919
+
1920
+ # @ all-in-one-wp-security-and-firewall
1921
+ #: admin/wp-security-filesystem-menu.php:100
1922
+ #, php-format
1923
+ msgid "Unable to change permissions for %s!"
1924
+ msgstr "Kon de machtiginsinstelling niet wijzigen voor %s!"
1925
+
1926
+ # @ all-in-one-wp-security-and-firewall
1927
+ #: admin/wp-security-filesystem-menu.php:106
1928
+ msgid "File Permissions Scan"
1929
+ msgstr "File machtiginsinstellings Scan"
1930
+
1931
+ # @ all-in-one-wp-security-and-firewall
1932
+ #: admin/wp-security-filesystem-menu.php:109
1933
+ msgid "Your WordPress file and folder permission settings govern the accessability and read/write privileges of the files and folders which make up your WP installation."
1934
+ msgstr "Uw WordPress-machtigingsinstellingen voor bestanden en mappen bepalen de leesbaarheid en lees- en schrijfrechten van de bestanden en mappen die deel uitmaken van uw WP-installatie."
1935
+
1936
+ # @ all-in-one-wp-security-and-firewall
1937
+ #: admin/wp-security-filesystem-menu.php:110
1938
+ msgid "Your WP installation already comes with reasonably secure file permission settings for the filesystem."
1939
+ msgstr "Uw WP-installatie wordt al geleverd met redelijk veilige bestandsmachtigingsinstellingen voor het bestandssysteem."
1940
+
1941
+ # @ all-in-one-wp-security-and-firewall
1942
+ #: admin/wp-security-filesystem-menu.php:111
1943
+ msgid "However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values."
1944
+ msgstr "Soms wijzigen mensen of andere plug-ins de verschillende machtigingsinstellingen van bepaalde kern-WP-mappen of -bestanden zodanig dat ze uiteindelijk hun site minder veilig maken omdat ze de verkeerde toestemmingswaarden hebben gekozen."
1945
+
1946
+ # @ all-in-one-wp-security-and-firewall
1947
+ #: admin/wp-security-filesystem-menu.php:112
1948
+ msgid "This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure."
1949
+ msgstr "Deze functie scant de cruciale WP-kernmappen en -bestanden en markeert eventuele machtigingsinstellingen die onveilig zijn."
1950
+
1951
+ # @ all-in-one-wp-security-and-firewall
1952
+ #: admin/wp-security-filesystem-menu.php:118
1953
+ msgid "WP Directory and File Permissions Scan Results"
1954
+ msgstr "Scanresultaten van de WP-directory en bestandsmachtigingen"
1955
+
1956
+ # @ all-in-one-wp-security-and-firewall
1957
+ #: admin/wp-security-filesystem-menu.php:131
1958
+ #: admin/wp-security-filesystem-menu.php:150
1959
+ msgid "File/Folder"
1960
+ msgstr "Bestand/map"
1961
+
1962
+ # @ all-in-one-wp-security-and-firewall
1963
+ #: admin/wp-security-filesystem-menu.php:132
1964
+ #: admin/wp-security-filesystem-menu.php:151
1965
+ msgid "Current Permissions"
1966
+ msgstr "Huidige machtigingen"
1967
+
1968
+ # @ all-in-one-wp-security-and-firewall
1969
+ #: admin/wp-security-filesystem-menu.php:133
1970
+ #: admin/wp-security-filesystem-menu.php:152
1971
+ msgid "Recommended Permissions"
1972
+ msgstr "Aanbevolen machtigingen"
1973
+
1974
+ # @ all-in-one-wp-security-and-firewall
1975
+ #: admin/wp-security-filesystem-menu.php:134
1976
+ #: admin/wp-security-filesystem-menu.php:153
1977
+ msgid "Recommended Action"
1978
+ msgstr "Aanbevolen actie"
1979
+
1980
+ # @ all-in-one-wp-security-and-firewall
1981
+ #: admin/wp-security-filesystem-menu.php:191
1982
+ msgid "Your PHP file editing settings were saved successfully."
1983
+ msgstr "Uw PHP-bestand bewerken instellingen werden met succes opgeslagen."
1984
+
1985
+ # @ all-in-one-wp-security-and-firewall
1986
+ #: admin/wp-security-filesystem-menu.php:195
1987
+ msgid "Operation failed! Unable to modify or make a backup of wp-config.php file!"
1988
+ msgstr "Operatie mislukt! Niet in staat om te wijzigen of een backup maken van de wp-config. php bestand!"
1989
+
1990
+ # @ all-in-one-wp-security-and-firewall
1991
+ #: admin/wp-security-filesystem-menu.php:201
1992
+ #: classes/grade-system/wp-security-feature-item-manager.php:68
1993
+ msgid "File Editing"
1994
+ msgstr "Bestand bewerken"
1995
+
1996
+ # @ all-in-one-wp-security-and-firewall
1997
+ #: admin/wp-security-filesystem-menu.php:204
1998
+ msgid "The Wordpress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files."
1999
+ msgstr "In het WordPress-dashboard kunnen beheerders standaard PHP-bestanden bewerken, zoals plug-in- en themabestanden."
2000
+
2001
+ # @ all-in-one-wp-security-and-firewall
2002
+ #: admin/wp-security-filesystem-menu.php:205
2003
+ msgid "This is often the first tool an attacker will use if able to login, since it allows code execution."
2004
+ msgstr "Dit is vaak het eerste hulpmiddel dat een aanvaller gebruikt als hij kan inloggen, omdat hiermee een code kan worden uitgevoerd .."
2005
+
2006
+ # @ all-in-one-wp-security-and-firewall
2007
+ #: admin/wp-security-filesystem-menu.php:206
2008
+ msgid "This feature will disable the ability for people to edit PHP files via the dashboard."
2009
+ msgstr "Met deze functie wordt de mogelijkheid voor personen om PHP-bestanden te bewerken via het dashboard uitgeschakeld."
2010
+
2011
+ # @ all-in-one-wp-security-and-firewall
2012
+ #: admin/wp-security-filesystem-menu.php:212
2013
+ msgid "Disable PHP File Editing"
2014
+ msgstr "Schakel PHP-bestands bewerking uit"
2015
+
2016
+ # @ all-in-one-wp-security-and-firewall
2017
+ #: admin/wp-security-filesystem-menu.php:224
2018
+ msgid "Disable Ability To Edit PHP Files"
2019
+ msgstr "Schakel de mogelijkheid om PHP-bestanden te bewerken uit"
2020
+
2021
+ # @ all-in-one-wp-security-and-firewall
2022
+ #: admin/wp-security-filesystem-menu.php:227
2023
+ msgid "Check this if you want to remove the ability for people to edit PHP files via the WP dashboard"
2024
+ msgstr "Vink dit aan als je de mogelijkheid voor mensen om PHP-bestanden te bewerken via het WP-dashboard wilt verwijderen"
2025
+
2026
+ # @ all-in-one-wp-security-and-firewall
2027
+ #: admin/wp-security-filesystem-menu.php:271
2028
+ msgid "You have successfully saved the Prevent Access to Default WP Files configuration."
2029
+ msgstr "U hebt de blokkering van de toegang tot configuratie van de standaard WP-bestanden opgeslagen."
2030
+
2031
+ # @ all-in-one-wp-security-and-firewall
2032
+ #: admin/wp-security-filesystem-menu.php:280
2033
+ msgid "WordPress Files"
2034
+ msgstr "WordPress bestanden"
2035
+
2036
+ # @ all-in-one-wp-security-and-firewall
2037
+ #: admin/wp-security-filesystem-menu.php:283
2038
+ #, php-format
2039
+ msgid "This feature allows you to prevent access to files such as %s, %s and %s which are delivered with all WP installations."
2040
+ msgstr "Met deze functie kunt u de toegang blokkeren tot bestanden zoals %s, %s en %s die bij alle WP-installaties worden geleverd."
2041
+
2042
+ # @ all-in-one-wp-security-and-firewall
2043
+ #: admin/wp-security-filesystem-menu.php:284
2044
+ msgid "By preventing access to these files you are hiding some key pieces of information (such as WordPress version info) from potential hackers."
2045
+ msgstr "Door toegang tot deze bestanden te voorkomen, verbergt u enkele belangrijke stukjes informatie (zoals WordPress-versiegegevens) voor potentiële hackers."
2046
+
2047
+ # @ all-in-one-wp-security-and-firewall
2048
+ #: admin/wp-security-filesystem-menu.php:289
2049
+ msgid "Prevent Access to Default WP Files"
2050
+ msgstr "Voorkom toegang tot standaard WP-bestanden"
2051
+
2052
+ # @ all-in-one-wp-security-and-firewall
2053
+ #: admin/wp-security-filesystem-menu.php:300
2054
+ msgid "Prevent Access to WP Default Install Files"
2055
+ msgstr "Voorkom toegang tot standaard WP-bestanden"
2056
+
2057
+ # @ all-in-one-wp-security-and-firewall
2058
+ #: admin/wp-security-filesystem-menu.php:303
2059
+ msgid "Check this if you want to prevent access to readme.html, license.txt and wp-config-sample.php."
2060
+ msgstr "Vink dit aan als u de toegang tot readme.html, license.txt en wp-config-sample.php wilt voorkomen."
2061
+
2062
+ # @ all-in-one-wp-security-and-firewall
2063
+ #: admin/wp-security-filesystem-menu.php:307
2064
+ msgid "Save Setting"
2065
+ msgstr "Instellingen opslaan"
2066
+
2067
+ # @ all-in-one-wp-security-and-firewall
2068
+ #: admin/wp-security-filesystem-menu.php:331
2069
+ msgid "System Logs"
2070
+ msgstr "Systeemlogboeken"
2071
+
2072
+ # @ all-in-one-wp-security-and-firewall
2073
+ #: admin/wp-security-filesystem-menu.php:334
2074
+ msgid "Sometimes your hosting platform will produce error or warning logs in a file called \"error_log\"."
2075
+ msgstr "Soms produceert uw hostingplatform fout- of waarschuwingslogboeken in een bestand met de naam \"error_log\"."
2076
+
2077
+ # @ all-in-one-wp-security-and-firewall
2078
+ #: admin/wp-security-filesystem-menu.php:335
2079
+ msgid "Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation."
2080
+ msgstr "Afhankelijk van de aard en oorzaak van de fout of waarschuwing, kan uw hostserver meerdere exemplaren van dit bestand maken op verschillende directorylocaties van uw WordPress-installatie."
2081
+
2082
+ # @ all-in-one-wp-security-and-firewall
2083
+ #: admin/wp-security-filesystem-menu.php:336
2084
+ msgid "By occassionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address."
2085
+ msgstr "Door af en toe de inhoud van deze logbestanden te bekijken, kunt u op de hoogte blijven van eventuele onderliggende problemen op uw systeem die u mogelijk moet verhelpen."
2086
+
2087
+ # @ all-in-one-wp-security-and-firewall
2088
+ #: admin/wp-security-filesystem-menu.php:342
2089
+ msgid "View System Logs"
2090
+ msgstr "Bekijk systeemlogboeken"
2091
+
2092
+ # @ all-in-one-wp-security-and-firewall
2093
+ #: admin/wp-security-filesystem-menu.php:347
2094
+ msgid "Enter System Log File Name"
2095
+ msgstr "Voer de bestandsnaam van het systeemlogbestand in"
2096
+
2097
+ # @ all-in-one-wp-security-and-firewall
2098
+ #: admin/wp-security-filesystem-menu.php:349
2099
+ msgid "Enter your system log file name. (Defaults to error_log)"
2100
+ msgstr "Voer uw systeemlogbestandsnaam in. (Standaard naar error_log)"
2101
+
2102
+ # @ all-in-one-wp-security-and-firewall
2103
+ #: admin/wp-security-filesystem-menu.php:352
2104
+ msgid "View Latest System Logs"
2105
+ msgstr "Bekijk de nieuwste systeemlogboeken"
2106
+
2107
+ # @ all-in-one-wp-security-and-firewall
2108
+ #: admin/wp-security-filesystem-menu.php:354
2109
+ msgid "Loading..."
2110
+ msgstr "Bezig met laden..."
2111
+
2112
+ # @ all-in-one-wp-security-and-firewall
2113
+ #: admin/wp-security-filesystem-menu.php:371
2114
+ msgid "No system logs were found!"
2115
+ msgstr "Er zijn geen systeemlogboeken gevonden!"
2116
+
2117
+ # @ all-in-one-wp-security-and-firewall
2118
+ #: admin/wp-security-filesystem-menu.php:424
2119
+ msgid "Set Recommended Permissions"
2120
+ msgstr "Stel aanbevolen machtigingen in"
2121
+
2122
+ # @ all-in-one-wp-security-and-firewall
2123
+ #: admin/wp-security-filesystem-menu.php:430
2124
+ msgid "No Action Required"
2125
+ msgstr "Geen actie nodig"
2126
+
2127
+ # @ all-in-one-wp-security-and-firewall
2128
+ #: admin/wp-security-filesystem-menu.php:470
2129
+ #, php-format
2130
+ msgid "Showing latest entries of error_log file: %s"
2131
+ msgstr "De laatste gegevens van error_log file: %s"
2132
+
2133
+ # @ all-in-one-wp-security-and-firewall
2134
+ #: admin/wp-security-firewall-menu.php:27
2135
+ msgid "Basic Firewall Rules"
2136
+ msgstr "Basic Firewall-regels"
2137
+
2138
+ # @ all-in-one-wp-security-and-firewall
2139
+ #: admin/wp-security-firewall-menu.php:28
2140
+ msgid "Additional Firewall Rules"
2141
+ msgstr "Aanvullende firewallregels"
2142
+
2143
+ # @ all-in-one-wp-security-and-firewall
2144
+ #: admin/wp-security-firewall-menu.php:29
2145
+ msgid "5G Blacklist Firewall Rules"
2146
+ msgstr "5G Blacklist Firewall-regels"
2147
+
2148
+ # @ all-in-one-wp-security-and-firewall
2149
+ #: admin/wp-security-firewall-menu.php:30
2150
+ msgid "Internet Bots"
2151
+ msgstr "Internet Bots"
2152
+
2153
+ # @ all-in-one-wp-security-and-firewall
2154
+ #: admin/wp-security-firewall-menu.php:31
2155
+ msgid "Prevent Hotlinks"
2156
+ msgstr "Voorkom Hotlinks"
2157
+
2158
+ # @ all-in-one-wp-security-and-firewall
2159
+ #: admin/wp-security-firewall-menu.php:32
2160
+ msgid "404 Detection"
2161
+ msgstr "404 Detectie"
2162
+
2163
+ # @ all-in-one-wp-security-and-firewall
2164
+ #: admin/wp-security-firewall-menu.php:115
2165
+ #: admin/wp-security-firewall-menu.php:663 admin/wp-security-spam-menu.php:102
2166
+ #: admin/wp-security-user-registration-menu.php:96
2167
+ msgid "Settings were successfully saved"
2168
+ msgstr "Instellingen zijn succesvol opgeslagen"
2169
+
2170
+ # @ all-in-one-wp-security-and-firewall
2171
+ #: admin/wp-security-firewall-menu.php:124
2172
+ #: admin/wp-security-firewall-menu.php:503
2173
+ msgid "Firewall Settings"
2174
+ msgstr "Firewall-instellingen"
2175
+
2176
+ # @ all-in-one-wp-security-and-firewall
2177
+ #: admin/wp-security-firewall-menu.php:131
2178
+ #, php-format
2179
+ msgid "This should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding."
2180
+ msgstr "Dit zou geen enkele invloed moeten hebben op de algemene functionaliteit van uw site, maar u kunt desgewenst een %s van uw .htaccess-bestand nemen voordat u doorgaat."
2181
+
2182
+ # @ all-in-one-wp-security-and-firewall
2183
+ #: admin/wp-security-firewall-menu.php:132
2184
+ msgid "The features in this tab allow you to activate some basic firewall security protection rules for your site."
2185
+ msgstr "Met de functies op dit tabblad kunt u enkele basisbeveiligingsregels voor firewallbeveiliging voor uw site activeren."
2186
+
2187
+ # @ all-in-one-wp-security-and-firewall
2188
+ #: admin/wp-security-firewall-menu.php:133
2189
+ msgid "The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file."
2190
+ msgstr "De firewallfunctionaliteit wordt bereikt door het invoegen van speciale code in uw momenteel actieve .htaccess-bestand."
2191
+
2192
+ # @ all-in-one-wp-security-and-firewall
2193
+ #: admin/wp-security-firewall-menu.php:143
2194
+ msgid "Attention:"
2195
+ msgstr "Aandacht:"
2196
+
2197
+ # @ all-in-one-wp-security-and-firewall
2198
+ #: admin/wp-security-firewall-menu.php:144
2199
+ msgid "Currently the "
2200
+ msgstr "Momenteel de "
2201
+
2202
+ # @ all-in-one-wp-security-and-firewall
2203
+ #: admin/wp-security-firewall-menu.php:144
2204
+ #: admin/wp-security-firewall-menu.php:191
2205
+ msgid "Enable Pingback Protection"
2206
+ msgstr "Activeer Pingback-bescherming"
2207
+
2208
+ # @ all-in-one-wp-security-and-firewall
2209
+ #: admin/wp-security-firewall-menu.php:144
2210
+ msgid " is active."
2211
+ msgstr " is actief."
2212
+
2213
+ # @ all-in-one-wp-security-and-firewall
2214
+ #: admin/wp-security-firewall-menu.php:145
2215
+ msgid "Please beware that if you are using the WordPress iOS App, then you will need to deactivate this feature in order for the app to work properly."
2216
+ msgstr "Let op: als u de WordPress iOS-app gebruikt, moet u deze functie deactiveren om ervoor te zorgen dat de app correct werkt."
2217
+
2218
+ # @ all-in-one-wp-security-and-firewall
2219
+ #: admin/wp-security-firewall-menu.php:153
2220
+ msgid "Basic Firewall Settings"
2221
+ msgstr "Basis Firewall-instellingen"
2222
+
2223
+ # @ all-in-one-wp-security-and-firewall
2224
+ #: admin/wp-security-firewall-menu.php:161
2225
+ msgid "Enable Basic Firewall Protection"
2226
+ msgstr "Schakel de basis firewallbescherming in"
2227
+
2228
+ # @ all-in-one-wp-security-and-firewall
2229
+ #: admin/wp-security-firewall-menu.php:164
2230
+ msgid "Check this if you want to apply basic firewall protection to your site."
2231
+ msgstr "Selecteer dit als u basisfirewallbeveiliging op uw site wilt toepassen."
2232
+
2233
+ # @ all-in-one-wp-security-and-firewall
2234
+ #: admin/wp-security-firewall-menu.php:168
2235
+ msgid "This setting will implement the following basic firewall protection mechanisms on your site:"
2236
+ msgstr "Met deze instelling worden de volgende basismechanismen voor firewallbescherming op uw site geïmplementeerd:"
2237
+
2238
+ # @ all-in-one-wp-security-and-firewall
2239
+ #: admin/wp-security-firewall-menu.php:169
2240
+ msgid "1) Protect your htaccess file by denying access to it."
2241
+ msgstr "1) Bescherm uw htaccess-bestand door toegang te weigeren."
2242
+
2243
+ # @ all-in-one-wp-security-and-firewall
2244
+ #: admin/wp-security-firewall-menu.php:170
2245
+ msgid "2) Disable the server signature."
2246
+ msgstr "2) Schakel de serverhandsignature uit."
2247
+
2248
+ # @ all-in-one-wp-security-and-firewall
2249
+ #: admin/wp-security-firewall-menu.php:171
2250
+ msgid "3) Limit file upload size (10MB)."
2251
+ msgstr "3) Beperk bestandsgrootte van uploaden (10MB)."
2252
+
2253
+ # @ all-in-one-wp-security-and-firewall
2254
+ #: admin/wp-security-firewall-menu.php:172
2255
+ msgid "4) Protect your wp-config.php file by denying access to it."
2256
+ msgstr "4) Bescherm uw wp-config.php bestand door toegang te weigeren."
2257
+
2258
+ # @ all-in-one-wp-security-and-firewall
2259
+ #: admin/wp-security-firewall-menu.php:173
2260
+ msgid "The above firewall features will be applied via your .htaccess file and should not affect your site's overall functionality."
2261
+ msgstr "De bovenstaande firewall-functies worden toegepast via uw .htaccess-bestand en hebben geen invloed op de algehele functionaliteit van uw site."
2262
+
2263
+ # @ all-in-one-wp-security-and-firewall
2264
+ #: admin/wp-security-firewall-menu.php:174
2265
+ msgid "You are still advised to take a backup of your active .htaccess file just in case."
2266
+ msgstr "U wordt nog steeds geadviseerd om een back-up te maken van uw actieve .htaccess-bestand voor het geval dat."
2267
+
2268
+ # @ all-in-one-wp-security-and-firewall
2269
+ #: admin/wp-security-firewall-menu.php:183
2270
+ msgid "WordPress Pingback Vulnerability Protection"
2271
+ msgstr "WordPress Pingback-beveiligingslek"
2272
+
2273
+ # @ all-in-one-wp-security-and-firewall
2274
+ #: admin/wp-security-firewall-menu.php:194
2275
+ msgid "Check this if you are not using the WP XML-RPC functionality and you want to enable protection against WordPress pingback vulnerabilities."
2276
+ msgstr "Vink dit aan als u de WP XML-RPC-functionaliteit niet gebruikt en u bescherming tegen WordPress-kwetsbaarheden voor Pingback wilt inschakelen."
2277
+
2278
+ # @ all-in-one-wp-security-and-firewall
2279
+ #: admin/wp-security-firewall-menu.php:198
2280
+ msgid "This setting will add a directive in your .htaccess to disable access to the WordPress xmlrpc.php file which is responsible for the XML-RPC functionality such as pingbacks in WordPress."
2281
+ msgstr "Deze instelling voegt een richtlijn toe aan uw .htaccess om de toegang tot het WordPress xmlrpc.php-bestand uit te schakelen dat verantwoordelijk is voor de XML-RPC-functionaliteit zoals pingbacks in WordPress."
2282
+
2283
+ # @ all-in-one-wp-security-and-firewall
2284
+ #: admin/wp-security-firewall-menu.php:199
2285
+ msgid "Hackers can exploit various pingback vulnerabilities in the WordPress XML-RPC API in a number of ways such as:"
2286
+ msgstr "Hackers kunnen verschillende Pingback-kwetsbaarheden in de WordPress XML-RPC API misbruiken op een aantal manieren, zoals:"
2287
+
2288
+ # @ all-in-one-wp-security-and-firewall
2289
+ #: admin/wp-security-firewall-menu.php:200
2290
+ msgid "1) Denial of Service (DoS) attacks"
2291
+ msgstr "1) tegengaan van Service-aanvallen (DoS)"
2292
+
2293
+ # @ all-in-one-wp-security-and-firewall
2294
+ #: admin/wp-security-firewall-menu.php:201
2295
+ msgid "2) Hacking internal routers."
2296
+ msgstr "2) het hacken van interne routers."
2297
+
2298
+ # @ all-in-one-wp-security-and-firewall
2299
+ #: admin/wp-security-firewall-menu.php:202
2300
+ msgid "3) Scanning ports in internal networks to get info from various hosts."
2301
+ msgstr "3) Scannen van poorten in interne netwerken om informatie te krijgen van verschillende hosts."
2302
+
2303
+ # @ all-in-one-wp-security-and-firewall
2304
+ #: admin/wp-security-firewall-menu.php:203
2305
+ msgid "Apart from the security protection benefit, this feature may also help reduce load on your server, particularly if your site currently has a lot of unwanted traffic hitting the XML-RPC API on your installation."
2306
+ msgstr "Afgezien van het voordeel van de beveiligingsbescherming, kan deze functie ook helpen de belasting van uw server te verminderen, vooral als uw site momenteel veel ongewenst verkeer heeft dat de XML-RPC API op uw installatie raakt."
2307
+
2308
+ # @ all-in-one-wp-security-and-firewall
2309
+ #: admin/wp-security-firewall-menu.php:204
2310
+ msgid "NOTE: You should only enable this feature if you are not currently using the XML-RPC functionality on your WordPress installation."
2311
+ msgstr "OPMERKING: u moet deze functie alleen inschakelen als u de XML-RPC-functionaliteit momenteel niet gebruikt in uw WordPress-installatie."
2312
+
2313
+ # @ all-in-one-wp-security-and-firewall
2314
+ #: admin/wp-security-firewall-menu.php:211
2315
+ msgid "Save Basic Firewall Settings"
2316
+ msgstr "Bewaar basisinstellingen van de firewall"
2317
+
2318
+ # @ all-in-one-wp-security-and-firewall
2319
+ #: admin/wp-security-firewall-menu.php:283
2320
+ msgid "You have successfully saved the Additional Firewall Protection configuration"
2321
+ msgstr "U hebt de aanvullende firewallbeveiligingsconfiguratie opgeslagen"
2322
+
2323
+ # @ all-in-one-wp-security-and-firewall
2324
+ #: admin/wp-security-firewall-menu.php:297
2325
+ msgid "Additional Firewall Protection"
2326
+ msgstr "Extra firewallbescherming"
2327
+
2328
+ # @ all-in-one-wp-security-and-firewall
2329
+ #: admin/wp-security-firewall-menu.php:301
2330
+ #, php-format
2331
+ msgid "Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration."
2332
+ msgstr "Vanwege de aard van de code die wordt ingevoegd in het. Htaccess-bestand, kan deze functie sommige functionaliteit voor bepaalde plug-ins onderbreken en daarom wordt u geadviseerd om %s van .htaccess te nemen voordat u deze configuratie toepast."
2333
+
2334
+ # @ all-in-one-wp-security-and-firewall
2335
+ #: admin/wp-security-firewall-menu.php:303
2336
+ msgid "This feature allows you to activate more advanced firewall settings to your site."
2337
+ msgstr "Met deze functie kunt u geavanceerdere firewall-instellingen activeren voor uw site."
2338
+
2339
+ # @ all-in-one-wp-security-and-firewall
2340
+ #: admin/wp-security-firewall-menu.php:304
2341
+ msgid "The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file."
2342
+ msgstr "De geavanceerde firewallregels worden toegepast via het invoegen van speciale code in uw momenteel actieve .htaccess-bestand."
2343
+
2344
+ # @ all-in-one-wp-security-and-firewall
2345
+ #: admin/wp-security-firewall-menu.php:313
2346
+ msgid "Listing of Directory Contents"
2347
+ msgstr "Vermelding van directoryinhoud"
2348
+
2349
+ # @ all-in-one-wp-security-and-firewall
2350
+ #: admin/wp-security-firewall-menu.php:322
2351
+ #: classes/grade-system/wp-security-feature-item-manager.php:88
2352
+ msgid "Disable Index Views"
2353
+ msgstr "Indexweergaven uitschakelen"
2354
+
2355
+ # @ all-in-one-wp-security-and-firewall
2356
+ #: admin/wp-security-firewall-menu.php:325
2357
+ msgid "Check this if you want to disable directory and file listing."
2358
+ msgstr "Selecteer dit als u directory- en bestandsvermeldingen wilt uitschakelen."
2359
+
2360
+ # @ all-in-one-wp-security-and-firewall
2361
+ #: admin/wp-security-firewall-menu.php:330
2362
+ msgid "By default, an Apache server will allow the listing of the contents of a directory if it doesn't contain an index.php file."
2363
+ msgstr "Standaard staat een Apache-server de vermelding van de inhoud van een map toe als deze geen index.php-bestand bevat."
2364
+
2365
+ # @ all-in-one-wp-security-and-firewall
2366
+ #: admin/wp-security-firewall-menu.php:332
2367
+ msgid "This feature will prevent the listing of contents for all directories."
2368
+ msgstr "Deze functie voorkomt dat de inhoud van alle mappen wordt vermeld."
2369
+
2370
+ # @ all-in-one-wp-security-and-firewall
2371
+ #: admin/wp-security-firewall-menu.php:334
2372
+ msgid "NOTE: In order for this feature to work \"AllowOverride\" of the Indexes directive must be enabled in your httpd.conf file. Ask your hosting provider to check this if you don't have access to httpd.conf"
2373
+ msgstr "OPMERKING: Om deze functie te laten werken, moet \"AllowOverride\" van de Indexes-instructie zijn ingeschakeld in uw httpd.conf-bestand. Vraag uw hostingprovider om dit te controleren als u geen toegang heeft tot httpd.conf"
2374
+
2375
+ # @ all-in-one-wp-security-and-firewall
2376
+ #: admin/wp-security-firewall-menu.php:343
2377
+ msgid "Trace and Track"
2378
+ msgstr "Traceren en volgen"
2379
+
2380
+ # @ all-in-one-wp-security-and-firewall
2381
+ #: admin/wp-security-firewall-menu.php:352
2382
+ #: classes/grade-system/wp-security-feature-item-manager.php:89
2383
+ msgid "Disable Trace and Track"
2384
+ msgstr "Schakel Traceren en volgen uit"
2385
+
2386
+ # @ all-in-one-wp-security-and-firewall
2387
+ #: admin/wp-security-firewall-menu.php:355
2388
+ msgid "Check this if you want to disable trace and track."
2389
+ msgstr "Selecteer dit als u traceren en volgen wilt uitschakelen."
2390
+
2391
+ # @ all-in-one-wp-security-and-firewall
2392
+ #: admin/wp-security-firewall-menu.php:360
2393
+ msgid "HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information."
2394
+ msgstr "HTTP Trace Attack (XST) kan worden gebruikt om headeraanvragen in te dienen en om cookies en andere informatie te bemachtigen."
2395
+
2396
+ # @ all-in-one-wp-security-and-firewall
2397
+ #: admin/wp-security-firewall-menu.php:362
2398
+ msgid "This hacking technique is usually used together with cross site scripting attacks (XSS)."
2399
+ msgstr "Deze hacktechniek wordt meestal gebruikt in combinatie met cross-site scripting attacks (XSS)."
2400
+
2401
+ # @ all-in-one-wp-security-and-firewall
2402
+ #: admin/wp-security-firewall-menu.php:364
2403
+ msgid "Disabling trace and track on your site will help prevent HTTP Trace attacks."
2404
+ msgstr "Als u tracering en volgen uitschakelt op uw site, voorkomt u HTTP Trace-aanvallen."
2405
+
2406
+ # @ all-in-one-wp-security-and-firewall
2407
+ #: admin/wp-security-firewall-menu.php:373
2408
+ msgid "Proxy Comment Posting"
2409
+ msgstr "Proxy-opmerkingen plaatsen"
2410
+
2411
+ # @ all-in-one-wp-security-and-firewall
2412
+ #: admin/wp-security-firewall-menu.php:383
2413
+ msgid "Forbid Proxy Comment Posting"
2414
+ msgstr "Verbieden het plaatsen van Proxy opmerkingen"
2415
+
2416
+ # @ all-in-one-wp-security-and-firewall
2417
+ #: admin/wp-security-firewall-menu.php:386
2418
+ msgid "Check this if you want to forbid proxy comment posting."
2419
+ msgstr "Vink dit aan als u het plaatsen van proxycommentaar wilt verbieden."
2420
+
2421
+ # @ all-in-one-wp-security-and-firewall
2422
+ #: admin/wp-security-firewall-menu.php:391
2423
+ msgid "This setting will deny any requests that use a proxy server when posting comments."
2424
+ msgstr "Met deze instelling worden aanvragen die gebruikmaken van een proxyserver geweigerd bij het plaatsen van opmerkingen."
2425
+
2426
+ # @ all-in-one-wp-security-and-firewall
2427
+ #: admin/wp-security-firewall-menu.php:392
2428
+ msgid "By forbidding proxy comments you are in effect eliminating some SPAM and other proxy requests."
2429
+ msgstr "Door proxy-opmerkingen te verbieden, elimineert u in feite enkele SPAM- en andere proxyverzoeken."
2430
+
2431
+ # @ all-in-one-wp-security-and-firewall
2432
+ #: admin/wp-security-firewall-menu.php:401
2433
+ msgid "Bad Query Strings"
2434
+ msgstr "Slechte queryreeksen"
2435
+
2436
+ # @ all-in-one-wp-security-and-firewall
2437
+ #: admin/wp-security-firewall-menu.php:411
2438
+ msgid "Deny Bad Query Strings"
2439
+ msgstr "Slechte queryreeksen weigeren"
2440
+
2441
+ # @ all-in-one-wp-security-and-firewall
2442
+ #: admin/wp-security-firewall-menu.php:414
2443
+ msgid "This will help protect you against malicious queries via XSS."
2444
+ msgstr "Dit helpt je te beschermen tegen kwaadwillige vragen via XSS."
2445
+
2446
+ # @ all-in-one-wp-security-and-firewall
2447
+ #: admin/wp-security-firewall-menu.php:419
2448
+ msgid "This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS."
2449
+ msgstr "Deze functie schrijft regels in uw. Htaccess-bestand om kwaadwillende reeksaanvallen op uw site met XSS te voorkomen."
2450
+
2451
+ # @ all-in-one-wp-security-and-firewall
2452
+ #: admin/wp-security-firewall-menu.php:420
2453
+ msgid "NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality."
2454
+ msgstr "OPMERKING: sommige van deze tekenreeksen kunnen worden gebruikt voor plug-ins of thema's en daarom kan dit sommige functionaliteit tegenwerken."
2455
+
2456
+ # @ all-in-one-wp-security-and-firewall
2457
+ #: admin/wp-security-firewall-menu.php:421
2458
+ #: admin/wp-security-firewall-menu.php:451
2459
+ msgid "You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature."
2460
+ msgstr "Daarom wordt u ten zeerste aangeraden een back-up van uw actieve .htaccess-bestand te maken voordat u deze functie toepast."
2461
+
2462
+ # @ all-in-one-wp-security-and-firewall
2463
+ #: admin/wp-security-firewall-menu.php:430
2464
+ #: classes/grade-system/wp-security-feature-item-manager.php:92
2465
+ msgid "Advanced Character String Filter"
2466
+ msgstr "Geavanceerde Character String Filter"
2467
+
2468
+ # @ all-in-one-wp-security-and-firewall
2469
+ #: admin/wp-security-firewall-menu.php:440
2470
+ msgid "Enable Advanced Character String Filter"
2471
+ msgstr "Geavanceerde Advanced Character String filter inschakelen"
2472
+
2473
+ # @ all-in-one-wp-security-and-firewall
2474
+ #: admin/wp-security-firewall-menu.php:443
2475
+ msgid "This will block bad character matches from XSS."
2476
+ msgstr "Hiermee worden verkeerde karakterovereenkomsten van XSS geblokkeerd."
2477
+
2478
+ # @ all-in-one-wp-security-and-firewall
2479
+ #: admin/wp-security-firewall-menu.php:448
2480
+ msgid "This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS)."
2481
+ msgstr "Dit is een geavanceerd character string filter om te voorkomen dat kwaadwillende string attacks op uw site die afkomstig zijn van Cross Site Scripting (XSS)."
2482
+
2483
+ # @ all-in-one-wp-security-and-firewall
2484
+ #: admin/wp-security-firewall-menu.php:449
2485
+ msgid "This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query."
2486
+ msgstr "Deze instelling komt overeen met veelgebruikte kwaadwillende stringpatronen en exploits en zal een 403-fout produceren voor de hacker die de query probeert uit te voeren."
2487
+
2488
+ # @ all-in-one-wp-security-and-firewall
2489
+ #: admin/wp-security-firewall-menu.php:450
2490
+ msgid "NOTE: Some strings for this setting might break some functionality."
2491
+ msgstr "OPMERKING: Sommige strings met deze instelling kunnen sommige functies schenden."
2492
+
2493
+ # @ all-in-one-wp-security-and-firewall
2494
+ #: admin/wp-security-firewall-menu.php:459
2495
+ msgid "Save Additional Firewall Settings"
2496
+ msgstr "Sla extra firewall-instellingen op"
2497
+
2498
+ # @ all-in-one-wp-security-and-firewall
2499
+ #: admin/wp-security-firewall-menu.php:494
2500
+ msgid "You have successfully saved the 5G Firewall Protection configuration"
2501
+ msgstr "U hebt de configuratie van de 5G-firewallbescherming succesvol opgeslagen"
2502
+
2503
+ # @ all-in-one-wp-security-and-firewall
2504
+ #: admin/wp-security-firewall-menu.php:507
2505
+ #, php-format
2506
+ msgid "This feature allows you to activate the 5G firewall security protection rules designed and produced by %s."
2507
+ msgstr "Met deze functie kunt u de beveiligings beschermingsregels van de 5G-firewall activeren die door %s zijn ontworpen en geproduceerd."
2508
+
2509
+ # @ all-in-one-wp-security-and-firewall
2510
+ #: admin/wp-security-firewall-menu.php:508
2511
+ msgid "The 5G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website."
2512
+ msgstr "De 5G Blacklist is een eenvoudige, flexibele zwarte lijst die helpt het aantal schadelijke URL-verzoeken te verminderen die op uw website terechtkomen."
2513
+
2514
+ # @ all-in-one-wp-security-and-firewall
2515
+ #: admin/wp-security-firewall-menu.php:509
2516
+ msgid "The added advantage of applying the 5G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar."
2517
+ msgstr "Het extra voordeel van het toepassen van de 5G-firewall op uw site is dat deze door de mensen op PerishablePress.com is getest en bevestigd als een optimale en minst verstorende set van .htaccess-beveiligingsregels voor algemene WP-sites die op een Apache-server of vergelijkbaar worden uitgevoerd ."
2518
+
2519
+ # @ all-in-one-wp-security-and-firewall
2520
+ #: admin/wp-security-firewall-menu.php:510
2521
+ #, php-format
2522
+ msgid "Therefore the 5G firewall rules should not have any impact on your site's general functionality but if you wish you can take a %s of your .htaccess file before proceeding."
2523
+ msgstr "Daarom mogen de 5G-firewallregels geen invloed hebben op de algemene functionaliteit van uw site, maar u kunt desgewenst een %s van uw .htaccess-bestand nemen voordat u doorgaat."
2524
+
2525
+ # @ all-in-one-wp-security-and-firewall
2526
+ #: admin/wp-security-firewall-menu.php:516
2527
+ msgid "5G Blacklist/Firewall Settings"
2528
+ msgstr "5G Blacklist / Firewall-instellingen"
2529
+
2530
+ # @ all-in-one-wp-security-and-firewall
2531
+ #: admin/wp-security-firewall-menu.php:528
2532
+ msgid "Enable 5G Firewall Protection"
2533
+ msgstr "Schakel 5G Firewall-bescherming in"
2534
+
2535
+ # @ all-in-one-wp-security-and-firewall
2536
+ #: admin/wp-security-firewall-menu.php:531
2537
+ msgid "Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site."
2538
+ msgstr "Vink dit aan als u de 5G Blacklist-firewallbescherming van perishablepress.com op uw site wilt toepassen."
2539
+
2540
+ # @ all-in-one-wp-security-and-firewall
2541
+ #: admin/wp-security-firewall-menu.php:535
2542
+ msgid "This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:"
2543
+ msgstr "Deze instelling implementeert de 5G-firewallbeveiligingsmechanismen op uw site die de volgende zaken bevatten:"
2544
+
2545
+ # @ all-in-one-wp-security-and-firewall
2546
+ #: admin/wp-security-firewall-menu.php:536
2547
+ msgid "1) Block forbidden characters commonly used in exploitative attacks."
2548
+ msgstr "1) Blokkeer verboden karakters die vaak worden gebruikt bij exploitative attacks."
2549
+
2550
+ # @ all-in-one-wp-security-and-firewall
2551
+ #: admin/wp-security-firewall-menu.php:537
2552
+ msgid "2) Block malicious encoded URL characters such as the \".css(\" string."
2553
+ msgstr "2) Blokkeer kwaadwillende gecodeerde URL-tekens, zoals de tekenreeks \".css (\"."
2554
+
2555
+ # @ all-in-one-wp-security-and-firewall
2556
+ #: admin/wp-security-firewall-menu.php:538
2557
+ msgid "3) Guard against the common patterns and specific exploits in the root portion of targeted URLs."
2558
+ msgstr "3) Bescherm uzelf tegen de algemene patronen en specifieke exploits in het rootgedeelte van gerichte URL's."
2559
+
2560
+ # @ all-in-one-wp-security-and-firewall
2561
+ #: admin/wp-security-firewall-menu.php:539
2562
+ msgid "4) Stop attackers from manipulating query strings by disallowing illicit characters."
2563
+ msgstr "4) Stop aanvallers met het manipuleren van query strings door ongeoorloofde characters niet toe te staan."
2564
+
2565
+ # @ all-in-one-wp-security-and-firewall
2566
+ #: admin/wp-security-firewall-menu.php:540
2567
+ msgid "....and much more."
2568
+ msgstr "....en veel meer."
2569
+
2570
+ # @ all-in-one-wp-security-and-firewall
2571
+ #: admin/wp-security-firewall-menu.php:546
2572
+ msgid "Save 5G Firewall Settings"
2573
+ msgstr "Sla 5G Firewall-instellingen op"
2574
+
2575
+ # @ all-in-one-wp-security-and-firewall
2576
+ #: admin/wp-security-firewall-menu.php:577
2577
+ msgid "The Internet bot settings were successfully saved"
2578
+ msgstr "De internetbot-instellingen zijn succesvol opgeslagen"
2579
+
2580
+ # @ all-in-one-wp-security-and-firewall
2581
+ #: admin/wp-security-firewall-menu.php:581
2582
+ msgid "Internet Bot Settings"
2583
+ msgstr "Internet Bot-instellingen"
2584
+
2585
+ # @ all-in-one-wp-security-and-firewall
2586
+ #: admin/wp-security-firewall-menu.php:588
2587
+ #, php-format
2588
+ msgid "%s?"
2589
+ msgstr "%s?"
2590
+
2591
+ # @ all-in-one-wp-security-and-firewall
2592
+ #: admin/wp-security-firewall-menu.php:590
2593
+ msgid "A bot is a piece of software which runs on the Internet and performs automatic tasks. For example when Google indexes your pages it uses automatic bots to achieve this task."
2594
+ msgstr "Een bot is een stukje software dat op internet wordt uitgevoerd en automatische taken uitvoert. Wanneer Google bijvoorbeeld uw pagina's indexeert, gebruikt het automatische bots om deze taak te bereiken."
2595
+
2596
+ # @ all-in-one-wp-security-and-firewall
2597
+ #: admin/wp-security-firewall-menu.php:591
2598
+ msgid "A lot of bots are legitimate and non-malicous but not all bots are good and often you will find some which try to impersonate legitimate bots such as \"Googlebot\" but in reality they have nohing to do with Google at all."
2599
+ msgstr "Veel bots zijn legitiem en non-malicous, maar niet alle bots zijn goed en vaak zul je er een paar vinden die proberen om zich uit te geven voor legitieme bots zoals 'Googlebot', maar in werkelijkheid hebben ze helemaal niets met Google te maken."
2600
+
2601
+ # @ all-in-one-wp-security-and-firewall
2602
+ #: admin/wp-security-firewall-menu.php:592
2603
+ msgid "Although most of the bots out there are relatively harmless sometimes website owners want to have more control over which bots they allow into their site."
2604
+ msgstr "Hoewel de meeste bots die er zijn relatief onschadelijk zijn, willen website-eigenaren meer controle over welke bots ze op hun site toelaten."
2605
+
2606
+ # @ all-in-one-wp-security-and-firewall
2607
+ #: admin/wp-security-firewall-menu.php:593
2608
+ msgid "This feature allows you to block bots which are impersonating as a Googlebot but actually aren't. (In other words they are fake Google bots)"
2609
+ msgstr "Met deze functie kunt u bots blokkeren die zich voordoen als een Googlebot, maar dat in werkelijkheid niet zijn. (Met andere woorden: het zijn valse Google-bots)"
2610
+
2611
+ # @ all-in-one-wp-security-and-firewall
2612
+ #: admin/wp-security-firewall-menu.php:594
2613
+ msgid "Googlebots have a unique indentity which cannot easily be forged and this feature will indentify any fake Google bots and block them from reading your site's pages."
2614
+ msgstr "Google Bots hebben een unieke identiteit die niet gemakkelijk kan worden vervalst en deze functie identificeert eventuele nep-bots van Google en voorkomt dat ze de pagina's van uw site lezen."
2615
+
2616
+ # @ all-in-one-wp-security-and-firewall
2617
+ #: admin/wp-security-firewall-menu.php:600
2618
+ msgid "<strong>Attention</strong>: Sometimes non-malicious Internet organizations might have bots which impersonate as a \"Googlebot\"."
2619
+ msgstr "<strong> Let op </ strong>: soms hebben niet-kwaadwillende internetorganisaties mogelijk bots die zich voordoen als een 'Googlebot'."
2620
+
2621
+ # @ all-in-one-wp-security-and-firewall
2622
+ #: admin/wp-security-firewall-menu.php:601
2623
+ msgid "Just be aware that if you activate this feature the plugin will block all bots which use the \"Googlebot\" string in their User Agent information but are NOT officially from Google (irrespective whether they are malicious or not)."
2624
+ msgstr "Houd er rekening mee dat als u deze functie activeert, de plug-in alle bots die de 'Googlebot' string gebruiken blokkeert in hun User Agent-informatie, maar niet officieel van Google is (ongeacht of ze kwaadaardig zijn of niet)."
2625
+
2626
+ # @ all-in-one-wp-security-and-firewall
2627
+ #: admin/wp-security-firewall-menu.php:602
2628
+ msgid "All other bots from other organizations such as \"Yahoo\", \"Bing\" etc will not be affected by this feature."
2629
+ msgstr "Alle andere bots van andere organisaties zoals \"Yahoo\", \"Bing\" enz. Worden niet beïnvloed door deze functie."
2630
+
2631
+ # @ all-in-one-wp-security-and-firewall
2632
+ #: admin/wp-security-firewall-menu.php:608
2633
+ #: admin/wp-security-firewall-menu.php:618
2634
+ #: classes/grade-system/wp-security-feature-item-manager.php:94
2635
+ msgid "Block Fake Googlebots"
2636
+ msgstr "Nep Googlebots blokkeren"
2637
+
2638
+ # @ all-in-one-wp-security-and-firewall
2639
+ #: admin/wp-security-firewall-menu.php:621
2640
+ msgid "Check this if you want to block all fake Googlebots."
2641
+ msgstr "Vink dit aan als je alle nep-Googlebots wilt blokkeren."
2642
+
2643
+ # @ all-in-one-wp-security-and-firewall
2644
+ #: admin/wp-security-firewall-menu.php:625
2645
+ msgid "This feature will check if the User Agent information of a bot contains the string \"Googlebot\"."
2646
+ msgstr "Deze functie controleert of de User Agent-informatie van een bot de string \"Googlebot\" bevat."
2647
+
2648
+ # @ all-in-one-wp-security-and-firewall
2649
+ #: admin/wp-security-firewall-menu.php:626
2650
+ msgid "It will then perform a few tests to verify if the bot is legitimately from Google and if so it will allow the bot to proceed."
2651
+ msgstr "Vervolgens voert het een paar tests uit om te controleren of de bot legitiem van Google is en zo ja, dan kan de bot doorgaan."
2652
+
2653
+ # @ all-in-one-wp-security-and-firewall
2654
+ #: admin/wp-security-firewall-menu.php:627
2655
+ msgid "If the bot fails the checks then the plugin will mark it as being a fake Googlebot and it will block it"
2656
+ msgstr "Als de bot niet voldoet aan de controles, markeert de plug-in deze als een nep-Googlebot en blokkeert deze"
2657
+
2658
+ # @ all-in-one-wp-security-and-firewall
2659
+ #: admin/wp-security-firewall-menu.php:634
2660
+ msgid "Save Internet Bot Settings"
2661
+ msgstr "Sla de internet-botinstellingen op"
2662
+
2663
+ # @ all-in-one-wp-security-and-firewall
2664
+ #: admin/wp-security-firewall-menu.php:671
2665
+ #: admin/wp-security-firewall-menu.php:693
2666
+ #: classes/grade-system/wp-security-feature-item-manager.php:32
2667
+ msgid "Prevent Image Hotlinking"
2668
+ msgstr "Voorkom dat afbeeldingen hotlinken worden"
2669
+
2670
+ # @ all-in-one-wp-security-and-firewall
2671
+ #: admin/wp-security-firewall-menu.php:674
2672
+ msgid "A Hotlink is where someone displays an image on their site which is actually located on your site by using a direct link to the source of the image on your server."
2673
+ msgstr "Een hotlink is waar iemand een afbeelding op zijn site weergeeft die zich daadwerkelijk op uw site bevindt door een directe link naar de bron van de afbeelding op uw server te gebruiken."
2674
+
2675
+ # @ all-in-one-wp-security-and-firewall
2676
+ #: admin/wp-security-firewall-menu.php:675
2677
+ msgid "Due to the fact that the image being displayed on the other person's site is coming from your server, this can cause leaking of bandwidth and resources for you because your server has to present this image for the people viewing it on someone elses's site."
2678
+ msgstr "Vanwege het feit dat de afbeelding die wordt weergegeven op de site van de andere persoon afkomstig is van uw server, kan dit leiden tot lekken van bandbreedte en bronnen voor u omdat uw server deze afbeelding moet presenteren voor de mensen die deze op de website van iemand anders bekijken."
2679
+
2680
+ # @ all-in-one-wp-security-and-firewall
2681
+ #: admin/wp-security-firewall-menu.php:676
2682
+ msgid "This feature will prevent people from directly hotlinking images from your site's pages by writing some directives in your .htaccess file."
2683
+ msgstr "Met deze functie wordt voorkomen dat mensen rechtstreeks afbeeldingen van de pagina's van uw site hotlinken door enkele richtlijnen in uw .htaccess-bestand te schrijven."
2684
+
2685
+ # @ all-in-one-wp-security-and-firewall
2686
+ #: admin/wp-security-firewall-menu.php:681
2687
+ msgid "Prevent Hotlinking"
2688
+ msgstr "Voorkomen hotlinken"
2689
+
2690
+ # @ all-in-one-wp-security-and-firewall
2691
+ #: admin/wp-security-firewall-menu.php:696
2692
+ msgid "Check this if you want to prevent hotlinking to images on your site."
2693
+ msgstr "Vink dit aan als u wilt voorkomen dat hotlinks worden toegevoegd aan afbeeldingen op uw site."
2694
+
2695
+ # @ all-in-one-wp-security-and-firewall
2696
+ #: admin/wp-security-firewall-menu.php:716
2697
+ msgid "Nonce check failed for delete all 404 event logs operation!"
2698
+ msgstr "Nonce check mislukt voor het verwijderen van alle 404 event logs operatie!"
2699
+
2700
+ # @ all-in-one-wp-security-and-firewall
2701
+ #: admin/wp-security-firewall-menu.php:727
2702
+ msgid "404 Detection Feature - Delete all 404 event logs operation failed!"
2703
+ msgstr "404 Detectiefunctie - Verwijderen van alle 404-gebeurtenislogboeken is mislukt!"
2704
+
2705
+ # @ all-in-one-wp-security-and-firewall
2706
+ #: admin/wp-security-firewall-menu.php:731
2707
+ msgid "All 404 event logs were deleted from the DB successfully!"
2708
+ msgstr "Alle 404-gebeurtenislogboeken zijn met succes uit de database verwijderd!"
2709
+
2710
+ # @ all-in-one-wp-security-and-firewall
2711
+ #: admin/wp-security-firewall-menu.php:757
2712
+ #: admin/wp-security-user-login-menu.php:110
2713
+ msgid "You entered a non numeric value for the lockout time length field. It has been set to the default value."
2714
+ msgstr "U hebt een niet-numerieke waarde ingevoerd voor het veld lockout time length. Het is ingesteld op de standaardwaarde."
2715
+
2716
+ # @ all-in-one-wp-security-and-firewall
2717
+ #: admin/wp-security-firewall-menu.php:763
2718
+ msgid "You entered an incorrect format for the \"Redirect URL\" field. It has been set to the default value."
2719
+ msgstr "U hebt een verkeerd formaat ingevoerd voor het veld \"Omleidings-URL\". Het is ingesteld op de standaardwaarde."
2720
+
2721
+ # @ all-in-one-wp-security-and-firewall
2722
+ #: admin/wp-security-firewall-menu.php:795
2723
+ msgid "404 Detection Configuration"
2724
+ msgstr "404 Detectieconfiguratie"
2725
+
2726
+ # @ all-in-one-wp-security-and-firewall
2727
+ #: admin/wp-security-firewall-menu.php:798
2728
+ msgid "A 404 or Not Found error occurs when somebody tries to access a non-existent page on your website."
2729
+ msgstr "Er treedt een niet gevonden 404-fout op als iemand probeert een niet-bestaande pagina op uw website te openen."
2730
+
2731
+ # @ all-in-one-wp-security-and-firewall
2732
+ #: admin/wp-security-firewall-menu.php:799
2733
+ msgid "Typically, most 404 errors happen quite innocently when people have mis-typed a URL or used an old link to page which doesn't exist anymore."
2734
+ msgstr "Meestal gebeuren de meeste 404-fouten vrij onschuldig wanneer mensen een URL verkeerd hebben getypt of een oude link naar een pagina hebben gebruikt die niet meer bestaat."
2735
+
2736
+ # @ all-in-one-wp-security-and-firewall
2737
+ #: admin/wp-security-firewall-menu.php:800
2738
+ msgid "However, in some cases you may find many repeated 404 errors which occur in a relatively short space of time and from the same IP address which are all attempting to access a variety of non-existent page URLs."
2739
+ msgstr "In sommige gevallen kunt u echter veel herhaalde 404-fouten vinden die zich in een relatief korte tijdspanne voordoen en van hetzelfde IP-adres die allemaal proberen toegang te krijgen tot een verscheidenheid aan niet-bestaande pagina-URL's."
2740
+
2741
+ # @ all-in-one-wp-security-and-firewall
2742
+ #: admin/wp-security-firewall-menu.php:801
2743
+ msgid "Such behaviour can mean that a hacker might be trying to find a particular page or URL for sinister reasons."
2744
+ msgstr "Dergelijk gedrag kan betekenen dat een hacker om een sinistere reden een bepaalde pagina of URL probeert te vinden."
2745
+
2746
+ # @ all-in-one-wp-security-and-firewall
2747
+ #: admin/wp-security-firewall-menu.php:802
2748
+ msgid "This feature allows you to monitor all 404 events which occur on your site, and it also gives you the option of blocking IP addresses for a configured length of time."
2749
+ msgstr "Met deze functie kunt u alle 404-gebeurtenissen op uw site volgen en kunt u ook IP-adressen gedurende een ingestelde tijdsduur blokkeren."
2750
+
2751
+ # @ all-in-one-wp-security-and-firewall
2752
+ #: admin/wp-security-firewall-menu.php:803
2753
+ msgid "If you want to temporarily block an IP address, simply click the \"Temp Block\" link for the applicable IP entry in the \"404 Event Logs\" table below."
2754
+ msgstr "Als u tijdelijk een IP-adres wilt blokkeren, klikt u eenvoudig op de koppeling \"Temp Block\" voor het toepasselijke IP-item in de tabel \"404 Event Logs\" hieronder."
2755
+
2756
+ # @ all-in-one-wp-security-and-firewall
2757
+ #: admin/wp-security-firewall-menu.php:808
2758
+ msgid "404 Detection Options"
2759
+ msgstr "404 Detectieopties"
2760
+
2761
+ # @ all-in-one-wp-security-and-firewall
2762
+ #: admin/wp-security-firewall-menu.php:820
2763
+ msgid "Enable IP Lockout For 404 Events"
2764
+ msgstr "IP-vergrendeling inschakelen voor 404-gebeurtenissen"
2765
+
2766
+ # @ all-in-one-wp-security-and-firewall
2767
+ #: admin/wp-security-firewall-menu.php:823
2768
+ msgid "Check this if you want to enable the lockout of selected IP addresses."
2769
+ msgstr "Selecteer dit als u de vergrendeling van geselecteerde IP-adressen wilt inschakelen."
2770
+
2771
+ # @ all-in-one-wp-security-and-firewall
2772
+ #: admin/wp-security-firewall-menu.php:828
2773
+ msgid "When you enable this checkbox, all 404 events on your site will be logged in the table below. You can monitor these events and select some IP addresses to be blocked in the table. All IP addresses you select to be blocked from the \"404 Event Logs\" table section will be unable to access your site."
2774
+ msgstr "Wanneer u dit selectievakje inschakelt, worden alle 404 gebeurtenissen op uw site in de onderstaande tabel vastgelegd. U kunt deze gebeurtenissen controleren en bepaalde IP-adressen selecteren die in de tabel moeten worden geblokkeerd. Alle IP-adressen die u selecteert om te worden geblokkeerd in het tabelgedeelte \"404 Event Logs\", hebben geen toegang tot uw site."
2775
+
2776
+ # @ all-in-one-wp-security-and-firewall
2777
+ #: admin/wp-security-firewall-menu.php:836
2778
+ msgid "Enable 404 Event Logging"
2779
+ msgstr "404 Logregistratie inschakelen"
2780
+
2781
+ # @ all-in-one-wp-security-and-firewall
2782
+ #: admin/wp-security-firewall-menu.php:839
2783
+ msgid "Check this if you want to enable the logging of 404 events"
2784
+ msgstr "Selecteer dit als u het loggen van 404-gebeurtenissen wilt inschakelen"
2785
+
2786
+ # @ all-in-one-wp-security-and-firewall
2787
+ #: admin/wp-security-firewall-menu.php:844
2788
+ msgid "Time Length of 404 Lockout (min)"
2789
+ msgstr "Tijdslengte van 404 Uitsluiting (min)"
2790
+
2791
+ # @ all-in-one-wp-security-and-firewall
2792
+ #: admin/wp-security-firewall-menu.php:846
2793
+ msgid "Set the length of time for which a blocked IP address will be prevented from visiting your site"
2794
+ msgstr "Stel in hoe lang het duurt voordat een geblokkeerd IP-adres uw site weer kan bezoeken"
2795
+
2796
+ # @ all-in-one-wp-security-and-firewall
2797
+ #: admin/wp-security-firewall-menu.php:851
2798
+ msgid "You can lock any IP address which is recorded in the \"404 Event Logs\" table section below."
2799
+ msgstr "U kunt elk IP-adres vergrendelen dat is vastgelegd in het onderstaande tabelgedeelte van de \"404 Event Logs\"."
2800
+
2801
+ # @ all-in-one-wp-security-and-firewall
2802
+ #: admin/wp-security-firewall-menu.php:853
2803
+ msgid "To temporarily lock an IP address, hover over the ID column and click the \"Temp Block\" link for the applicable IP entry."
2804
+ msgstr "Om tijdelijk een IP-adres te vergrendelen, plaatst u de muisaanwijzer op de kolom ID en klikt u op de koppeling \"Temp Block\" voor het toepasselijke IP-item."
2805
+
2806
+ # @ all-in-one-wp-security-and-firewall
2807
+ #: admin/wp-security-firewall-menu.php:860
2808
+ msgid "404 Lockout Redirect URL"
2809
+ msgstr "404 uitsluitingsverwijzings URL"
2810
+
2811
+ # @ all-in-one-wp-security-and-firewall
2812
+ #: admin/wp-security-firewall-menu.php:862
2813
+ msgid "A blocked visitor will be automatically redirected to this URL."
2814
+ msgstr "Een geblokkeerde bezoeker wordt automatisch doorgestuurd naar deze URL."
2815
+
2816
+ # @ all-in-one-wp-security-and-firewall
2817
+ #: admin/wp-security-firewall-menu.php:871
2818
+ msgid "404 Event Logs"
2819
+ msgstr "404 Gebeurtenislog"
2820
+
2821
+ # @ all-in-one-wp-security-and-firewall
2822
+ #: admin/wp-security-firewall-menu.php:892
2823
+ #: admin/wp-security-firewall-menu.php:901
2824
+ msgid "Delete All 404 Event Logs"
2825
+ msgstr "Verwijder alle 404 gebeurtenislogs"
2826
+
2827
+ # @ all-in-one-wp-security-and-firewall
2828
+ #: admin/wp-security-firewall-menu.php:898
2829
+ msgid "Click this button if you wish to purge all 404 event logs from the DB."
2830
+ msgstr "Klik op deze knop als u alle 404-gebeurtenislog uit de database wilt verwijderen."
2831
+
2832
+ # @ all-in-one-wp-security-and-firewall
2833
+ #: admin/wp-security-list-404.php:108
2834
+ #: admin/wp-security-list-acct-activity.php:79
2835
+ #: admin/wp-security-list-comment-spammer-ip.php:86
2836
+ #: admin/wp-security-list-locked-ip.php:82
2837
+ #: admin/wp-security-list-locked-ip.php:93
2838
+ #: admin/wp-security-list-login-fails.php:78
2839
+ #: admin/wp-security-list-registered-users.php:82
2840
+ #: admin/wp-security-list-registered-users.php:93
2841
+ msgid "Please select some records using the checkboxes"
2842
+ msgstr "Selecteer enkele records met behulp van de selectievakjes"
2843
+
2844
+ # @ all-in-one-wp-security-and-firewall
2845
+ #: admin/wp-security-list-acct-activity.php:107
2846
+ #: admin/wp-security-list-login-fails.php:107
2847
+ msgid "The selected entries were deleted successfully!"
2848
+ msgstr "De geselecteerde items zijn succesvol verwijderd!"
2849
+
2850
+ # @ all-in-one-wp-security-and-firewall
2851
+ #: admin/wp-security-list-acct-activity.php:120
2852
+ #: admin/wp-security-list-login-fails.php:119
2853
+ msgid "The selected entry was deleted successfully!"
2854
+ msgstr "Het geselecteerde item is succesvol verwijderd!"
2855
+
2856
+ # @ all-in-one-wp-security-and-firewall
2857
+ #: admin/wp-security-list-comment-spammer-ip.php:139
2858
+ msgid "The selected IP addresses were saved in the blacklist configuration settings."
2859
+ msgstr "De geselecteerde IP-adressen zijn opgeslagen in de configuratie-instellingen van de blacklist."
2860
+
2861
+ # @ all-in-one-wp-security-and-firewall
2862
+ #: admin/wp-security-list-comment-spammer-ip.php:153
2863
+ msgid "The .htaccess file was successfully modified to include the selected IP addresses."
2864
+ msgstr "Het .htaccess-bestand is met succes gewijzigd om de geselecteerde IP-adressen op te nemen."
2865
+
2866
+ # @ all-in-one-wp-security-and-firewall
2867
+ #: admin/wp-security-list-comment-spammer-ip.php:159
2868
+ msgid "NOTE: The .htaccess file was not modified because you have disabled the \"Enable IP or User Agent Blacklisting\" check box."
2869
+ msgstr "OPMERKING: het .htaccess-bestand is niet gewijzigd omdat u het selectievakje \"IP-adres of Gebruikersagent-zwarte lijst toestaan\" hebt uitgeschakeld."
2870
+
2871
+ # @ all-in-one-wp-security-and-firewall
2872
+ #: admin/wp-security-list-comment-spammer-ip.php:160
2873
+ #, php-format
2874
+ msgid "To block these IP addresses you will need to enable the above flag in the %s menu"
2875
+ msgstr "Om deze IP-adressen te blokkeren, moet u de bovenstaande markering in het %s-menu inschakelen"
2876
+
2877
+ # @ all-in-one-wp-security-and-firewall
2878
+ #: admin/wp-security-list-locked-ip.php:117
2879
+ #: admin/wp-security-user-login-menu.php:527
2880
+ msgid "The selected IP entries were unlocked successfully!"
2881
+ msgstr "De geselecteerde IP-vermeldingen zijn succesvol ontgrendeld!"
2882
+
2883
+ # @ all-in-one-wp-security-and-firewall
2884
+ #: admin/wp-security-list-locked-ip.php:126
2885
+ #: admin/wp-security-user-login-menu.php:536
2886
+ msgid "The selected IP entry was unlocked successfully!"
2887
+ msgstr "Het geselecteerde IP-item is succesvol ontgrendeld!"
2888
+
2889
+ # @ all-in-one-wp-security-and-firewall
2890
+ #: admin/wp-security-list-registered-users.php:127
2891
+ #: admin/wp-security-list-registered-users.php:151
2892
+ msgid "Your account is now active"
2893
+ msgstr "Uw account is nu actief"
2894
+
2895
+ # @ all-in-one-wp-security-and-firewall
2896
+ #: admin/wp-security-list-registered-users.php:128
2897
+ msgid "Your account with username:"
2898
+ msgstr "Uw account met gebruikersnaam:"
2899
+
2900
+ # @ all-in-one-wp-security-and-firewall
2901
+ #: admin/wp-security-list-registered-users.php:135
2902
+ msgid "The selected accounts were approved successfully!"
2903
+ msgstr "De geselecteerde accounts zijn succesvol goedgekeurd!"
2904
+
2905
+ # @ all-in-one-wp-security-and-firewall
2906
+ #: admin/wp-security-list-registered-users.php:139
2907
+ msgid "The following accounts failed to update successfully: "
2908
+ msgstr "De volgende accounts konden niet succesvol worden bijgewerkt: "
2909
+
2910
+ # @ all-in-one-wp-security-and-firewall
2911
+ #: admin/wp-security-list-registered-users.php:147
2912
+ msgid "The selected account was approved successfully!"
2913
+ msgstr "Het geselecteerde account is succesvol goedgekeurd!"
2914
+
2915
+ # @ all-in-one-wp-security-and-firewall
2916
+ #: admin/wp-security-list-registered-users.php:152
2917
+ msgid "Your account with username: "
2918
+ msgstr "Uw account met gebruikersnaam: "
2919
+
2920
+ # @ all-in-one-wp-security-and-firewall
2921
+ #: admin/wp-security-list-registered-users.php:176
2922
+ msgid "The selected accounts were deleted successfully!"
2923
+ msgstr "De geselecteerde accounts zijn succesvol verwijderd!"
2924
+
2925
+ # @ all-in-one-wp-security-and-firewall
2926
+ #: admin/wp-security-list-registered-users.php:184
2927
+ msgid "The selected account was deleted successfully!"
2928
+ msgstr "Het geselecteerde account is succesvol verwijderd!"
2929
+
2930
+ # @ all-in-one-wp-security-and-firewall
2931
+ #: admin/wp-security-maintenance-menu.php:22
2932
+ msgid "Visitor Lockout"
2933
+ msgstr "Blokkeren van bezoeker"
2934
+
2935
+ # @ all-in-one-wp-security-and-firewall
2936
+ #: admin/wp-security-maintenance-menu.php:88
2937
+ msgid "Site lockout feature settings saved!"
2938
+ msgstr "Site instellingen voor de blokkeringsfunctie zijn opgeslagen!"
2939
+
2940
+ # @ all-in-one-wp-security-and-firewall
2941
+ #: admin/wp-security-maintenance-menu.php:93
2942
+ msgid "General Visitor Lockout"
2943
+ msgstr "Algemene bezoekers uitsluiting"
2944
+
2945
+ # @ all-in-one-wp-security-and-firewall
2946
+ #: admin/wp-security-maintenance-menu.php:99
2947
+ msgid "This feature allows you to put your site into \"maintenance mode\" by locking down the front-end to all visitors except logged in users with super admin privileges."
2948
+ msgstr "Met deze functie kunt u uw site in de \"onderhoudsmodus\" plaatsen door de front-end te vergrendelen voor alle bezoekers behalve ingelogde gebruikers met superbeheerdersrechten."
2949
+
2950
+ # @ all-in-one-wp-security-and-firewall
2951
+ #: admin/wp-security-maintenance-menu.php:100
2952
+ msgid "Locking your site down to general visitors can be useful if you are investigating some issues on your site or perhaps you might be doing some maintenance and wish to keep out all traffic for security reasons."
2953
+ msgstr "Het vergrendelen van uw site voor algemene bezoekers kan handig zijn als u een aantal problemen op uw site onderzoekt of misschien onderhoudt en u om veiligheidsredenen al het verkeer buiten wilt houden."
2954
+
2955
+ # @ all-in-one-wp-security-and-firewall
2956
+ #: admin/wp-security-maintenance-menu.php:105
2957
+ msgid "Enable Front-end Lockout"
2958
+ msgstr "Front-end blokkering inschakelen"
2959
+
2960
+ # @ all-in-one-wp-security-and-firewall
2961
+ #: admin/wp-security-maintenance-menu.php:108
2962
+ msgid "Check this if you want all visitors except those who are logged in as administrator to be locked out of the front-end of your site."
2963
+ msgstr "Vink dit aan als u wilt dat alle bezoekers, behalve degenen die zijn aangemeld als beheerder, worden uitgesloten van de front-end van uw site."
2964
+
2965
+ # @ all-in-one-wp-security-and-firewall
2966
+ #: admin/wp-security-maintenance-menu.php:112
2967
+ msgid "Enter a Message:"
2968
+ msgstr "Voer een bericht in:"
2969
+
2970
+ # @ all-in-one-wp-security-and-firewall
2971
+ #: admin/wp-security-maintenance-menu.php:124
2972
+ msgid "Enter a message you wish to display to visitors when your site is in maintenance mode."
2973
+ msgstr "Voer een bericht in dat u wilt weergeven aan bezoekers wanneer uw site in onderhoudsmodus is."
2974
+
2975
+ # @ default
2976
+ #: admin/wp-security-maintenance-menu.php:131
2977
+ msgid "Save Site Lockout Settings"
2978
+ msgstr "Instellingen voor siteblokkering opslaan"
2979
+
2980
+ # @ all-in-one-wp-security-and-firewall
2981
+ #: admin/wp-security-settings-menu.php:25
2982
+ msgid "General Settings"
2983
+ msgstr "Algemene instellingen"
2984
+
2985
+ # @ all-in-one-wp-security-and-firewall
2986
+ #: admin/wp-security-settings-menu.php:28
2987
+ msgid "WP Meta Info"
2988
+ msgstr "WP Meta informatie"
2989
+
2990
+ # @ all-in-one-wp-security-and-firewall
2991
+ #: admin/wp-security-settings-menu.php:95
2992
+ msgid "All the security features have been disabled successfully!"
2993
+ msgstr "Alle beveiligingsfuncties zijn met succes uitgeschakeld!"
2994
+
2995
+ # @ all-in-one-wp-security-and-firewall
2996
+ #: admin/wp-security-settings-menu.php:99
2997
+ #: admin/wp-security-settings-menu.php:126
2998
+ msgid "Could not write to the .htaccess file. Please restore your .htaccess file manually using the restore functionality in the \".htaccess File\"."
2999
+ msgstr "Kon het .htaccess-bestand niet schrijven. Herstel uw .htaccess-file handmatig met behulp van de herstelfunctionaliteit in de \".htaccess-file\"."
3000
+
3001
+ # @ all-in-one-wp-security-and-firewall
3002
+ #: admin/wp-security-settings-menu.php:104
3003
+ msgid "Could not write to the wp-config.php. Please restore your wp-config.php file manually using the restore functionality in the \"wp-config.php File\"."
3004
+ msgstr "Kon niet naar de wp-config.php schrijven. Herstel uw wp-config.php-file handmatig met behulp van de herstelfunctionaliteit in de \"wp-config.php-file\"."
3005
+
3006
+ # @ all-in-one-wp-security-and-firewall
3007
+ #: admin/wp-security-settings-menu.php:122
3008
+ msgid "All firewall rules have been disabled successfully!"
3009
+ msgstr "Alle firewallregels zijn succesvol uitgeschakeld!"
3010
+
3011
+ # @ all-in-one-wp-security-and-firewall
3012
+ #: admin/wp-security-settings-menu.php:136
3013
+ msgid "WP Security Plugin"
3014
+ msgstr "WP-beveiligings plugin"
3015
+
3016
+ # @ all-in-one-wp-security-and-firewall
3017
+ #: admin/wp-security-settings-menu.php:138
3018
+ msgid "Thank you for using our WordPress security plugin. There are a lot of security features in this plugin."
3019
+ msgstr "Bedankt voor het gebruik van onze WordPress-beveiligings plugin. Er zijn veel beveiligingsfuncties in deze plugin."
3020
+
3021
+ # @ all-in-one-wp-security-and-firewall
3022
+ #: admin/wp-security-settings-menu.php:139
3023
+ msgid "Go through each menu items and enable the security options to add more security to your site. Start by activating the basic features first."
3024
+ msgstr "Doorloop alle menu-items en schakel de beveiligingsopties in om meer beveiliging aan uw site toe te voegen. Begin door eerst de basisfuncties te activeren."
3025
+
3026
+ # @ all-in-one-wp-security-and-firewall
3027
+ #: admin/wp-security-settings-menu.php:140
3028
+ msgid "It is a good practice to take a backup of your .htaccess file, database and wp-config.php file before activating the security features. This plugin has options that you can use to backup those resources easily."
3029
+ msgstr "Het is een goede gewoonte om een back-up te maken van uw .htaccess-bestand, database en wp-config.php-bestand voordat u de beveiligingsfuncties activeert. Deze plug-in heeft opties die u kunt gebruiken om gemakkelijk een back-up van die bronnen te maken."
3030
+
3031
+ # @ all-in-one-wp-security-and-firewall
3032
+ #: admin/wp-security-settings-menu.php:143
3033
+ msgid "Backup your database"
3034
+ msgstr "Maak een backup van je database"
3035
+
3036
+ # @ all-in-one-wp-security-and-firewall
3037
+ #: admin/wp-security-settings-menu.php:144
3038
+ msgid "Backup .htaccess file"
3039
+ msgstr "Back-up .htaccess file"
3040
+
3041
+ # @ all-in-one-wp-security-and-firewall
3042
+ #: admin/wp-security-settings-menu.php:145
3043
+ msgid "Backup wp-config.php file"
3044
+ msgstr "Back-up wp-config.php file"
3045
+
3046
+ # @ all-in-one-wp-security-and-firewall
3047
+ #: admin/wp-security-settings-menu.php:151
3048
+ msgid "Disable Security Features"
3049
+ msgstr "Beveiligingsfuncties uitschakelen"
3050
+
3051
+ # @ all-in-one-wp-security-and-firewall
3052
+ #: admin/wp-security-settings-menu.php:157
3053
+ msgid "If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin."
3054
+ msgstr "Als u denkt dat sommige plug-infunctionaliteiten op uw site zijn verbroken vanwege een beveiligingsfunctie die u in deze plug-in hebt ingeschakeld, gebruikt u dan de volgende optie om alle beveiligingsfuncties van deze plug-in uit te schakelen."
3055
+
3056
+ # @ default
3057
+ #: admin/wp-security-settings-menu.php:161
3058
+ msgid "Disable All Security Features"
3059
+ msgstr "Schakel alle beveiligingsfuncties uit"
3060
+
3061
+ # @ all-in-one-wp-security-and-firewall
3062
+ # @ default
3063
+ #: admin/wp-security-settings-menu.php:167
3064
+ #: admin/wp-security-settings-menu.php:177
3065
+ msgid "Disable All Firewall Rules"
3066
+ msgstr "Schakel alle firewallregels uit"
3067
+
3068
+ # @ all-in-one-wp-security-and-firewall
3069
+ #: admin/wp-security-settings-menu.php:173
3070
+ msgid "This feature will disable all firewall rules which are currently active in this plugin and it will also delete these rules from your .htacess file. Use it if you think one of the firewall rules is causing an issue on your site."
3071
+ msgstr "Met deze functie worden alle firewallregels uitgeschakeld die momenteel actief zijn in deze plug-in en deze regels worden ook verwijderd uit uw htacess-file. Gebruik het als u denkt dat een van de firewallregels een probleem op uw site veroorzaakt."
3072
+
3073
+ # @ all-in-one-wp-security-and-firewall
3074
+ #: admin/wp-security-settings-menu.php:206
3075
+ msgid "Your .htaccess file was successfully backed up! Using an FTP program go to the \"/wp-content/aiowps_backups\" directory to save a copy of the file to your computer."
3076
+ msgstr "Er is een back-up van uw .htaccess-bestand gemaakt! Ga met behulp van een FTP-programma naar de map \"/ wp-content / aiowps_backups\" om een kopie van het bestand op uw computer op te slaan."
3077
+
3078
+ # @ all-in-one-wp-security-and-firewall
3079
+ #: admin/wp-security-settings-menu.php:212
3080
+ msgid "htaccess file rename failed during backup. Please check your root directory for the backup file using FTP."
3081
+ msgstr "Het hernoemen van de htaccess-file is mislukt tijdens de back-up. Controleer de hoofdmap voor het back-upbestand met behulp van FTP."
3082
+
3083
+ # @ all-in-one-wp-security-and-firewall
3084
+ #: admin/wp-security-settings-menu.php:218
3085
+ msgid "htaccess backup failed."
3086
+ msgstr "htaccess backup mislukt."
3087
+
3088
+ # @ all-in-one-wp-security-and-firewall
3089
+ #: admin/wp-security-settings-menu.php:233
3090
+ msgid "Please choose a .htaccess to restore from."
3091
+ msgstr "Kies alstublieft een .htaccess-file om uit te herstellen."
3092
+
3093
+ # @ all-in-one-wp-security-and-firewall
3094
+ #: admin/wp-security-settings-menu.php:249
3095
+ msgid "htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP."
3096
+ msgstr "Het herstellen van de htaccess-file mislukt. Probeer de .htaccess-file handmatig te herstellen met behulp van FTP."
3097
+
3098
+ # @ all-in-one-wp-security-and-firewall
3099
+ #: admin/wp-security-settings-menu.php:253
3100
+ msgid "Your .htaccess file has successfully been restored!"
3101
+ msgstr "Uw .htaccess-file is succesvol hersteld!"
3102
+
3103
+ # @ all-in-one-wp-security-and-firewall
3104
+ #: admin/wp-security-settings-menu.php:259
3105
+ msgid "htaccess Restore operation failed! Please check the contents of the file you are trying to restore from."
3106
+ msgstr "De htaccess-file herstelbewerking mislukt! Controleer de inhoud van het bestand dat u probeert te herstellen."
3107
+
3108
+ # @ all-in-one-wp-security-and-firewall
3109
+ #: admin/wp-security-settings-menu.php:265
3110
+ msgid ".htaccess File Operations"
3111
+ msgstr ".htaccess-file bewerkingen"
3112
+
3113
+ # @ all-in-one-wp-security-and-firewall
3114
+ #: admin/wp-security-settings-menu.php:268
3115
+ msgid "Your \".htaccess\" file is a key component of your website's security and it can be modified to implement various levels of protection mechanisms."
3116
+ msgstr "Uw \".htaccess-file\" is een belangrijk onderdeel van de beveiliging van uw website en het kan worden gewijzigd om verschillende niveaus van beveiligingsmechanismen te implementeren."
3117
+
3118
+ # @ all-in-one-wp-security-and-firewall
3119
+ #: admin/wp-security-settings-menu.php:269
3120
+ msgid "This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future."
3121
+ msgstr "Met deze functie kunt u een back-up maken en uw momenteel actieve .htaccess-file opslaan als u het back-upbestand in de toekomst opnieuw moet gebruiken."
3122
+
3123
+ # @ all-in-one-wp-security-and-firewall
3124
+ #: admin/wp-security-settings-menu.php:270
3125
+ msgid "You can also restore your site's .htaccess settings using a backed up .htaccess file."
3126
+ msgstr "U kunt ook de .htaccess-instellingen van uw site herstellen met behulp van een .htaccess-bestand waarvan een back-up is gemaakt."
3127
+
3128
+ # @ all-in-one-wp-security-and-firewall
3129
+ #: admin/wp-security-settings-menu.php:284
3130
+ msgid "Save the current .htaccess file"
3131
+ msgstr "Sla de huidige .htaccess-file op"
3132
+
3133
+ # @ all-in-one-wp-security-and-firewall
3134
+ #: admin/wp-security-settings-menu.php:288
3135
+ msgid "Click the button below to backup and save the currently active .htaccess file."
3136
+ msgstr "Klik op de onderstaande knop om een back-up te maken van de momenteel actieve .htaccess-file en deze op te slaan."
3137
+
3138
+ # @ all-in-one-wp-security-and-firewall
3139
+ #: admin/wp-security-settings-menu.php:289
3140
+ msgid "Backup .htaccess File"
3141
+ msgstr "Back-up .htaccess-file"
3142
+
3143
+ # @ all-in-one-wp-security-and-firewall
3144
+ #: admin/wp-security-settings-menu.php:293
3145
+ msgid "Restore from a backed up .htaccess file"
3146
+ msgstr "Herstellen vanuit een back-up van een .htaccess-flie"
3147
+
3148
+ # @ all-in-one-wp-security-and-firewall
3149
+ #: admin/wp-security-settings-menu.php:299
3150
+ msgid ".htaccess file to restore from"
3151
+ msgstr ".htaccess-file om vanuit te herstellen"
3152
+
3153
+ # @ all-in-one-wp-security-and-firewall
3154
+ #: admin/wp-security-settings-menu.php:305
3155
+ msgid "After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt)."
3156
+ msgstr "Na het selecteren van uw bestand, klikt u op de onderstaande knop om uw site te herstellen met behulp van het back-up htaccess-file (htaccess_backup.txt)."
3157
+
3158
+ # @ all-in-one-wp-security-and-firewall
3159
+ #: admin/wp-security-settings-menu.php:311
3160
+ msgid "Restore .htaccess File"
3161
+ msgstr "Terugplaatsen .htaccess-file"
3162
+
3163
+ # @ all-in-one-wp-security-and-firewall
3164
+ #: admin/wp-security-settings-menu.php:315
3165
+ msgid "View Contents of the currently active .htaccess file"
3166
+ msgstr "Bekijk de inhoud van de momenteel actieve .htaccess-file"
3167
+
3168
+ # @ all-in-one-wp-security-and-firewall
3169
+ #: admin/wp-security-settings-menu.php:344
3170
+ msgid "Please choose a wp-config.php file to restore from."
3171
+ msgstr "Kies een wp-config.php file om van te herstellen."
3172
+
3173
+ # @ all-in-one-wp-security-and-firewall
3174
+ #: admin/wp-security-settings-menu.php:360
3175
+ msgid "wp-config.php file restore failed. Please attempt to restore this file manually using FTP."
3176
+ msgstr "Het herstellen van de wp-config.php file is mislukt. Probeer dit bestand handmatig te herstellen met behulp van FTP."
3177
+
3178
+ # @ all-in-one-wp-security-and-firewall
3179
+ #: admin/wp-security-settings-menu.php:364
3180
+ msgid "Your wp-config.php file has successfully been restored!"
3181
+ msgstr "Uw wp-config.php file is succesvol hersteld!"
3182
+
3183
+ # @ all-in-one-wp-security-and-firewall
3184
+ #: admin/wp-security-settings-menu.php:370
3185
+ msgid "wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from."
3186
+ msgstr "De wp-config.php-file herstelbewerking is mislukt! Controleer de inhoud van de file die u probeert te herstellen."
3187
+
3188
+ # @ all-in-one-wp-security-and-firewall
3189
+ #: admin/wp-security-settings-menu.php:376
3190
+ msgid "wp-config.php File Operations"
3191
+ msgstr "wp-config.php file bewerkingen"
3192
+
3193
+ # @ all-in-one-wp-security-and-firewall
3194
+ #: admin/wp-security-settings-menu.php:379
3195
+ msgid "Your \"wp-config.php\" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components."
3196
+ msgstr "Uw \"wp-config.php-file\" is een van de belangrijkste in uw WordPress-installatie. Het is een primair configuratiebestand en bevat cruciale dingen zoals details van uw database en andere kritieke componenten."
3197
+
3198
+ # @ all-in-one-wp-security-and-firewall
3199
+ #: admin/wp-security-settings-menu.php:380
3200
+ msgid "This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future."
3201
+ msgstr "Met deze functie kunt u een back-up maken van uw momenteel actieve wp-config.php-file en deze opslaan als u de back-up file in de toekomst opnieuw moet gebruiken."
3202
+
3203
+ # @ all-in-one-wp-security-and-firewall
3204
+ #: admin/wp-security-settings-menu.php:381
3205
+ msgid "You can also restore your site's wp-config.php settings using a backed up wp-config.php file."
3206
+ msgstr "U kunt ook de wp-config.php instellingen van uw site herstellen met een back-up van een wp-config.php-file."
3207
+
3208
+ # @ all-in-one-wp-security-and-firewall
3209
+ #: admin/wp-security-settings-menu.php:395
3210
+ msgid "Save the current wp-config.php file"
3211
+ msgstr "Sla de huidige wp-config.php-file op"
3212
+
3213
+ # @ all-in-one-wp-security-and-firewall
3214
+ #: admin/wp-security-settings-menu.php:399
3215
+ msgid "Click the button below to backup and download the contents of the currently active wp-config.php file."
3216
+ msgstr "Klik op de onderstaande knop om de inhoud van de momenteel actieve wp-config.php-file te back-uppen en te downloaden."
3217
+
3218
+ # @ all-in-one-wp-security-and-firewall
3219
+ #: admin/wp-security-settings-menu.php:400
3220
+ msgid "Backup wp-config.php File"
3221
+ msgstr "Back-up wp-config.php-file"
3222
+
3223
+ # @ all-in-one-wp-security-and-firewall
3224
+ #: admin/wp-security-settings-menu.php:405
3225
+ msgid "Restore from a backed up wp-config file"
3226
+ msgstr "Herstellen vanuit een back-up van een wp-config-file"
3227
+
3228
+ # @ all-in-one-wp-security-and-firewall
3229
+ #: admin/wp-security-settings-menu.php:411
3230
+ msgid "wp-config file to restore from"
3231
+ msgstr "wp-config-file om vanuit te herstellen"
3232
+
3233
+ # @ all-in-one-wp-security-and-firewall
3234
+ #: admin/wp-security-settings-menu.php:417
3235
+ msgid "After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt)."
3236
+ msgstr "Nadat u uw bestand hebt geselecteerd, klikt u op de onderstaande knop om uw site te herstellen met behulp van het back-upbestand wp-config (wp-config.php.backup.txt)."
3237
+
3238
+ # @ all-in-one-wp-security-and-firewall
3239
+ #: admin/wp-security-settings-menu.php:423
3240
+ msgid "Restore wp-config File"
3241
+ msgstr "Terug plaatsen wp-config-file"
3242
+
3243
+ # @ all-in-one-wp-security-and-firewall
3244
+ #: admin/wp-security-settings-menu.php:427
3245
+ msgid "View Contents of the currently active wp-config.php file"
3246
+ msgstr "Bekijk de inhoud van de momenteel actieve wp-config.php-file"
3247
+
3248
+ # @ all-in-one-wp-security-and-firewall
3249
+ #: admin/wp-security-settings-menu.php:462
3250
+ msgid "WP Generator Meta Tag"
3251
+ msgstr "WP-generator meta tag"
3252
+
3253
+ # @ all-in-one-wp-security-and-firewall
3254
+ #: admin/wp-security-settings-menu.php:465
3255
+ msgid "Wordpress generator automatically adds some meta information inside the \"head\" tags of every page on your site's front end. Below is an example of this:"
3256
+ msgstr "WordPress-generator voegt automatisch wat meta-informatie toe aan de front-tags van elke pagina op de voorkant van uw site. Hieronder is een voorbeeld hiervan:"
3257
+
3258
+ # @ all-in-one-wp-security-and-firewall
3259
+ #: admin/wp-security-settings-menu.php:467
3260
+ msgid "The above meta information shows which version of WordPress your site is currently running and thus can help hackers or crawlers scan your site to see if you have an older version of WordPress or one with a known exploit."
3261
+ msgstr "De bovenstaande meta-informatie laat zien welke versie van WordPress uw site momenteel gebruikt en kan zo helpen bij het door hackers of crawlers scannen van uw site om te zien of u een oudere versie van WordPress heeft of een versie met een bekende aftap mogelijkheid."
3262
+
3263
+ # @ all-in-one-wp-security-and-firewall
3264
+ #: admin/wp-security-settings-menu.php:468
3265
+ msgid "This feature will allow you to remove the WP generator meta info from your site's pages."
3266
+ msgstr "Met deze functie kunt u de meta-info van de WP-generator verwijderen van de pagina's van uw site."
3267
+
3268
+ # @ all-in-one-wp-security-and-firewall
3269
+ #: admin/wp-security-settings-menu.php:474
3270
+ msgid "WP Generator Meta Info"
3271
+ msgstr "WP Generator Meta Info"
3272
+
3273
+ # @ all-in-one-wp-security-and-firewall
3274
+ #: admin/wp-security-settings-menu.php:486
3275
+ msgid "Remove WP Generator Meta Info"
3276
+ msgstr "WP Generator Meta Info verwijderen"
3277
+
3278
+ # @ all-in-one-wp-security-and-firewall
3279
+ #: admin/wp-security-settings-menu.php:489
3280
+ msgid "Check this if you want to remove the meta info produced by WP Generator from all pages"
3281
+ msgstr "Selecteer dit als u de meta-info die geproduceerd is door de WP Generator van alle pagina's wilt verwijderen"
3282
+
3283
+ # @ all-in-one-wp-security-and-firewall
3284
+ #: admin/wp-security-spam-menu.php:23
3285
+ msgid "Comment SPAM"
3286
+ msgstr "Kritieke SPAM"
3287
+
3288
+ # @ all-in-one-wp-security-and-firewall
3289
+ #: admin/wp-security-spam-menu.php:24
3290
+ msgid "Comment SPAM IP Monitoring"
3291
+ msgstr "Kritieke SPAM IP bewaking"
3292
+
3293
+ # @ all-in-one-wp-security-and-firewall
3294
+ #: admin/wp-security-spam-menu.php:111
3295
+ msgid "Comment SPAM Settings"
3296
+ msgstr "Kritieke SPAM-instellingen"
3297
+
3298
+ # @ all-in-one-wp-security-and-firewall
3299
+ #: admin/wp-security-spam-menu.php:116
3300
+ msgid "Add Captcha To Comments Form"
3301
+ msgstr "Captcha aan opmerkingenformulier toevoegen"
3302
+
3303
+ # @ all-in-one-wp-security-and-firewall
3304
+ #: admin/wp-security-spam-menu.php:120
3305
+ msgid "This feature will add a simple math captcha field in the WordPress comments form."
3306
+ msgstr "Met deze functie wordt een eenvoudig wiskundig captcha-veld toegevoegd aan het opmerkingenformulier van WordPress."
3307
+
3308
+ # @ all-in-one-wp-security-and-firewall
3309
+ #: admin/wp-security-spam-menu.php:121
3310
+ msgid "Adding a captcha field in the comment form is a simple way of greatly reducing SPAM comments from bots without using .htaccess rules."
3311
+ msgstr "Het toevoegen van een captcha-veld in het commentaarformulier is een eenvoudige manier om SPAM-opmerkingen van bots te verminderen zonder de .htaccess-regels te gebruiken."
3312
+
3313
+ # @ all-in-one-wp-security-and-firewall
3314
+ #: admin/wp-security-spam-menu.php:137
3315
+ msgid "Enable Captcha On Comment Forms"
3316
+ msgstr "Schakel Captcha in op het opmerkingenformulier"
3317
+
3318
+ # @ all-in-one-wp-security-and-firewall
3319
+ #: admin/wp-security-spam-menu.php:140
3320
+ msgid "Check this if you want to insert a captcha field on the comment forms"
3321
+ msgstr "Selecteer dit als u een captcha-veld wilt invoegen op het opmerkingenformulieren"
3322
+
3323
+ # @ all-in-one-wp-security-and-firewall
3324
+ #: admin/wp-security-spam-menu.php:148
3325
+ msgid "Block Spambot Comments"
3326
+ msgstr "Spambot-opmerkingen blokkeren"
3327
+
3328
+ # @ all-in-one-wp-security-and-firewall
3329
+ #: admin/wp-security-spam-menu.php:152
3330
+ msgid "A large portion of WordPress blog comment SPAM is mainly produced by automated bots and not necessarily by humans. "
3331
+ msgstr "Een groot deel van WordPress blog commentaar SPAM wordt voornamelijk geproduceerd door geautomatiseerde bots en niet noodzakelijk door mensen. "
3332
+
3333
+ # @ all-in-one-wp-security-and-firewall
3334
+ #: admin/wp-security-spam-menu.php:153
3335
+ msgid "This feature will greatly minimize the useless and unecessary traffic and load on your server resulting from SPAM comments by blocking all comment requests which do not originate from your domain."
3336
+ msgstr "Deze functie minimaliseert het nutteloze en onnodige verkeer en de belasting van uw server ten gevolge van SPAM-opmerkingen door alle reactieaanvragen te blokkeren die niet afkomstig zijn uit uw domein."
3337
+
3338
+ # @ all-in-one-wp-security-and-firewall
3339
+ #: admin/wp-security-spam-menu.php:154
3340
+ msgid "In other words, if the comment was not submitted by a human who physically submitted the comment on your site, the request will be blocked."
3341
+ msgstr "Met andere woorden, als de opmerking niet is ingediend door een persoon die de opmerking fysiek op uw site heeft geplaatst, wordt de aanvraag geblokkeerd."
3342
+
3343
+ # @ all-in-one-wp-security-and-firewall
3344
+ #: admin/wp-security-spam-menu.php:170
3345
+ msgid "Block Spambots From Posting Comments"
3346
+ msgstr "Spambots blokkeren uit geplaatste opmerkingen"
3347
+
3348
+ # @ all-in-one-wp-security-and-firewall
3349
+ #: admin/wp-security-spam-menu.php:173
3350
+ msgid "Check this if you want to apply a firewall rule which will block comments originating from spambots."
3351
+ msgstr "Selecteer dit als u een firewallregel wilt toepassen die opmerkingen afkomstig van spambots blokkeert."
3352
+
3353
+ # @ all-in-one-wp-security-and-firewall
3354
+ #: admin/wp-security-spam-menu.php:177
3355
+ msgid "This feature will implement a firewall rule to block all comment attempts which do not originate from your domain."
3356
+ msgstr "Met deze functie wordt een firewallregel geïmplementeerd om alle opmerkingen te blokkeren die niet afkomstig zijn uit uw domein."
3357
+
3358
+ # @ all-in-one-wp-security-and-firewall
3359
+ #: admin/wp-security-spam-menu.php:178
3360
+ msgid "A legitimate comment is one which is submitted by a human who physically fills out the comment form and clicks the submit button. For such events, the HTTP_REFERRER is always set to your own domain."
3361
+ msgstr "Een legitieme opmerking is een opmerking die wordt ingediend door een persoon die het opmerkingenformulier fysiek invult en op de knop Verzenden klikt. Voor dergelijke gebeurtenissen is de HTTP_REFERRER altijd ingesteld op uw eigen domein."
3362
+
3363
+ # @ all-in-one-wp-security-and-firewall
3364
+ #: admin/wp-security-spam-menu.php:179
3365
+ msgid "A comment submitted by a spambot is done by directly calling the comments.php file, which usually means that the HTTP_REFERRER value is not your domain and often times empty."
3366
+ msgstr "Een opmerking die door een spambot wordt ingediend, wordt gedaan door rechtstreeks het bestand comments.php op te roepen. Dit betekent meestal dat de waarde HTTP_REFERRER niet uw domein is en meestal leeg is."
3367
+
3368
+ # @ all-in-one-wp-security-and-firewall
3369
+ #: admin/wp-security-spam-menu.php:180
3370
+ msgid "This feature will check and block comment requests which are not referred by your domain thus greatly reducing your overall blog SPAM and PHP requests done by the server to process these comments."
3371
+ msgstr "Met deze functie worden opmerkingen gecontroleerd en geblokkeerd die niet door uw domein worden doorgestuurd, waardoor uw algehele blog-SPAM- en PHP-verzoeken van de server om deze opmerkingen te verwerken aanzienlijk worden verminderd."
3372
+
3373
+ # @ all-in-one-wp-security-and-firewall
3374
+ #: admin/wp-security-spam-menu.php:207
3375
+ msgid "Nonce check failed for list SPAM comment IPs!"
3376
+ msgstr "Nonce check mislukt voor de lijst SPAM opmerkingen van IP's!"
3377
+
3378
+ # @ all-in-one-wp-security-and-firewall
3379
+ #: admin/wp-security-spam-menu.php:213
3380
+ msgid "You entered a non numeric value for the minimum SPAM comments per IP field. It has been set to the default value."
3381
+ msgstr "U hebt een niet-numerieke waarde ingevoerd voor de minimale SPAM-opmerkingen per IP-veld. Het is ingesteld op de standaardwaarde."
3382
+
3383
+ # @ all-in-one-wp-security-and-firewall
3384
+ #: admin/wp-security-spam-menu.php:225
3385
+ #, php-format
3386
+ msgid "Displaying results for IP addresses which have posted a minimum of %s SPAM comments"
3387
+ msgstr "Resultaten weergeven voor IP-adressen die een minimum van %s SPAM-opmerkingen hebben gepost"
3388
+
3389
+ # @ all-in-one-wp-security-and-firewall
3390
+ #: admin/wp-security-spam-menu.php:241
3391
+ msgid "This tab displays a list of the IP addresses of the people or bots who have left SPAM comments on your site."
3392
+ msgstr "Op dit tabblad wordt een lijst weergegeven met de IP-adressen van de mensen of bots die SPAM-opmerkingen op uw site hebben achtergelaten."
3393
+
3394
+ # @ all-in-one-wp-security-and-firewall
3395
+ #: admin/wp-security-spam-menu.php:242
3396
+ msgid "This information can be handy for identifying the most persistent IP addresses or ranges used by spammers."
3397
+ msgstr "Deze informatie kan handig zijn voor het identificeren van de meest hardnekkige IP-adressen of bereiken die worden gebruikt door spammers."
3398
+
3399
+ # @ all-in-one-wp-security-and-firewall
3400
+ #: admin/wp-security-spam-menu.php:243
3401
+ msgid "By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to your blacklist."
3402
+ msgstr "Door de IP-adresgegevens te controleren die afkomstig zijn van spammers, bent u beter in staat om te bepalen welke adressen of adresreeksen u moet blokkeren door ze toe te voegen aan uw blacklist."
3403
+
3404
+ # @ all-in-one-wp-security-and-firewall
3405
+ #: admin/wp-security-spam-menu.php:244
3406
+ msgid ""
3407
+ "To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the \"Block\" link for the individual row or select more than one address \n"
3408
+ " using the checkboxes and then choose the \"block\" option from the Bulk Actions dropdown list and click the \"Apply\" button."
3409
+ msgstr ""
3410
+ "Om een of meer van de IP-adressen die in de onderstaande tabel worden weergegeven toe te voegen aan uw zwarte lijst, klikt u eenvoudig op de koppeling \"Blokkeren\" voor de afzonderlijke rij of selecteert u meer dan één adres\n"
3411
+ " gebruik de selectievakjes en kies vervolgens de optie \"blokkeren\" in de vervolgkeuzelijst Bulkacties en klik op de knop \"Toepassen\"."
3412
+
3413
+ # @ all-in-one-wp-security-and-firewall
3414
+ #: admin/wp-security-spam-menu.php:250
3415
+ msgid "List SPAMMER IP Addresses"
3416
+ msgstr "Lijst SPAMMER IP-adressen"
3417
+
3418
+ # @ all-in-one-wp-security-and-firewall
3419
+ #: admin/wp-security-spam-menu.php:256
3420
+ msgid "Minimum number of SPAM comments per IP"
3421
+ msgstr "Minimaal aantal SPAM-opmerkingen per IP"
3422
+
3423
+ # @ all-in-one-wp-security-and-firewall
3424
+ #: admin/wp-security-spam-menu.php:258
3425
+ msgid "This field allows you to list only those IP addresses which have been used to post X or more SPAM comments."
3426
+ msgstr "In dit veld kunt u alleen die IP-adressen vermelden die zijn gebruikt om X of meer SPAM-opmerkingen te plaatsen."
3427
+
3428
+ # @ all-in-one-wp-security-and-firewall
3429
+ #: admin/wp-security-spam-menu.php:262
3430
+ msgid "Example 1: Setting this value to \"0\" or \"1\" will list ALL IP addresses which were used to submit SPAM comments."
3431
+ msgstr "Voorbeeld 1: door deze waarde in te stellen op \"0\" of \"1\" worden ALLE IP-adressen vermeld die zijn gebruikt om SPAM-opmerkingen in te dienen."
3432
+
3433
+ # @ all-in-one-wp-security-and-firewall
3434
+ #: admin/wp-security-spam-menu.php:263
3435
+ msgid "Example 2: Setting this value to \"5\" will list only those IP addresses which were used to submit 5 SPAM comments or more on your site."
3436
+ msgstr "Voorbeeld 2: als u deze waarde instelt op \"5\", worden alleen die IP-adressen weergegeven die zijn gebruikt om 5 SPAM-opmerkingen of meer op uw site in te dienen."
3437
+
3438
+ # @ all-in-one-wp-security-and-firewall
3439
+ #: admin/wp-security-spam-menu.php:270
3440
+ msgid "Find IP Addresses"
3441
+ msgstr "Zoek IP-adressen"
3442
+
3443
+ # @ all-in-one-wp-security-and-firewall
3444
+ #: admin/wp-security-spam-menu.php:274
3445
+ msgid "SPAMMER IP Address Results"
3446
+ msgstr "SPAMMER IP-adresresultaten"
3447
+
3448
+ # @ all-in-one-wp-security-and-firewall
3449
+ #: admin/wp-security-spam-menu.php:280 classes/wp-security-utility.php:150
3450
+ msgid "The plugin has detected that you are using a Multi-Site WordPress installation."
3451
+ msgstr "De plug-in heeft gedetecteerd dat u een Multi-Site WordPress-installatie gebruikt."
3452
+
3453
+ # @ all-in-one-wp-security-and-firewall
3454
+ #: admin/wp-security-spam-menu.php:281
3455
+ msgid "Only the \"superadmin\" can block IP addresses from the main site."
3456
+ msgstr "Alleen het \"superadmin\" kan IP-adressen blokkeren van de hoofdsite."
3457
+
3458
+ # @ all-in-one-wp-security-and-firewall
3459
+ #: admin/wp-security-spam-menu.php:282
3460
+ msgid "Take note of the IP addresses you want blocked and ask the superadmin to add these to the blacklist using the \"Blacklist Manager\" on the main site."
3461
+ msgstr "Noteer de IP-adressen die u wilt blokkeren en vraag de superadmin om deze toe te voegen aan de zwarte lijst met behulp van de \"Blacklist Manager\" op de hoofdsite."
3462
+
3463
+ # @ all-in-one-wp-security-and-firewall
3464
+ #: admin/wp-security-user-accounts-menu.php:29
3465
+ msgid "WP Username"
3466
+ msgstr "WP-gebruikersnaam"
3467
+
3468
+ # @ all-in-one-wp-security-and-firewall
3469
+ #: admin/wp-security-user-accounts-menu.php:30
3470
+ msgid "Display Name"
3471
+ msgstr "Naam weergeven"
3472
+
3473
+ # @ all-in-one-wp-security-and-firewall
3474
+ # @ default
3475
+ #: admin/wp-security-user-accounts-menu.php:31
3476
+ #: other-includes/wp-security-rename-login-feature.php:845
3477
+ msgid "Password"
3478
+ msgstr "Wachtwoord"
3479
+
3480
+ # @ all-in-one-wp-security-and-firewall
3481
+ #: admin/wp-security-user-accounts-menu.php:85
3482
+ msgid "Admin User Security"
3483
+ msgstr "Beheerder Gebruikersbeveiliging"
3484
+
3485
+ # @ all-in-one-wp-security-and-firewall
3486
+ #: admin/wp-security-user-accounts-menu.php:88
3487
+ msgid "By default, WordPress sets the administrator username to \"admin\" at installation time."
3488
+ msgstr "WordPress stelt de beheerdersbenaming standaard in op \"admin\" tijdens de installatie."
3489
+
3490
+ # @ all-in-one-wp-security-and-firewall
3491
+ #: admin/wp-security-user-accounts-menu.php:89
3492
+ msgid "A lot of hackers try to take advantage of this information by attempting \"Brute Force Login Attacks\" where they repeatedly try to guess the password by using \"admin\" for username."
3493
+ msgstr "Veel hackers proberen van deze informatie gebruik te maken door \"Brute Force Login Attacks\" uit te proberen, waarbij ze herhaaldelijk proberen het wachtwoord te raden door \"admin\" als gebruikersnaam te gebruiken."
3494
+
3495
+ # @ all-in-one-wp-security-and-firewall
3496
+ #: admin/wp-security-user-accounts-menu.php:90
3497
+ msgid "From a security perspective, changing the default \"admin\" user name is one of the first and smartest things you should do on your site."
3498
+ msgstr "Vanuit beveiligingsoogpunt is het wijzigen van de standaardgebruikersnaam \"admin\" een van de eerste en slimste dingen die u op uw site moet doen."
3499
+
3500
+ # @ all-in-one-wp-security-and-firewall
3501
+ #: admin/wp-security-user-accounts-menu.php:91
3502
+ msgid "This feature will allow you to change your default \"admin\" user name to a more secure name of your choosing."
3503
+ msgstr "Met deze functie kunt u uw standaard \"admin\" -gebruikersnaam wijzigen in een veiligere naam naar keuze."
3504
+
3505
+ # @ all-in-one-wp-security-and-firewall
3506
+ #: admin/wp-security-user-accounts-menu.php:98
3507
+ msgid "List of Administrator Accounts"
3508
+ msgstr "Lijst met beheerdersaccounts"
3509
+
3510
+ # @ all-in-one-wp-security-and-firewall
3511
+ #: admin/wp-security-user-accounts-menu.php:107
3512
+ #: classes/grade-system/wp-security-feature-item-manager.php:36
3513
+ msgid "Change Admin Username"
3514
+ msgstr "Wijzig beheerdersnaam"
3515
+
3516
+ # @ all-in-one-wp-security-and-firewall
3517
+ #: admin/wp-security-user-accounts-menu.php:115
3518
+ msgid ""
3519
+ "Your site currently has an account which uses the default \"admin\" username. \n"
3520
+ " It is highly recommended that you change this name to something else. \n"
3521
+ " Use the following field to change the admin username."
3522
+ msgstr ""
3523
+ "Uw site heeft momenteel een account die de standaard \"admin\" gebruikersnaam gebruikt.\n"
3524
+ " Het wordt sterk aanbevolen om deze naam in iets anders te veranderen.\n"
3525
+ " Gebruik het volgende veld om de gebruikersnaam van de beheerder te wijzigen."
3526
+
3527
+ # @ all-in-one-wp-security-and-firewall
3528
+ #: admin/wp-security-user-accounts-menu.php:123
3529
+ msgid "New Admin Username"
3530
+ msgstr "Nieuwe beheerders-gebruikersnaam"
3531
+
3532
+ # @ all-in-one-wp-security-and-firewall
3533
+ #: admin/wp-security-user-accounts-menu.php:125
3534
+ msgid "Choose a new username for admin."
3535
+ msgstr "Kies een nieuwe gebruikersnaam voor admin."
3536
+
3537
+ # @ all-in-one-wp-security-and-firewall
3538
+ #: admin/wp-security-user-accounts-menu.php:129
3539
+ msgid "Change Username"
3540
+ msgstr "Gebruikersnaam wijzigen"
3541
+
3542
+ # @ all-in-one-wp-security-and-firewall
3543
+ #: admin/wp-security-user-accounts-menu.php:131
3544
+ msgid "NOTE: If you are currently logged in as \"admin\" you will be automatically logged out after changing your username and will be required to log back in."
3545
+ msgstr "OPMERKING: Als u momenteel bent aangemeld als \"admin\", wordt u automatisch uitgelogd nadat u uw gebruikersnaam hebt gewijzigd en moet u opnieuw inloggen."
3546
+
3547
+ # @ all-in-one-wp-security-and-firewall
3548
+ #: admin/wp-security-user-accounts-menu.php:138
3549
+ msgid "No action required! "
3550
+ msgstr "Geen actie nodig! "
3551
+
3552
+ # @ all-in-one-wp-security-and-firewall
3553
+ #: admin/wp-security-user-accounts-menu.php:140
3554
+ msgid "Your site does not have any account which uses the default \"admin\" username. "
3555
+ msgstr "Uw site heeft geen account die de standaard \"admin\" gebruikersnaam gebruikt. "
3556
+
3557
+ # @ all-in-one-wp-security-and-firewall
3558
+ #: admin/wp-security-user-accounts-menu.php:141
3559
+ msgid "This is good security practice."
3560
+ msgstr "Dit zijn goede beveiligings actie."
3561
+
3562
+ # @ all-in-one-wp-security-and-firewall
3563
+ #: admin/wp-security-user-accounts-menu.php:153
3564
+ msgid "Display Name Security"
3565
+ msgstr "Toon de beveilingsnaam"
3566
+
3567
+ # @ all-in-one-wp-security-and-firewall
3568
+ #: admin/wp-security-user-accounts-menu.php:156
3569
+ msgid "When you submit a post or answer a comment, WordPress will usually display your \"nickname\"."
3570
+ msgstr "Wanneer u een bericht verzendt of een opmerking beantwoordt, geeft WordPress meestal uw \"bijnaam\" weer."
3571
+
3572
+ # @ all-in-one-wp-security-and-firewall
3573
+ #: admin/wp-security-user-accounts-menu.php:157
3574
+ msgid "By default the nickname is set to the login (or user) name of your account."
3575
+ msgstr "Standaard is de bijnaam ingesteld op de login- (of gebruikers-) naam van uw account."
3576
+
3577
+ # @ all-in-one-wp-security-and-firewall
3578
+ #: admin/wp-security-user-accounts-menu.php:158
3579
+ msgid "From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account's login credentials."
3580
+ msgstr "Vanuit beveiligingsoogpunt is het onjuist om uw bijnaam hetzelfde te laten als uw gebruikersnaam, omdat deze een hacker op zijn minst de helft van de aanmeldingsreferenties van uw account geeft."
3581
+
3582
+ # @ all-in-one-wp-security-and-firewall
3583
+ #: admin/wp-security-user-accounts-menu.php:159
3584
+ msgid "Therefore to further tighten your site's security you are advised to change your <strong>nickname</strong> and <strong>Display name</strong> to be different from your <strong>Username</strong>."
3585
+ msgstr "Daarom wordt u aangeraden om uw <strong> bijnaam </ strong> en <strong> weergavenaam </ strong> te wijzigen om uw website te beveiligen met uw <strong> gebruikersnaam </ strong>."
3586
+
3587
+ # @ all-in-one-wp-security-and-firewall
3588
+ #: admin/wp-security-user-accounts-menu.php:165
3589
+ msgid "Modify Accounts With Identical Login Name & Display Name"
3590
+ msgstr "Wijzig accounts met identieke inlognaam & weergavenaam"
3591
+
3592
+ # @ all-in-one-wp-security-and-firewall
3593
+ #: admin/wp-security-user-accounts-menu.php:174
3594
+ msgid "Your site currently has the following accounts which have an identical login name and display name."
3595
+ msgstr "Uw site heeft momenteel de volgende accounts met een identieke inlognaam en weergavenaam."
3596
+
3597
+ # @ all-in-one-wp-security-and-firewall
3598
+ #: admin/wp-security-user-accounts-menu.php:175
3599
+ msgid "Click on the link to edit the settings of that particular user account"
3600
+ msgstr "Klik op de link om de instellingen van dat specifieke gebruikersaccount te bewerken"
3601
+
3602
+ # @ all-in-one-wp-security-and-firewall
3603
+ #: admin/wp-security-user-accounts-menu.php:190
3604
+ msgid "No action required."
3605
+ msgstr "Geen actie nodig."
3606
+
3607
+ # @ all-in-one-wp-security-and-firewall
3608
+ #: admin/wp-security-user-accounts-menu.php:191
3609
+ msgid "Your site does not have a user account where the display name is identical to the username."
3610
+ msgstr "Uw site heeft geen gebruikersaccount waarvan de weergavenaam identiek is aan de gebruikersnaam."
3611
+
3612
+ # @ all-in-one-wp-security-and-firewall
3613
+ #: admin/wp-security-user-accounts-menu.php:202
3614
+ msgid "Password Tool"
3615
+ msgstr "Wachtwoord tool"
3616
+
3617
+ # @ all-in-one-wp-security-and-firewall
3618
+ #: admin/wp-security-user-accounts-menu.php:205
3619
+ msgid "Poor password selection is one of the most common weak points of many sites and is usually the first thing a hacker will try to exploit when attempting to break into your site."
3620
+ msgstr "Slechte wachtwoordselectie is een van de meest voorkomende zwakke punten van veel sites en is meestal het eerste wat een hacker probeert te misbruiken wanneer hij probeert in te breken op uw site."
3621
+
3622
+ # @ all-in-one-wp-security-and-firewall
3623
+ #: admin/wp-security-user-accounts-menu.php:206
3624
+ msgid "Many people fall into the trap of using a simple word or series of numbers as their password. Such a predictable and simple password would take a competent hacker merely minutes to guess your password by using a simple script which cycles through the easy and most common combinations."
3625
+ msgstr "Veel mensen raken in de val bij het gebruik van een simpel woord of een reeks cijfers als wachtwoord. Een dergelijk voorspelbaar en eenvoudig wachtwoord zou een bekwame hacker slechts enkele minuten kosten om uw wachtwoord te raden met behulp van een eenvoudig script dat door de eenvoudige en meest gebruikelijke combinaties loopt."
3626
+
3627
+ # @ all-in-one-wp-security-and-firewall
3628
+ #: admin/wp-security-user-accounts-menu.php:207
3629
+ msgid "The longer and more complex your password is the harder it is for hackers to \"crack\" because more complex passwords require much greater computing power and time."
3630
+ msgstr "Hoe langer en complexer uw wachtwoord is, hoe moeilijker het voor hackers is om te \"kraken\", omdat meer complexe wachtwoorden veel meer rekenkracht en tijd vereisen."
3631
+
3632
+ # @ all-in-one-wp-security-and-firewall
3633
+ #: admin/wp-security-user-accounts-menu.php:208
3634
+ msgid "This section contains a useful password strength tool which you can use to check whether your password is sufficiently strong enough."
3635
+ msgstr "Dit gedeelte bevat een handig wachtwoordsterktetool dat u kunt gebruiken om te controleren of uw wachtwoord voldoende sterk genoeg is."
3636
+
3637
+ # @ all-in-one-wp-security-and-firewall
3638
+ #: admin/wp-security-user-accounts-menu.php:213
3639
+ msgid "Password Strength Tool"
3640
+ msgstr "Wachtwoord sterkte tool"
3641
+
3642
+ # @ all-in-one-wp-security-and-firewall
3643
+ #: admin/wp-security-user-accounts-menu.php:218
3644
+ msgid "Start typing a password."
3645
+ msgstr "Begin met het typen van een wachtwoord."
3646
+
3647
+ # @ all-in-one-wp-security-and-firewall
3648
+ #: admin/wp-security-user-accounts-menu.php:221
3649
+ msgid "It would take a desktop PC approximately"
3650
+ msgstr "Het zou een desktop-pc ongeveerzoveel tijd kosten"
3651
+
3652
+ # @ all-in-one-wp-security-and-firewall
3653
+ #: admin/wp-security-user-accounts-menu.php:222
3654
+ msgid "1 sec"
3655
+ msgstr "1 sec"
3656
+
3657
+ # @ all-in-one-wp-security-and-firewall
3658
+ #: admin/wp-security-user-accounts-menu.php:222
3659
+ msgid "to crack your password!"
3660
+ msgstr "om je wachtwoord te kraken!"
3661
+
3662
+ # @ all-in-one-wp-security-and-firewall
3663
+ #: admin/wp-security-user-accounts-menu.php:227
3664
+ msgid "Password Strength"
3665
+ msgstr "Wachtwoord sterkte"
3666
+
3667
+ # @ all-in-one-wp-security-and-firewall
3668
+ #: admin/wp-security-user-accounts-menu.php:243
3669
+ msgid "Nonce check failed on admin username change operation!"
3670
+ msgstr "Controle nonce is mislukt bij wijziging van de beheerders gebruikersnaam!"
3671
+
3672
+ # @ all-in-one-wp-security-and-firewall
3673
+ #: admin/wp-security-user-accounts-menu.php:250
3674
+ msgid "Username "
3675
+ msgstr "Gebruikersnaam "
3676
+
3677
+ # @ all-in-one-wp-security-and-firewall
3678
+ #: admin/wp-security-user-accounts-menu.php:250
3679
+ msgid " already exists. Please enter another value. "
3680
+ msgstr " bestaat al. Voer een andere waarde in. "
3681
+
3682
+ # @ all-in-one-wp-security-and-firewall
3683
+ #: admin/wp-security-user-accounts-menu.php:266
3684
+ msgid "The database update operation of the user account failed!"
3685
+ msgstr "De database-update van het gebruikersaccount is mislukt!"
3686
+
3687
+ # @ all-in-one-wp-security-and-firewall
3688
+ #: admin/wp-security-user-accounts-menu.php:293
3689
+ msgid "You entered an invalid username. Please enter another value. "
3690
+ msgstr "U hebt een ongeldige gebruikersnaam ingevoerd. Voer een andere waarde in. "
3691
+
3692
+ # @ all-in-one-wp-security-and-firewall
3693
+ #: admin/wp-security-user-accounts-menu.php:297
3694
+ msgid "Please enter a value for your username. "
3695
+ msgstr "Voer een waarde in voor uw gebruikersnaam. "
3696
+
3697
+ # @ all-in-one-wp-security-and-firewall
3698
+ #: admin/wp-security-user-accounts-menu.php:304
3699
+ msgid "Username Successfully Changed!"
3700
+ msgstr "Gebruikersnaam is succesvol gewijzigd!"
3701
+
3702
+ # @ all-in-one-wp-security-and-firewall
3703
+ #: admin/wp-security-user-accounts-menu.php:324
3704
+ msgid "Account Login Name"
3705
+ msgstr "Account Login naam"
3706
+
3707
+ # @ all-in-one-wp-security-and-firewall
3708
+ #: admin/wp-security-user-login-menu.php:26
3709
+ #: admin/wp-security-user-login-menu.php:298
3710
+ msgid "Failed Login Records"
3711
+ msgstr "Mislukte Login Records"
3712
+
3713
+ # @ all-in-one-wp-security-and-firewall
3714
+ #: admin/wp-security-user-login-menu.php:27
3715
+ #: classes/grade-system/wp-security-feature-item-manager.php:50
3716
+ msgid "Force Logout"
3717
+ msgstr "Gedwongen afmelden"
3718
+
3719
+ # @ all-in-one-wp-security-and-firewall
3720
+ #: admin/wp-security-user-login-menu.php:28
3721
+ #: admin/wp-security-user-login-menu.php:432
3722
+ msgid "Account Activity Logs"
3723
+ msgstr "Log van accountactiviteit"
3724
+
3725
+ # @ all-in-one-wp-security-and-firewall
3726
+ #: admin/wp-security-user-login-menu.php:96
3727
+ msgid "You entered a non numeric value for the max login attempts field. It has been set to the default value."
3728
+ msgstr "U hebt geen numerieke waarde ingevoerd voor het veld Max. loginpogingen. Het is ingesteld op de standaardwaarde."
3729
+
3730
+ # @ all-in-one-wp-security-and-firewall
3731
+ #: admin/wp-security-user-login-menu.php:103
3732
+ msgid "You entered a non numeric value for the login retry time period field. It has been set to the default value."
3733
+ msgstr "U hebt geen numerieke waarde ingevoerd voor het veld opnieuw aanmelden tijdsperiode. Het is ingesteld op de standaardwaarde."
3734
+
3735
+ # @ all-in-one-wp-security-and-firewall
3736
+ #: admin/wp-security-user-login-menu.php:159
3737
+ msgid "Login Lockdown Configuration"
3738
+ msgstr "Login vergrendel configuratie"
3739
+
3740
+ # @ all-in-one-wp-security-and-firewall
3741
+ #: admin/wp-security-user-login-menu.php:163
3742
+ msgid "One of the ways hackers try to compromise sites is via a "
3743
+ msgstr "Een van de manieren waarop hackers proberen sites te compromitteren is via een "
3744
+
3745
+ # @ all-in-one-wp-security-and-firewall
3746
+ #: admin/wp-security-user-login-menu.php:163
3747
+ msgid "Brute Force Login Attack"
3748
+ msgstr "Brute force login aanval"
3749
+
3750
+ # @ all-in-one-wp-security-and-firewall
3751
+ #: admin/wp-security-user-login-menu.php:164
3752
+ msgid "This is where attackers use repeated login attempts until they guess the password."
3753
+ msgstr "Dit is waar aanvallers herhaalde inlogpogingen gebruiken totdat ze het wachtwoord raden."
3754
+
3755
+ # @ all-in-one-wp-security-and-firewall
3756
+ #: admin/wp-security-user-login-menu.php:165
3757
+ msgid "Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks."
3758
+ msgstr "Afgezien van het kiezen van sterke wachtwoorden is het controleren en blokkeren van IP-adressen die in korte tijd betrokken zijn bij herhaalde inlogproblemen, een zeer effectieve manier om dit soort aanvallen te stoppen."
3759
+
3760
+ # @ all-in-one-wp-security-and-firewall
3761
+ #: admin/wp-security-user-login-menu.php:166
3762
+ #, php-format
3763
+ msgid "You may also want to checkout our %s feature for another secure way to protect against these types of attacks."
3764
+ msgstr "U kunt ook onze %s functie checken voor een andere veilige manier om u te beschermen tegen dit soort aanvallen."
3765
+
3766
+ # @ all-in-one-wp-security-and-firewall
3767
+ #: admin/wp-security-user-login-menu.php:171
3768
+ msgid "Login Lockdown Options"
3769
+ msgstr "Aanmeldings vergrendel opties voor inloggen"
3770
+
3771
+ # @ all-in-one-wp-security-and-firewall
3772
+ #: admin/wp-security-user-login-menu.php:183
3773
+ msgid "Enable Login Lockdown Feature"
3774
+ msgstr "Schakel Login vergrendel kenmerken in"
3775
+
3776
+ # @ all-in-one-wp-security-and-firewall
3777
+ #: admin/wp-security-user-login-menu.php:186
3778
+ msgid "Check this if you want to enable the login lockdown feature and apply the settings below"
3779
+ msgstr "Selecteer dit als u de functie voor het vergrendelen van inloggegevens wilt inschakelen en de onderstaande instellingen wilt toepassen"
3780
+
3781
+ # @ all-in-one-wp-security-and-firewall
3782
+ #: admin/wp-security-user-login-menu.php:190
3783
+ msgid "Allow Unlock Requests"
3784
+ msgstr "Laat ontgrendelverzoeken toe"
3785
+
3786
+ # @ all-in-one-wp-security-and-firewall
3787
+ #: admin/wp-security-user-login-menu.php:193
3788
+ msgid "Check this if you want to allow users to generate an automated unlock request link which will unlock their account"
3789
+ msgstr "Vink dit aan als u wilt dat gebruikers een automatische ontgrendelverzoeklink kunnen genereren die hun account ontgrendelt"
3790
+
3791
+ # @ all-in-one-wp-security-and-firewall
3792
+ #: admin/wp-security-user-login-menu.php:197
3793
+ msgid "Max Login Attempts"
3794
+ msgstr "Maximale inlogpogingen"
3795
+
3796
+ # @ all-in-one-wp-security-and-firewall
3797
+ #: admin/wp-security-user-login-menu.php:199
3798
+ msgid "Set the value for the maximum login retries before IP address is locked out"
3799
+ msgstr "Stel de waarde in voor het maximale aantal pogingen om opnieuw in te loggen voordat het IP-adres is geblokkeerd"
3800
+
3801
+ # @ all-in-one-wp-security-and-firewall
3802
+ #: admin/wp-security-user-login-menu.php:203
3803
+ msgid "Login Retry Time Period (min)"
3804
+ msgstr "Tijdsperiode voor het opnieuw proberen om in te loggen (min)"
3805
+
3806
+ # @ all-in-one-wp-security-and-firewall
3807
+ #: admin/wp-security-user-login-menu.php:205
3808
+ msgid "If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address"
3809
+ msgstr "Als het maximale aantal mislukte inlogpogingen voor een bepaald IP-adres binnen deze tijdsperiode plaatsvindt, blokkeert de plug-in dat adres"
3810
+
3811
+ # @ all-in-one-wp-security-and-firewall
3812
+ #: admin/wp-security-user-login-menu.php:209
3813
+ msgid "Time Length of Lockout (min)"
3814
+ msgstr "Duur van de lockout tijd (min)"
3815
+
3816
+ # @ all-in-one-wp-security-and-firewall
3817
+ #: admin/wp-security-user-login-menu.php:211
3818
+ msgid "Set the length of time for which a particular IP address will be prevented from logging in"
3819
+ msgstr "Stel de tijdsduur in waarin een bepaald IP-adres zich niet kan aanmelden"
3820
+
3821
+ # @ all-in-one-wp-security-and-firewall
3822
+ #: admin/wp-security-user-login-menu.php:215
3823
+ msgid "Display Generic Error Message"
3824
+ msgstr "Toon algemeen foutbericht"
3825
+
3826
+ # @ all-in-one-wp-security-and-firewall
3827
+ #: admin/wp-security-user-login-menu.php:218
3828
+ msgid "Check this if you want to show a generic error message when a login attempt fails"
3829
+ msgstr "Selecteer dit als u een generiek foutbericht wilt weergeven wanneer een inlogpoging mislukt"
3830
+
3831
+ # @ all-in-one-wp-security-and-firewall
3832
+ #: admin/wp-security-user-login-menu.php:222
3833
+ msgid "Instantly Lockout Invalid Usernames"
3834
+ msgstr "Directe uitsluiting van ongeldige gebruikersnamen"
3835
+
3836
+ # @ all-in-one-wp-security-and-firewall
3837
+ #: admin/wp-security-user-login-menu.php:225
3838
+ msgid "Check this if you want to instantly lockout login attempts with usernames which do not exist on your system"
3839
+ msgstr "Vink dit aan als u inlogpogingen onmiddellijk wilt blokkeren met gebruikersnamen die niet bestaan op uw systeem"
3840
+
3841
+ # @ all-in-one-wp-security-and-firewall
3842
+ #: admin/wp-security-user-login-menu.php:230
3843
+ msgid "Notify By Email"
3844
+ msgstr "Melden per e-mail"
3845
+
3846
+ # @ all-in-one-wp-security-and-firewall
3847
+ #: admin/wp-security-user-login-menu.php:233
3848
+ msgid "Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts"
3849
+ msgstr "Vink dit aan als u een e-mail wilt ontvangen wanneer iemand is geblokkerd vanwege het maximaal aantal mislukte inlogpogingen"
3850
+
3851
+ # @ all-in-one-wp-security-and-firewall
3852
+ #: admin/wp-security-user-login-menu.php:243
3853
+ msgid "Currently Locked Out IP Address Ranges"
3854
+ msgstr "Aantal van momenteel geblokkeerde IP-adres"
3855
+
3856
+ # @ all-in-one-wp-security-and-firewall
3857
+ #: admin/wp-security-user-login-menu.php:248
3858
+ #, php-format
3859
+ msgid "To see a list of all locked IP addresses and ranges go to the %s tab in the dashboard menu."
3860
+ msgstr "Als u een lijst met alle vergrendelde IP-adressen en bereiken wilt zien, gaat u naar het tabblad %s in het dashboardmenu."
3861
+
3862
+ # @ all-in-one-wp-security-and-firewall
3863
+ #: admin/wp-security-user-login-menu.php:264
3864
+ msgid "Nonce check failed for delete all failed login records operation!"
3865
+ msgstr "Nonce check mislukt voor het verwijderen van alle mislukte login records operatie!"
3866
+
3867
+ # @ all-in-one-wp-security-and-firewall
3868
+ #: admin/wp-security-user-login-menu.php:273
3869
+ msgid "User Login Feature - Delete all failed login records operation failed!"
3870
+ msgstr "Gebruikersaanmeldings kenmerken - Verwijder alle records van mislukte inlog pogingen!"
3871
+
3872
+ # @ all-in-one-wp-security-and-firewall
3873
+ #: admin/wp-security-user-login-menu.php:277
3874
+ msgid "All records from the Failed Logins table were deleted successfully!"
3875
+ msgstr "Alle records uit de lijst mislukt inlogingen zijn met succes verwijderd!"
3876
+
3877
+ # @ all-in-one-wp-security-and-firewall
3878
+ #: admin/wp-security-user-login-menu.php:292
3879
+ msgid "This tab displays the failed login attempts for your site."
3880
+ msgstr "Op dit tabblad worden de mislukte inlogpogingen voor uw site weergegeven."
3881
+
3882
+ # @ all-in-one-wp-security-and-firewall
3883
+ #: admin/wp-security-user-login-menu.php:293
3884
+ msgid "The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt."
3885
+ msgstr "De onderstaande informatie kan handig zijn als u beveiligingsonderzoeken moet uitvoeren omdat deze u het IP-bereik, de gebruikersnaam en ID (indien van toepassing) en de tijd / datum van de mislukte inlogpoging laten zien."
3886
+
3887
+ # @ all-in-one-wp-security-and-firewall
3888
+ #: admin/wp-security-user-login-menu.php:314
3889
+ #: admin/wp-security-user-login-menu.php:323
3890
+ msgid "Delete All Failed Login Records"
3891
+ msgstr "Verwijder alle mislukte inlog records"
3892
+
3893
+ # @ all-in-one-wp-security-and-firewall
3894
+ #: admin/wp-security-user-login-menu.php:320
3895
+ msgid "Click this button if you wish to delete all failed login records in one go."
3896
+ msgstr "Klik op deze knop als u alle mislukte in log records in één keer wilt verwijderen."
3897
+
3898
+ # @ all-in-one-wp-security-and-firewall
3899
+ #: admin/wp-security-user-login-menu.php:348
3900
+ msgid "You entered a non numeric value for the logout time period field. It has been set to the default value."
3901
+ msgstr "U hebt een geen numerieke waarde ingevoerd voor het veld logout-tijdsperiode. Het is ingesteld op de standaardwaarde."
3902
+
3903
+ # @ all-in-one-wp-security-and-firewall
3904
+ #: admin/wp-security-user-login-menu.php:376
3905
+ msgid "Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer."
3906
+ msgstr "Het instellen van een vervalperiode voor uw WP-beheersessie is een eenvoudige manier om uw computer tegen ongeoorloofde toegang tot uw site te beschermen."
3907
+
3908
+ # @ all-in-one-wp-security-and-firewall
3909
+ #: admin/wp-security-user-login-menu.php:377
3910
+ msgid "This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in."
3911
+ msgstr "Met deze functie kunt u een tijdsperiode opgeven in minuten waarna de beheersessie verloopt en de gebruiker gedwongen wordt weer in te loggen."
3912
+
3913
+ # @ all-in-one-wp-security-and-firewall
3914
+ #: admin/wp-security-user-login-menu.php:382
3915
+ msgid "Force User Logout Options"
3916
+ msgstr "Geforceerde gebruikers uitlogopties"
3917
+
3918
+ # @ all-in-one-wp-security-and-firewall
3919
+ #: admin/wp-security-user-login-menu.php:394
3920
+ msgid "Enable Force WP User Logout"
3921
+ msgstr "Schakel geforceerde WP gebruikers uitlogoptie in"
3922
+
3923
+ # @ all-in-one-wp-security-and-firewall
3924
+ #: admin/wp-security-user-login-menu.php:397
3925
+ msgid "Check this if you want to force a wp user to be logged out after a configured amount of time"
3926
+ msgstr "Selecteer dit als u wilt dat een wp-gebruiker na een ingestelde tijd wordt uitgelogd"
3927
+
3928
+ # @ all-in-one-wp-security-and-firewall
3929
+ #: admin/wp-security-user-login-menu.php:401
3930
+ msgid "Logout the WP User After XX Minutes"
3931
+ msgstr "WP-gebruiker na XX minuten uitloggen"
3932
+
3933
+ # @ all-in-one-wp-security-and-firewall
3934
+ #: admin/wp-security-user-login-menu.php:403
3935
+ msgid "(Minutes) The user will be forced to log back in after this time period has elapased."
3936
+ msgstr "(Minuten) De gebruiker wordt gedwongen zich weer aan te melden nadat deze periode is verstreken."
3937
+
3938
+ # @ all-in-one-wp-security-and-firewall
3939
+ #: admin/wp-security-user-login-menu.php:426
3940
+ msgid "This tab displays the login activity for WordPress admin accounts registered with your site."
3941
+ msgstr "Dit tabblad toont de login-activiteit voor WordPress-beheerdersaccounts die bij uw site zijn geregistreerd."
3942
+
3943
+ # @ all-in-one-wp-security-and-firewall
3944
+ #: admin/wp-security-user-login-menu.php:427
3945
+ msgid "The information below can be handy if you need to do security investigations because it will show you the last 50 recent login events by username, IP address and time/date."
3946
+ msgstr "De onderstaande informatie kan handig zijn als u beveiligingsonderzoeken moet uitvoeren omdat u de laatste 50 recente aanmeldingsgebeurtenissen te zien krijgt op gebruikersnaam, IP-adres en tijd / datum."
3947
+
3948
+ # @ all-in-one-wp-security-and-firewall
3949
+ #: admin/wp-security-user-login-menu.php:464
3950
+ msgid "Nonce check failed for users logged in list!"
3951
+ msgstr "Nonce check mislukt voor ingelogde gebruikerslijst!"
3952
+
3953
+ # @ all-in-one-wp-security-and-firewall
3954
+ #: admin/wp-security-user-login-menu.php:477
3955
+ msgid "Refresh Logged In User Data"
3956
+ msgstr "Vernieuwde ingelogde gebruikersgegevens vernieuwen"
3957
+
3958
+ # @ all-in-one-wp-security-and-firewall
3959
+ #: admin/wp-security-user-login-menu.php:481
3960
+ msgid "Refresh Data"
3961
+ msgstr "Data vernieuwen"
3962
+
3963
+ # @ all-in-one-wp-security-and-firewall
3964
+ #: admin/wp-security-user-login-menu.php:487
3965
+ msgid "This tab displays all users who are currently logged into your site."
3966
+ msgstr "Op dit tabblad worden alle gebruikers weergegeven die op uw site zijn ingelogd."
3967
+
3968
+ # @ all-in-one-wp-security-and-firewall
3969
+ #: admin/wp-security-user-login-menu.php:488
3970
+ msgid "If you suspect there is a user or users who are logged in which should not be, you can block them by inspecting the IP addresses from the data below and adding them to your blacklist."
3971
+ msgstr "Als u vermoedt dat er een gebruiker is of gebruikers die zijn ingelogd en dat niet zou moeten zijn, kunt u deze blokkeren door de IP-adressen uit de onderstaande gegevens te controleren en ze toe te voegen aan uw zwarte lijst."
3972
+
3973
+ # @ all-in-one-wp-security-and-firewall
3974
+ #: admin/wp-security-user-login-menu.php:493
3975
+ msgid "Currently Logged In Users"
3976
+ msgstr "Momenteel ingelogde gebruikers"
3977
+
3978
+ # @ all-in-one-wp-security-and-firewall
3979
+ #: admin/wp-security-user-login-menu.php:558
3980
+ msgid "The selected records were deleted successfully!"
3981
+ msgstr "De geselecteerde records zijn succesvol verwijderd!"
3982
+
3983
+ # @ all-in-one-wp-security-and-firewall
3984
+ #: admin/wp-security-user-login-menu.php:567
3985
+ msgid "The selected record was deleted successfully!"
3986
+ msgstr "Het geselecteerde record is succesvol verwijderd!"
3987
+
3988
+ # @ all-in-one-wp-security-and-firewall
3989
+ #: admin/wp-security-user-registration-menu.php:23
3990
+ msgid "Manual Approval"
3991
+ msgstr "Handmatige goedkeuring"
3992
+
3993
+ # @ all-in-one-wp-security-and-firewall
3994
+ #: admin/wp-security-user-registration-menu.php:24
3995
+ #: classes/grade-system/wp-security-feature-item-manager.php:56
3996
+ msgid "Registration Captcha"
3997
+ msgstr "Registratie Captcha"
3998
+
3999
+ # @ all-in-one-wp-security-and-firewall
4000
+ #: admin/wp-security-user-registration-menu.php:112
4001
+ msgid "User Registration Settings"
4002
+ msgstr "Gebruikersregistratie-instellingen"
4003
+
4004
+ # @ all-in-one-wp-security-and-firewall
4005
+ #: admin/wp-security-user-registration-menu.php:116
4006
+ msgid "Manually Approve New Registrations"
4007
+ msgstr "Handmatig nieuwe registraties goedkeuren"
4008
+
4009
+ # @ all-in-one-wp-security-and-firewall
4010
+ #: admin/wp-security-user-registration-menu.php:120
4011
+ msgid "If your site allows people to create their own accounts via the WordPress registration form, then you can minimize SPAM or bogus registrations by manually approving each registration."
4012
+ msgstr "Als uw site mensen toestaat om hun eigen accounts aan te maken via het registratieformulier van WordPress, dan kunt u SPAM- of valse registraties minimaliseren door elke registratie handmatig goed te keuren."
4013
+
4014
+ # @ all-in-one-wp-security-and-firewall
4015
+ #: admin/wp-security-user-registration-menu.php:121
4016
+ msgid "This feature will automatically set a newly registered account to \"pending\" until the administrator activates it. Therefore undesirable registrants will be unable to log in without your express approval."
4017
+ msgstr "Met deze functie wordt automatisch een nieuw geregistreerde account ingesteld op \"In behandeling\" totdat de beheerder deze activeert. Ongewenste registranten kunnen daarom niet inloggen zonder uw uitdrukkelijke toestemming."
4018
+
4019
+ # @ all-in-one-wp-security-and-firewall
4020
+ #: admin/wp-security-user-registration-menu.php:122
4021
+ msgid "You can view all accounts which have been newly registered via the handy table below and you can also perform bulk activation/deactivation/deletion tasks on each account."
4022
+ msgstr "U kunt alle accounts die nieuw zijn geregistreerd bekijken via de onderstaande handige tabel en u kunt ook bulkactivatie- / deactiverings- / verwijderingstaken uitvoeren voor elk account."
4023
+
4024
+ # @ all-in-one-wp-security-and-firewall
4025
+ #: admin/wp-security-user-registration-menu.php:138
4026
+ msgid "Enable manual approval of new registrations"
4027
+ msgstr "Schakel handmatige goedkeuring van nieuwe registraties in"
4028
+
4029
+ # @ all-in-one-wp-security-and-firewall
4030
+ #: admin/wp-security-user-registration-menu.php:141
4031
+ msgid "Check this if you want to automatically disable all newly registered accounts so that you can approve them manually."
4032
+ msgstr "Selecteer dit als u alle nieuw geregistreerde accounts automatisch wilt uitschakelen, zodat u ze handmatig kunt goedkeuren."
4033
+
4034
+ # @ all-in-one-wp-security-and-firewall
4035
+ #: admin/wp-security-user-registration-menu.php:150
4036
+ msgid "Approve Registered Users"
4037
+ msgstr "Goedgekeurde geregistreerde gebruikers"
4038
+
4039
+ # @ all-in-one-wp-security-and-firewall
4040
+ #: admin/wp-security-user-registration-menu.php:195
4041
+ msgid "This feature allows you to add a captcha form on the WordPress registration page."
4042
+ msgstr "Met deze functie kunt u een captcha-formulier toevoegen aan de registratiepagina van WordPress."
4043
+
4044
+ # @ all-in-one-wp-security-and-firewall
4045
+ #: admin/wp-security-user-registration-menu.php:196
4046
+ msgid "Users who attempt to register will also need to enter the answer to a simple mathematical question - if they enter the wrong answer, the plugin will not allow them to register."
4047
+ msgstr "Gebruikers die proberen zich te registreren, moeten ook het antwoord op een eenvoudige wiskundige vraag invoeren. Als ze een verkeerd antwoord invoeren, kan de plug-in hen niet toestaan zich te registreren."
4048
+
4049
+ # @ all-in-one-wp-security-and-firewall
4050
+ #: admin/wp-security-user-registration-menu.php:197
4051
+ msgid "Therefore, adding a captcha form on the registration page is another effective yet simple SPAM registration prevention technique."
4052
+ msgstr "Daarom is het toevoegen van een captcha-formulier op de registratiepagina een andere effectieve maar toch eenvoudige SPAM-registratiepreventietechniek."
4053
+
4054
+ # @ all-in-one-wp-security-and-firewall
4055
+ #: admin/wp-security-user-registration-menu.php:202
4056
+ msgid "Registration Page Captcha Settings"
4057
+ msgstr "Registratiepagina Captcha-instellingen"
4058
+
4059
+ # @ all-in-one-wp-security-and-firewall
4060
+ #: admin/wp-security-user-registration-menu.php:214
4061
+ msgid "Enable Captcha On Registration Page"
4062
+ msgstr "Captcha op registratiepagina inschakelen"
4063
+
4064
+ # @ all-in-one-wp-security-and-firewall
4065
+ #: admin/wp-security-user-registration-menu.php:217
4066
+ msgid "Check this if you want to insert a captcha form on the WordPress user registration page (if you allow user registration)."
4067
+ msgstr "Selecteer dit als u een captcha-formulier wilt invoegen op de gebruikersregistratiepagina van WordPress (als u gebruikersregistratie toestaat)."
4068
+
4069
+ # @ all-in-one-wp-security-and-firewall
4070
+ #: admin/wp-security-whois-menu.php:22
4071
+ msgid "WhoIS Lookup"
4072
+ msgstr "WhoIS opzoeken"
4073
+
4074
+ # @ all-in-one-wp-security-and-firewall
4075
+ #: admin/wp-security-whois-menu.php:74
4076
+ msgid "WHOIS Lookup Information"
4077
+ msgstr "WHOIS opzoek informatie"
4078
+
4079
+ # @ all-in-one-wp-security-and-firewall
4080
+ #: admin/wp-security-whois-menu.php:77
4081
+ msgid "This feature allows you to look up more detailed information about an IP address or domain name by querying the WHOIS API."
4082
+ msgstr "Met deze functie kunt u meer gedetailleerde informatie over een IP-adres of domeinnaam opzoeken door de WHOIS API te raadplegen."
4083
+
4084
+ # @ all-in-one-wp-security-and-firewall
4085
+ #: admin/wp-security-whois-menu.php:83
4086
+ msgid "Perform a WHOIS Lookup for an IP or Domain Name"
4087
+ msgstr "Voer een WHOIS-zoekopdracht uit voor een IP- of domeinnaam"
4088
+
4089
+ # @ all-in-one-wp-security-and-firewall
4090
+ #: admin/wp-security-whois-menu.php:89
4091
+ msgid "Enter IP Address or Domain Name"
4092
+ msgstr "Voer het IP-adres of de domeinnaam in"
4093
+
4094
+ # @ all-in-one-wp-security-and-firewall
4095
+ #: admin/wp-security-whois-menu.php:91
4096
+ msgid "Enter an IP address or domain name. Example: 111.11.12.13 OR some-domain-name.com"
4097
+ msgstr "Voer een IP-adres of domeinnaam in. Voorbeeld: 111.11.12.13 OF een-domeinnaam.com"
4098
+
4099
+ # @ all-in-one-wp-security-and-firewall
4100
+ #: admin/wp-security-whois-menu.php:95
4101
+ msgid "Perform IP or Domain Lookup"
4102
+ msgstr "IP of Domein opzoeken uitvoeren"
4103
+
4104
+ # @ all-in-one-wp-security-and-firewall
4105
+ #: admin/wp-security-whois-menu.php:115
4106
+ msgid "WHOIS lookup successfully completed. Please see the results below:"
4107
+ msgstr "WHOIS-zoekopdracht is voltooid. Zie de resultaten hieronder:"
4108
+
4109
+ # @ all-in-one-wp-security-and-firewall
4110
+ #: admin/wp-security-whois-menu.php:127
4111
+ msgid "You have entered an incorrectly formatted IP address or domain name. Please try again."
4112
+ msgstr "U hebt een onjuist geformatteerd IP-adres of een domeinnaam ingevoerd. Probeer het opnieuw."
4113
+
4114
+ # @ all-in-one-wp-security-and-firewall
4115
+ #: classes/grade-system/wp-security-feature-item-manager.php:29
4116
+ msgid "Remove WP Generatore Meta Tag"
4117
+ msgstr "WP-generator-metatag verwijderen"
4118
+
4119
+ # @ all-in-one-wp-security-and-firewall
4120
+ #: classes/grade-system/wp-security-feature-item-manager.php:38
4121
+ msgid "Change Display Name"
4122
+ msgstr "Verander de naam weergave"
4123
+
4124
+ # @ all-in-one-wp-security-and-firewall
4125
+ #: classes/grade-system/wp-security-feature-item-manager.php:46
4126
+ msgid "Lost Password Captcha"
4127
+ msgstr "Wachtwoord vergeten Captcha"
4128
+
4129
+ # @ all-in-one-wp-security-and-firewall
4130
+ #: classes/grade-system/wp-security-feature-item-manager.php:48
4131
+ msgid "Login IP Whitelisting"
4132
+ msgstr "Login IP niet geblokkeerdelijst"
4133
+
4134
+ # @ all-in-one-wp-security-and-firewall
4135
+ #: classes/grade-system/wp-security-feature-item-manager.php:54
4136
+ msgid "Registration Approval"
4137
+ msgstr "Registratie Goedkeuring"
4138
+
4139
+ # @ all-in-one-wp-security-and-firewall
4140
+ #: classes/grade-system/wp-security-feature-item-manager.php:70
4141
+ msgid "WordPress Files Access"
4142
+ msgstr "WordPress bestanden openen"
4143
+
4144
+ # @ all-in-one-wp-security-and-firewall
4145
+ #: classes/grade-system/wp-security-feature-item-manager.php:74
4146
+ msgid "IP and User Agent Blacklisting"
4147
+ msgstr "Zwarte lijst IP adressen en gebruikers"
4148
+
4149
+ # @ all-in-one-wp-security-and-firewall
4150
+ #: classes/grade-system/wp-security-feature-item-manager.php:78
4151
+ msgid "Enable Basic Firewall"
4152
+ msgstr "Schakel de basis firewallbescherming in"
4153
+
4154
+ # @ all-in-one-wp-security-and-firewall
4155
+ #: classes/grade-system/wp-security-feature-item-manager.php:79
4156
+ msgid "Enable Pingback Vulnerability Protection"
4157
+ msgstr "Schakel Pingback-beveiligingslek in"
4158
+
4159
+ # @ all-in-one-wp-security-and-firewall
4160
+ #: classes/grade-system/wp-security-feature-item-manager.php:80
4161
+ msgid "Enable IP blocking for 404 detection"
4162
+ msgstr "IP-blokkering inschakelen voor 404-detectie"
4163
+
4164
+ # @ all-in-one-wp-security-and-firewall
4165
+ #: classes/grade-system/wp-security-feature-item-manager.php:84
4166
+ msgid "Enable Rename Login Page"
4167
+ msgstr "Schakel de naam wijziging van de inlogpagina in"
4168
+
4169
+ # @ all-in-one-wp-security-and-firewall
4170
+ #: classes/grade-system/wp-security-feature-item-manager.php:90
4171
+ msgid "Forbid Proxy Comments"
4172
+ msgstr "Verhinder Proxy-opmerkingen"
4173
+
4174
+ # @ all-in-one-wp-security-and-firewall
4175
+ #: classes/grade-system/wp-security-feature-item-manager.php:91
4176
+ msgid "Deny Bad Queries"
4177
+ msgstr "Weigerdslechte zoekopdrachten"
4178
+
4179
+ # @ all-in-one-wp-security-and-firewall
4180
+ #: classes/grade-system/wp-security-feature-item-manager.php:93
4181
+ msgid "5G Blacklist"
4182
+ msgstr "5G B;acklist"
4183
+
4184
+ # @ all-in-one-wp-security-and-firewall
4185
+ #: classes/grade-system/wp-security-feature-item-manager.php:96
4186
+ msgid "Block Spambots"
4187
+ msgstr "Spambots blokkeren"
4188
+
4189
+ # @ all-in-one-wp-security-and-firewall
4190
+ #: classes/grade-system/wp-security-feature-item-manager.php:98
4191
+ msgid "Comment Captcha"
4192
+ msgstr "Captcha Commentaar"
4193
+
4194
+ # @ all-in-one-wp-security-and-firewall
4195
+ #: classes/grade-system/wp-security-feature-item.php:28
4196
+ msgid "Basic"
4197
+ msgstr "Basis"
4198
+
4199
+ # @ all-in-one-wp-security-and-firewall
4200
+ #: classes/grade-system/wp-security-feature-item.php:31
4201
+ msgid "Intermediate"
4202
+ msgstr "Tussenvorm"
4203
+
4204
+ # @ all-in-one-wp-security-and-firewall
4205
+ #: classes/grade-system/wp-security-feature-item.php:34
4206
+ msgid "Advanced"
4207
+ msgstr "Geavanceerd"
4208
+
4209
+ # @ all-in-one-wp-security-and-firewall
4210
+ #: classes/wp-security-backup.php:177
4211
+ msgid "All In One WP Security - Site Database Backup"
4212
+ msgstr "All In One WP Security - Site Database Backup"
4213
+
4214
+ # @ all-in-one-wp-security-and-firewall
4215
+ #: classes/wp-security-backup.php:179
4216
+ msgid "Attached is your latest DB backup file for site URL"
4217
+ msgstr "Bijgevoegd is uw nieuwste DB-back-upbestand voor de site-URL"
4218
+
4219
+ # @ all-in-one-wp-security-and-firewall
4220
+ #: classes/wp-security-backup.php:179
4221
+ msgid " generated on"
4222
+ msgstr " gegenereerd op"
4223
+
4224
+ # @ all-in-one-wp-security-and-firewall
4225
+ #: classes/wp-security-captcha.php:12
4226
+ msgid "Please enter an answer in digits:"
4227
+ msgstr "Geef het antwoord (in cijfers) van de rekensom:"
4228
+
4229
+ # @ all-in-one-wp-security-and-firewall
4230
+ #: classes/wp-security-captcha.php:91
4231
+ msgid "one"
4232
+ msgstr "een"
4233
+
4234
+ # @ all-in-one-wp-security-and-firewall
4235
+ #: classes/wp-security-captcha.php:92
4236
+ msgid "two"
4237
+ msgstr "twee"
4238
+
4239
+ # @ all-in-one-wp-security-and-firewall
4240
+ #: classes/wp-security-captcha.php:93
4241
+ msgid "three"
4242
+ msgstr "drie"
4243
+
4244
+ # @ all-in-one-wp-security-and-firewall
4245
+ #: classes/wp-security-captcha.php:94
4246
+ msgid "four"
4247
+ msgstr "vier"
4248
+
4249
+ # @ all-in-one-wp-security-and-firewall
4250
+ #: classes/wp-security-captcha.php:95
4251
+ msgid "five"
4252
+ msgstr "vijf"
4253
+
4254
+ # @ all-in-one-wp-security-and-firewall
4255
+ #: classes/wp-security-captcha.php:96
4256
+ msgid "six"
4257
+ msgstr "zes"
4258
+
4259
+ # @ all-in-one-wp-security-and-firewall
4260
+ #: classes/wp-security-captcha.php:97
4261
+ msgid "seven"
4262
+ msgstr "zeven"
4263
+
4264
+ # @ all-in-one-wp-security-and-firewall
4265
+ #: classes/wp-security-captcha.php:98
4266
+ msgid "eight"
4267
+ msgstr "acht"
4268
+
4269
+ # @ all-in-one-wp-security-and-firewall
4270
+ #: classes/wp-security-captcha.php:99
4271
+ msgid "nine"
4272
+ msgstr "negen"
4273
+
4274
+ # @ all-in-one-wp-security-and-firewall
4275
+ #: classes/wp-security-captcha.php:100
4276
+ msgid "ten"
4277
+ msgstr "tien"
4278
+
4279
+ # @ all-in-one-wp-security-and-firewall
4280
+ #: classes/wp-security-captcha.php:101
4281
+ msgid "eleven"
4282
+ msgstr "elf"
4283
+
4284
+ # @ all-in-one-wp-security-and-firewall
4285
+ #: classes/wp-security-captcha.php:102
4286
+ msgid "twelve"
4287
+ msgstr "twaalf"
4288
+
4289
+ # @ all-in-one-wp-security-and-firewall
4290
+ #: classes/wp-security-captcha.php:103
4291
+ msgid "thirteen"
4292
+ msgstr "dertien"
4293
+
4294
+ # @ all-in-one-wp-security-and-firewall
4295
+ #: classes/wp-security-captcha.php:104
4296
+ msgid "fourteen"
4297
+ msgstr "veertien"
4298
+
4299
+ # @ all-in-one-wp-security-and-firewall
4300
+ #: classes/wp-security-captcha.php:105
4301
+ msgid "fifteen"
4302
+ msgstr "vijftien"
4303
+
4304
+ # @ all-in-one-wp-security-and-firewall
4305
+ #: classes/wp-security-captcha.php:106
4306
+ msgid "sixteen"
4307
+ msgstr "zestien"
4308
+
4309
+ # @ all-in-one-wp-security-and-firewall
4310
+ #: classes/wp-security-captcha.php:107
4311
+ msgid "seventeen"
4312
+ msgstr "zeventien"
4313
+
4314
+ # @ all-in-one-wp-security-and-firewall
4315
+ #: classes/wp-security-captcha.php:108
4316
+ msgid "eighteen"
4317
+ msgstr "achttien"
4318
+
4319
+ # @ all-in-one-wp-security-and-firewall
4320
+ #: classes/wp-security-captcha.php:109
4321
+ msgid "nineteen"
4322
+ msgstr "negentien"
4323
+
4324
+ # @ all-in-one-wp-security-and-firewall
4325
+ #: classes/wp-security-captcha.php:110
4326
+ msgid "twenty"
4327
+ msgstr "twintig"
4328
+
4329
+ # @ all-in-one-wp-security-and-firewall
4330
+ #: classes/wp-security-file-scan.php:62
4331
+ msgid "All In One WP Security - File change detected!"
4332
+ msgstr "All In One WP Security - Bestandsverandering gedetecteerd!"
4333
+
4334
+ # @ all-in-one-wp-security-and-firewall
4335
+ #: classes/wp-security-file-scan.php:64
4336
+ msgid "A file change was detected on your system for site URL"
4337
+ msgstr "Er is een bestandswijziging op uw systeem gedetecteerd voor de site-URL"
4338
+
4339
+ # @ all-in-one-wp-security-and-firewall
4340
+ #: classes/wp-security-file-scan.php:64
4341
+ msgid ". Scan was generated on"
4342
+ msgstr ". Scan is gegenereerd op"
4343
+
4344
+ # @ all-in-one-wp-security-and-firewall
4345
+ #: classes/wp-security-file-scan.php:65
4346
+ msgid "Login to your site to view the scan details."
4347
+ msgstr "Log in op uw site om de scandetails te bekijken."
4348
+
4349
+ # @ all-in-one-wp-security-and-firewall
4350
+ #: classes/wp-security-general-init-tasks.php:214
4351
+ msgid "Please enter an answer in the CAPTCHA field."
4352
+ msgstr "Voer een antwoord in het CAPTCHA-veld in."
4353
+
4354
+ # @ all-in-one-wp-security-and-firewall
4355
+ #: classes/wp-security-general-init-tasks.php:224
4356
+ msgid "Error: You entered an incorrect CAPTCHA answer. Please go back and try again."
4357
+ msgstr "Fout: u hebt een onjuist CAPTCHA-antwoord ingevoerd. Ga alsjeblieft terug en probeer het opnieuw."
4358
+
4359
+ # @ all-in-one-wp-security-and-firewall
4360
+ #: classes/wp-security-general-init-tasks.php:252
4361
+ #: classes/wp-security-user-login.php:70 classes/wp-security-user-login.php:73
4362
+ #: classes/wp-security-user-registration.php:59
4363
+ msgid "<strong>ERROR</strong>: Your answer was incorrect - please try again."
4364
+ msgstr "<strong>FOUT</ strong>: Uw antwoord was onjuist - probeer het opnieuw."
4365
+
4366
+ # @ all-in-one-wp-security-and-firewall
4367
+ #: classes/wp-security-process-renamed-login-page.php:68
4368
+ msgid "Please log in to access the WordPress admin area."
4369
+ msgstr "Meld u aan om toegang te krijgen tot het WordPress-beheergebied."
4370
+
4371
+ # @ all-in-one-wp-security-and-firewall
4372
+ #: classes/wp-security-user-login.php:43
4373
+ msgid ""
4374
+ "<strong>ERROR</strong>: Login failed because your IP address has been blocked.\n"
4375
+ " Please contact the administrator."
4376
+ msgstr ""
4377
+ "<strong>FOUT</ strong>: Aanmelden mislukt omdat uw IP-adres is geblokkeerd.\n"
4378
+ " Neem contact op met de beheerder."
4379
+
4380
+ # @ all-in-one-wp-security-and-firewall
4381
+ #: classes/wp-security-user-login.php:83
4382
+ msgid "<strong>ERROR</strong>: The username field is empty."
4383
+ msgstr "<strong>FOUT</ strong>: Het veld gebruikersnaam is leeg."
4384
+
4385
+ # @ all-in-one-wp-security-and-firewall
4386
+ #: classes/wp-security-user-login.php:87
4387
+ msgid "<strong>ERROR</strong>: The password field is empty."
4388
+ msgstr "<strong>FOUT</ strong>: het wachtwoordveld is leeg."
4389
+
4390
+ # @ all-in-one-wp-security-and-firewall
4391
+ #: classes/wp-security-user-login.php:107
4392
+ #: classes/wp-security-user-login.php:133
4393
+ msgid "<strong>ERROR</strong>: Invalid login credentials."
4394
+ msgstr "<strong>FOUT</ strong>: Ongeldige inloggegevens."
4395
+
4396
+ # @ all-in-one-wp-security-and-firewall
4397
+ #: classes/wp-security-user-login.php:110
4398
+ msgid "<strong>ERROR</strong>: Invalid username."
4399
+ msgstr "<strong>FOUT</ strong>: Ongeldige gebruikersnaam."
4400
+
4401
+ # @ all-in-one-wp-security-and-firewall
4402
+ #: classes/wp-security-user-login.php:136
4403
+ #, php-format
4404
+ msgid "<strong>ERROR</strong>: Incorrect password. <a href=\"%s\" title=\"Password Lost and Found\">Lost your password</a>?"
4405
+ msgstr "<strong>FOUT</ strong>: Onjuist wachtwoord. <a href=\"%s\" title=\"Password lost and found\"> Wachtwoord vergeten </a>?"
4406
+
4407
+ # @ all-in-one-wp-security-and-firewall
4408
+ #: classes/wp-security-user-login.php:147
4409
+ msgid "<strong>ACCOUNT PENDING</strong>: Your account is currently not active. An administrator needs to activate your account before you can login."
4410
+ msgstr "<strong>ACCOUNT IN BEHANDELING</ strong>: uw account is momenteel niet actief. Een beheerder moet uw account activeren voordat u kunt inloggen."
4411
+
4412
+ # @ all-in-one-wp-security-and-firewall
4413
+ #: classes/wp-security-user-login.php:270
4414
+ msgid "Site Lockout Notification"
4415
+ msgstr "Kennisgeving van sitevergrendeling"
4416
+
4417
+ # @ all-in-one-wp-security-and-firewall
4418
+ #: classes/wp-security-user-login.php:271
4419
+ msgid "A lockdown event has occurred due to too many failed login attempts or invalid username:"
4420
+ msgstr "Er is een vergrendeling opgetreden vanwege te veel mislukte aanmeldpogingen of ongeldige gebruikersnaam:"
4421
+
4422
+ # @ all-in-one-wp-security-and-firewall
4423
+ #: classes/wp-security-user-login.php:272
4424
+ msgid "Username: Unknown"
4425
+ msgstr "Gebruikersnaam: onbekend"
4426
+
4427
+ # @ all-in-one-wp-security-and-firewall
4428
+ #: classes/wp-security-user-login.php:273
4429
+ msgid "IP Address: "
4430
+ msgstr "IP-adres: "
4431
+
4432
+ # @ all-in-one-wp-security-and-firewall
4433
+ #: classes/wp-security-user-login.php:274
4434
+ msgid "IP Range: .*"
4435
+ msgstr "IP-bereik: . *"
4436
+
4437
+ # @ all-in-one-wp-security-and-firewall
4438
+ #: classes/wp-security-user-login.php:275
4439
+ msgid "Log into your site's WordPress administration panel to see the duration of the lockout or to unlock the user."
4440
+ msgstr "Log in op het WordPress administratiepaneel van uw site om de duur van de blokkering te bekijken of om de gebruiker te ontgrendelen."
4441
+
4442
+ # @ all-in-one-wp-security-and-firewall
4443
+ #: classes/wp-security-user-login.php:337
4444
+ msgid "Unlock Request Notification"
4445
+ msgstr "Ontgrendel aanvraagmelding"
4446
+
4447
+ # @ all-in-one-wp-security-and-firewall
4448
+ #: classes/wp-security-user-login.php:338
4449
+ msgid "You have requested for the account with email address to be unlocked. Please click the link below to unlock your account:"
4450
+ msgstr "U hebt gevraagd om het account met het e-mailadres te ontgrendelen. Klik op de onderstaande link om uw account te ontgrendelen:"
4451
+
4452
+ # @ all-in-one-wp-security-and-firewall
4453
+ #: classes/wp-security-user-login.php:339
4454
+ msgid "Unlock link: "
4455
+ msgstr "Ontgrendel link: "
4456
+
4457
+ # @ all-in-one-wp-security-and-firewall
4458
+ #: classes/wp-security-user-login.php:340
4459
+ msgid "After clicking the above link you will be able to login to the WordPress administration panel."
4460
+ msgstr "Nadat u op de bovenstaande link hebt geklikt, kunt u inloggen op het WordPress-beheerpaneel."
4461
+
4462
+ # @ all-in-one-wp-security-and-firewall
4463
+ #: classes/wp-security-user-login.php:504
4464
+ #, php-format
4465
+ msgid "Your session has expired because it has been over %d minutes since your last login."
4466
+ msgstr "Uw sessie is verlopen omdat het meer dan %d minuten geleden is dat u voor het laatst bent ingelogd."
4467
+
4468
+ # @ all-in-one-wp-security-and-firewall
4469
+ #: classes/wp-security-user-login.php:505
4470
+ #: classes/wp-security-user-login.php:509
4471
+ msgid "Please log back in to continue."
4472
+ msgstr "Log opnieuw in om verder te gaan."
4473
+
4474
+ # @ all-in-one-wp-security-and-firewall
4475
+ #: classes/wp-security-user-login.php:508
4476
+ msgid "You were logged out because you just changed the \"admin\" username."
4477
+ msgstr "Je bent uitgelogd omdat je zojuist de gebruikersnaam voor \"admin\" hebt gewijzigd."
4478
+
4479
+ # @ all-in-one-wp-security-and-firewall
4480
+ #: classes/wp-security-user-login.php:534
4481
+ msgid "Request Unlock"
4482
+ msgstr "Verzoek om ontgrendeling"
4483
+
4484
+ # @ all-in-one-wp-security-and-firewall
4485
+ #: classes/wp-security-utility-ip-address.php:82
4486
+ #: classes/wp-security-utility-ip-address.php:101
4487
+ #: classes/wp-security-utility-ip-address.php:116
4488
+ #: classes/wp-security-utility-ip-address.php:131
4489
+ msgid " is not a valid ip address format."
4490
+ msgstr " is geen geldig IP-adresformaat."
4491
+
4492
+ # @ all-in-one-wp-security-and-firewall
4493
+ #: classes/wp-security-utility-ip-address.php:139
4494
+ msgid "You cannot ban your own IP address: "
4495
+ msgstr "U kunt uw eigen IP-adres niet verbieden: "
4496
+
4497
+ # @ all-in-one-wp-security-and-firewall
4498
+ #: classes/wp-security-utility.php:151
4499
+ msgid "This feature can only be configured by the \"superadmin\" on the main site."
4500
+ msgstr "Deze functie kan alleen worden geconfigureerd door het \"superadmin\" op de hoofdsite."
4501
+
4502
+ # @ default
4503
+ #: other-includes/wp-security-rename-login-feature.php:98
4504
+ #: other-includes/wp-security-unlock-request.php:13
4505
+ msgid "http://wordpress.org/"
4506
+ msgstr "http://wordpress.org/"
4507
+
4508
+ # @ default
4509
+ #: other-includes/wp-security-rename-login-feature.php:99
4510
+ #: other-includes/wp-security-unlock-request.php:14
4511
+ msgid "Powered by WordPress"
4512
+ msgstr "Powered by WordPress"
4513
+
4514
+ # @ default
4515
+ #: other-includes/wp-security-rename-login-feature.php:215
4516
+ msgid "Are you lost?"
4517
+ msgstr "Ben je verloren?"
4518
+
4519
+ # @ default
4520
+ #: other-includes/wp-security-rename-login-feature.php:215
4521
+ #, php-format
4522
+ msgid "&larr; Back to %s"
4523
+ msgstr "&Larr; Terug naar %s"
4524
+
4525
+ # @ default
4526
+ #: other-includes/wp-security-rename-login-feature.php:273
4527
+ msgid "<strong>ERROR</strong>: Enter a username or e-mail address."
4528
+ msgstr "<strong>FOUT</ strong>: Voer een gebruikersnaam of e-mailadres in."
4529
+
4530
+ # @ default
4531
+ #: other-includes/wp-security-rename-login-feature.php:277
4532
+ msgid "<strong>ERROR</strong>: There is no user registered with that email address."
4533
+ msgstr "<strong>FOUT</ strong>: Er is geen gebruiker geregistreerd met dat e-mailadres."
4534
+
4535
+ # @ default
4536
+ #: other-includes/wp-security-rename-login-feature.php:294
4537
+ msgid "<strong>ERROR</strong>: Invalid username or e-mail."
4538
+ msgstr "<strong>FOUT</ strong>: Ongeldige gebruikersnaam of e-mail."
4539
+
4540
+ # @ default
4541
+ #: other-includes/wp-security-rename-login-feature.php:331
4542
+ msgid "Password reset is not allowed for this user"
4543
+ msgstr "Wachtwoord resetten is niet toegestaan voor deze gebruiker"
4544
+
4545
+ # @ default
4546
+ #: other-includes/wp-security-rename-login-feature.php:356
4547
+ msgid "Someone requested that the password be reset for the following account:"
4548
+ msgstr "Iemand heeft verzocht om het wachtwoord opnieuw in te stellen voor het volgende account:"
4549
+
4550
+ # @ default
4551
+ #: other-includes/wp-security-rename-login-feature.php:358
4552
+ #, php-format
4553
+ msgid "Username: %s"
4554
+ msgstr "Gebruikersnaam: %s"
4555
+
4556
+ # @ default
4557
+ #: other-includes/wp-security-rename-login-feature.php:359
4558
+ msgid "If this was a mistake, just ignore this email and nothing will happen."
4559
+ msgstr "Als dit een vergissing was, negeer deze e-mail dan en er gebeurt niets."
4560
+
4561
+ # @ default
4562
+ #: other-includes/wp-security-rename-login-feature.php:360
4563
+ msgid "To reset your password, visit the following address:"
4564
+ msgstr "Ga naar het volgende adres om uw wachtwoord opnieuw in te stellen:"
4565
+
4566
+ # @ default
4567
+ #: other-includes/wp-security-rename-login-feature.php:370
4568
+ #, php-format
4569
+ msgid "[%s] Password Reset"
4570
+ msgstr "[%s] Wachtwoord resetten"
4571
+
4572
+ # @ default
4573
+ #: other-includes/wp-security-rename-login-feature.php:391
4574
+ msgid "The e-mail could not be sent."
4575
+ msgstr "De e-mail kan niet worden verzonden."
4576
+
4577
+ # @ default
4578
+ #: other-includes/wp-security-rename-login-feature.php:391
4579
+ msgid "Possible reason: your host may have disabled the mail() function."
4580
+ msgstr "Mogelijke reden: uw gastheer kan de functie mail() hebben uitgeschakeld."
4581
+
4582
+ # @ default
4583
+ #: other-includes/wp-security-rename-login-feature.php:496
4584
+ msgid "Sorry, that key does not appear to be valid."
4585
+ msgstr "Sorry, die sleutel lijkt niet geldig te zijn."
4586
+
4587
+ # @ default
4588
+ #: other-includes/wp-security-rename-login-feature.php:498
4589
+ msgid "Sorry, that key has expired. Please try again."
4590
+ msgstr "Sorry, die sleutel is verlopen. Probeer het opnieuw."
4591
+
4592
+ # @ default
4593
+ #: other-includes/wp-security-rename-login-feature.php:518
4594
+ msgid "Lost Password"
4595
+ msgstr "Wachtwoord vergeten"
4596
+
4597
+ # @ default
4598
+ #: other-includes/wp-security-rename-login-feature.php:518
4599
+ msgid "Please enter your username or email address. You will receive a link to create a new password via email."
4600
+ msgstr "Voer uw gebruikersnaam of e-mailadres in. U ontvangt een link om via e-mail een nieuw wachtwoord aan te maken."
4601
+
4602
+ # @ default
4603
+ #: other-includes/wp-security-rename-login-feature.php:526
4604
+ msgid "Username or E-mail:"
4605
+ msgstr "Gebruikersnaam of emailadres:"
4606
+
4607
+ # @ default
4608
+ #: other-includes/wp-security-rename-login-feature.php:537
4609
+ msgid "Get New Password"
4610
+ msgstr "Een nieuw wachtwoord verkrijgen"
4611
+
4612
+ # @ default
4613
+ #: other-includes/wp-security-rename-login-feature.php:541
4614
+ #: other-includes/wp-security-rename-login-feature.php:590
4615
+ #: other-includes/wp-security-rename-login-feature.php:621
4616
+ #: other-includes/wp-security-rename-login-feature.php:703
4617
+ msgid "Log in"
4618
+ msgstr "Inloggen"
4619
+
4620
+ # @ default
4621
+ #: other-includes/wp-security-rename-login-feature.php:544
4622
+ #: other-includes/wp-security-rename-login-feature.php:624
4623
+ #: other-includes/wp-security-rename-login-feature.php:699
4624
+ #: other-includes/wp-security-rename-login-feature.php:875
4625
+ msgid "Register"
4626
+ msgstr "Registreren"
4627
+
4628
+ # @ default
4629
+ #: other-includes/wp-security-rename-login-feature.php:576
4630
+ msgid "The passwords do not match."
4631
+ msgstr "De wachtwoorden komen niet overeen."
4632
+
4633
+ # @ default
4634
+ #: other-includes/wp-security-rename-login-feature.php:590
4635
+ msgid "Password Reset"
4636
+ msgstr "Wachtwoord resetten"
4637
+
4638
+ # @ default
4639
+ #: other-includes/wp-security-rename-login-feature.php:590
4640
+ msgid "Your password has been reset."
4641
+ msgstr "Uw wachtwoord is opnieuw ingesteld."
4642
+
4643
+ # @ default
4644
+ #: other-includes/wp-security-rename-login-feature.php:598
4645
+ #: other-includes/wp-security-rename-login-feature.php:617
4646
+ msgid "Reset Password"
4647
+ msgstr "Wachtwoord opnieuw instellen"
4648
+
4649
+ # @ default
4650
+ #: other-includes/wp-security-rename-login-feature.php:598
4651
+ msgid "Enter your new password below."
4652
+ msgstr "Voer je nieuw wachtwoord hieronder in."
4653
+
4654
+ # @ default
4655
+ #: other-includes/wp-security-rename-login-feature.php:605
4656
+ msgid "New password"
4657
+ msgstr "Nieuw wachtwoord"
4658
+
4659
+ # @ default
4660
+ #: other-includes/wp-security-rename-login-feature.php:609
4661
+ msgid "Confirm new password"
4662
+ msgstr "Bevestig het nieuwe wachtwoord"
4663
+
4664
+ # @ default
4665
+ #: other-includes/wp-security-rename-login-feature.php:613
4666
+ msgid "Strength indicator"
4667
+ msgstr "Sterkte indicator"
4668
+
4669
+ # @ default
4670
+ #: other-includes/wp-security-rename-login-feature.php:614
4671
+ msgid "Hint: The password should be at least seven characters long. To make it stronger, use upper and lower case letters, numbers and symbols like ! \" ? $ % ^ &amp; )."
4672
+ msgstr "Tip: het wachtwoord moet uit minimaal zeven tekens bestaan. Om het sterker te maken, gebruik hoofdletters en kleine letters, cijfers en symbolen zoals! \"? $ % ^ &amp;)."
4673
+
4674
+ # @ default
4675
+ #: other-includes/wp-security-rename-login-feature.php:676
4676
+ msgid "Registration Form"
4677
+ msgstr "Registratieformulier"
4678
+
4679
+ # @ default
4680
+ #: other-includes/wp-security-rename-login-feature.php:676
4681
+ msgid "Register For This Site"
4682
+ msgstr "Registreer voor deze website"
4683
+
4684
+ # @ default
4685
+ #: other-includes/wp-security-rename-login-feature.php:681
4686
+ #: other-includes/wp-security-rename-login-feature.php:841
4687
+ msgid "Username"
4688
+ msgstr "Gebruikersnaam"
4689
+
4690
+ # @ default
4691
+ #: other-includes/wp-security-rename-login-feature.php:685
4692
+ msgid "E-mail"
4693
+ msgstr "E-mail"
4694
+
4695
+ # @ default
4696
+ #: other-includes/wp-security-rename-login-feature.php:696
4697
+ msgid "A password will be e-mailed to you."
4698
+ msgstr "Een wachtwoord wordt naar uw mailadres verzonden."
4699
+
4700
+ # @ default
4701
+ #: other-includes/wp-security-rename-login-feature.php:704
4702
+ #: other-includes/wp-security-rename-login-feature.php:880
4703
+ msgid "Password Lost and Found"
4704
+ msgstr "Wachtwoord verloren en gevonden"
4705
+
4706
+ # @ default
4707
+ #: other-includes/wp-security-rename-login-feature.php:704
4708
+ #: other-includes/wp-security-rename-login-feature.php:880
4709
+ msgid "Lost your password?"
4710
+ msgstr "Wachtwoord vergeten?"
4711
+
4712
+ # @ default
4713
+ #: other-includes/wp-security-rename-login-feature.php:748
4714
+ msgid "<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href='http://www.google.com/cookies.html'>enable cookies</a> to use WordPress."
4715
+ msgstr "<strong>FOUT</ strong>: cookies worden geblokkeerd of worden niet ondersteund door uw browser. U moet <a href='http://www.google.com/cookies.html'>cookies inschakelen </a> om WordPress te gebruiken."
4716
+
4717
+ # @ default
4718
+ #: other-includes/wp-security-rename-login-feature.php:766
4719
+ msgid "You have logged in successfully."
4720
+ msgstr "Je bent succesvol ingelogd."
4721
+
4722
+ # @ default
4723
+ #: other-includes/wp-security-rename-login-feature.php:800
4724
+ msgid "Session expired. Please log in again. You will not move away from this page."
4725
+ msgstr "Sessie verlopen. Log alsjeblieft nogmaals in. Je gaat niet weg van deze pagina."
4726
+
4727
+ # @ default
4728
+ #: other-includes/wp-security-rename-login-feature.php:804
4729
+ msgid "You are now logged out."
4730
+ msgstr "Je bent nu uitgelogd."
4731
+
4732
+ # @ default
4733
+ #: other-includes/wp-security-rename-login-feature.php:806
4734
+ msgid "User registration is currently not allowed."
4735
+ msgstr "Gebruikersregistratie is momenteel niet toegestaan."
4736
+
4737
+ # @ default
4738
+ #: other-includes/wp-security-rename-login-feature.php:808
4739
+ msgid "Check your e-mail for the confirmation link."
4740
+ msgstr "Bekijk je e-mail voor de bevestigingslink."
4741
+
4742
+ # @ default
4743
+ #: other-includes/wp-security-rename-login-feature.php:810
4744
+ msgid "Check your e-mail for your new password."
4745
+ msgstr "Controleer uw e-mail voor uw nieuwe wachtwoord."
4746
+
4747
+ # @ default
4748
+ #: other-includes/wp-security-rename-login-feature.php:812
4749
+ msgid "Registration complete. Please check your e-mail."
4750
+ msgstr "Registratie compleet. Controleer uw e-mail."
4751
+
4752
+ # @ default
4753
+ #: other-includes/wp-security-rename-login-feature.php:814
4754
+ msgid "<strong>You have successfully updated WordPress!</strong> Please log back in to experience the awesomeness."
4755
+ msgstr "<strong>U heeft WordPress met succes geüpdatet!</ strong> log opnieuw in om de ontzagwekkende ervaring te ervaren."
4756
+
4757
+ # @ default
4758
+ #: other-includes/wp-security-rename-login-feature.php:831
4759
+ #: other-includes/wp-security-rename-login-feature.php:858
4760
+ msgid "Log In"
4761
+ msgstr "Inloggen"
4762
+
4763
+ # @ default
4764
+ #: other-includes/wp-security-rename-login-feature.php:856
4765
+ msgid "Remember Me"
4766
+ msgstr "Onthoud mij"
4767
+
4768
+ # @ all-in-one-wp-security-and-firewall
4769
+ #: other-includes/wp-security-unlock-request.php:48
4770
+ msgid "Please enter a valid email address"
4771
+ msgstr "Vul een geldig e-mailadres in"
4772
+
4773
+ # @ all-in-one-wp-security-and-firewall
4774
+ #: other-includes/wp-security-unlock-request.php:59
4775
+ msgid "User account not found!"
4776
+ msgstr "Gebruikersaccount niet gevonden!"
4777
+
4778
+ # @ all-in-one-wp-security-and-firewall
4779
+ #: other-includes/wp-security-unlock-request.php:70
4780
+ msgid "Error: No locked entry was found in the DB with your IP address range!"
4781
+ msgstr "Fout: er is geen vergrendelde invoer gevonden in de database met uw IP-adresbereik!"
4782
+
4783
+ # @ all-in-one-wp-security-and-firewall
4784
+ #: other-includes/wp-security-unlock-request.php:98
4785
+ msgid "Email Address"
4786
+ msgstr "E-mailadres"
{tags/4.0.8/languages → languages}/all-in-one-wp-security-and-firewall-pt_BR.mo RENAMED
File without changes
{tags/4.0.8/languages → languages}/all-in-one-wp-security-and-firewall-pt_BR.po RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-ru_RU.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-ru_RU.po RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-sv_SE.mo RENAMED
File without changes
{tags/4.0.1/languages → languages}/all-in-one-wp-security-and-firewall-sv_SE.po RENAMED
File without changes
{tags/4.2.8/languages → languages}/all-in-one-wp-security-and-firewall-zh_CN.mo RENAMED
File without changes
{tags/4.2.8/languages → languages}/all-in-one-wp-security-and-firewall-zh_CN.po RENAMED
File without changes
{tags/4.3.7.1/trunk/languages → languages}/all-in-one-wp-security-and-firewall.pot RENAMED
File without changes
{tags/2.0/lib → languages}/index.html RENAMED
File without changes
{tags/2.0/logs → lib}/index.html RENAMED
File without changes
{tags/1.0/lib → lib}/whois/LICENSE RENAMED
File without changes
{tags/1.0/lib → lib}/whois/handler.template.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/npdata.ser RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ae.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.aero.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ag.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.asia.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.at.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.au.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.be.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.biz.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.br.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ca.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.cat.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ch.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.cl.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.client.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.cn.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.co.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.co.za.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.coop.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.cz.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.de.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.edu.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.eu.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.fi.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.fj.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.fm.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.fr.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.afternic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.alldomains.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.ascio.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.assorted.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.corporatedomains.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.directnic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.domaindiscover.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.domainpeople.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.dotster.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.dreamhost.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.enom.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.fabulous.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.fastdomain.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.gandi.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.genericb.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.godaddy.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.iana.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.interdomain.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.itsyourdomain.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.joker.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.markmonitor.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.melbourneit.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.moniker.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.gtld.namejuice.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.nameking.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.names4ever.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.namevault.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.networksolutions.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.nicco.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.nicline.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.onlinenic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.opensrs.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.ovh.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.psiusa.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.publicdomainregistry.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.register.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.rrpproxy.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.schlund.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.srsplus.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.tmagnic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.tvcorp.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.gtld.wildwestdomains.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.hu.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.icon.png RENAMED
File without changes
{tags/4.2.8/lib → lib}/whois/whois.idna.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ie.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.in.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.info.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.int.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ip.afrinic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ip.apnic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ip.arin.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ip.krnic.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ip.lacnic.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.ip.lib.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.ip.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ip.ripe.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ir.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.is.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.it.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.jp.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.lt.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.lu.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ly.php RENAMED
File without changes
{tags/4.2.8/lib → lib}/whois/whois.main.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.me.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.mobi.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.museum.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.mx.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.name.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.nl.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.nu.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.nz.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.org.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.org.za.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.parser.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.pl.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.pro.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.pt.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ro.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ru.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.rwhois.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.sc.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.se.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.servers.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.si.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.su.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.tel.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.travel.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.uk.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.us.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.utils.php RENAMED
File without changes
{tags/4.3.1/lib → lib}/whois/whois.ve.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.ws.php RENAMED
File without changes
{tags/1.0/lib → lib}/whois/whois.zanet.php RENAMED
File without changes
tags/1.0/license.txt → license.txt RENAMED
File without changes
{tags/4.2.8/logs → logs}/.htaccess RENAMED
File without changes
{tags/2.0/other-includes → logs}/index.html RENAMED
File without changes
{tags/1.0/logs → logs}/wp-security-log-cron-job.txt RENAMED
File without changes
{tags/1.0/logs → logs}/wp-security-log.txt RENAMED
File without changes
{tags/2.1.1/admin → other-includes}/index.html RENAMED
File without changes
other-includes/wp-security-rename-login-feature.php ADDED
@@ -0,0 +1,1136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * WordPress User Page
4
+ *
5
+ * Handles authentication, registering, resetting passwords, forgot password,
6
+ * and other user handling.
7
+ *
8
+ * @package WordPress
9
+ */
10
+
11
+
12
+ // Redirect to https login if forced to use SSL
13
+ if ( force_ssl_admin() && ! is_ssl() ) {
14
+ if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
15
+ wp_safe_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
16
+ exit();
17
+ } else {
18
+ wp_safe_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
19
+ exit();
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Output the login page header.
25
+ *
26
+ * @param string $title Optional. WordPress login Page title to display in the `<title>` element.
27
+ * Default 'Log In'.
28
+ * @param string $message Optional. Message to display in header. Default empty.
29
+ * @param WP_Error $wp_error Optional. The error to pass. Default empty.
30
+ */
31
+ function login_header( $title = 'Log In', $message = '', $wp_error = '' ) {
32
+ global $error, $interim_login, $action;
33
+
34
+ // Don't index any of these forms
35
+ add_action( 'login_head', 'wp_no_robots' );
36
+
37
+ add_action( 'login_head', 'wp_login_viewport_meta' );
38
+
39
+ if ( empty($wp_error) )
40
+ $wp_error = new WP_Error();
41
+
42
+ // Shake it!
43
+ $shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password' );
44
+ /**
45
+ * Filter the error codes array for shaking the login form.
46
+ *
47
+ * @since 3.0.0
48
+ *
49
+ * @param array $shake_error_codes Error codes that shake the login form.
50
+ */
51
+ $shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );
52
+
53
+ if ( $shake_error_codes && $wp_error->get_error_code() && in_array( $wp_error->get_error_code(), $shake_error_codes ) )
54
+ add_action( 'login_head', 'wp_shake_js', 12 );
55
+
56
+ $login_title = get_bloginfo( 'name', 'display' );
57
+
58
+ /* translators: Login screen title. 1: Login screen name, 2: Network or site name */
59
+ $login_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $title, $login_title );
60
+
61
+ /**
62
+ * Filters the title tag content for login page.
63
+ *
64
+ * @since 4.9.0
65
+ *
66
+ * @param string $login_title The page title, with extra context added.
67
+ * @param string $title The original page title.
68
+ */
69
+ $login_title = apply_filters( 'login_title', $login_title, $title );
70
+
71
+ ?><!DOCTYPE html>
72
+ <!--[if IE 8]>
73
+ <html xmlns="http://www.w3.org/1999/xhtml" class="ie8" <?php language_attributes(); ?>>
74
+ <![endif]-->
75
+ <!--[if !(IE 8) ]><!-->
76
+ <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
77
+ <!--<![endif]-->
78
+ <head>
79
+ <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
80
+ <title><?php echo $login_title; ?></title>
81
+ <?php
82
+
83
+ wp_enqueue_style( 'login' );
84
+
85
+ /*
86
+ * Remove all stored post data on logging out.
87
+ * This could be added by add_action('login_head'...) like wp_shake_js(),
88
+ * but maybe better if it's not removable by plugins
89
+ */
90
+ if ( 'loggedout' == $wp_error->get_error_code() ) {
91
+ ?>
92
+ <script>if("sessionStorage" in window){try{for(var key in sessionStorage){if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>
93
+ <?php
94
+ }
95
+
96
+ /**
97
+ * Enqueue scripts and styles for the login page.
98
+ *
99
+ * @since 3.1.0
100
+ */
101
+ do_action( 'login_enqueue_scripts' );
102
+
103
+ /**
104
+ * Fires in the login page header after scripts are enqueued.
105
+ *
106
+ * @since 2.1.0
107
+ */
108
+ do_action( 'login_head' );
109
+
110
+ if ( is_multisite() ) {
111
+ $login_header_url = network_home_url();
112
+ $login_header_title = get_network()->site_name;
113
+ } else {
114
+ $login_header_url = __( 'https://wordpress.org/' );
115
+ $login_header_title = __( 'Powered by WordPress' );
116
+ }
117
+
118
+ /**
119
+ * Filter link URL of the header logo above login form.
120
+ *
121
+ * @since 2.1.0
122
+ *
123
+ * @param string $login_header_url Login header logo URL.
124
+ */
125
+ $login_header_url = apply_filters( 'login_headerurl', $login_header_url );
126
+
127
+ /**
128
+ * Filter the title attribute of the header logo above login form.
129
+ *
130
+ * @since 2.1.0
131
+ *
132
+ * @param string $login_header_title Login header logo title attribute.
133
+ */
134
+ $login_header_title = apply_filters( 'login_headertitle', $login_header_title );
135
+
136
+ /*
137
+ * To match the URL/title set above, Multisite sites have the blog name,
138
+ * while single sites get the header title.
139
+ */
140
+ if ( is_multisite() ) {
141
+ $login_header_text = get_bloginfo( 'name', 'display' );
142
+ } else {
143
+ $login_header_text = $login_header_title;
144
+ }
145
+
146
+ $classes = array( 'login-action-' . $action, 'wp-core-ui' );
147
+ if ( is_rtl() )
148
+ $classes[] = 'rtl';
149
+ if ( $interim_login ) {
150
+ $classes[] = 'interim-login';
151
+ ?>
152
+ <style type="text/css">html{background-color: transparent;}</style>
153
+ <?php
154
+
155
+ if ( 'success' === $interim_login )
156
+ $classes[] = 'interim-login-success';
157
+ }
158
+ $classes[] =' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
159
+
160
+ /**
161
+ * Filter the login page body classes.
162
+ *
163
+ * @since 3.5.0
164
+ *
165
+ * @param array $classes An array of body classes.
166
+ * @param string $action The action that brought the visitor to the login page.
167
+ */
168
+ $classes = apply_filters( 'login_body_class', $classes, $action );
169
+
170
+ ?>
171
+ </head>
172
+ <body class="login <?php echo esc_attr( implode( ' ', $classes ) ); ?>">
173
+ <?php
174
+ /**
175
+ * Fires in the login page header after the body tag is opened.
176
+ *
177
+ * @since 4.6.0
178
+ */
179
+ do_action( 'login_header' );
180
+ ?>
181
+ <div id="login">
182
+ <h1><a href="<?php echo esc_url( $login_header_url ); ?>" title="<?php echo esc_attr( $login_header_title ); ?>" tabindex="-1"><?php echo $login_header_text; ?></a></h1>
183
+ <?php
184
+
185
+ unset( $login_header_url, $login_header_title );
186
+
187
+ /**
188
+ * Filter the message to display above the login form.
189
+ *
190
+ * @since 2.1.0
191
+ *
192
+ * @param string $message Login message text.
193
+ */
194
+
195
+ $message = apply_filters( 'login_message', $message );
196
+ if ( !empty( $message ) )
197
+ echo $message . "\n";
198
+
199
+ // In case a plugin uses $error rather than the $wp_errors object
200
+ if ( !empty( $error ) ) {
201
+ $wp_error->add('error', $error);
202
+ unset($error);
203
+ }
204
+
205
+ if ( $wp_error->get_error_code() ) {
206
+ $errors = '';
207
+ $messages = '';
208
+ foreach ( $wp_error->get_error_codes() as $code ) {
209
+ $severity = $wp_error->get_error_data( $code );
210
+ foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
211
+ if ( 'message' == $severity )
212
+ $messages .= ' ' . $error_message . "<br />\n";
213
+ else
214
+ $errors .= ' ' . $error_message . "<br />\n";
215
+ }
216
+ }
217
+ if ( ! empty( $errors ) ) {
218
+ /**
219
+ * Filter the error messages displayed above the login form.
220
+ *
221
+ * @since 2.1.0
222
+ *
223
+ * @param string $errors Login error message.
224
+ */
225
+ echo '<div id="login_error">' . apply_filters( 'login_errors', $errors ) . "</div>\n";
226
+ }
227
+ if ( ! empty( $messages ) ) {
228
+ /**
229
+ * Filter instructional messages displayed above the login form.
230
+ *
231
+ * @since 2.5.0
232
+ *
233
+ * @param string $messages Login messages.
234
+ */
235
+ echo '<p class="message">' . apply_filters( 'login_messages', $messages ) . "</p>\n";
236
+ }
237
+ }
238
+ } // End of login_header()
239
+
240
+ /**
241
+ * Outputs the footer for the login page.
242
+ *
243
+ * @param string $input_id Which input to auto-focus
244
+ */
245
+ function login_footer($input_id = '') {
246
+ global $interim_login;
247
+
248
+ // Don't allow interim logins to navigate away from the page.
249
+ if ( ! $interim_login ): ?>
250
+ <p id="backtoblog"><a href="<?php echo esc_url( home_url( '/' ) ); ?>"><?php
251
+ /* translators: %s: site title */
252
+ printf( _x( '&larr; Back to %s', 'site' ), get_bloginfo( 'title', 'display' ) );
253
+ ?></a></p>
254
+ <?php
255
+ if(function_exists('the_privacy_policy_link')){
256
+ the_privacy_policy_link( '<div class="privacy-policy-page-link">', '</div>' );
257
+ }
258
+ ?>
259
+ <?php endif; ?>
260
+
261
+ </div>
262
+
263
+ <?php if ( !empty($input_id) ) : ?>
264
+ <script type="text/javascript">
265
+ try{document.getElementById('<?php echo $input_id; ?>').focus();}catch(e){}
266
+ if(typeof wpOnload=='function')wpOnload();
267
+ </script>
268
+ <?php endif; ?>
269
+
270
+ <?php
271
+ /**
272
+ * Fires in the login page footer.
273
+ *
274
+ * @since 3.1.0
275
+ */
276
+ do_action( 'login_footer' ); ?>
277
+ <div class="clear"></div>
278
+ </body>
279
+ </html>
280
+ <?php
281
+ }
282
+
283
+ /**
284
+ * @since 3.0.0
285
+ */
286
+ function wp_shake_js() {
287
+ ?>
288
+ <script type="text/javascript">
289
+ addLoadEvent = function(func){if(typeof jQuery!="undefined")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
290
+ function s(id,pos){g(id).left=pos+'px';}
291
+ function g(id){return document.getElementById(id).style;}
292
+ function shake(id,a,d){c=a.shift();s(id,c);if(a.length>0){setTimeout(function(){shake(id,a,d);},d);}else{try{g(id).position='static';wp_attempt_focus();}catch(e){}}}
293
+ addLoadEvent(function(){ var p=new Array(15,30,15,0,-15,-30,-15,0);p=p.concat(p.concat(p));var i=document.forms[0].id;g(i).position='relative';shake(i,p,20);});
294
+ </script>
295
+ <?php
296
+ }
297
+
298
+ /**
299
+ * @since 3.7.0
300
+ */
301
+ function wp_login_viewport_meta() {
302
+ ?>
303
+ <meta name="viewport" content="width=device-width" />
304
+ <?php
305
+ }
306
+
307
+ /**
308
+ * Handles sending password retrieval email to user.
309
+ *
310
+ * @return bool|WP_Error True: when finish. WP_Error on error
311
+ */
312
+ function retrieve_password() {
313
+ $errors = new WP_Error();
314
+
315
+ if ( empty( $_POST['user_login'] ) || ! is_string( $_POST['user_login'] ) ) {
316
+ $errors->add('empty_username', __('<strong>ERROR</strong>: Enter a username or email address.' ));
317
+ } elseif ( strpos( $_POST['user_login'], '@' ) ) {
318
+ $user_data = get_user_by( 'email', trim( wp_unslash( $_POST['user_login'] ) ) );
319
+ if ( empty( $user_data ) )
320
+ $errors->add('invalid_email', __('<strong>ERROR</strong>: There is no user registered with that email address.' ));
321
+ } else {
322
+ $login = trim($_POST['user_login']);
323
+ $user_data = get_user_by('login', $login);
324
+ }
325
+
326
+ /**
327
+ * Fires before errors are returned from a password reset request.
328
+ *
329
+ * @since 2.1.0
330
+ * @since 4.4.0 Added the `$errors` parameter.
331
+ *
332
+ * @param WP_Error $errors A WP_Error object containing any errors generated
333
+ * by using invalid credentials.
334
+ */
335
+ do_action( 'lostpassword_post', $errors );
336
+
337
+ if ( $errors->get_error_code() )
338
+ return $errors;
339
+
340
+ if ( !$user_data ) {
341
+ $errors->add('invalidcombo', __('<strong>ERROR</strong>: Invalid username or email.' ));
342
+ return $errors;
343
+ }
344
+
345
+ // Redefining user_login ensures we return the right case in the email.
346
+ $user_login = $user_data->user_login;
347
+ $user_email = $user_data->user_email;
348
+ $key = get_password_reset_key( $user_data );
349
+
350
+ if ( is_wp_error( $key ) ) {
351
+ return $key;
352
+ }
353
+
354
+ if ( is_multisite() ) {
355
+ $site_name = get_network()->site_name;
356
+ } else {
357
+ /*
358
+ * The blogname option is escaped with esc_html on the way into the database
359
+ * in sanitize_option we want to reverse this for the plain text arena of emails.
360
+ */
361
+ $site_name = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
362
+ }
363
+
364
+ $message = __( 'Someone has requested a password reset for the following account:' ) . "\r\n\r\n";
365
+ /* translators: %s: site name */
366
+ $message .= sprintf( __( 'Site Name: %s'), $site_name ) . "\r\n\r\n";
367
+ /* translators: %s: user login */
368
+ $message .= sprintf( __( 'Username: %s'), $user_login ) . "\r\n\r\n";
369
+ $message .= __( 'If this was a mistake, just ignore this email and nothing will happen.' ) . "\r\n\r\n";
370
+ $message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n";
371
+ $message .= '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . ">\r\n";
372
+
373
+ /* translators: Password reset email subject. %s: Site name */
374
+ $title = sprintf( __( '[%s] Password Reset' ), $site_name );
375
+
376
+ /**
377
+ * Filters the subject of the password reset email.
378
+ *
379
+ * @since 2.8.0
380
+ * @since 4.4.0 Added the `$user_login` and `$user_data` parameters.
381
+ *
382
+ * @param string $title Default email title.
383
+ * @param string $user_login The username for the user.
384
+ * @param WP_User $user_data WP_User object.
385
+ */
386
+ $title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data );
387
+
388
+ /**
389
+ * Filter the message body of the password reset mail.
390
+ *
391
+ * If the filtered message is empty, the password reset email will not be sent.
392
+ *
393
+ * @since 2.8.0
394
+ * @since 4.1.0 Added `$user_login` and `$user_data` parameters.
395
+ *
396
+ * @param string $message Default mail message.
397
+ * @param string $key The activation key.
398
+ * @param string $user_login The username for the user.
399
+ * @param WP_User $user_data WP_User object.
400
+ */
401
+ $message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data );
402
+
403
+ if ( $message && !wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) )
404
+ wp_die( __('The email could not be sent.' ) . "<br />\n" . __('Possible reason: your host may have disabled the mail() function.' ) );
405
+
406
+ return true;
407
+ }
408
+
409
+ //
410
+ // Main
411
+ //
412
+
413
+ $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';
414
+ $errors = new WP_Error();
415
+
416
+ if ( isset($_GET['key']) )
417
+ $action = 'resetpass';
418
+
419
+ // validate action so as to default to the login screen
420
+ if ( !in_array( $action, array( 'postpass', 'logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login', 'confirmaction' ), true ) && false === has_filter( 'login_form_' . $action ) )
421
+ $action = 'login';
422
+
423
+ nocache_headers();
424
+
425
+ header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset'));
426
+
427
+ if ( defined( 'RELOCATE' ) && RELOCATE ) { // Move flag is set
428
+ if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )
429
+ $_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
430
+
431
+ $url = dirname( set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );
432
+ if ( $url != get_option( 'siteurl' ) )
433
+ update_option( 'siteurl', $url );
434
+ }
435
+
436
+ //Set a cookie now to see if they are supported by the browser.
437
+ $secure = ( 'https' === parse_url( wp_login_url(), PHP_URL_SCHEME ) );
438
+ setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure );
439
+ if ( SITECOOKIEPATH != COOKIEPATH )
440
+ setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );
441
+
442
+ $lang = ! empty( $_GET['wp_lang'] ) ? sanitize_text_field( $_GET['wp_lang'] ) : '';
443
+ $switched_locale = switch_to_locale( $lang );
444
+
445
+ /**
446
+ * Fires when the login form is initialized.
447
+ *
448
+ * @since 3.2.0
449
+ */
450
+ do_action( 'login_init' );
451
+
452
+ /**
453
+ * Fires before a specified login form action.
454
+ *
455
+ * The dynamic portion of the hook name, `$action`, refers to the action
456
+ * that brought the visitor to the login form. Actions include 'postpass',
457
+ * 'logout', 'lostpassword', etc.
458
+ *
459
+ * @since 2.8.0
460
+ */
461
+ do_action( "login_form_{$action}" );
462
+
463
+ $http_post = ('POST' == $_SERVER['REQUEST_METHOD']);
464
+ $interim_login = isset($_REQUEST['interim-login']);
465
+
466
+ /**
467
+ * Filters the separator used between login form navigation links.
468
+ *
469
+ * @since 4.9.0
470
+ *
471
+ * @param string $login_link_separator The separator used between login form navigation links.
472
+ */
473
+ $login_link_separator = apply_filters( 'login_link_separator', ' | ' );
474
+
475
+ switch ($action) {
476
+
477
+ case 'postpass' :
478
+ if ( ! array_key_exists( 'post_password', $_POST ) ) {
479
+ wp_safe_redirect( wp_get_referer() );
480
+ exit();
481
+ }
482
+
483
+ require_once ABSPATH . WPINC . '/class-phpass.php';
484
+ $hasher = new PasswordHash( 8, true );
485
+
486
+ /**
487
+ * Filter the life span of the post password cookie.
488
+ *
489
+ * By default, the cookie expires 10 days from creation. To turn this
490
+ * into a session cookie, return 0.
491
+ *
492
+ * @since 3.7.0
493
+ *
494
+ * @param int $expires The expiry time, as passed to setcookie().
495
+ */
496
+ $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );
497
+ $referer = wp_get_referer();
498
+ if ( $referer ) {
499
+ $secure = ( 'https' === parse_url( $referer, PHP_URL_SCHEME ) );
500
+ } else {
501
+ $secure = false;
502
+ }
503
+ setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure );
504
+
505
+ if ( $switched_locale ) {
506
+ restore_previous_locale();
507
+ }
508
+
509
+ wp_safe_redirect( wp_get_referer() );
510
+ exit();
511
+
512
+ case 'logout' :
513
+ check_admin_referer('log-out');
514
+
515
+ $user = wp_get_current_user();
516
+
517
+ wp_logout();
518
+
519
+ if ( ! empty( $_REQUEST['redirect_to'] ) ) {
520
+ $redirect_to = $requested_redirect_to = $_REQUEST['redirect_to'];
521
+ } else {
522
+ $redirect_to = 'wp-login.php?loggedout=true';
523
+ $requested_redirect_to = '';
524
+ }
525
+
526
+ if ( $switched_locale ) {
527
+ restore_previous_locale();
528
+ }
529
+
530
+ /**
531
+ * Filter the log out redirect URL.
532
+ *
533
+ * @since 4.2.0
534
+ *
535
+ * @param string $redirect_to The redirect destination URL.
536
+ * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter.
537
+ * @param WP_User $user The WP_User object for the user that's logging out.
538
+ */
539
+ $redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user );
540
+ wp_safe_redirect( $redirect_to );
541
+ exit();
542
+
543
+ case 'lostpassword' :
544
+ case 'retrievepassword' :
545
+
546
+ if ( $http_post ) {
547
+ $errors = retrieve_password();
548
+ if ( !is_wp_error($errors) ) {
549
+ $redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';
550
+ wp_safe_redirect( $redirect_to );
551
+ exit();
552
+ }
553
+ }
554
+
555
+ if ( isset( $_GET['error'] ) ) {
556
+ if ( 'invalidkey' == $_GET['error'] ) {
557
+ $errors->add( 'invalidkey', __( 'Your password reset link appears to be invalid. Please request a new link below.' ) );
558
+ } elseif ( 'expiredkey' == $_GET['error'] ) {
559
+ $errors->add( 'expiredkey', __( 'Your password reset link has expired. Please request a new link below.' ) );
560
+ }
561
+ }
562
+
563
+ $lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
564
+ /**
565
+ * Filter the URL redirected to after submitting the lostpassword/retrievepassword form.
566
+ *
567
+ * @since 3.0.0
568
+ *
569
+ * @param string $lostpassword_redirect The redirect destination URL.
570
+ */
571
+ $redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect );
572
+
573
+ /**
574
+ * Fires before the lost password form.
575
+ *
576
+ * @since 1.5.1
577
+ */
578
+ do_action( 'lost_password' );
579
+
580
+ login_header(__('Lost Password' ), '<p class="message">' . __('Please enter your username or email address. You will receive a link to create a new password via email.' ) . '</p>', $errors);
581
+
582
+ $user_login = '';
583
+
584
+ if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) {
585
+ $user_login = wp_unslash( $_POST['user_login'] );
586
+ }
587
+
588
+ ?>
589
+
590
+ <form name="lostpasswordform" id="lostpasswordform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=lostpassword', 'login_post' ) ); ?>" method="post">
591
+ <p>
592
+ <label for="user_login" ><?php _e('Username or Email Address'); ?><br />
593
+ <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr($user_login); ?>" size="20" /></label>
594
+ </p>
595
+ <?php
596
+ /**
597
+ * Fires inside the lostpassword form tags, before the hidden fields.
598
+ *
599
+ * @since 2.1.0
600
+ */
601
+ do_action( 'lostpassword_form' ); ?>
602
+ <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
603
+ <p class="submit"><input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Get New Password'); ?>" /></p>
604
+ </form>
605
+
606
+ <p id="nav">
607
+ <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e('Log in') ?></a>
608
+ <?php
609
+ if ( get_option( 'users_can_register' ) ) :
610
+ $registration_url = sprintf( '<a href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );
611
+
612
+ echo esc_html( $login_link_separator );
613
+
614
+ /** This filter is documented in wp-includes/general-template.php */
615
+ echo apply_filters( 'register', $registration_url );
616
+ endif;
617
+ ?>
618
+ </p>
619
+
620
+ <?php
621
+ login_footer('user_login');
622
+
623
+ if ( $switched_locale ) {
624
+ restore_previous_locale();
625
+ }
626
+
627
+ break;
628
+
629
+ case 'resetpass' :
630
+ case 'rp' :
631
+ list( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
632
+ $rp_cookie = 'wp-resetpass-' . COOKIEHASH;
633
+ if ( isset( $_GET['key'] ) ) {
634
+ $value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) );
635
+ setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
636
+ wp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) );
637
+ exit;
638
+ }
639
+
640
+ if ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], ':' ) ) {
641
+ list( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );
642
+ $user = check_password_reset_key( $rp_key, $rp_login );
643
+ if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
644
+ $user = false;
645
+ }
646
+ } else {
647
+ $user = false;
648
+ }
649
+
650
+ if ( ! $user || is_wp_error( $user ) ) {
651
+ setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
652
+ if ( $user && $user->get_error_code() === 'expired_key' )
653
+ wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) );
654
+ else
655
+ wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) );
656
+ exit;
657
+ }
658
+
659
+ $errors = new WP_Error();
660
+
661
+ if ( isset($_POST['pass1']) && $_POST['pass1'] != $_POST['pass2'] )
662
+ $errors->add( 'password_reset_mismatch', __( 'The passwords do not match.' ) );
663
+
664
+ /**
665
+ * Fires before the password reset procedure is validated.
666
+ *
667
+ * @since 3.5.0
668
+ *
669
+ * @param object $errors WP Error object.
670
+ * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise.
671
+ */
672
+ do_action( 'validate_password_reset', $errors, $user );
673
+
674
+ if ( ( ! $errors->get_error_code() ) && isset( $_POST['pass1'] ) && !empty( $_POST['pass1'] ) ) {
675
+ reset_password($user, $_POST['pass1']);
676
+ setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
677
+ login_header( __( 'Password Reset' ), '<p class="message reset-pass">' . __( 'Your password has been reset.' ) . ' <a href="' . esc_url( wp_login_url() ) . '">' . __( 'Log in' ) . '</a></p>' );
678
+ login_footer();
679
+ exit;
680
+ }
681
+
682
+ wp_enqueue_script('utils');
683
+ wp_enqueue_script('user-profile');
684
+
685
+ login_header(__('Reset Password' ), '<p class="message reset-pass">' . __('Enter your new password below.' ) . '</p>', $errors );
686
+
687
+ ?>
688
+ <form name="resetpassform" id="resetpassform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=resetpass', 'login_post' ) ); ?>" method="post" autocomplete="off">
689
+ <input type="hidden" id="user_login" value="<?php echo esc_attr( $rp_login ); ?>" autocomplete="off" />
690
+
691
+ <div class="user-pass1-wrap">
692
+ <p>
693
+ <label for="pass1"><?php _e( 'New password' ) ?></label>
694
+ </p>
695
+
696
+ <div class="wp-pwd">
697
+ <div class="password-input-wrapper">
698
+ <input type="password" data-reveal="1" data-pw="<?php echo esc_attr( wp_generate_password( 16 ) ); ?>" name="pass1" id="pass1" class="input password-input" size="24" value="" autocomplete="off" aria-describedby="pass-strength-result" />
699
+ <span class="button button-secondary wp-hide-pw hide-if-no-js">
700
+ <span class="dashicons dashicons-hidden"></span>
701
+ </span>
702
+ </div>
703
+ <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength indicator' ); ?></div>
704
+ </div>
705
+ <div class="pw-weak">
706
+ <label>
707
+ <input type="checkbox" name="pw_weak" class="pw-checkbox" />
708
+ <?php _e( 'Confirm use of weak password' ); ?>
709
+ </label>
710
+ </div>
711
+ </div>
712
+ <p class="user-pass2-wrap">
713
+ <label for="pass2"><?php _e('Confirm new password') ?></label><br />
714
+ <input type="password" name="pass2" id="pass2" class="input" size="20" value="" autocomplete="off" />
715
+ </p>
716
+
717
+ <p class="description indicator-hint"><?php echo wp_get_password_hint(); ?></p>
718
+ <br class="clear" />
719
+
720
+ <?php
721
+ /**
722
+ * Fires following the 'Strength indicator' meter in the user password reset form.
723
+ *
724
+ * @since 3.9.0
725
+ *
726
+ * @param WP_User $user User object of the user whose password is being reset.
727
+ */
728
+ do_action( 'resetpass_form', $user );
729
+ ?>
730
+ <input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
731
+ <p class="submit"><input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Reset Password'); ?>" /></p>
732
+ </form>
733
+
734
+ <p id="nav">
735
+ <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
736
+ <?php
737
+ if ( get_option( 'users_can_register' ) ) :
738
+ $registration_url = sprintf( '<a href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );
739
+
740
+ echo esc_html( $login_link_separator );
741
+
742
+ /** This filter is documented in wp-includes/general-template.php */
743
+ echo apply_filters( 'register', $registration_url );
744
+ endif;
745
+ ?>
746
+ </p>
747
+
748
+ <?php
749
+ login_footer('user_pass');
750
+
751
+ if ( $switched_locale ) {
752
+ restore_previous_locale();
753
+ }
754
+
755
+ break;
756
+
757
+ case 'register' :
758
+ if ( is_multisite() ) {
759
+ /**
760
+ * Filter the Multisite sign up URL.
761
+ *
762
+ * @since 3.0.0
763
+ *
764
+ * @param string $sign_up_url The sign up URL.
765
+ */
766
+ wp_redirect( apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ) );
767
+ exit;
768
+ }
769
+
770
+ if ( !get_option('users_can_register') ) {
771
+ wp_redirect( site_url('wp-login.php?registration=disabled') );
772
+ exit();
773
+ }
774
+
775
+ $user_login = '';
776
+ $user_email = '';
777
+ if ( $http_post ) {
778
+ if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) {
779
+ $user_login = $_POST['user_login'];
780
+ }
781
+
782
+ if ( isset( $_POST['user_email'] ) && is_string( $_POST['user_email'] ) ) {
783
+ $user_email = wp_unslash( $_POST['user_email'] );
784
+ }
785
+
786
+ $errors = register_new_user($user_login, $user_email);
787
+ if ( !is_wp_error($errors) ) {
788
+ $redirect_to = !empty( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : 'wp-login.php?checkemail=registered';
789
+ wp_safe_redirect( $redirect_to );
790
+ exit();
791
+ }
792
+ }
793
+
794
+ $registration_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
795
+ /**
796
+ * Filter the registration redirect URL.
797
+ *
798
+ * @since 3.0.0
799
+ *
800
+ * @param string $registration_redirect The redirect destination URL.
801
+ */
802
+ $redirect_to = apply_filters( 'registration_redirect', $registration_redirect );
803
+ login_header(__('Registration Form' ), '<p class="message register">' . __('Register For This Site' ) . '</p>', $errors);
804
+ ?>
805
+
806
+ <form name="registerform" id="registerform" action="<?php echo esc_url( site_url( 'wp-login.php?action=register', 'login_post' ) ); ?>" method="post" novalidate="novalidate">
807
+ <p>
808
+ <label for="user_login"><?php _e('Username') ?><br />
809
+ <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr(wp_unslash($user_login)); ?>" size="20" /></label>
810
+ </p>
811
+ <p>
812
+ <label for="user_email"><?php _e('Email') ?><br />
813
+ <input type="email" name="user_email" id="user_email" class="input" value="<?php echo esc_attr( wp_unslash( $user_email ) ); ?>" size="25" /></label>
814
+ </p>
815
+ <?php
816
+ /**
817
+ * Fires following the 'Email' field in the user registration form.
818
+ *
819
+ * @since 2.1.0
820
+ */
821
+ do_action( 'register_form' );
822
+ ?>
823
+ <p id="reg_passmail"><?php _e( 'Registration confirmation will be emailed to you.' ); ?></p>
824
+ <br class="clear" />
825
+ <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
826
+ <p class="submit"><input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Register'); ?>" /></p>
827
+ </form>
828
+
829
+ <p id="nav">
830
+ <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
831
+ <?php echo esc_html( $login_link_separator ); ?>
832
+ <a href="<?php echo esc_url( wp_lostpassword_url() ); ?>"><?php _e( 'Lost your password?' ); ?></a>
833
+ </p>
834
+
835
+ <?php
836
+ login_footer('user_login');
837
+
838
+ if ( $switched_locale ) {
839
+ restore_previous_locale();
840
+ }
841
+
842
+ break;
843
+
844
+ case 'confirmaction' :
845
+ if ( ! isset( $_GET['request_id'] ) ) {
846
+ wp_die( __( 'Invalid request.' ) );
847
+ }
848
+
849
+ $request_id = (int) $_GET['request_id'];
850
+
851
+ if ( isset( $_GET['confirm_key'] ) ) {
852
+ $key = sanitize_text_field( wp_unslash( $_GET['confirm_key'] ) );
853
+ $result = wp_validate_user_request_key( $request_id, $key );
854
+ } else {
855
+ $result = new WP_Error( 'invalid_key', __( 'Invalid key' ) );
856
+ }
857
+
858
+ if ( is_wp_error( $result ) ) {
859
+ wp_die( $result );
860
+ }
861
+
862
+ /**
863
+ * Fires an action hook when the account action has been confirmed by the user.
864
+ *
865
+ * Using this you can assume the user has agreed to perform the action by
866
+ * clicking on the link in the confirmation email.
867
+ *
868
+ * After firing this action hook the page will redirect to wp-login a callback
869
+ * redirects or exits first.
870
+ *
871
+ * @param int $request_id Request ID.
872
+ */
873
+ do_action( 'user_request_action_confirmed', $request_id );
874
+
875
+ $message = _wp_privacy_account_request_confirmed_message( $request_id );
876
+
877
+ login_header( __( 'User action confirmed.' ), $message );
878
+ login_footer();
879
+ exit;
880
+
881
+ case 'login' :
882
+ default:
883
+ $secure_cookie = '';
884
+ $customize_login = isset( $_REQUEST['customize-login'] );
885
+ if ( $customize_login )
886
+ wp_enqueue_script( 'customize-base' );
887
+
888
+ // If the user wants ssl but the session is not ssl, force a secure cookie.
889
+ if ( !empty($_POST['log']) && !force_ssl_admin() ) {
890
+ $user_name = sanitize_user($_POST['log']);
891
+ $user = get_user_by( 'login', $user_name );
892
+
893
+ if ( ! $user && strpos( $user_name, '@' ) ) {
894
+ $user = get_user_by( 'email', $user_name );
895
+ }
896
+
897
+ if ( $user ) {
898
+ if ( get_user_option('use_ssl', $user->ID) ) {
899
+ $secure_cookie = true;
900
+ force_ssl_admin(true);
901
+ }
902
+ }
903
+ }
904
+
905
+ if ( isset( $_REQUEST['redirect_to'] ) ) {
906
+ $redirect_to = $_REQUEST['redirect_to'];
907
+ // Redirect to https if user wants ssl
908
+ if ( $secure_cookie && false !== strpos($redirect_to, 'wp-admin') )
909
+ $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to);
910
+ } else {
911
+ $redirect_to = admin_url();
912
+ }
913
+
914
+ $reauth = empty($_REQUEST['reauth']) ? false : true;
915
+
916
+ $user = wp_signon( array(), $secure_cookie );
917
+
918
+ if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
919
+ if ( headers_sent() ) {
920
+ /* translators: 1: Browser cookie documentation URL, 2: Support forums URL */
921
+ $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
922
+ __( 'https://codex.wordpress.org/Cookies' ), __( 'https://wordpress.org/support/' ) ) );
923
+ } elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {
924
+ // If cookies are disabled we can't log in even with a valid user+pass
925
+ /* translators: 1: Browser cookie documentation URL */
926
+ $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
927
+ __( 'https://codex.wordpress.org/Cookies' ) ) );
928
+ }
929
+ }
930
+
931
+ $requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
932
+ /**
933
+ * Filter the login redirect URL.
934
+ *
935
+ * @since 3.0.0
936
+ *
937
+ * @param string $redirect_to The redirect destination URL.
938
+ * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter.
939
+ * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise.
940
+ */
941
+ $redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );
942
+
943
+ if ( !is_wp_error($user) && !$reauth ) {
944
+ if ( $interim_login ) {
945
+ $message = '<p class="message">' . __('You have logged in successfully.' ) . '</p>';
946
+ $interim_login = 'success';
947
+ login_header( '', $message ); ?>
948
+ </div>
949
+ <?php
950
+ /** This action is documented in wp-login.php */
951
+ do_action( 'login_footer' ); ?>
952
+ <?php if ( $customize_login ) : ?>
953
+ <script type="text/javascript">setTimeout( function(){ new wp.customize.Messenger({ url: '<?php echo wp_customize_url(); ?>', channel: 'login' }).send('login') }, 1000 );</script>
954
+ <?php endif; ?>
955
+ </body></html>
956
+ <?php exit;
957
+ }
958
+
959
+ if ( ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' || $redirect_to == admin_url() ) ) {
960
+ // If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
961
+ if ( is_multisite() && !get_active_blog_for_user($user->ID) && !is_super_admin( $user->ID ) )
962
+ $redirect_to = user_admin_url();
963
+ elseif ( is_multisite() && !$user->has_cap('read') )
964
+ $redirect_to = get_dashboard_url( $user->ID );
965
+ elseif ( !$user->has_cap('edit_posts') )
966
+ $redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url();
967
+
968
+ wp_redirect( $redirect_to );
969
+ exit();
970
+ }
971
+ wp_safe_redirect($redirect_to);
972
+ exit();
973
+ }
974
+
975
+ $errors = $user;
976
+ // Clear errors if loggedout is set.
977
+ if ( !empty($_GET['loggedout']) || $reauth )
978
+ $errors = new WP_Error();
979
+
980
+ if ( $interim_login ) {
981
+ if ( ! $errors->get_error_code() )
982
+ $errors->add('expired', __('Your session has expired. Please log in to continue where you left off.' ), 'message');
983
+ } else {
984
+ // Some parts of this script use the main login form to display a message
985
+ if ( isset($_GET['loggedout']) && true == $_GET['loggedout'] )
986
+ $errors->add('loggedout', __('You are now logged out.' ), 'message');
987
+ elseif ( isset($_GET['registration']) && 'disabled' == $_GET['registration'] )
988
+ $errors->add('registerdisabled', __('User registration is currently not allowed.' ));
989
+ elseif ( isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail'] )
990
+ $errors->add('confirm', __('Check your email for the confirmation link.' ), 'message');
991
+ elseif ( isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail'] )
992
+ $errors->add('newpass', __('Check your email for your new password.' ), 'message');
993
+ elseif ( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] )
994
+ $errors->add('registered', __('Registration complete. Please check your email.' ), 'message');
995
+ elseif ( strpos( $redirect_to, 'about.php?updated' ) )
996
+ $errors->add('updated', __( '<strong>You have successfully updated WordPress!</strong> Please log back in to see what&#8217;s new.' ), 'message' );
997
+ }
998
+
999
+ /**
1000
+ * Filter the login page errors.
1001
+ *
1002
+ * @since 3.6.0
1003
+ *
1004
+ * @param object $errors WP Error object.
1005
+ * @param string $redirect_to Redirect destination URL.
1006
+ */
1007
+ $errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );
1008
+
1009
+ // Clear any stale cookies.
1010
+ if ( $reauth )
1011
+ wp_clear_auth_cookie();
1012
+
1013
+ login_header(__('Log In' ), '', $errors);
1014
+
1015
+ if ( isset($_POST['log']) )
1016
+ $user_login = ( 'incorrect_password' == $errors->get_error_code() || 'empty_password' == $errors->get_error_code() ) ? esc_attr(wp_unslash($_POST['log'])) : '';
1017
+ $rememberme = ! empty( $_POST['rememberme'] );
1018
+
1019
+ if ( ! empty( $errors->errors ) ) {
1020
+ $aria_describedby_error = ' aria-describedby="login_error"';
1021
+ } else {
1022
+ $aria_describedby_error = '';
1023
+ }
1024
+
1025
+ //aiowps - this check is necessary because otherwise if variables are undefined we get a warning!
1026
+ if(empty($user_login)){
1027
+ $user_login = '';
1028
+ }
1029
+ if(empty($error)){
1030
+ $error = '';
1031
+ }
1032
+ ?>
1033
+
1034
+ <form name="loginform" id="loginform" action="<?php echo esc_url( site_url( 'wp-login.php', 'login_post' ) ); ?>" method="post">
1035
+ <p>
1036
+ <label for="user_login"><?php _e('Username or Email Address'); ?><br />
1037
+ <input type="text" name="log" id="user_login"<?php echo $aria_describedby_error; ?> class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" /></label>
1038
+ </p>
1039
+ <p>
1040
+ <label for="user_pass"><?php _e('Password'); ?><br />
1041
+ <input type="password" name="pwd" id="user_pass"<?php echo $aria_describedby_error; ?> class="input" value="" size="20" /></label>
1042
+ </p>
1043
+ <?php
1044
+ /**
1045
+ * Fires following the 'Password' field in the login form.
1046
+ *
1047
+ * @since 2.1.0
1048
+ */
1049
+ do_action( 'login_form' );
1050
+ ?>
1051
+ <p class="forgetmenot"><label for="rememberme"><input name="rememberme" type="checkbox" id="rememberme" value="forever" <?php checked( $rememberme ); ?> /> <?php esc_html_e('Remember Me'); ?></label></p>
1052
+ <p class="submit">
1053
+ <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Log In'); ?>" />
1054
+ <?php if ( $interim_login ) { ?>
1055
+ <input type="hidden" name="interim-login" value="1" />
1056
+ <?php } else { ?>
1057
+ <input type="hidden" name="redirect_to" value="<?php echo esc_attr($redirect_to); ?>" />
1058
+ <?php } ?>
1059
+ <?php if ( $customize_login ) : ?>
1060
+ <input type="hidden" name="customize-login" value="1" />
1061
+ <?php endif; ?>
1062
+ <input type="hidden" name="testcookie" value="1" />
1063
+ </p>
1064
+ </form>
1065
+
1066
+ <?php if ( ! $interim_login ) { ?>
1067
+ <p id="nav">
1068
+ <?php if ( ! isset( $_GET['checkemail'] ) || ! in_array( $_GET['checkemail'], array( 'confirm', 'newpass' ) ) ) :
1069
+ if ( get_option( 'users_can_register' ) ) :
1070
+ $registration_url = sprintf( '<a href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );
1071
+
1072
+ /** This filter is documented in wp-includes/general-template.php */
1073
+ echo apply_filters( 'register', $registration_url );
1074
+
1075
+ echo esc_html( $login_link_separator );
1076
+ endif;
1077
+ ?>
1078
+ <a href="<?php echo esc_url( wp_lostpassword_url() ); ?>"><?php _e( 'Lost your password?' ); ?></a>
1079
+ <?php endif; ?>
1080
+ </p>
1081
+ <?php } ?>
1082
+
1083
+ <script type="text/javascript">
1084
+ function wp_attempt_focus(){
1085
+ setTimeout( function(){ try{
1086
+ <?php if ( $user_login ) { ?>
1087
+ d = document.getElementById('user_pass');
1088
+ d.value = '';
1089
+ <?php } else { ?>
1090
+ d = document.getElementById('user_login');
1091
+ <?php if ( 'invalid_username' == $errors->get_error_code() ) { ?>
1092
+ if( d.value != '' )
1093
+ d.value = '';
1094
+ <?php
1095
+ }
1096
+ }?>
1097
+ d.focus();
1098
+ d.select();
1099
+ } catch(e){}
1100
+ }, 200);
1101
+ }
1102
+
1103
+ <?php
1104
+ /**
1105
+ * Filters whether to print the call to `wp_attempt_focus()` on the login screen.
1106
+ *
1107
+ * @since 4.8.0
1108
+ *
1109
+ * @param bool $print Whether to print the function call. Default true.
1110
+ */
1111
+ if ( apply_filters( 'enable_login_autofocus', true ) && ! $error ) { ?>
1112
+ wp_attempt_focus();
1113
+ <?php } ?>
1114
+ if(typeof wpOnload=='function')wpOnload();
1115
+ <?php if ( $interim_login ) { ?>
1116
+ (function(){
1117
+ try {
1118
+ var i, links = document.getElementsByTagName('a');
1119
+ for ( i in links ) {
1120
+ if ( links[i].href )
1121
+ links[i].target = '_blank';
1122
+ }
1123
+ } catch(e){}
1124
+ }());
1125
+ <?php } ?>
1126
+ </script>
1127
+
1128
+ <?php
1129
+ login_footer();
1130
+
1131
+ if ( $switched_locale ) {
1132
+ restore_previous_locale();
1133
+ }
1134
+
1135
+ break;
1136
+ } // end action switch
{tags/4.3.7.1/trunk/other-includes → other-includes}/wp-security-stop-users-enumeration.php RENAMED
File without changes
{tags/4.3.7.1/trunk/other-includes → other-includes}/wp-security-unlock-request.php RENAMED
File without changes
{tags/1.8/other-includes → other-includes}/wp-security-visitor-lockout-page.php RENAMED
File without changes
readme.txt ADDED
@@ -0,0 +1,836 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === All In One WP Security & Firewall ===
2
+ Contributors: Tips and Tricks HQ, wpsolutions, Peter Petreski, Ruhul Amin, mbrsolution, chesio
3
+ Donate link: https://www.tipsandtricks-hq.com
4
+ Tags: security, secure, Anti Virus, antivirus, ban, ban hacker, virus, firewall, firewall security, login, lockdown, htaccess, hack, malware, vulnerability, protect, protection, phishing, database, backup, plugin, sql injection, ssl, restrict, login captcha, bot, hotlink, 404 detection, admin, rename, all in one, scan, scanner, iframe,
5
+ Requires at least: 4.7
6
+ Tested up to: 5.0
7
+ Stable tag: trunk
8
+ License: GPLv3
9
+
10
+ A comprehensive, user-friendly, all in one WordPress security and firewall plugin for your site.
11
+
12
+ == Privacy Policy ==
13
+ This plugin may collect IP addresses for security reasons such as mitigating brute force login threats and malicious activity.
14
+ The collected information is stored on your server. No information is transmitted to third parties or remote server locations.
15
+
16
+ == Description ==
17
+ = A COMPREHENSIVE, EASY TO USE, STABLE AND WELL SUPPORTED WORDPRESS SECURITY PLUGIN =
18
+
19
+ WordPress itself is a very secure platform. However, it helps to add some extra security and firewall to your site by using a security plugin that enforces a lot of good security practices.
20
+
21
+ The All In One WordPress Security plugin will take your website security to a whole new level.
22
+
23
+ This plugin is designed and written by experts and is easy to use and understand.
24
+
25
+ It reduces security risk by checking for vulnerabilities, and by implementing and enforcing the latest recommended WordPress security practices and techniques.
26
+
27
+ https://www.youtube.com/watch?v=CJvCTlVtazA
28
+
29
+ All In One WP Security also uses an unprecedented security points grading system to measure how well you are protecting your site based on the security features you have activated.
30
+
31
+ Our security and firewall rules are categorized into "basic", "intermediate" and "advanced". This way you can apply the firewall rules progressively without breaking your site's functionality.
32
+
33
+ The All In One WordPress Security plugin doesn't slow down your site and it is 100% free.
34
+
35
+ Visit the [WordPress Security Plugin](https://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin) page for more details.
36
+
37
+ Below is a list of the security and firewall features offered in this plugin:
38
+
39
+ = User Accounts Security =
40
+ * Detect if there is a user account which has the default "admin" username and easily change the username to a value of your choice.
41
+ * The plugin will also detect if you have any WordPress user accounts which have identical login and display names. Having account's where display name is identical to login name is bad security practice because
42
+ you are making it 50% easier for hackers because they already know the login name.
43
+ * Password strength tool to allow you to create very strong passwords.
44
+ * Stop user enumeration. So users/bots cannot discover user info via author permalink.
45
+
46
+ = User Login Security =
47
+ * Protect against "Brute Force Login Attack" with the Login Lockdown feature. Users with a certain IP address or range will be locked out of the system for a predetermined amount of time based on the configuration settings and you can also choose to be notified
48
+ via email whenever somebody gets locked out due to too many login attempts.
49
+
50
+ * As the administrator you can view a list of all locked out users which are displayed in an easily readable and navigable table which also allows you to unlock individual or bulk IP addresses at the click of a button.
51
+ * Force logout of all users after a configurable time period
52
+ * Monitor/View failed login attempts which show the user's IP address, User ID/Username and Date/Time of the failed login attempt
53
+
54
+ * Monitor/View the account activity of all user accounts on your system by keeping track of the username, IP address, login date/time, and logout date/time.
55
+ * Ability to automatically lockout IP address ranges which attempt to login with an invalid username.
56
+ * Ability to see a list of all the users who are currently logged into your site.
57
+ * Allows you to specify one or more IP addresses in a special whitelist. The whitelisted IP addresses will have access to your WP login page.
58
+ * Add Google reCaptcha or plain maths captcha to WordPress Login form.
59
+ * Add Google reCaptcha or plain maths captcha to the forgot password form of your WP Login system.
60
+
61
+ = User Registration Security =
62
+ * Enable manual approval of WordPress user accounts. If your site allows people to create their own accounts via the WordPress registration form, then you can minimize SPAM or bogus registrations by manually approving each registration.
63
+ * Ability to add Google reCaptcha or plain maths captcha to the WordPress's user registration page to protect you from spam user registration.
64
+ * Ability to add Honeypot to the WordPress's user registration form to reduce registration attempts by robots.
65
+
66
+ = Database Security =
67
+ * Easily set the default WP prefix to a value of your choice with the click of a button.
68
+ * Schedule automatic backups and email notifications or make an instant DB backup whenever you want with one click.
69
+
70
+ = File System Security =
71
+ * Identify files or folders which have permission settings which are not secure and set the permissions to the recommend secure values with click of a button.
72
+ * Protect your PHP code by disabling file editing from the WordPress administration area.
73
+ * Easily view and monitor all host system logs from a single menu page and stay informed of any issues or problems occurring on your server so you can address them quickly.
74
+ * Prevent people from accessing the readme.html, license.txt and wp-config-sample.php files of your WordPress site.
75
+
76
+ = htaccess and wp-config.php File Backup and Restore =
77
+ * Easily backup your original .htaccess and wp-config.php files in case you will need to use them to restore broken functionality.
78
+ * Modify the contents of the currently active .htaccess or wp-config.php files from the admin dashboard with only a few clicks
79
+
80
+ = Blacklist Functionality =
81
+ * Ban users by specifying IP addresses or use a wild card to specify IP ranges.
82
+ * Ban users by specifying user agents.
83
+
84
+ = Firewall Functionality =
85
+
86
+ This plugin allows you to easily add a lot of firewall protection to your site via htaccess file. An htaccess file is processed by your web server before any other code on your site.
87
+ So these firewall rules will stop malicious script(s) before it gets a chance to reach the WordPress code on your site.
88
+
89
+ * Access control facility.
90
+ * Instantly activate a selection of firewall settings ranging from basic, intermediate and advanced.
91
+ * Enable the famous "6G Blacklist" Firewall rules courtesy of [Perishable Press](http://perishablepress.com/)
92
+ * Forbid proxy comment posting.
93
+ * Block access to debug log file.
94
+ * Disable trace and track.
95
+ * Deny bad or malicious query strings.
96
+ * Protect against Cross Site Scripting (XSS) by activating the comprehensive advanced character string filter.
97
+ or malicious bots who do not have a special cookie in their browser. You (the site admin) will know how to set this special cookie and be able to log into your site.
98
+ * WordPress PingBack Vulnerability Protection feature. This firewall feature allows the user to prohibit access to the xmlrpc.php file in order to protect against certain vulnerabilities in the pingback functionality. This is also helpful to block bots from constantly accessing the xmlrpc.php file and wasting your server resource.
99
+ * Ability to block fake Googlebots from crawling your site.
100
+ * Ability to prevent image hotlinking. Use this to prevent others from hotlinking your images.
101
+ * Ability to log all 404 events on your site. You can also choose to automatically block IP addresses that are hitting too many 404s.
102
+ * Ability to add custom rules to block access to various resources of your site.
103
+
104
+ = Brute force login attack prevention =
105
+ * Instantly block Brute Force Login Attacks via our special Cookie-Based Brute Force Login Prevention feature. This firewall functionality will block all login attempts from people and bots.
106
+ * Ability to add a simple math captcha to the WordPress login form to fight against brute force login attacks.
107
+ * Ability to hide admin login page. Rename your WordPress login page URL so that bots and hackers cannot access your real WordPress login URL. This feature allows you to change the default login page (wp-login.php) to something you configure.
108
+ * Ability to use Login Honeypot which will helps reduce brute force login attempts by robots.
109
+
110
+ = WhoIs Lookup =
111
+ * Perform a WhoIs lookup of a suspicious host or IP address and get full details.
112
+
113
+ = Security Scanner =
114
+ * The file change detection scanner can alert you if any files have changed in your WordPress system. You can then investigate and see if that was a legitimate change or some bad code was injected.
115
+ * Database scanner feature can be used to scan your database tables. It will look for any common suspicious-looking strings, javascript and html code in some of the WordPress core tables.
116
+
117
+ = Comment SPAM Security =
118
+ * Monitor the most active IP addresses which persistently produce the most SPAM comments and instantly block them with the click of a button.
119
+ * Prevent comments from being submitted if it doesn't originate from your domain (this should reduce some SPAM bot comment posting on your site).
120
+ * Add a captcha to your wordpress comment form to add security against comment spam.
121
+ * Automatically and permanently block IP addresses which have exceeded a certain number of comments labeled as SPAM.
122
+
123
+ = Front-end Text Copy Protection =
124
+ * Ability to disable the right click, text selection and copy option for your front-end.
125
+
126
+ = Regular updates and additions of new security features =
127
+ * WordPress Security is something that evolves over time. We will be updating the All In One WP Security plugin with new security features (and fixes if required) on a regular basis so you can rest assured that your site will be on the cutting edge of security protection techniques.
128
+
129
+ = Works with Most Popular WordPress Plugins =
130
+ * It should work smoothly with most popular WordPress plugins.
131
+
132
+ = Additional Features =
133
+ * Ability to remove the WordPress Generator Meta information from the HTML source of your site.
134
+ * Ability to remove the WordPress Version information from the JS and CSS file includes of your site.
135
+ * Ability to prevent people from accessing the readme.html, license.txt and wp-config-sample.php files
136
+ * Ability to temporarily lock down the front end of your site from general visitors while you do various backend tasks (investigate security attacks, perform site upgrades, do maintenance work etc.)
137
+ * Ability to export/import the security settings.
138
+ * Prevent other sites from displaying your content via a frame or iframe.
139
+
140
+ = Plugin Support =
141
+ * If you have a question or problem with the All In One Security plugin, post it on the support forum and we will help you.
142
+
143
+ = Developers =
144
+ * If you are a developer and you need some extra hooks or filters for this plugin then let us know.
145
+ * Github repository - https://github.com/Arsenal21/all-in-one-wordpress-security
146
+
147
+ = Translations =
148
+ * All In One WP Security plugin can be translated to any language.
149
+
150
+ Currently available translations:
151
+
152
+ - English
153
+ - German
154
+ - Spanish
155
+ - French
156
+ - Hungarian
157
+ - Italian
158
+ - Swedish
159
+ - Russian
160
+ - Chinese
161
+ - Portuguese (Brazil)
162
+ - Persian
163
+
164
+ Visit the [WordPress Security Plugin](https://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin) page for more details.
165
+
166
+ == Installation ==
167
+
168
+ To begin making your WordPress site more secure:
169
+
170
+ 1. Upload the 'all-in-one-wp-security.zip' file from the Plugins->Add New page in the WordPress administration panel.
171
+ 2. Activate the plugin through the 'Plugins' menu in WordPress
172
+ 3. Go to Settings menu under 'WP Security' and start activating the security features of the plugin.
173
+
174
+ == Usage ==
175
+
176
+ Go to the settings menu after you activate the plugin and follow the instructions.
177
+
178
+ == Screenshots ==
179
+ Check the following page for screenshots:
180
+ https://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin
181
+
182
+ == Frequently Asked Questions ==
183
+ Check the following page for F.A.Q (see the faq section):
184
+ https://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin
185
+
186
+ == Upgrade Notice ==
187
+ None
188
+
189
+ == Changelog ==
190
+ = 4.3.8.1 =
191
+ - Minor bug fix - added missing check to enqueue recaptcha script only if that feature is enabled.
192
+
193
+ = 4.3.8 =
194
+ - Added ability to hide secret rename login page link when sending emails to people asking for personal data export.
195
+ - Fixed Google reCaptcha not showing on comment page.
196
+ - Fixed activation handler and creation of DB tables to handle multi-site activations more robustly.
197
+ - Improved reCaptcha code to prevent the occasional occurrence of "Uncaught Error: reCAPTCHA placeholder element must be an element or id" error.
198
+ - Added extra check for PHP_OS value to prevent Apple "DARWIN" being interpreted as windows server.
199
+ - Corrected some minor translation issues on rename login page.
200
+ - Increased priority of authenticate hook for captcha check.
201
+ - Updated the Dutch Language file.
202
+
203
+ = 4.3.7.2 =
204
+ - More "get_home_path" fatal error preventions.
205
+
206
+ = 4.3.7.1 =
207
+ - Fixed fatal error regarding "get_home_path" function.
208
+
209
+
210
+ = 4.3.7 =
211
+ - Added Google reCaptcha feature for login forms.
212
+ - Improved code which checks if site is main for multi-site installations.
213
+ - Removed the text domain string from the translation functions in the wp-security-rename-login-feature.php file.
214
+ - Changed .htaccess path location to use get_home_path().
215
+ - Fixed minor woocommerce captcha bug
216
+
217
+ = 4.3.6 =
218
+ - Added new tab called "WP REST API" in the Miscellaneous menu and created separate feature which disables unauthorized REST access for non-logged in users independent of the users enumeration feature.
219
+ - Improved dashboard page widget area display.
220
+ - Small translation string fix in the rename login page feature.
221
+
222
+ = 4.3.5 =
223
+ - Fix - Error: Call to undefined function the_privacy_policy_link() in older versions of WordPress.
224
+ - Added a check to disable file change detection feature and prevent fatal errors when FilesystemIterator is not available due to old versions of PHP.
225
+ - Improved get_login_fail_count method in the AIOWPSecurity_User_Login class which will fix cases where login lockdown
226
+ was not working on some servers due to timestamp difference between PHP current_time( 'mysql' ) and mysql now().
227
+
228
+ = 4.3.4 =
229
+ - Modified rename login page to handle GDPR Export/Erase Personal Data request.
230
+ - Fixed woocommerce registration page captcha bug.
231
+ - Improved users enumeration so that authenticated requests to the REST API are allowed but others are blocked.
232
+ - Improved logic in Renamed Login Page settings such that unnecessary call of AIOWPSecurity_Utility_Htaccess::write_to_htaccess() function is avoided.
233
+
234
+ = 4.3.3.1 =
235
+ - Fixed a typo with the newly added action hook - aiowps_before_wp_die_renamed_login
236
+
237
+ = 4.3.3 =
238
+ - Fixed bug - aiowps will now allow access to admin-post.php from front-end when rename login feature is active.
239
+ - Modified login lockdown feature so that the exact IP address is locked down and not the IP range.
240
+ - Added new filter (aiowps_ip_blocked_output_page) which allows user to filter the complete output when someone's IP has been locked out.
241
+ - Added new action hook (aiopws_before_wp_die_renamed_login) for the renamed login feature which fires just before the wp_die event which produces the "Not available" behaviour.
242
+ - Removed unused code.
243
+ - Modified get_user_ip_address to get the first IP address in cases where there are multiple comma separated addresses provided - example X-Forwarded-For.
244
+
245
+ = 4.3.2 =
246
+ - Added new IP address settings page which user the ability to configure which $_SERVER global the IP address will be retrieved from. (New setting found in WP Security >> Settings >> Advanced Settings)
247
+ - Fixed bug in .htaccess rules caused when 6G and IP blacklist firewall rules were simultaneously enabled.
248
+ - Fixed bug where captcha answer was being ignored on woocommerce login page.
249
+ - Added support for unlock requests made from woocomerce account login page when rename login feature is active.
250
+ - Added useful debug code for troubleshooting in the fake googlebot function.
251
+ - Some general code cleanup and improvement.
252
+ - Added code to prevent direct access data leaks.
253
+ - Added captcha settings for BBPress new topic form.
254
+ - Fixed minor bug in dashboard page when checking if htaccess rules applied.
255
+ - Added a check for Windows server installation in File Permissions feature - this feature is not applicable for Windows servers.
256
+ - Added check to display comment captcha only when user not logged in.
257
+
258
+ = 4.3.1 =
259
+ - Improved white list directives to cater for Apache 2.4 and earlier versions.
260
+ - Added 3 filters for the manual account registration approval email: aiowps_register_approval_email_subject, aiowps_register_approval_email_msg, aiowps_register_approval_email_from_name
261
+ - Added configuration option to allow custom firewall rules to be applied at beginning of all rules applied by aiowps.
262
+ - Changed record insertions to DB table aiowps_failed_logins to store the full IP address instead of IP range.
263
+
264
+ = 4.3.0 =
265
+ - Updated wp-security-rename-login-feature.php to include latest WordPress core changes.
266
+ - Added captcha for woocommerce login and registration forms.
267
+ - Fixed "mixed line endings" warnings for whois library.
268
+ - Moved DB cleanup task cron job from daily to hourly.
269
+ - Updated the reapply htaccess function so it doesn't create the header already sent error.
270
+
271
+ = 4.2.9 =
272
+ - Changed the parameter in current_user_can function to use an administrator capability instead of the "administrator" role name.
273
+ - Added some new hooks to the AIOWPSecurity_WP_Loaded_Tasks called aiowps_wp_loaded_tasks_start and aiowps_wp_loaded_tasks_end.
274
+ - Improved get_locked_ips() function and added $wpdb->prepare statement.
275
+ - Added more missing translation domain parameters for translatable strings in the rename login page.
276
+ - Deleted local copy of the Persian and Italian language files. These translations are available on translate.wordpress.org.
277
+ - Domain path and text domain added to plugin header.
278
+ - Changed the get_user_ip_address functions so that $_SERVER['REMOTE_ADDR'] is the primary method used to obtain IP address.
279
+ - Added enumeration block via REST API (wp >= 4.7)
280
+
281
+ = 4.2.8 =
282
+ - Improved "User Registration" feature to bypass the pending approval status for new users created in admin side.
283
+ - Fixed bug in whois library.
284
+ - Added translation domain parameter for translatable strings in the rename login page.
285
+ - Updated the chinese language file.
286
+
287
+ = 4.2.7 =
288
+ - The PHPWhois library updated to their latest version to include a security patch.
289
+
290
+ = 4.2.6 =
291
+ - Added new Login Lockdown whitelist feature which allows immunity for IP address or ranges from being locked by the lockdown feature.
292
+ - Fixed bug - Replaced date_i18n with current_time to prevent cases where some localizations produce foreign characters in date stamp output.
293
+ - Added a new feature to add Honeypot to the WordPress's user registration form (this can help reduce registration attempts by robots).
294
+ - Added "Export to CSV" buttons for 404 Event Logs, Account Activity Logs and Failed Login Records.
295
+ - Minor update to 6G rules.
296
+ - Minor spelling and wording fixes and changes.
297
+
298
+ = 4.2.5 =
299
+ - Fixed bug - added code which caters for mysql view definitions when DB prefix is changed.
300
+ - Fixed a typo in the user login security menu.
301
+ - Fixed storage of time stamp in lockdown table to match the local Wordpress server time and be consistent with the timestamp stored in the failed logins table.
302
+ - Prevent direct access to wp-security-core.php
303
+ - Updated the POT file.
304
+
305
+ = 4.2.4 =
306
+ - Fix error on block_ip_if_locked(), doesn't exit with a wp_user. This is needed for other plugins that create the $user (aka ldap auth plugins).
307
+ - Fix login error message for users with pending account approval.
308
+ - Wordpress 4.7 compatibility.
309
+
310
+ = 4.2.3 =
311
+ - Fixed bug when math captcha was displayed on Woocommerce registration page.
312
+ - Fixed login page bug for cases where email address and captcha are used to submit login form (thanks to @chesio for fix).
313
+ - Logs directory now contains a .htaccess file with proper deny directives.
314
+ - Small UX improvement: add for attribute to captcha label.
315
+ - Added check for IIS server in get_server_type function.
316
+
317
+ = 4.2.2 =
318
+ - Debug logger class improvements.
319
+ - Added a message in the debug settings area to state that the log files are reset on every plugin update.
320
+ - Always return an array from scan_dir_sort_date() to prevent PHP notices.
321
+ - Improvements for Automated DB backups filling up space - old backup file will be deleted first.
322
+ - Thanks to RIPS Analyzer for sending us the vulnerability report.
323
+
324
+ = 4.2.1 =
325
+ - Improve output of .htaccess to include <IfModule mod_rewrite.c> checks and RewriteEngine On directives.
326
+ - Fall back to default DB backup interval in case of invalid value.
327
+ - The aiowps_delete_backup_files() function will produce a debug log message on every call (to help with troubleshooting when needed).
328
+
329
+ = 4.2.0 =
330
+ - WPML plugin compatibility fix for the renamed admin login page feature.
331
+ - Fixed a few potential XSS vulnerabilities.
332
+
333
+ = 4.1.9 =
334
+ - Small improvement to the new "immediate blocking of specific usernames" feature.
335
+
336
+ = 4.1.8 =
337
+ - New feature to allow immediate blocking of specific usernames.
338
+ - Only activate copy (right-click) protection for non-admin users.
339
+ - Fixed bug where logout link in admin bar does not get updated on after the $_POST submit to reflect the new rename login setting.
340
+ - Fixed small bug in return_regularized_url function.
341
+ - Improvement/bug fix: When currently logged in user attempts to access renamed login page, redirect them to dashboard.
342
+ - Removed Spanish language files so they can be automatically pulled from WordPress.org.
343
+ - Drop unnecessary WHERE clause in some backend listings.
344
+ - Improvement: do not schedule a cronjob, if it is already scheduled.
345
+
346
+ = 4.1.7 =
347
+ - Added sanitisation for log file data in textarea.
348
+ - Disabled autocomplete for Captcha field.
349
+
350
+ = 4.1.6 =
351
+ - Added cleanup code for captcha string info transients.
352
+ - Minor change to the username label in the renamed login page to keep it inline with the standard WordPress login page.
353
+ - Fixed a potential vulnerability when viewing AIOWPS log files in the Dashboard menu. Thanks to Manuel LLOP for pointing this out.
354
+
355
+ = 4.1.5 =
356
+ - Fixed bug where username is an email and captcha was being ignored.
357
+ - Reduce memory footprint of database backup.
358
+ - Improvements: Make hard-coded strings localizable.
359
+ - Partial Apache 2.3 compatibility.
360
+ - Improved: Hide WP version number by replacing it with a hash. This way, WordPress version number is not exposed, but browser caching is not obscured by missing version numbers.
361
+
362
+ = 4.1.4 =
363
+ - Improved and tweaked the login captcha feature to avoid some issues people had with the last modification.
364
+ - Deleted reference to ini_get('safe_mode') to avoid fatal errors for newer versions of PHP where that setting has been totally removed.
365
+
366
+ = 4.1.3 =
367
+ - Added new checkbox for XMLRPC to disable only pingback methods but leave other XMLRPC functionality accessible. This will be useful for people who use Jetpack or Wordpress iOS or other apps.
368
+ - Updated the French language file.
369
+ - Fix: decbin doesn't add leading zero. Comparing empty strings return bad results.
370
+ - Fix: bugfix in the login captcha. Thanks to Sipke Mellema for pointing it out.
371
+
372
+ = 4.1.2 =
373
+ - Fixed bug introduced by last file change scanner code changes.
374
+ - Fixed bug in SPAM comment blocking functionality.
375
+ - Fixed fatal error case when Divi theme and front end lockout is enabled.
376
+
377
+ = 4.1.1 =
378
+ - Fixed Fatal error conflict between Rename Login feature and Yoast SEO and some themes when attempting to access wp-admin page directly.
379
+ - Added "Pending Approval" message when manual registration approval feature is enabled and a user registers.
380
+ - Fix (minor): No need to use strcmp to compare integer values.
381
+ - Updated and simplified wp-security-stop-users-enumeration.php for bug (thanks to @davidegiunchidiennea)
382
+ - Minor code cleanup (Thanks to @chesio for the following changes).
383
+ - File scanner codebase cleanup.
384
+ - Fix: properly report invalid email addresses in file scanner configuration.
385
+ - Code clean-up in AIOWPSecurity_Scan::do_file_change_scan() method.
386
+ - Tweak: Compare file scan data faster.
387
+
388
+ = 4.1.0 =
389
+ - Fixed bug in Maintenance menu page when trying to attach a media file to the message text box.
390
+ - Added a new filter (called "aiowps_ip_blocked_error_msg") which allows the modification of the error message displayed on the login page when an IP address has been blocked by the login lockdown feature.
391
+ - Updated French language translation. Thanks to Claude Ribaux for providing the translation files.
392
+ - Thanks to @chesio for making the following two changes.
393
+ - Replaced deprecated call to get_currentuserinfo() function.
394
+ - Minor code fixes in the backup class file.
395
+ - Fix: display correct (error) message when write_to_htaccess() fails.
396
+ - Tweak: database backup filename is more human-readable.
397
+ Before: 24x7eg8l6i-database-backup-1463042767.zip
398
+ After: database-backup-20160512-104607-24x7eg8l6i.zip
399
+
400
+ = 4.0.9 =
401
+ - Made file change scanner code more robust for cases when open_basedir restriction is in effect. (Thanks to Manuel Jeanne for pointing this out).
402
+ - Added code which will remove WordPress version info during CSS and JS script loading if you have the "Remove WP Generator Meta Info" option checked. (Thanks to aldemarcalazans for pointing this out).
403
+ - Fixed some potential SQL injection vulnerabilities. (Thanks to Julio Potier for pointing these out).
404
+ - Changed the feature category of blacklist manger from "Intermediate" to "Advanced".
405
+ - Tweak: Remove "@" from list of characters blocked by advanced character string filter. (Because it is often used in retina-ready images).
406
+ - Fix: Use home URL instead of site URL in lock notification email subject. Thanks to @chesio for fixing this.
407
+
408
+ = 4.0.8 =
409
+ - Added ability to identify IP addresses during user registration and option to block selected IPs.
410
+ - Added login form captcha functionality for sub-sites in a multi-site installation. (see the Brute Force menu)
411
+ - Fixed multi-site bug related to manual user-chosen DB prefix change.
412
+ - Added extra XSS protection inside admin menu pages for the "tab" query parameter.
413
+ - Added a note to the features that has the potential to lock you out if it doesn't work correctly on your site.
414
+ - Updated Brazil-Portuguese language file.
415
+ - Fixed issue with firewall custom rules being corrupted by magic quotes. Thanks to @chesio for fixing this.
416
+
417
+ = 4.0.7 =
418
+ - Added a new action hook "aiopws_before_set_404" which triggers just before the AIOWPS sets a 404. (handy for cases when rename login page is used which affects some themes when accessing "wp-admin" directly)
419
+ - Fixed some potential SQL injection vulnerabilities.
420
+ - Thanks to @chesio for submitting the following changes and applying the fixes.
421
+ - Sub-directory install fixes.
422
+ - Improve behavior of WP File Access tab.
423
+ - Fix invalid nesting of HTML elements.
424
+ - Do not block HTTP requests that contain "tag=" in query string.
425
+ - Option to enable the 6G firewall.
426
+
427
+ = 4.0.6 =
428
+ - Removed the viewing of contents of wp-config.php and .htaccess files in order to protect sensitive info.
429
+ - Fixed more potential XSS vulnerabilities in some other settings pages. (Once again many thanks to Erin Germ for pointing these out)
430
+
431
+ = 4.0.5 =
432
+ - Fixed some potential XSS vulnerability in the blacklist, file system and file change detection settings pages. (Many thanks to Erin Germ for pointing these out)
433
+
434
+ = 4.0.4 =
435
+ - Added new feature: Auto Block Spammer IPs. This feature will automatically and permanently block IP addresses which are linked to comment SPAM. (see SPAM Prevention -> Comment SPAM IP Monitoring tab)
436
+ - Added compatibility fix for the qTranslate-X plugin in the rename login page feature.
437
+ - Added ability to send to more than one email address for file change detection feature notification.
438
+ - Fixed bug in whois library when searching ARIN registry.
439
+ - Fixed the handling of display of longer IPV6 strings in dashboard summary table.
440
+ - Added hook for WooCommerce login form to display unlock button.
441
+ - Added Dutch language translation. Thanks to Jeroen van der Linde for providing the translation files.
442
+ - Typo fix in the "stop users enumeration" feature.
443
+
444
+ = 4.0.3 =
445
+ - Added urlencode to query strings in URLs to prevent unexpected behaviour. Thanks to @chesio for spotting the issue.
446
+ - Added new feature to stop users enumeration. Thanks to Davide Giunchi @davidegiunchidiennea for adding this.
447
+ - Added a more robust code for check_user_exists function. Thanks to Christian Carey.
448
+ - Added cron cleanup of the global meta table.
449
+ - Added a title in each of the admin interface menu.
450
+
451
+ = 4.0.2 =
452
+ - Added ability to enable/disable debug from the settings menu.
453
+ - Fixed bug related to using IP ranges in the whitelist settings.
454
+ - Added IPv6 support for the whitelist feature.
455
+ - Added check in file permissions feature for cases where wp-config.php may be located outside of root.
456
+ - Added wp cron DB cleanup events for various tables which may grow large over time.
457
+ - Changed firewall rule for proxy comment prevention to reflect suggestion made by Thomas O. in forum (https://wordpress.org/support/topic/high-server-cpu-with-proxy-login)
458
+ - Fixed CSS styling issue in admin pages for WordPrss 4.4
459
+
460
+ = 4.0.1 =
461
+ - Renamed the language files to match the new textdomain slug to fix the language translation bug.
462
+ - Fixed bug related to the rename login feature and force logout or logout expiry events.
463
+ - Applied fix for log being generated by events table DB insert.
464
+ - Corrected a function call to static version of display error msg.
465
+
466
+ = 4.0.0 =
467
+ - Updated text domain to match expected value for translate.wordpress.org translation system.
468
+ - Fixed bug related to multi-site user_roles not being updated for child sites.
469
+ - Fixed minor bug in rename login feature.
470
+ - Updated the Italian language file.
471
+
472
+ = 3.9.9 =
473
+ - Fixed an issue with the rename login page feature for WordPress 4.3
474
+ - Added esc_attr() sanitization to some of the relevant parameters
475
+ - Added the necessary changes to allow activation via wp-cli
476
+
477
+ = 3.9.8 =
478
+ - Added guard against possible XSS in the unlock request feature.
479
+
480
+ = 3.9.7 =
481
+ - Added new feature which allows custom .htaccess rules. (See "Custom Rules" tab in Firewall menu). You can now use this to add custom rules to block access to various resources on your site.
482
+ - Added a new feature to block access to the wp-content/debug.log file (WordPress creates this file if you enabled debug loggin option in the config file).
483
+ - Removed the "v" from version number of the plugin.
484
+ - Completed testing with WordPress 4.3.
485
+
486
+ = 3.9.6 =
487
+ - Added Rename Login page feature from the "Brute Force" menu to multisite sub-sites.
488
+ - Removed invalid "length" attribute from input element in captcha code.
489
+ - Fixed reset password feature whereby the URL which is sent out in the email for cases when rename login feature is enabled was not decoded properly.
490
+ - Corrected the check for boolean false if returned from wpdb query result.
491
+ - Added media button for wp editor in maintenance settings page.
492
+
493
+ = 3.9.5 =
494
+ - Fixed minor bug - IP addresses blocked due to '404' were not being listed in the display table.
495
+ - Updated the Russian language translation file.
496
+ - The automatic database table prefix generation value will use a-z characters only.
497
+ - Added esc_url sanitization to the add_query_arg/remove_query_arg function instances to prevent possible XSS.
498
+
499
+ = 3.9.4 =
500
+ - The sort order and orderby parameters now use a whitelisting approach for sanitization.
501
+
502
+ = 3.9.3 =
503
+ - Fixed the sort order not working in the 404 error logging and account activity page.
504
+
505
+ = 3.9.2 =
506
+ - Added a check for registration captcha feature to prevent errors when using another captcha plugin.
507
+ - Improved a few SQL statements.
508
+
509
+ = 3.9.1 =
510
+ - Added new "Force Logout" feature which will instantly force a certain user to be logged out of their session. (See the "Logged In Users" tab in User Login menu)
511
+ - Added more security protection for aiowps log files by creating .htaccess file and rules. AIOWPS log files can now only be viewed via dashboard menu, in new tab called "AIOWPS Logs". (NOTE:This security currently applies only for apache or similar servers)
512
+ - Added backticks to SQL statement for DB prefix change to help prevent errors.
513
+ - Added protection against possible SQL injection attacks.
514
+
515
+ = 3.9.0 =
516
+ - Added some robustness to the file-scan code.
517
+ - Added extra security to all relevant list table instances to prevent unlikely malicious deletion commands.
518
+ - Fixed the user agent part of the blacklist settings code to allow user-agents to be cleared upon saving.
519
+
520
+ = 3.8.9 =
521
+ - Fixed bug in the new feature which allows permanent blocking of IP addresses that create 404 events.
522
+ - Fixed minor bug for all instances where wpdb "prepare" was being used with order/orderby parameters.
523
+ - Fixed a possible open redirect vulnerability. Thanks to Sucuri for pointing it out.
524
+
525
+ = 3.8.8 =
526
+ - Added extra robustness and security for wp list table db commands by using wpdb "prepare" command.
527
+ - Fixed minor bug with undeclared variable in rename login feature page.
528
+
529
+ = 3.8.7 =
530
+ - Added an improvement for login lockdown feature - locked IP addresses will no longer be allowed to register.
531
+ - Added a "view" link for each account in the pending registration approval table list.
532
+ - Fixed 404 logging/lockout bug.
533
+ - Added ability to permanently block IP addresses from the 404 event list for both bulk and single cases.
534
+ - Added ability to do bulk temp blocking for IP addresses in 404 list.
535
+ - Fixed a minor bug with validate_ip_list function.
536
+
537
+ = 3.8.6 =
538
+ - DB cleanup cron event bug fixed.
539
+ - Added Swedish language translation. The translation was submitted by Tor-Björn Fjellner.
540
+ - Updated the Russian language translation file. Update submitted by Tor-Björn Fjellner.
541
+ - The events table will automatically be cleaned up so it only keeps the last 5000 entries. You can override it using a filter (if you wanted to).
542
+
543
+ = 3.8.5 =
544
+ - Added functionality to prevent the aiowps_events table from getting too large.
545
+ - Added file change scan summary inside the alert email.
546
+ - Fixed the unlock feature so that it works correctly when the Rename Login Page feature is active.
547
+ - Added a check in the list logged in users file to prevent error when get_transient returns false.
548
+
549
+ = 3.8.4 =
550
+ - Updated POT language file.
551
+ - Tweaked the function which retrieves the IP address to handle cases where traffic is coming from cloudflare
552
+ - The MySQL database will not be forced anymore at the time of creating the table. It also reads the characters set value from the system first.
553
+ - Applied fixes to prevent remotely exploitable vulnerabilities.
554
+
555
+ = 3.8.3 =
556
+ - Modified "Pingback Protection" .htaccess rules to prevent xmlrpc login attacks and to be compatible with more servers.
557
+ - Made improvements to ensure that the rename login and white list features can be used together.
558
+ - Added a check to force user to enter alphanumeric string for renamed login slug.
559
+ - Improved the turn_off_all_firewall_rules() and turn_off_all_security_features() functions so that they also handle the updating of the htaccess file.
560
+ - Added an alternative way to import settings via a text box (Thanks to Dave McHale). This is for people who might have issues using the config settings file uploader.
561
+ - Added fix to properly update options tables when changing DB prefix in multisite system.
562
+ - Greatly improved the Renamed Login Page feature by removing various potential vulnerabilities.
563
+ - Added an if statement check to fix bug with rename login page feature - special case where user had non permalink structure was not working correctly in some rare scenarios.
564
+ - Updated the Italian language file.
565
+ - Fixed bug regarding wp_mail malformed header when "From" string was empty due to "site title" not being set.
566
+ - Fixed bug in IP list validation function for blacklist feature.
567
+ - Removed strict filtering of IP addresses so as to allow internal IP address ranges.
568
+ - Added stripping of orderby and order query parameters in the plugin.
569
+ - Added search capability by IP address, URL or referer for the 404 events list table.
570
+
571
+ = 3.8.2 =
572
+ - Fixed a CSS issue with the honeypot feature.
573
+ - Fixed a call to the login action handler static function.
574
+
575
+ = 3.8.1 =
576
+ - Minor bug fix for the honeypot feature - loading of css style sheet was not occurring when main login page rendered.
577
+
578
+ = 3.8.0 =
579
+ - Improved deactivation and re-activation tasks - AIOWPS will now gracefully clean up the .htaccess rules when the plugin is deactivated.
580
+ - Tweaked code so that all login pages including custom ones will correctly load the CSS style sheet file needed for honeypot feature.
581
+ - Updated the Portugese language translation.
582
+ - Fixed the copy protection feature so it doesn't interfere with iframes and shortcodes.
583
+ - The plugin will now work fine even if your wp-config.php file is outside the wordpress root folder.
584
+
585
+ = 3.7.9.2 =
586
+ - copy protection feature JS code improvement
587
+
588
+ = 3.7.9.1 =
589
+ - Added captcha functionality for custom login form which is produced by the WP function: wp_login_form()
590
+ - Fixed a minor bug with the copy protection feature's JavaScript code.
591
+ - Tweaked file change scan algorithm to help prevent getMTime fatal runtime errors.
592
+ - Added a link to the github repository in the readme.txt file for developers.
593
+
594
+ = 3.7.9 =
595
+ - Fixed a small bug related to the cookie test in the Cookie Based Brute Force feature.
596
+
597
+ = 3.7.8 =
598
+ - Added new feature called Login Honeypot which will help reduce brute force login attempts by robots. (This can be found in the Brute Force menu)
599
+ - Added new feature to prevent other sites from displaying your content via a frame or iframe. (This can be found in the Miscellaneous menu)
600
+ - Added captcha feature for BuddyPress registration form.
601
+ - Added a new filter for the site lockout message so it can be customized.
602
+ - Added a new filter for template include of the site lockout feature.
603
+ - Temporarily deactivated the "DB Scan" feature.
604
+
605
+ = 3.7.7 =
606
+ - Improved DB prefix change code to make it more robust.
607
+ - Fixed a minor bug for the Rename Login page feature.
608
+ - Added check when processing rename login page to see if maintenance (lockout) mode enabled. Plugin will now display lockout message instead of 404 page if site lockout enabled.
609
+ - Made the Cookie Based Brute Force Prevention feature more secure by introducing a 10 digit random suffix to the test cookie name.
610
+
611
+ = 3.7.6 =
612
+ - Added ability to insert captcha in WordPress Multi Site registration form.
613
+ - Added a condition around the management permission constant. This will allow users to define a custom capability for this plugin's admin side via the wp-config file. This was submitted by Samuel Aguilera.
614
+ - Fixed a bug with the hidden login page feature.
615
+ - Fixed a small settings bug with the "block fake google bot" feature.
616
+
617
+ = 3.7.5 =
618
+ - Added a new DB scan feature. Go to the "Scanner" menu to use this new feature.
619
+ - Added new settings import/export feature.
620
+ - Modified user accounts feature to alert administrator if one or both "admin" or "Admin" usernames are being used.
621
+ - Added Persian language translation. The translation was submitted by Amir Mousavi Pour (me@ameer.ir).
622
+ - Small change to get_mysql_tables function to prevent fatal error when mysqli query is unsuccessful.
623
+ - Added Italian language translation. The translation was submitted by Marco Guglielmetti.
624
+
625
+ = 3.7.4 =
626
+ - Added a new feature to add copy protection for your front-end. You can find this feature under the "Miscellaneous" menu.
627
+ - Fixed comment captcha bug for multi-site. Now this feature can be activated/deactivated for subsites of a multisite installation.
628
+ - Added Hungarian language translation. The translation was submitted by Daniel Kocsis.
629
+ - Moved the custom login page feature's handling code to wp-loaded hook so other plugins that modify the login page can do their task before our one is triggered. This change was suggested by Mark Hudnall.
630
+ - Added German language translation. The translation was submitted by Manuel Fritsch.
631
+ - Updated the Brazilian language translation file.
632
+
633
+
634
+ = 3.7.3 =
635
+ - Added Brazilian language translation. The translation was submitted by Sergio Siqueira.
636
+ - Added two new action hooks for plugin activation and deactivation time.
637
+ - Improved the get_user_ip_address() function so it handles cases when multiple addresses are returned due to proxy.
638
+ - Fixed the mis-alignment of login page which was broken by WP3.9 when rename login feature is used.
639
+ - WordPress 3.9 compatibility
640
+
641
+ = 3.7.2 =
642
+ - Added a PHP Info section in the system info interface to show some important PHP details of the server.
643
+ - Added a filter to allow the user to have a custom translation in a place (which will be loaded instead of the default one from the plugin). This change was submitted by Samuel Aguilera.
644
+ - Replaced myslqi fetch_all method with fetch_assoc to cover cases where some servers do not have the correct mysql drivers.
645
+ - Added a new filter to allow manipulation of the htaccess rules from your custom code. The name of the filter is 'aiowps_htaccess_rules_before_writing'.
646
+ - Added a "Delete All 404 Event Logs" button to purge all 404 logs from DB
647
+ - Added code to automatically send an email to the registrant when an account has been manually "Approved" from the User Registration menu.
648
+
649
+ = 3.7.1 =
650
+ - Fixed a minor bug: dashboard link was pointing to the wrong tab for the "Logged In Users" tab.
651
+ - Fix a bug with the login page captcha. The captcha wansn't shown if the rename login page feature was enabled at the same time.
652
+
653
+ = 3.7 =
654
+ - Added new feature - 404 detection. This allows you to log 404 events and block selected IPs. This feature can be found in the Firewall menu.
655
+ - Added new dashboard info box to display number of blocked IP addresses in the lockout table.
656
+ - Fixed bug where user could not access login page when maintenance mode and rename login page features were both active.
657
+ - Tweaked the hotlinking .htaccess directives to cover both http and https.
658
+ - Fixed code to prevent mysql errors due to some variables not having default value in failed login and lockdown tables
659
+ - Replaced deprecated PHP function mysql_query with mysqli.
660
+ - Added language file for Spanish language. The Spanish translation was done by Samuel Montoya.
661
+ - Added code to hide the "DB Prefix" menu for the non-main sites in multi-site installation
662
+
663
+ = 3.6 =
664
+ - Added a new feature to prevent image hot-linking. (See the "Prevent Hotlinks" tab in the firewall menu)
665
+ - Added a check in the Rename Login Page feature to prevent people from setting the slug to "wp-admin"
666
+ - Fixed a small bug with Login Lockdown feature.
667
+
668
+ = 3.5.1 =
669
+ - Fixed a bug where the cookie-based brute force directives were not being deleted from the .htaccess file when the Rename Login Page feature was being activated.
670
+
671
+ = 3.5 =
672
+ - Added new feature which will Block Fake Googlebots from crawling your site. Check the Firewall menu for this new feature.
673
+ - Added code to prevent users from having both the Rename Login Page and Cookie-Based Brute Force features active at the same time.
674
+ - Added some useful info boxes in the dashboard: 1) to inform the user if the cookie based brute force or rename login page features are active, 2) last 5 logins to your site.
675
+ - Fixed minor bug with .htaccess backup feature.
676
+ - Updated the from email address value used for sending backups and file change notification. Thanks to @TheAssurer for the tip.
677
+ - Updated the warning message for the disable index view feature.
678
+
679
+
680
+ = 3.4 =
681
+ - Consolidated "Brute Force" features by moving all such features to the "Brute Force" menu.
682
+ - Improved the file change detection scan feature: Introduced a button allowing admin to view the file change results from the last scan and fixed small bug whereby the change detected flag was not being cleared for applicable cases.
683
+ - Fixed a small bug with "rename login page" (hide admin login) feature.
684
+ - Made wp-config.php and .htaccess file backups more secure. Thanks to @TheAssurer for the tip.
685
+ - Made the login code more robust by catering for cases where the "wp_login" action was not passing 2 parameters.
686
+
687
+ = 3.3 =
688
+ - Added a brand new brute force prevention feature - Rename Login Page. This feature can be found in the new menu item called "Brute Force".
689
+ - Modified the new unlock request feature so that the locked out user will only have to enter email address when they submit an unlock request.
690
+ - Replaced the deprecated PHP function "mysql_list_tables" with alternative code.
691
+ - Added warning message regarding WordPress iOS app when pingback protection feature in the firewall settings is active.
692
+ - Added Malware scan tab and information.
693
+ - Some minor html form and CSS corrections.
694
+
695
+ = 3.2 =
696
+ - Added new feature which allows users to generate an automated unlock request link via email when they get locked out because of the login lockdown feature.
697
+ - Added a check to ensure that user cannot enter 0 minutes in the Force Logout feature.
698
+ - Fixed translations so that various previously omitted strings can now be translated.
699
+ - Added a new filter before locking down a user's IP address - aiowps_before_lockdown.
700
+ - Generated a new translation (POT) file.
701
+
702
+ = 3.1 =
703
+ - Added a new feature that will allow you to add a captcha to the lost password form (useful if you are allowing user registration on your site).
704
+ - Added ability to specify a system log file in the "Host System Logs" tab of the "File System Security" menu
705
+ - Fixed a tab link bug. One link was going to the wrong menu tab.
706
+ - Updated the POT file of the plugin.
707
+
708
+ = 3.0 =
709
+ - Added a new feature which allows you to add captcha to the Wordpress user registration page.
710
+ - Added some more helpful comments and link to video tutorial in the brute force and white list features settings pages.
711
+
712
+ = 2.9 =
713
+ - Added new feature which automatically sets the status of newly registered wordpress user accounts to "pending" and allows manual approval by an administrator.
714
+ - Improved robustness of file change detection iteration code.
715
+ - WordPress 3.7 compatibility
716
+
717
+ = 2.8.1 =
718
+ - Improved the login captcha implementation
719
+ - Changed the management permission to manage_options
720
+
721
+ = 2.8 =
722
+ - Added a feature to insert a simple math captcha to the WordPress comment form (to reduce comment spam). Check the spam prevention menu for this new feature.
723
+ - Fixed a minor bug with bulk unlock/delete in user login menu
724
+ - Fixed a minor bug with math captcha logic.
725
+
726
+ = 2.7 =
727
+ - Added a simple math captcha functionality for the WP login page. This is another easy yet effective way to combat Brute Force Login Attacks. You can enable this new feature from the user login security menu.
728
+
729
+ = 2.6 =
730
+ - Added a new Login Whitelist feature. This feature enables you to specify one or more IP addresses in a special whitelist which will have access to your WP login page.
731
+ All other IP addresses trying to access your WP login page which are not in the whitelist will be automatically blocked.
732
+ - The IP address will also be included in the email that gets sent to the admin for the ip address lockout notification.
733
+ - Language file loading fix for Chinese language.
734
+ - Tweaked the code which creates a .htaccess file in the backup directory to ensure it gets run even if the directory already existed.
735
+ - Made DB backups more secure.
736
+ - Added more useful debug logs for .htaccess file manipulation failure scenarios.
737
+
738
+ = 2.5 =
739
+ - Added a new feature which will list the currently logged in users who have been active within the last 15 minutes.
740
+ - Added a new feature in settings menu which will disable all firewall rules and clear all applicable directives in the .htaccess file.
741
+ - Improved the way the wp-config.php file is handled when it contains an ending PHP tag "?>" (older sites that were using PHP4 earlier).
742
+
743
+ = 2.4 =
744
+ - Added new feature/checkbox which will instantly lockout IP address ranges which attempt to login with an invalid username.
745
+ - Fixed a bug in the Comment SPAM IP Monitoring page where trying to block one or more IPs was failing.
746
+ - Removed the word "config" from the list of bad query strings check (to add compatibility with a few more plugins)
747
+ - Added a notice in the dashboard menu to show you if there are any recent file changes that the plugin detected.
748
+ - Fixed bug with php File Editing feature. Code now also handles older style wp-config.php files which have the php end tag "?>"
749
+ - Fixed bug with "Disable All Security Features" button functionality. When clicked, this will now also make the appropriate changes to the .htacces and wp-config.php files if necessary.
750
+ - Changed the storage of backup files from the plugin's directory to the uploads directory. Also added a .htaccess file for security.
751
+ - Fixed the way user-agent strings were written to the .htacess file from the Blacklist feature. The code now will correctly identify and represent spaces and escaped chars.
752
+ - Fixed a bug related to sending backup to correct email address.
753
+
754
+ = 2.3 =
755
+ - Added new menu called Scanner with a new feature called File Change Detection. This feature will alert you if any files have changed, added or removed from your system.
756
+ - Fixed "Deny Bad Query Strings" rules to not break the ability to drag components in the WordPress "Appearance->Menus" page
757
+ - Fixed an activation time warning (on sites with WP_DEBUG option enabled)
758
+ - Re-implemented the wp-config.php file content backup feature. It now directly downloads the contents of the file to your computer.
759
+ - Multi-site enhancements: Suppressed access to configuration settings for features which are not allowed to be configured from subsites of multi-site installations.
760
+ - Fixed a bug with login lockdown feature.
761
+
762
+ = 2.2 =
763
+ - Added a new feature which will block some spambots from submitting comments.
764
+ - Moved Comment SPAM IP monitoring interface to the new "SPAM Prevention" menu.
765
+ - Fixed a bug with login lockdown feature for both multi and single site.
766
+ - Improved firewall feature for multi-site by making the "Firewall" menu available only for the main site and not the sub-sites.
767
+ - Added random prefix to backup file names.
768
+ - Fixed a bug for WP multi-site install where DB tables do not get created when new blog are created in the network.
769
+
770
+ = 2.1.1 =
771
+ - Fixed a version tagging issue.
772
+
773
+ = 2.1 =
774
+ - Fixed an issue with install time error on some sites for WordPress 3.6
775
+ - Fixed some WP Debug related errors for WordPress 3.6
776
+ - Replaced the deprecated $wpdb->escape() function calls with esc_sql() calls
777
+
778
+ = 2.0 =
779
+ - Fixed a bug for general DB backup functionality.
780
+ - Fixed multi-site DB backup - the plugin will now backup only the tables relevant for the sub-site in question.
781
+ - Added blank index.html files in various folders inside the plugin.
782
+ - Disabled the wp-config.php file backup feature until we find a more secure method of doing the backup.
783
+
784
+ = 1.9 =
785
+ - Added new WordPress PingBack Vulnerability Protection feature. This allows the user to prohibit access to the xmlrpc.php file in order to protect against certain vulnerabilities in the pingback functionality.
786
+ - Added a configuration item in the brute force login prevention feature to allow ajax functionality to work properly when this feature is enabled.
787
+ - Added a POT file for language translations.
788
+ - Made the DB Prefix feature more robust by adding a check to ensure that plugin can write to the wp-config.php file. This will prevent user from losing access to their site in cases where the system changed the prefix but not the entry in the wp-config.php file.
789
+ - Tightened the data validation for the cookie based brute force login feature to ensure that the user must enter a secret word which consists of alphanumeric characters.
790
+ - Added edit links to the user account list in the "User Acounts" menu.
791
+
792
+ = 1.8 =
793
+ - Moved the front end site lockout feature to a new menu called "Maintenance".
794
+ - Added a feature in the front-end lockout feature to allow people to specify their own message which will be displayed on the front-end to visitors who try to access the site when it is in lock out state.
795
+ - Fixed a bug in the front-end lockout feature by adding some checks which ensure that the admin will not get locked if the feature is still active and their login session expires or they log out.
796
+ - Added a widget in the dashboard menu to show the status of the "maintenance mode" feature.
797
+
798
+ = 1.7 =
799
+ - Added a new feature which is a password strength tool which calculates how easy it is for your chosen password to be cracked using a desktop PC and the appropriate SW. This tool should help you create strong passwords.
800
+ - Added a front-end general visitor lockout feature. This feature allows you to temporarily lock down the front end of your site while you do security investigation, site upgrades, tweaks etc.
801
+
802
+ = 1.6 =
803
+ - Added a new option in the cookie-based Brute Force Login Attack prevention feature to allow users to use this feature together with the WordPress's post/page password protection feature.
804
+ - Fixed a bug in the 5G firewall rules to so that the printed rules include the correct number of '\' characters.
805
+ - Fixed a minor bug in the "restore from backed up htaccess file" feature.
806
+ - Enhanced the "Save current wp-config.php file" feature so it will continue to work with all of the firewall rules active on the site.
807
+ - Added extra checks to account for some error scenarios caused on some servers when recursive file search is done.
808
+
809
+ = 1.5 =
810
+ - Added new feature - Cookie-based Brute Force Login Attack Prevention. Check under the "Firewall" menu for this new feature.
811
+ This feature will stop hackers in their tracks when they try to access your wp-admin or login pages. This feature will secure your WordPress backend by enforcing the requirement that anybody trying to access these pages will require a special cookie.
812
+
813
+ - Fixed bug related to setting of default configuration for first-time plugin activation.
814
+
815
+ = 1.4 =
816
+ - Tweaked the "Deny Bad Query Strings" firewall rules so that plugin deletion and update operations from the WordPress plugins menu are not affected.
817
+ - Fixed a minor bug related to scheduled database backups.
818
+ - Added some extra default settings to be applied to the plugin's configuration pages upon activation for the first time.
819
+ - Plugin will now display a recommendation message if user sets scheduled backup frequency to less than 24 hours.
820
+
821
+ = 1.3 =
822
+ - Added a new feature to remove the WordPress Generator Meta information from the HTML source of your site.
823
+ - Tweaked the "Advanced Character String Filter" to fix issue which was affecting plugins such as "Admin Management Xtended" and also pages with keywords such as "password" in the URL.
824
+ - Updated one rule in the "Advanced Character String Filter" feature to make it compatible with W3 Total Cache Plugin's minify feature.
825
+ - Added a "Delete All Failed Login Records" option in the "Failed Login Records" tab. This will delete all entries in the failed logins table and will make it less tedious for users who get a lot of brute force attacks on their site.
826
+
827
+ = 1.2 =
828
+ - Moved the rules which disable index views from the "basic firewall" rules to the "additional rules" section. This will prevent any site breakage for
829
+ those who want to enable the basic firewall but do not have "AllowOverride" option enabled in their httpd.conf
830
+
831
+ = 1.1 =
832
+ - Added the following new feature:
833
+ - Prevent people from accessing the readme.html, license.txt and wp-config-sample.php files.
834
+
835
+ = 1.0 =
836
+ - First commit to the WP repository.
tags/1.0/admin/general/wp-security-list-table.php DELETED
@@ -1,907 +0,0 @@
1
- <?php
2
- /**
3
- * Base class for displaying a list of items in an ajaxified HTML table.
4
- */
5
- class AIOWPSecurity_List_Table
6
- {
7
- /**
8
- * The current list of items
9
- *
10
- * @since 3.1.0
11
- * @var array
12
- * @access protected
13
- */
14
- var $items;
15
-
16
- /**
17
- * Various information about the current table
18
- *
19
- * @since 3.1.0
20
- * @var array
21
- * @access private
22
- */
23
- var $_args;
24
-
25
- /**
26
- * Various information needed for displaying the pagination
27
- *
28
- * @since 3.1.0
29
- * @var array
30
- * @access private
31
- */
32
- var $_pagination_args = array();
33
-
34
- /**
35
- * The current screen
36
- *
37
- * @since 3.1.0
38
- * @var object
39
- * @access protected
40
- */
41
- var $screen;
42
-
43
- /**
44
- * Cached bulk actions
45
- *
46
- * @since 3.1.0
47
- * @var array
48
- * @access private
49
- */
50
- var $_actions;
51
-
52
- /**
53
- * Cached pagination output
54
- *
55
- * @since 3.1.0
56
- * @var string
57
- * @access private
58
- */
59
- var $_pagination;
60
-
61
- /**
62
- * Constructor. The child class should call this constructor from it's own constructor
63
- *
64
- * @param array $args An associative array with information about the current table
65
- * @access protected
66
- */
67
- function __construct( $args = array() ) {
68
- $args = wp_parse_args( $args, array(
69
- 'plural' => '',
70
- 'singular' => '',
71
- 'ajax' => false,
72
- 'screen' => null,
73
- ) );
74
-
75
- $this->screen = convert_to_screen( $args['screen'] );
76
-
77
- add_filter( "manage_{$this->screen->id}_columns", array( &$this, 'get_columns' ), 0 );
78
-
79
- if ( !$args['plural'] )
80
- $args['plural'] = $this->screen->base;
81
-
82
- $args['plural'] = sanitize_key( $args['plural'] );
83
- $args['singular'] = sanitize_key( $args['singular'] );
84
-
85
- $this->_args = $args;
86
-
87
- if ( $args['ajax'] ) {
88
- // wp_enqueue_script( 'list-table' );
89
- add_action( 'admin_footer', array( &$this, '_js_vars' ) );
90
- }
91
- }
92
-
93
- /**
94
- * Checks the current user's permissions
95
- * @uses wp_die()
96
- *
97
- * @since 3.1.0
98
- * @access public
99
- * @abstract
100
- */
101
- function ajax_user_can() {
102
- die( 'function AIOWPSecurity_List_Table::ajax_user_can() must be over-ridden in a sub-class.' );
103
- }
104
-
105
- /**
106
- * Prepares the list of items for displaying.
107
- * @uses AIOWPSecurity_List_Table::set_pagination_args()
108
- *
109
- * @since 3.1.0
110
- * @access public
111
- * @abstract
112
- */
113
- function prepare_items() {
114
- die( 'function AIOWPSecurity_List_Table::prepare_items() must be over-ridden in a sub-class.' );
115
- }
116
-
117
- /**
118
- * An internal method that sets all the necessary pagination arguments
119
- *
120
- * @param array $args An associative array with information about the pagination
121
- * @access protected
122
- */
123
- function set_pagination_args( $args ) {
124
- $args = wp_parse_args( $args, array(
125
- 'total_items' => 0,
126
- 'total_pages' => 0,
127
- 'per_page' => 0,
128
- ) );
129
-
130
- if ( !$args['total_pages'] && $args['per_page'] > 0 )
131
- $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] );
132
-
133
- // redirect if page number is invalid and headers are not already sent
134
- if ( ! headers_sent() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) {
135
- wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) );
136
- exit;
137
- }
138
-
139
- $this->_pagination_args = $args;
140
- }
141
-
142
- /**
143
- * Access the pagination args
144
- *
145
- * @since 3.1.0
146
- * @access public
147
- *
148
- * @param string $key
149
- * @return array
150
- */
151
- function get_pagination_arg( $key ) {
152
- if ( 'page' == $key )
153
- return $this->get_pagenum();
154
-
155
- if ( isset( $this->_pagination_args[$key] ) )
156
- return $this->_pagination_args[$key];
157
- }
158
-
159
- /**
160
- * Whether the table has items to display or not
161
- *
162
- * @since 3.1.0
163
- * @access public
164
- *
165
- * @return bool
166
- */
167
- function has_items() {
168
- return !empty( $this->items );
169
- }
170
-
171
- /**
172
- * Message to be displayed when there are no items
173
- *
174
- * @since 3.1.0
175
- * @access public
176
- */
177
- function no_items() {
178
- _e( 'No items found.' );
179
- }
180
-
181
- /**
182
- * Display the search box.
183
- *
184
- * @since 3.1.0
185
- * @access public
186
- *
187
- * @param string $text The search button text
188
- * @param string $input_id The search input id
189
- */
190
- function search_box( $text, $input_id ) {
191
- if ( empty( $_REQUEST['s'] ) && !$this->has_items() )
192
- return;
193
-
194
- $input_id = $input_id . '-search-input';
195
-
196
- if ( ! empty( $_REQUEST['orderby'] ) )
197
- echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
198
- if ( ! empty( $_REQUEST['order'] ) )
199
- echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
200
- if ( ! empty( $_REQUEST['post_mime_type'] ) )
201
- echo '<input type="hidden" name="post_mime_type" value="' . esc_attr( $_REQUEST['post_mime_type'] ) . '" />';
202
- if ( ! empty( $_REQUEST['detached'] ) )
203
- echo '<input type="hidden" name="detached" value="' . esc_attr( $_REQUEST['detached'] ) . '" />';
204
- ?>
205
- <p class="search-box">
206
- <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
207
- <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>" />
208
- <?php submit_button( $text, 'button', false, false, array('id' => 'search-submit') ); ?>
209
- </p>
210
- <?php
211
- }
212
-
213
- /**
214
- * Get an associative array ( id => link ) with the list
215
- * of views available on this table.
216
- *
217
- * @since 3.1.0
218
- * @access protected
219
- *
220
- * @return array
221
- */
222
- function get_views() {
223
- return array();
224
- }
225
-
226
- /**
227
- * Display the list of views available on this table.
228
- *
229
- * @since 3.1.0
230
- * @access public
231
- */
232
- function views() {
233
- $views = $this->get_views();
234
- $views = apply_filters( 'views_' . $this->screen->id, $views );
235
-
236
- if ( empty( $views ) )
237
- return;
238
-
239
- echo "<ul class='subsubsub'>\n";
240
- foreach ( $views as $class => $view ) {
241
- $views[ $class ] = "\t<li class='$class'>$view";
242
- }
243
- echo implode( " |</li>\n", $views ) . "</li>\n";
244
- echo "</ul>";
245
- }
246
-
247
- /**
248
- * Get an associative array ( option_name => option_title ) with the list
249
- * of bulk actions available on this table.
250
- *
251
- * @since 3.1.0
252
- * @access protected
253
- *
254
- * @return array
255
- */
256
- function get_bulk_actions() {
257
- return array();
258
- }
259
-
260
- /**
261
- * Display the bulk actions dropdown.
262
- *
263
- * @since 3.1.0
264
- * @access public
265
- */
266
- function bulk_actions() {
267
- if ( is_null( $this->_actions ) ) {
268
- $no_new_actions = $this->_actions = $this->get_bulk_actions();
269
- // This filter can currently only be used to remove actions.
270
- $this->_actions = apply_filters( 'bulk_actions-' . $this->screen->id, $this->_actions );
271
- $this->_actions = array_intersect_assoc( $this->_actions, $no_new_actions );
272
- $two = '';
273
- } else {
274
- $two = '2';
275
- }
276
-
277
- if ( empty( $this->_actions ) )
278
- return;
279
-
280
- echo "<select name='action$two'>\n";
281
- echo "<option value='-1' selected='selected'>" . __( 'Bulk Actions' ) . "</option>\n";
282
-
283
- foreach ( $this->_actions as $name => $title ) {
284
- $class = 'edit' == $name ? ' class="hide-if-no-js"' : '';
285
-
286
- echo "\t<option value='$name'$class>$title</option>\n";
287
- }
288
-
289
- echo "</select>\n";
290
-
291
- submit_button( __( 'Apply' ), 'action', false, false, array( 'id' => "doaction$two" ) );
292
- echo "\n";
293
- }
294
-
295
- /**
296
- * Get the current action selected from the bulk actions dropdown.
297
- *
298
- * @since 3.1.0
299
- * @access public
300
- *
301
- * @return string|bool The action name or False if no action was selected
302
- */
303
- function current_action() {
304
- if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] )
305
- return $_REQUEST['action'];
306
-
307
- if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] )
308
- return $_REQUEST['action2'];
309
-
310
- return false;
311
- }
312
-
313
- /**
314
- * Generate row actions div
315
- *
316
- * @since 3.1.0
317
- * @access protected
318
- *
319
- * @param array $actions The list of actions
320
- * @param bool $always_visible Whether the actions should be always visible
321
- * @return string
322
- */
323
- function row_actions( $actions, $always_visible = false ) {
324
- $action_count = count( $actions );
325
- $i = 0;
326
-
327
- if ( !$action_count )
328
- return '';
329
-
330
- $out = '<div class="' . ( $always_visible ? 'row-actions-visible' : 'row-actions' ) . '">';
331
- foreach ( $actions as $action => $link ) {
332
- ++$i;
333
- ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
334
- $out .= "<span class='$action'>$link$sep</span>";
335
- }
336
- $out .= '</div>';
337
-
338
- return $out;
339
- }
340
-
341
- /**
342
- * Display a monthly dropdown for filtering items
343
- *
344
- * @since 3.1.0
345
- * @access protected
346
- */
347
- function months_dropdown( $post_type ) {
348
- global $wpdb, $wp_locale;
349
-
350
- $months = $wpdb->get_results( $wpdb->prepare( "
351
- SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
352
- FROM $wpdb->posts
353
- WHERE post_type = %s
354
- ORDER BY post_date DESC
355
- ", $post_type ) );
356
-
357
- $month_count = count( $months );
358
-
359
- if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )
360
- return;
361
-
362
- $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
363
- ?>
364
- <select name='m'>
365
- <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates' ); ?></option>
366
- <?php
367
- foreach ( $months as $arc_row ) {
368
- if ( 0 == $arc_row->year )
369
- continue;
370
-
371
- $month = zeroise( $arc_row->month, 2 );
372
- $year = $arc_row->year;
373
-
374
- printf( "<option %s value='%s'>%s</option>\n",
375
- selected( $m, $year . $month, false ),
376
- esc_attr( $arc_row->year . $month ),
377
- /* translators: 1: month name, 2: 4-digit year */
378
- sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
379
- );
380
- }
381
- ?>
382
- </select>
383
- <?php
384
- }
385
-
386
- /**
387
- * Display a view switcher
388
- *
389
- * @since 3.1.0
390
- * @access protected
391
- */
392
- function view_switcher( $current_mode ) {
393
- $modes = array(
394
- 'list' => __( 'List View' ),
395
- 'excerpt' => __( 'Excerpt View' )
396
- );
397
-
398
- ?>
399
- <input type="hidden" name="mode" value="<?php echo esc_attr( $current_mode ); ?>" />
400
- <div class="view-switch">
401
- <?php
402
- foreach ( $modes as $mode => $title ) {
403
- $class = ( $current_mode == $mode ) ? 'class="current"' : '';
404
- echo "<a href='" . esc_url( add_query_arg( 'mode', $mode, $_SERVER['REQUEST_URI'] ) ) . "' $class><img id='view-switch-$mode' src='" . esc_url( includes_url( 'images/blank.gif' ) ) . "' width='20' height='20' title='$title' alt='$title' /></a>\n";
405
- }
406
- ?>
407
- </div>
408
- <?php
409
- }
410
-
411
- /**
412
- * Display a comment count bubble
413
- *
414
- * @since 3.1.0
415
- * @access protected
416
- *
417
- * @param int $post_id
418
- * @param int $pending_comments
419
- */
420
- function comments_bubble( $post_id, $pending_comments ) {
421
- $pending_phrase = sprintf( __( '%s pending' ), number_format( $pending_comments ) );
422
-
423
- if ( $pending_comments )
424
- echo '<strong>';
425
-
426
- echo "<a href='" . esc_url( add_query_arg( 'p', $post_id, admin_url( 'edit-comments.php' ) ) ) . "' title='" . esc_attr( $pending_phrase ) . "' class='post-com-count'><span class='comment-count'>" . number_format_i18n( get_comments_number() ) . "</span></a>";
427
-
428
- if ( $pending_comments )
429
- echo '</strong>';
430
- }
431
-
432
- /**
433
- * Get the current page number
434
- *
435
- * @since 3.1.0
436
- * @access protected
437
- *
438
- * @return int
439
- */
440
- function get_pagenum() {
441
- $pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0;
442
-
443
- if( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] )
444
- $pagenum = $this->_pagination_args['total_pages'];
445
-
446
- return max( 1, $pagenum );
447
- }
448
-
449
- /**
450
- * Get number of items to display on a single page
451
- *
452
- * @since 3.1.0
453
- * @access protected
454
- *
455
- * @return int
456
- */
457
- function get_items_per_page( $option, $default = 20 ) {
458
- $per_page = (int) get_user_option( $option );
459
- if ( empty( $per_page ) || $per_page < 1 )
460
- $per_page = $default;
461
-
462
- return (int) apply_filters( $option, $per_page );
463
- }
464
-
465
- /**
466
- * Display the pagination.
467
- *
468
- * @since 3.1.0
469
- * @access protected
470
- */
471
- function pagination( $which ) {
472
- if ( empty( $this->_pagination_args ) )
473
- return;
474
-
475
- extract( $this->_pagination_args, EXTR_SKIP );
476
-
477
- $output = '<span class="displaying-num">' . sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . '</span>';
478
-
479
- $current = $this->get_pagenum();
480
-
481
- $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
482
-
483
- $current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url );
484
-
485
- $page_links = array();
486
-
487
- $disable_first = $disable_last = '';
488
- if ( $current == 1 )
489
- $disable_first = ' disabled';
490
- if ( $current == $total_pages )
491
- $disable_last = ' disabled';
492
-
493
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
494
- 'first-page' . $disable_first,
495
- esc_attr__( 'Go to the first page' ),
496
- esc_url( remove_query_arg( 'paged', $current_url ) ),
497
- '&laquo;'
498
- );
499
-
500
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
501
- 'prev-page' . $disable_first,
502
- esc_attr__( 'Go to the previous page' ),
503
- esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
504
- '&lsaquo;'
505
- );
506
-
507
- if ( 'bottom' == $which )
508
- $html_current_page = $current;
509
- else
510
- $html_current_page = sprintf( "<input class='current-page' title='%s' type='text' name='paged' value='%s' size='%d' />",
511
- esc_attr__( 'Current page' ),
512
- $current,
513
- strlen( $total_pages )
514
- );
515
-
516
- $html_total_pages = sprintf( "<span class='total-pages'>%s</span>", number_format_i18n( $total_pages ) );
517
- $page_links[] = '<span class="paging-input">' . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . '</span>';
518
-
519
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
520
- 'next-page' . $disable_last,
521
- esc_attr__( 'Go to the next page' ),
522
- esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
523
- '&rsaquo;'
524
- );
525
-
526
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
527
- 'last-page' . $disable_last,
528
- esc_attr__( 'Go to the last page' ),
529
- esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
530
- '&raquo;'
531
- );
532
-
533
- $pagination_links_class = 'pagination-links';
534
- if ( ! empty( $infinite_scroll ) )
535
- $pagination_links_class = ' hide-if-js';
536
- $output .= "\n<span class='$pagination_links_class'>" . join( "\n", $page_links ) . '</span>';
537
-
538
- if ( $total_pages )
539
- $page_class = $total_pages < 2 ? ' one-page' : '';
540
- else
541
- $page_class = ' no-pages';
542
-
543
- $this->_pagination = "<div class='tablenav-pages{$page_class}'>$output</div>";
544
-
545
- echo $this->_pagination;
546
- }
547
-
548
- /**
549
- * Get a list of columns. The format is:
550
- * 'internal-name' => 'Title'
551
- *
552
- * @since 3.1.0
553
- * @access protected
554
- * @abstract
555
- *
556
- * @return array
557
- */
558
- function get_columns() {
559
- die( 'function AIOWPSecurity_List_Table::get_columns() must be over-ridden in a sub-class.' );
560
- }
561
-
562
- /**
563
- * Get a list of sortable columns. The format is:
564
- * 'internal-name' => 'orderby'
565
- * or
566
- * 'internal-name' => array( 'orderby', true )
567
- *
568
- * The second format will make the initial sorting order be descending
569
- *
570
- * @since 3.1.0
571
- * @access protected
572
- *
573
- * @return array
574
- */
575
- function get_sortable_columns() {
576
- return array();
577
- }
578
-
579
- /**
580
- * Get a list of all, hidden and sortable columns, with filter applied
581
- *
582
- * @since 3.1.0
583
- * @access protected
584
- *
585
- * @return array
586
- */
587
- function get_column_info() {
588
- if ( isset( $this->_column_headers ) )
589
- return $this->_column_headers;
590
-
591
- $columns = get_column_headers( $this->screen );
592
- $hidden = get_hidden_columns( $this->screen );
593
-
594
- $_sortable = apply_filters( "manage_{$this->screen->id}_sortable_columns", $this->get_sortable_columns() );
595
-
596
- $sortable = array();
597
- foreach ( $_sortable as $id => $data ) {
598
- if ( empty( $data ) )
599
- continue;
600
-
601
- $data = (array) $data;
602
- if ( !isset( $data[1] ) )
603
- $data[1] = false;
604
-
605
- $sortable[$id] = $data;
606
- }
607
-
608
- $this->_column_headers = array( $columns, $hidden, $sortable );
609
-
610
- return $this->_column_headers;
611
- }
612
-
613
- /**
614
- * Return number of visible columns
615
- *
616
- * @since 3.1.0
617
- * @access public
618
- *
619
- * @return int
620
- */
621
- function get_column_count() {
622
- list ( $columns, $hidden ) = $this->get_column_info();
623
- $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) );
624
- return count( $columns ) - count( $hidden );
625
- }
626
-
627
- /**
628
- * Print column headers, accounting for hidden and sortable columns.
629
- *
630
- * @since 3.1.0
631
- * @access protected
632
- *
633
- * @param bool $with_id Whether to set the id attribute or not
634
- */
635
- function print_column_headers( $with_id = true ) {
636
- list( $columns, $hidden, $sortable ) = $this->get_column_info();
637
-
638
- $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
639
- $current_url = remove_query_arg( 'paged', $current_url );
640
-
641
- if ( isset( $_GET['orderby'] ) )
642
- $current_orderby = $_GET['orderby'];
643
- else
644
- $current_orderby = '';
645
-
646
- if ( isset( $_GET['order'] ) && 'desc' == $_GET['order'] )
647
- $current_order = 'desc';
648
- else
649
- $current_order = 'asc';
650
-
651
- if ( ! empty( $columns['cb'] ) ) {
652
- static $cb_counter = 1;
653
- $columns['cb'] = '<label class="screen-reader-text" for="cb-select-all-' . $cb_counter . '">' . __( 'Select All' ) . '</label>'
654
- . '<input id="cb-select-all-' . $cb_counter . '" type="checkbox" />';
655
- $cb_counter++;
656
- }
657
-
658
- foreach ( $columns as $column_key => $column_display_name ) {
659
- $class = array( 'manage-column', "column-$column_key" );
660
-
661
- $style = '';
662
- if ( in_array( $column_key, $hidden ) )
663
- $style = 'display:none;';
664
-
665
- $style = ' style="' . $style . '"';
666
-
667
- if ( 'cb' == $column_key )
668
- $class[] = 'check-column';
669
- elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) )
670
- $class[] = 'num';
671
-
672
- if ( isset( $sortable[$column_key] ) ) {
673
- list( $orderby, $desc_first ) = $sortable[$column_key];
674
-
675
- if ( $current_orderby == $orderby ) {
676
- $order = 'asc' == $current_order ? 'desc' : 'asc';
677
- $class[] = 'sorted';
678
- $class[] = $current_order;
679
- } else {
680
- $order = $desc_first ? 'desc' : 'asc';
681
- $class[] = 'sortable';
682
- $class[] = $desc_first ? 'asc' : 'desc';
683
- }
684
-
685
- $column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
686
- }
687
-
688
- $id = $with_id ? "id='$column_key'" : '';
689
-
690
- if ( !empty( $class ) )
691
- $class = "class='" . join( ' ', $class ) . "'";
692
-
693
- echo "<th scope='col' $id $class $style>$column_display_name</th>";
694
- }
695
- }
696
-
697
- /**
698
- * Display the table
699
- *
700
- * @since 3.1.0
701
- * @access public
702
- */
703
- function display() {
704
- extract( $this->_args );
705
-
706
- $this->display_tablenav( 'top' );
707
-
708
- ?>
709
- <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">
710
- <thead>
711
- <tr>
712
- <?php $this->print_column_headers(); ?>
713
- </tr>
714
- </thead>
715
-
716
- <tfoot>
717
- <tr>
718
- <?php $this->print_column_headers( false ); ?>
719
- </tr>
720
- </tfoot>
721
-
722
- <tbody id="the-list"<?php if ( $singular ) echo " data-wp-lists='list:$singular'"; ?>>
723
- <?php $this->display_rows_or_placeholder(); ?>
724
- </tbody>
725
- </table>
726
- <?php
727
- $this->display_tablenav( 'bottom' );
728
- }
729
-
730
- /**
731
- * Get a list of CSS classes for the <table> tag
732
- *
733
- * @since 3.1.0
734
- * @access protected
735
- *
736
- * @return array
737
- */
738
- function get_table_classes() {
739
- return array( 'widefat', 'fixed', $this->_args['plural'] );
740
- }
741
-
742
- /**
743
- * Generate the table navigation above or below the table
744
- *
745
- * @since 3.1.0
746
- * @access protected
747
- */
748
- function display_tablenav( $which ) {
749
- if ( 'top' == $which )
750
- wp_nonce_field( 'bulk-' . $this->_args['plural'] );
751
- ?>
752
- <div class="tablenav <?php echo esc_attr( $which ); ?>">
753
-
754
- <div class="alignleft actions">
755
- <?php $this->bulk_actions(); ?>
756
- </div>
757
- <?php
758
- $this->extra_tablenav( $which );
759
- $this->pagination( $which );
760
- ?>
761
-
762
- <br class="clear" />
763
- </div>
764
- <?php
765
- }
766
-
767
- /**
768
- * Extra controls to be displayed between bulk actions and pagination
769
- *
770
- * @since 3.1.0
771
- * @access protected
772
- */
773
- function extra_tablenav( $which ) {}
774
-
775
- /**
776
- * Generate the <tbody> part of the table
777
- *
778
- * @since 3.1.0
779
- * @access protected
780
- */
781
- function display_rows_or_placeholder() {
782
- if ( $this->has_items() ) {
783
- $this->display_rows();
784
- } else {
785
- list( $columns, $hidden ) = $this->get_column_info();
786
- echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this->get_column_count() . '">';
787
- $this->no_items();
788
- echo '</td></tr>';
789
- }
790
- }
791
-
792
- /**
793
- * Generate the table rows
794
- *
795
- * @since 3.1.0
796
- * @access protected
797
- */
798
- function display_rows() {
799
- foreach ( $this->items as $item )
800
- $this->single_row( $item );
801
- }
802
-
803
- /**
804
- * Generates content for a single row of the table
805
- *
806
- * @since 3.1.0
807
- * @access protected
808
- *
809
- * @param object $item The current item
810
- */
811
- function single_row( $item ) {
812
- static $row_class = '';
813
- $row_class = ( $row_class == '' ? ' class="alternate"' : '' );
814
-
815
- echo '<tr' . $row_class . '>';
816
- echo $this->single_row_columns( $item );
817
- echo '</tr>';
818
- }
819
-
820
- /**
821
- * Generates the columns for a single row of the table
822
- *
823
- * @since 3.1.0
824
- * @access protected
825
- *
826
- * @param object $item The current item
827
- */
828
- function single_row_columns( $item ) {
829
- list( $columns, $hidden ) = $this->get_column_info();
830
-
831
- foreach ( $columns as $column_name => $column_display_name ) {
832
- $class = "class='$column_name column-$column_name'";
833
-
834
- $style = '';
835
- if ( in_array( $column_name, $hidden ) )
836
- $style = ' style="display:none;"';
837
-
838
- $attributes = "$class$style";
839
-
840
- if ( 'cb' == $column_name ) {
841
- echo '<th scope="row" class="check-column">';
842
- echo $this->column_cb( $item );
843
- echo '</th>';
844
- }
845
- elseif ( method_exists( $this, 'column_' . $column_name ) ) {
846
- echo "<td $attributes>";
847
- echo call_user_func( array( &$this, 'column_' . $column_name ), $item );
848
- echo "</td>";
849
- }
850
- else {
851
- echo "<td $attributes>";
852
- echo $this->column_default( $item, $column_name );
853
- echo "</td>";
854
- }
855
- }
856
- }
857
-
858
- /**
859
- * Handle an incoming ajax request (called from admin-ajax.php)
860
- *
861
- * @since 3.1.0
862
- * @access public
863
- */
864
- function ajax_response() {
865
- $this->prepare_items();
866
-
867
- extract( $this->_args );
868
- extract( $this->_pagination_args, EXTR_SKIP );
869
-
870
- ob_start();
871
- if ( ! empty( $_REQUEST['no_placeholder'] ) )
872
- $this->display_rows();
873
- else
874
- $this->display_rows_or_placeholder();
875
-
876
- $rows = ob_get_clean();
877
-
878
- $response = array( 'rows' => $rows );
879
-
880
- if ( isset( $total_items ) )
881
- $response['total_items_i18n'] = sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) );
882
-
883
- if ( isset( $total_pages ) ) {
884
- $response['total_pages'] = $total_pages;
885
- $response['total_pages_i18n'] = number_format_i18n( $total_pages );
886
- }
887
-
888
- die( json_encode( $response ) );
889
- }
890
-
891
- /**
892
- * Send required variables to JavaScript land
893
- *
894
- * @access private
895
- */
896
- function _js_vars() {
897
- $args = array(
898
- 'class' => get_class( $this ),
899
- 'screen' => array(
900
- 'id' => $this->screen->id,
901
- 'base' => $this->screen->base,
902
- )
903
- );
904
-
905
- printf( "<script type='text/javascript'>list_args = %s;</script>\n", json_encode( $args ) );
906
- }
907
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-admin-init.php DELETED
@@ -1,167 +0,0 @@
1
- <?php
2
- /*
3
- * Inits the admin dashboard side of things.
4
- * Main admin file which loads all settings panels and sets up admin menus.
5
- */
6
- class AIOWPSecurity_Admin_Init
7
- {
8
- var $main_menu_page;
9
- var $dashboard_menu;
10
- var $settings_menu;
11
- var $user_accounts_menu;
12
- var $user_login_menu;
13
- var $db_security_menu;
14
- var $filesystem_menu;
15
- var $whois_menu;
16
- var $blacklist_menu;
17
- var $firewall_menu;
18
-
19
- function __construct()
20
- {
21
- $this->admin_includes();
22
- add_action('admin_menu', array(&$this, 'create_admin_menus'));
23
-
24
- //make sure we are on our plugin's menu pages
25
- if (isset($_GET['page']) && strpos($_GET['page'], AIOWPSEC_MENU_SLUG_PREFIX ) !== false ) {
26
- add_action('admin_print_scripts', array(&$this, 'admin_menu_page_scripts'));
27
- add_action('admin_print_styles', array(&$this, 'admin_menu_page_styles'));
28
- add_action('admin_init', array( &$this, 'admin_init_hook_handler')); //For changing button text inside media uploader (thickbox)
29
- }
30
- }
31
-
32
- function admin_includes()
33
- {
34
- include_once('wp-security-admin-menu.php');
35
- }
36
-
37
- function admin_menu_page_scripts()
38
- {
39
- wp_enqueue_script('jquery');
40
- wp_enqueue_script('postbox');
41
- wp_enqueue_script('dashboard');
42
- wp_enqueue_script('thickbox');
43
- wp_enqueue_script('media-upload');
44
- wp_register_script('aiowpsec-admin-js', AIO_WP_SECURITY_URL. '/js/wp-security-admin-script.js', array('jquery'));
45
- wp_enqueue_script('aiowpsec-admin-js');
46
- }
47
-
48
- function admin_menu_page_styles()
49
- {
50
- wp_enqueue_style('dashboard');
51
- wp_enqueue_style('thickbox');
52
- wp_enqueue_style('global');
53
- wp_enqueue_style('wp-admin');
54
- wp_enqueue_style('aiowpsec-admin-css', AIO_WP_SECURITY_URL. '/css/wp-security-admin-styles.css');
55
- }
56
-
57
- function admin_init_hook_handler()
58
- {
59
- $this->aiowps_media_uploader_modification();
60
- $this->initialize_feature_manager();
61
- }
62
-
63
- //For media uploader thickbox - change button text
64
- function aiowps_media_uploader_modification()
65
- {
66
- global $pagenow;
67
- if ('media-upload.php' == $pagenow || 'async-upload.php' == $pagenow)
68
- {
69
- // Here we will customize the 'Insert into Post' Button text inside Thickbox
70
- add_filter( 'gettext', array($this, 'aiowps_media_uploader_replace_thickbox_text'), 1, 2);
71
- }
72
- }
73
-
74
- function aiowps_media_uploader_replace_thickbox_text($translated_text, $text)
75
- {
76
- if ('Insert into Post' == $text)
77
- {
78
- $referer = strpos(wp_get_referer(), 'aiowpsec');
79
- if ($referer != '')
80
- {
81
- return ('Select File');
82
- }
83
- }
84
- return $translated_text;
85
- }
86
-
87
- function initialize_feature_manager()
88
- {
89
- $aiowps_feature_mgr = new AIOWPSecurity_Feature_Item_Manager();
90
- $aiowps_feature_mgr->initialize_features();
91
- $aiowps_feature_mgr->check_and_set_feature_status();
92
- $aiowps_feature_mgr->calculate_total_points();
93
- $GLOBALS['aiowps_feature_mgr'] = $aiowps_feature_mgr;
94
- }
95
-
96
- function create_admin_menus()
97
- {
98
- $menu_icon_url = AIO_WP_SECURITY_URL.'/images/plugin-icon.png';
99
- $this->main_menu_page = add_menu_page(__('WP Security', 'aiowpsecurity'), __('WP Security', 'aiowpsecurity'), AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_MAIN_MENU_SLUG , array(&$this, 'handle_dashboard_menu_rendering'), $menu_icon_url);
100
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Dashboard', 'aiowpsecurity'), __('Dashboard', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_MAIN_MENU_SLUG, array(&$this, 'handle_dashboard_menu_rendering'));
101
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Settings', 'aiowpsecurity'), __('Settings', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_SETTINGS_MENU_SLUG, array(&$this, 'handle_settings_menu_rendering'));
102
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('User Accounts', 'aiowpsecurity'), __('User Accounts', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_USER_ACCOUNTS_MENU_SLUG, array(&$this, 'handle_user_accounts_menu_rendering'));
103
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('User Login', 'aiowpsecurity'), __('User Login', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_USER_LOGIN_MENU_SLUG, array(&$this, 'handle_user_login_menu_rendering'));
104
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Database Security', 'aiowpsecurity'), __('Database Security', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_DB_SEC_MENU_SLUG, array(&$this, 'handle_database_menu_rendering'));
105
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Filesystem Security', 'aiowpsecurity'), __('Filesystem Security', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_FILESYSTEM_MENU_SLUG, array(&$this, 'handle_filesystem_menu_rendering'));
106
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('WHOIS Lookup', 'aiowpsecurity'), __('WHOIS Lookup', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_WHOIS_MENU_SLUG, array(&$this, 'handle_whois_menu_rendering'));
107
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Blacklist Manager', 'aiowpsecurity'), __('Blacklist Manager', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_BLACKLIST_MENU_SLUG, array(&$this, 'handle_blacklist_menu_rendering'));
108
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Firewall', 'aiowpsecurity'), __('Firewall', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_FIREWALL_MENU_SLUG, array(&$this, 'handle_firewall_menu_rendering'));
109
- do_action('aiowpsecurity_admin_menu_created');
110
- }
111
-
112
- function handle_dashboard_menu_rendering()
113
- {
114
- include_once('wp-security-dashboard-menu.php');
115
- $this->dashboard_menu = new AIOWPSecurity_Dashboard_Menu();
116
- }
117
-
118
- function handle_settings_menu_rendering()
119
- {
120
- include_once('wp-security-settings-menu.php');
121
- $this->settings_menu = new AIOWPSecurity_Settings_Menu();
122
-
123
- }
124
-
125
- function handle_user_accounts_menu_rendering()
126
- {
127
- include_once('wp-security-user-accounts-menu.php');
128
- $this->user_accounts_menu = new AIOWPSecurity_User_Accounts_Menu();
129
- }
130
-
131
- function handle_user_login_menu_rendering()
132
- {
133
- include_once('wp-security-user-login-menu.php');
134
- $this->user_login_menu = new AIOWPSecurity_User_Login_Menu();
135
- }
136
-
137
- function handle_database_menu_rendering()
138
- {
139
- include_once('wp-security-database-menu.php');
140
- $this->db_security_menu = new AIOWPSecurity_Database_Menu();
141
- }
142
-
143
- function handle_filesystem_menu_rendering()
144
- {
145
- include_once('wp-security-filesystem-menu.php');
146
- $this->filesystem_menu = new AIOWPSecurity_Filescan_Menu();
147
- }
148
-
149
- function handle_whois_menu_rendering()
150
- {
151
- include_once('wp-security-whois-menu.php');
152
- $this->whois_menu = new AIOWPSecurity_WhoIs_Menu();
153
- }
154
-
155
- function handle_blacklist_menu_rendering()
156
- {
157
- include_once('wp-security-blacklist-menu.php');
158
- $this->blacklist_menu = new AIOWPSecurity_Blacklist_Menu();
159
- }
160
-
161
- function handle_firewall_menu_rendering()
162
- {
163
- include_once('wp-security-firewall-menu.php');
164
- $this->firewall_menu = new AIOWPSecurity_Firewall_Menu();
165
- }
166
- }//End of class
167
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-admin-menu.php DELETED
@@ -1,93 +0,0 @@
1
- <?php
2
-
3
- /* Parent class for all admin menu classes */
4
- abstract class AIOWPSecurity_Admin_Menu
5
- {
6
- /**
7
- * Shows postbox for settings menu
8
- *
9
- * @param string $id css ID for postbox
10
- * @param string $title title of the postbox section
11
- * @param string $content the content of the postbox
12
- **/
13
- function postbox_toggle($id, $title, $content)
14
- {
15
- //Always send string with translation markers in it
16
- ?>
17
- <div id="<?php echo $id; ?>" class="postbox">
18
- <div class="handlediv" title="Click to toggle"><br /></div>
19
- <h3 class="hndle"><span><?php echo $title; ?></span></h3>
20
- <div class="inside">
21
- <?php echo $content; ?>
22
- </div>
23
- </div>
24
- <?php
25
- }
26
-
27
- function postbox($title, $content)
28
- {
29
- //Always send string with translation markers in it
30
- ?>
31
- <div class="postbox">
32
- <h3><label for="title"><?php echo $title; ?></label></h3>
33
- <div class="inside">
34
- <?php echo $content; ?>
35
- </div>
36
- </div>
37
- <?php
38
- }
39
-
40
- function show_msg_settings_updated()
41
- {
42
- echo '<div id="message" class="updated fade"><p><strong>';
43
- _e('Settings successfully updated.','aiowpsecurity');
44
- echo '</strong></p></div>';
45
- }
46
-
47
- static function show_msg_record_deleted_st()
48
- {
49
- echo '<div id="message" class="updated fade"><p><strong>';
50
- _e('The selected record(s) deleted successfully!','aiowpsecurity');
51
- echo '</strong></p></div>';
52
- }
53
-
54
- function show_msg_updated($msg)
55
- {
56
- echo '<div id="message" class="updated fade"><p><strong>';
57
- echo $msg;
58
- echo '</strong></p></div>';
59
- }
60
-
61
- static function show_msg_updated_st($msg)
62
- {
63
- echo '<div id="message" class="updated fade"><p><strong>';
64
- echo $msg;
65
- echo '</strong></p></div>';
66
- }
67
-
68
- function show_msg_error($error_msg)
69
- {
70
- echo '<div id="message" class="error"><p><strong>';
71
- echo $error_msg;
72
- echo '</strong></p></div>';
73
- }
74
-
75
- static function show_msg_error_st($error_msg)
76
- {
77
- echo '<div id="message" class="error"><p><strong>';
78
- echo $error_msg;
79
- echo '</strong></p></div>';
80
- }
81
-
82
- function start_buffer()
83
- {
84
- ob_start();
85
- }
86
-
87
- function end_buffer_and_collect()
88
- {
89
- $output = ob_get_contents();
90
- ob_end_clean();
91
- return $output;
92
- }
93
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-blacklist-menu.php DELETED
@@ -1,332 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Blacklist_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_BLACKLIST_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'Ban Users',
10
- 'tab2' => 'SPAM Comments IP Monitoring',
11
- );
12
-
13
- var $menu_tabs_handler = array(
14
- 'tab1' => 'render_tab1',
15
- 'tab2' => 'render_tab2',
16
- );
17
-
18
- function __construct()
19
- {
20
- $this->render_menu_page();
21
- }
22
-
23
- function get_current_tab()
24
- {
25
- $tab_keys = array_keys($this->menu_tabs);
26
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
27
- return $tab;
28
- }
29
-
30
- /*
31
- * Renders our tabs of this menu as nav items
32
- */
33
- function render_menu_tabs()
34
- {
35
- $current_tab = $this->get_current_tab();
36
-
37
- echo '<h2 class="nav-tab-wrapper">';
38
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
39
- {
40
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
41
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
42
- }
43
- echo '</h2>';
44
- }
45
-
46
- /*
47
- * The menu rendering goes here
48
- */
49
- function render_menu_page()
50
- {
51
- $tab = $this->get_current_tab();
52
- ?>
53
- <div class="wrap">
54
- <div id="poststuff"><div id="post-body">
55
- <?php
56
- $this->render_menu_tabs();
57
- //$tab_keys = array_keys($this->menu_tabs);
58
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
59
- ?>
60
- </div></div>
61
- </div><!-- end of wrap -->
62
- <?php
63
- }
64
-
65
- function render_tab1()
66
- {
67
- //if this is the case there is no need to display a "fix permissions" button
68
- global $wpdb, $aio_wp_security;
69
- $result = 1;
70
- if (isset($_POST['aiowps_save_blacklist_settings']))
71
- {
72
- $nonce=$_REQUEST['_wpnonce'];
73
- if (!wp_verify_nonce($nonce, 'aiowpsec-blacklist-settings-nonce'))
74
- {
75
- $aio_wp_security->debug_logger->log_debug("Nonce check failed for save blacklist settings!",4);
76
- die(__('Nonce check failed for save blacklist settings!','aiowpsecurity'));
77
- }
78
-
79
- if (isset($_POST["aiowps_enable_blacklisting"]) && empty($_POST['aiowps_banned_ip_addresses']) && empty($_POST['aiowps_banned_user_agents']))
80
- {
81
- $this->show_msg_error('You must submit at least one IP address or one User Agent value or both!','aiowpsecurity');
82
- }
83
- else
84
- {
85
- if (!empty($_POST['aiowps_banned_ip_addresses']))
86
- {
87
- $ip_addresses = $_POST['aiowps_banned_ip_addresses'];
88
- $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($ip_addresses);
89
- $payload = AIOWPSecurity_Utility_IP::validate_ip_list($ip_list_array);
90
- if($payload[0] == 1){
91
- //success case
92
- $result = 1;
93
- $list = $payload[1];
94
- $banned_ip_data = implode(PHP_EOL, $list);
95
- $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses',$banned_ip_data);
96
- $_POST['aiowps_banned_ip_addresses'] = ''; //Clear the post variable for the banned address list
97
- }
98
- else{
99
- $result = -1;
100
- $error_msg = $payload[1][0];
101
- $this->show_msg_error($error_msg);
102
- }
103
-
104
- }
105
- else
106
- {
107
- $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses',''); //Clear the IP address config value
108
- }
109
-
110
- if (!empty($_POST['aiowps_banned_user_agents']))
111
- {
112
- $result = $result * $this->validate_user_agent_list();
113
- }
114
-
115
- if ($result == 1)
116
- {
117
- $aio_wp_security->configs->set_value('aiowps_enable_blacklisting',isset($_POST["aiowps_enable_blacklisting"])?'1':'');
118
- $aio_wp_security->configs->save_config(); //Save the configuration
119
- $this->show_msg_settings_updated();
120
-
121
- $write_result = AIOWPSecurity_Utility_Htaccess::write_to_htaccess(); //now let's write to the .htaccess file
122
- if ($write_result == -1)
123
- {
124
- $this->show_msg_error(__('The plugin was unable to write to the .htaccess file. Please edit file manually.','aiowpsecurity'));
125
- $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Blacklist_Menu - The plugin was unable to write to the .htaccess file.");
126
- }
127
- }
128
- }
129
- }
130
- ?>
131
- <h2><?php _e('Ban IPs or User Agents', 'aiowpsecurity')?></h2>
132
- <div class="aio_blue_box">
133
- <?php
134
- echo '<p>'.__('The All In One WP Security Blacklist feature gives you the option of banning certain host IP addresses or ranges and also user agents.', 'aiowpsecurity').'
135
- <br />'.__('This feature will deny total site access for users which have IP addresses or user agents matching those which you have configured in the settings below.', 'aiowpsecurity').'
136
- <br />'.__('The plugin achieves this by making appropriate modifications to your .htaccess file.', 'aiowpsecurity').'
137
- <br />'.__('By blocking people via the .htaccess file your are using the most secure first line of defence which denies all access to blacklisted visitors as soon as they hit your hosting server.', 'aiowpsecurity').'
138
- </p>';
139
- ?>
140
- </div>
141
-
142
- <div class="postbox">
143
- <h3><label for="title"><?php _e('IP Hosts and User Agent Blacklist Settings', 'aiowpsecurity'); ?></label></h3>
144
- <div class="inside">
145
- <?php
146
- //Display security info badge
147
- global $aiowps_feature_mgr;
148
- $aiowps_feature_mgr->output_feature_details_badge("blacklist-manager-ip-user-agent-blacklisting");
149
- ?>
150
- <form action="" method="POST">
151
- <?php wp_nonce_field('aiowpsec-blacklist-settings-nonce'); ?>
152
- <table class="form-table">
153
- <tr valign="top">
154
- <th scope="row"><?php _e('Enable IP or User Agent Blacklisting', 'aiowpsecurity')?>:</th>
155
- <td>
156
- <input name="aiowps_enable_blacklisting" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_blacklisting')=='1') echo ' checked="checked"'; ?> value="1"/>
157
- <span class="description"><?php _e('Check this if you want to enable the banning (or blacklisting) of selected IP addresses and/or user agents specified in the settings below', 'aiowpsecurity'); ?></span>
158
- </td>
159
- </tr>
160
- <tr valign="top">
161
- <th scope="row"><?php _e('Enter IP Addresses:', 'aiowpsecurity')?></th>
162
- <td>
163
- <textarea name="aiowps_banned_ip_addresses" rows="5" cols="50"><?php echo ($result == -1)?$_POST['aiowps_banned_ip_addresses']:$aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'); ?></textarea>
164
- <br />
165
- <span class="description"><?php _e('Enter one or more IP addresses or IP ranges.','aiowpsecurity');?></span>
166
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
167
- <div class="aiowps_more_info_body">
168
- <?php
169
- echo '<p class="description">'.__('Each IP address must be on a new line.', 'aiowpsecurity').'</p>';
170
- echo '<p class="description">'.__('To specify an IP range use a wildcard "*" character. Acceptable ways to use wildcards is shown in the examples below:', 'aiowpsecurity').'</p>';
171
- echo '<p class="description">'.__('Example 1: 195.47.89.*', 'aiowpsecurity').'</p>';
172
- echo '<p class="description">'.__('Example 2: 195.47.*.*', 'aiowpsecurity').'</p>';
173
- echo '<p class="description">'.__('Example 3: 195.*.*.*', 'aiowpsecurity').'</p>';
174
- ?>
175
- </div>
176
-
177
- </td>
178
- </tr>
179
- <tr valign="top">
180
- <th scope="row"><?php _e('Enter User Agents:', 'aiowpsecurity')?></th>
181
- <td>
182
- <textarea name="aiowps_banned_user_agents" rows="5" cols="50"><?php echo ($result == -1)?$_POST['aiowps_banned_user_agents']:$aio_wp_security->configs->get_value('aiowps_banned_user_agents'); ?></textarea>
183
- <br />
184
- <span class="description">
185
- <?php _e('Enter one or more user agent strings.','aiowpsecurity');?></span>
186
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
187
- <div class="aiowps_more_info_body">
188
- <?php
189
- echo '<p class="description">'.__('Each user agent string must be on a new line.', 'aiowpsecurity').'</p>';
190
- echo '<p class="description">'.__('Example 1 - A single user agent string to block:', 'aiowpsecurity').'</p>';
191
- echo '<p class="description">SquigglebotBot</p>';
192
- echo '<p class="description">'.__('Example 2 - A list of more than 1 user agent strings to block', 'aiowpsecurity').'</p>';
193
- echo '<p class="description">baiduspider<br />SquigglebotBot<br />SurveyBot<br />VoidEYE<br />webcrawl.net<br />YottaShopping_Bot</p>';
194
- ?>
195
- </div>
196
-
197
- </td>
198
- </tr>
199
- </table>
200
- <input type="submit" name="aiowps_save_blacklist_settings" value="<?php _e('Save Settings', 'aiowpsecurity')?>" class="button-primary" />
201
- </form>
202
- </div></div>
203
- <?php
204
- }
205
-
206
- function render_tab2()
207
- {
208
- global $aio_wp_security;
209
- include_once 'wp-security-list-comment-spammer-ip.php'; //For rendering the AIOWPSecurity_List_Table in tab2
210
- $spammer_ip_list = new AIOWPSecurity_List_Comment_Spammer_IP();
211
-
212
- if (isset($_POST['aiowps_ip_spam_comment_search']))
213
- {
214
- $error = '';
215
- $nonce=$_REQUEST['_wpnonce'];
216
- if (!wp_verify_nonce($nonce, 'aiowpsec-spammer-ip-list-nonce'))
217
- {
218
- $aio_wp_security->debug_logger->log_debug("Nonce check failed for list SPAM comment IPs!",4);
219
- die(__('Nonce check failed for list SPAM comment IPs!','aiowpsecurity'));
220
- }
221
-
222
- $min_comments_per_ip = sanitize_text_field($_POST['aiowps_spam_ip_min_comments']);
223
- if(!is_numeric($min_comments_per_ip))
224
- {
225
- $error .= '<br />'.__('You entered a non numeric value for the minimum SPAM comments per IP field. It has been set to the default value.','aiowpsecurity');
226
- $min_comments_per_ip = '5';//Set it to the default value for this field
227
- }
228
-
229
- if($error)
230
- {
231
- $this->show_msg_error(__('Attention!','aiowpsecurity').$error);
232
- }
233
-
234
- //Save all the form values to the options
235
- $aio_wp_security->configs->set_value('aiowps_spam_ip_min_comments',absint($min_comments_per_ip));
236
- $aio_wp_security->configs->save_config();
237
- $info_msg_string = sprintf( __('Displaying results for IP addresses which have posted a minimum of %s SPAM comments', 'aiowpsecurity'), $min_comments_per_ip);
238
- $this->show_msg_updated($info_msg_string);
239
-
240
- }
241
-
242
- if(isset($_REQUEST['action'])) //Do list table form row action tasks
243
- {
244
- if($_REQUEST['action'] == 'block_spammer_ip')
245
- { //The "block" link was clicked for a row in the list table
246
- $spammer_ip_list->block_spammer_ip_records(strip_tags($_REQUEST['spammer_ip']));
247
- }
248
- }
249
-
250
- ?>
251
- <div class="aio_blue_box">
252
- <?php
253
- echo '<p>'.__('This tab displays a list of the IP addresses of the people or bots who have left SPAM comments on your site.', 'aiowpsecurity').'
254
- <br />'.__('This information can be handy for identifying the most persistent IP addresses or ranges used by spammers.', 'aiowpsecurity').'
255
- <br />'.__('By inspecting the IP address data coming from spammers you will be in a better position to determine which addresses or address ranges you should block by adding them to your blacklist.', 'aiowpsecurity').'
256
- <br />'.__('To add one or more of the IP addresses displayed in the table below to your blacklist, simply click the "Block" link for the individual row or select more than one address
257
- using the checkboxes and then choose the "block" option from the Bulk Actions dropdown list and click the "Apply" button.', 'aiowpsecurity').'
258
- </p>';
259
- ?>
260
- </div>
261
- <div class="postbox">
262
- <h3><label for="title"><?php _e('List SPAMMER IP Addresses', 'aiowpsecurity'); ?></label></h3>
263
- <div class="inside">
264
- <form action="" method="POST">
265
- <?php wp_nonce_field('aiowpsec-spammer-ip-list-nonce'); ?>
266
- <table class="form-table">
267
- <tr valign="top">
268
- <th scope="row"><?php _e('Minimum number of SPAM comments per IP', 'aiowpsecurity')?>:</th>
269
- <td><input size="5" name="aiowps_spam_ip_min_comments" value="<?php echo $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments'); ?>" />
270
- <span class="description"><?php _e('This field allows you to list only those IP addresses which have been used to post X or more SPAM comments.', 'aiowpsecurity');?></span>
271
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
272
- <div class="aiowps_more_info_body">
273
- <?php
274
- echo '<p class="description">'.__('Example 1: Setting this value to "0" or "1" will list ALL IP addresses which were used to submit SPAM comments.', 'aiowpsecurity').'</p>';
275
- echo '<p class="description">'.__('Example 2: Setting this value to "5" will list only those IP addresses which were used to submit 5 SPAM comments or more on your site.', 'aiowpsecurity').'</p>';
276
- ?>
277
- </div>
278
-
279
- </td>
280
- </tr>
281
- </table>
282
- <input type="submit" name="aiowps_ip_spam_comment_search" value="<?php _e('Find IP Addresses', 'aiowpsecurity')?>" class="button-primary" />
283
- </form>
284
- </div></div>
285
- <div class="postbox">
286
- <h3><label for="title"><?php _e('SPAMMER IP Address Results', 'aiowpsecurity'); ?></label></h3>
287
- <div class="inside">
288
- <?php
289
- //Fetch, prepare, sort, and filter our data...
290
- $spammer_ip_list->prepare_items();
291
- //echo "put table of locked entries here";
292
- ?>
293
- <form id="tables-filter" method="get" onSubmit="return confirm('Are you sure you want to perform this bulk operation on the selected entries?');">
294
- <!-- For plugins, we also need to ensure that the form posts back to our current page -->
295
- <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
296
- <input type="hidden" name="tab" value="<?php echo $_REQUEST['tab']; ?>" />
297
- <!-- Now we can render the completed list table -->
298
- <?php $spammer_ip_list->display(); ?>
299
- </form>
300
- </div></div>
301
- <?php
302
- }
303
-
304
- function validate_user_agent_list()
305
- {
306
- global $aio_wp_security;
307
- @ini_set('auto_detect_line_endings', true);
308
- //$errors = '';
309
-
310
- $submitted_agents = explode(PHP_EOL, $_POST['aiowps_banned_user_agents']);
311
- $agents = array();
312
- if (!empty($submitted_agents))
313
- {
314
- foreach ($submitted_agents as $agent)
315
- {
316
- $text = quotemeta(sanitize_text_field($agent));
317
- $agents[] = $text;
318
- }
319
- }
320
-
321
- if (sizeof($agents) > 1)
322
- {
323
- sort( $agents );
324
- $agents = array_unique($agents, SORT_STRING);
325
- }
326
-
327
- $banned_user_agent_data = implode(PHP_EOL, $agents);
328
- $aio_wp_security->configs->set_value('aiowps_banned_user_agents',$banned_user_agent_data);
329
- $_POST['aiowps_banned_user_agents'] = ''; //Clear the post variable for the banned address list
330
- return 1;
331
- }
332
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-dashboard-menu.php DELETED
@@ -1,304 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Dashboard_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $dashboard_menu_page_slug = AIOWPSEC_MAIN_MENU_SLUG;
6
-
7
- var $menu_tabs = array(
8
- 'tab1' => 'Dashboard',
9
- 'tab2' => 'System Info',
10
- );
11
-
12
- var $menu_tabs_handler = array(
13
- 'tab1' => 'render_tab1',
14
- 'tab2' => 'render_tab2',
15
- );
16
-
17
- function __construct()
18
- {
19
- $this->render_menu_page();
20
- }
21
-
22
- function get_current_tab()
23
- {
24
- $tab_keys = array_keys($this->menu_tabs);
25
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
26
- return $tab;
27
- }
28
-
29
- /*
30
- * Renders our tabs of this menu as nav items
31
- */
32
- function render_menu_tabs()
33
- {
34
- $current_tab = $this->get_current_tab();
35
-
36
- echo '<h2 class="nav-tab-wrapper">';
37
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
38
- {
39
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
40
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->dashboard_menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
41
- }
42
- echo '</h2>';
43
- }
44
-
45
- /*
46
- * The menu rendering goes here
47
- */
48
- function render_menu_page()
49
- {
50
- $tab = $this->get_current_tab();
51
- ?>
52
- <div class="wrap">
53
- <div id="poststuff"><div id="post-body">
54
- <?php
55
- $this->render_menu_tabs();
56
- //$tab_keys = array_keys($this->menu_tabs);
57
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
58
- ?>
59
- </div></div>
60
- </div><!-- end of wrap -->
61
- <?php
62
- }
63
-
64
- function render_tab1()
65
- {
66
- echo '<div class="aio_grey_box">';
67
- echo '<p>For information, updates and documentation, please visit the <a href="http://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin" target="_blank">AIO WP Security & Firewall Plugin</a> Page.</p>';
68
- echo '<p><a href="http://www.tipsandtricks-hq.com/development-center" target="_blank">Follow us</a> on Twitter, Google+ or via Email to stay upto date about the new security features of this plugin.</p>';
69
- echo '</div>';
70
-
71
- echo "<script type='text/javascript' src='https://www.google.com/jsapi'></script>";//Include the google chart library
72
-
73
- global $aiowps_feature_mgr;
74
- $feature_mgr = $aiowps_feature_mgr;
75
- $total_site_security_points = $feature_mgr->get_total_site_points();
76
- $total_security_points_achievable = $feature_mgr->get_total_achievable_points();
77
-
78
- ?>
79
- <div class="aiowps_dashboard_box_small">
80
- <div class="postbox">
81
- <h3><label for="title">Security Strength Meter</label></h3>
82
- <div class="inside">
83
-
84
- <script type='text/javascript'>
85
- google.load('visualization', '1', {packages:['gauge']});
86
- google.setOnLoadCallback(drawChart);
87
- function drawChart() {
88
- var data = google.visualization.arrayToDataTable([
89
- ['Label', 'Value'],
90
- ['Strength', <?php echo $total_site_security_points; ?>]
91
- ]);
92
-
93
- var options = {
94
- width: 320, height: 200, max: <?php echo $total_security_points_achievable; ?>,
95
- greenColor: '8EFA9B', yellowColor: 'F5EE90', redColor: 'FA7373',
96
- redFrom: 0, redTo: 10,
97
- yellowFrom:10, yellowTo: 50,
98
- greenFrom:50, greenTo: <?php echo $total_security_points_achievable; ?>,
99
- minorTicks: 5
100
- };
101
-
102
- var chart = new google.visualization.Gauge(document.getElementById('security_strength_chart_div'));
103
- chart.draw(data, options);
104
- }
105
- </script>
106
- <div id='security_strength_chart_div'></div>
107
-
108
- <div class="aiowps_dashboard_widget_footer">
109
- <?php
110
- _e('Total Achievable Points: ','aiowpsecurity');
111
- echo '<strong>'.$total_security_points_achievable.'</strong><br />';
112
- _e('Current Score of Your Site: ','aiowpsecurity');
113
- echo '<strong>'.$total_site_security_points.'</strong>';
114
- ?>
115
- </div>
116
-
117
- </div></div>
118
- </div><!-- aiowps_dashboard_box -->
119
-
120
- <div class="aiowps_dashboard_box_small">
121
- <div class="postbox">
122
- <h3><label for="title">Security Points Breakdown</label></h3>
123
- <div class="inside">
124
-
125
- <?php
126
- $feature_items = $feature_mgr->feature_items;
127
- $pt_src_chart_data = "";
128
- $pt_src_chart_data .= "['Feature Name', 'Points'],";
129
- foreach($feature_items as $item)
130
- {
131
- if($item->feature_status == $feature_mgr->feature_active)
132
- {
133
- $pt_src_chart_data .= "['".$item->feature_name."', ".$item->item_points."],";
134
- }
135
- }
136
-
137
- ?>
138
- <script type="text/javascript">
139
- google.load("visualization", "1", {packages:["corechart"]});
140
- google.setOnLoadCallback(drawChart);
141
- function drawChart() {
142
- var data = google.visualization.arrayToDataTable([
143
- <?php echo $pt_src_chart_data; ?>
144
- ]);
145
-
146
- var options = {
147
- height: '250',
148
- width: '320',
149
- backgroundColor: 'F6F6F6'
150
- };
151
-
152
- var chart = new google.visualization.PieChart(document.getElementById('points_source_breakdown_chart_div'));
153
- chart.draw(data, options);
154
- }
155
- </script>
156
- <div id='points_source_breakdown_chart_div'></div>
157
-
158
- </div></div>
159
- </div><!-- aiowps_dashboard_box -->
160
-
161
- <div class="aiowps_dashboard_box_small">
162
- <div class="postbox">
163
- <h3><label for="title">Critical Feature Status</label></h3>
164
- <div class="inside">
165
-
166
- <?php
167
- _e('Below is the current status of the critical features that you should activate on your site for maximum security','aiowpsecurity');
168
- $feature_items = $feature_mgr->feature_items;
169
- $username_admin_feature = $feature_mgr->get_feature_item_by_id("user-accounts-change-admin-user");
170
- echo '<div class="aiowps_feature_status_container">';
171
- echo '<div class="aiowps_feature_status_name">'.__('Admin Username','aiowpsecurity').'</div>';
172
- echo '<a href="admin.php?page='.AIOWPSEC_USER_ACCOUNTS_MENU_SLUG.'" target="_blank">';
173
- echo '<div class="aiowps_feature_status_bar">';
174
- if($username_admin_feature->feature_status == $feature_mgr->feature_active){
175
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_on">On</div>';
176
- echo '<div class="aiowps_feature_status_label">Off</div>';
177
- }else{
178
- echo '<div class="aiowps_feature_status_label">On</div>';
179
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_off">Off</div>';
180
- }
181
- echo '</div></div></a>';
182
- echo '<div class="aio_clear_float"></div>';
183
-
184
- $login_lockdown_feature = $feature_mgr->get_feature_item_by_id("user-login-login-lockdown");
185
- echo '<div class="aiowps_feature_status_container">';
186
- echo '<div class="aiowps_feature_status_name">'.__('Login Lockdown','aiowpsecurity').'</div>';
187
- echo '<a href="admin.php?page='.AIOWPSEC_USER_LOGIN_MENU_SLUG.'" target="_blank">';
188
- echo '<div class="aiowps_feature_status_bar">';
189
- if($login_lockdown_feature->feature_status == $feature_mgr->feature_active){
190
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_on">On</div>';
191
- echo '<div class="aiowps_feature_status_label">Off</div>';
192
- }else{
193
- echo '<div class="aiowps_feature_status_label">On</div>';
194
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_off">Off</div>';
195
- }
196
- echo '</div></div></a>';
197
- echo '<div class="aio_clear_float"></div>';
198
-
199
- $filesystem_feature = $feature_mgr->get_feature_item_by_id("filesystem-file-permissions");
200
- echo '<div class="aiowps_feature_status_container">';
201
- echo '<div class="aiowps_feature_status_name">'.__('File Permission','aiowpsecurity').'</div>';
202
- echo '<a href="admin.php?page='.AIOWPSEC_FILESYSTEM_MENU_SLUG.'" target="_blank">';
203
- echo '<div class="aiowps_feature_status_bar">';
204
- if($filesystem_feature->feature_status == $feature_mgr->feature_active){
205
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_on">On</div>';
206
- echo '<div class="aiowps_feature_status_label">Off</div>';
207
- }else{
208
- echo '<div class="aiowps_feature_status_label">On</div>';
209
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_off">Off</div>';
210
- }
211
- echo '</div></div></a>';
212
- echo '<div class="aio_clear_float"></div>';
213
-
214
- $basic_firewall_feature = $feature_mgr->get_feature_item_by_id("firewall-basic-rules");
215
- echo '<div class="aiowps_feature_status_container">';
216
- echo '<div class="aiowps_feature_status_name">'.__('Basic Firewall','aiowpsecurity').'</div>';
217
- echo '<a href="admin.php?page='.AIOWPSEC_FIREWALL_MENU_SLUG.'" target="_blank">';
218
- echo '<div class="aiowps_feature_status_bar">';
219
- if($basic_firewall_feature->feature_status == $feature_mgr->feature_active){
220
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_on">On</div>';
221
- echo '<div class="aiowps_feature_status_label">Off</div>';
222
- }else{
223
- echo '<div class="aiowps_feature_status_label">On</div>';
224
- echo '<div class="aiowps_feature_status_label aiowps_feature_status_off">Off</div>';
225
- }
226
- echo '</div></div></a>';
227
- echo '<div class="aio_clear_float"></div>';
228
- ?>
229
- </div></div>
230
- </div><!-- aiowps_dashboard_box -->
231
-
232
- <div class="aiowps_dashboard_box_small">
233
- <div class="postbox">
234
- <h3><label for="title">Spread the Word</label></h3>
235
- <div class="inside">
236
-
237
- <p>We are working to make your WordPress site more secure. Please support us, here is how:</p>
238
- <p>
239
- <a href="http://twitter.com/intent/tweet?url=http://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin&text=I love the All In One WP Security and Firewall plugin!" target="_blank" class="aio_tweet_link">Post to Tweeter</a>
240
- </p>
241
- <p>
242
- <a href="http://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" target="_blank" class="aio_rate_us_link">Vote & Rate Now</a>
243
- </p>
244
-
245
- </div></div>
246
- </div><!-- aiowps_dashboard_box -->
247
-
248
- <div class="aio_clear_float"></div>
249
- <?php
250
- }
251
-
252
-
253
- function render_tab2()
254
- {
255
- global $wpdb;
256
- ?>
257
- <div class="postbox">
258
- <h3><label for="title">Site Info</label></h3>
259
- <div class="inside">
260
- <strong>Plugin Version: </strong><code><?php echo AIO_WP_SECURITY_VERSION;?></code><br />
261
- <strong>WP Version: </strong><code><?php echo get_bloginfo("version"); ?></code><br />
262
- <strong>WPMU: </strong><code><?php echo (!defined('MULTISITE') || !MULTISITE) ? "No" : "Yes"; ?></code><br />
263
- <strong>MySQL Version: </strong><code><?php echo $wpdb->db_version();?></code><br />
264
- <strong>WP Table Prefix: </strong><code><?php echo $wpdb->prefix; ?></code><br />
265
- <strong>PHP Version: </strong><code><?php echo phpversion(); ?></code><br />
266
- <strong>Session Save Path: </strong><code><?php echo ini_get("session.save_path"); ?></code><br />
267
- <strong>WP URL: </strong><code><?php echo get_bloginfo('wpurl'); ?></code><br />
268
- <strong>Server Name: </strong><code><?php echo $_SERVER['SERVER_NAME']; ?></code><br />
269
- <strong>Cookie Domain: </strong><code><?php $cookieDomain = parse_url( strtolower( get_bloginfo('wpurl') ) ); echo $cookieDomain['host']; ?></code><br />
270
- <strong>CURL Library Present: </strong><code><?php echo (function_exists('curl_init')) ? "Yes" : "No"; ?></code><br />
271
- <strong>Debug File Write Permissions: </strong><code><?php echo (is_writable(AIO_WP_SECURITY_PATH)) ? "Writable" : "Not Writable"; ?></code><br />
272
- </div></div>
273
-
274
- <div class="postbox">
275
- <h3><label for="title">Active Plugins</label></h3>
276
- <div class="inside">
277
- <?php
278
- $all_plugins = get_plugins();
279
- $active_plugins = get_option('active_plugins');
280
- //var_dump($all_plugins);
281
- ?>
282
- <table class="widefat aio_spacer_10_tb">
283
- <thead>
284
- <tr>
285
- <th><?php _e('Name', 'aiowpsecurity') ?></th>
286
- <th><?php _e('Version', 'aiowpsecurity') ?></th>
287
- <th><?php _e('Plugin URL', 'aiowpsecurity') ?></th>
288
- </tr>
289
- </thead>
290
- <tbody>
291
- <?php
292
- foreach ($active_plugins as $plugin_key)
293
- {
294
- $plugin_details = $all_plugins[$plugin_key];
295
- echo '<tr><td>'.$plugin_details['Name'].'</td><td>'.$plugin_details['Version'].'</td><td>'.$plugin_details['PluginURI'].'</td></tr>';
296
- }
297
- ?>
298
- </tbody>
299
- </table>
300
- </div></div>
301
- <?php
302
- }
303
-
304
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-database-menu.php DELETED
@@ -1,463 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Database_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_DB_SEC_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'DB Prefix',
10
- 'tab2' => 'DB Backup',
11
- );
12
-
13
- var $menu_tabs_handler = array(
14
- 'tab1' => 'render_tab1',
15
- 'tab2' => 'render_tab2',
16
- );
17
-
18
- function __construct()
19
- {
20
- $this->render_menu_page();
21
- }
22
-
23
- function get_current_tab()
24
- {
25
- $tab_keys = array_keys($this->menu_tabs);
26
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
27
- return $tab;
28
- }
29
-
30
- /*
31
- * Renders our tabs of this menu as nav items
32
- */
33
- function render_menu_tabs()
34
- {
35
- $current_tab = $this->get_current_tab();
36
-
37
- echo '<h2 class="nav-tab-wrapper">';
38
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
39
- {
40
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
41
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
42
- }
43
- echo '</h2>';
44
- }
45
-
46
- /*
47
- * The menu rendering goes here
48
- */
49
- function render_menu_page()
50
- {
51
- $tab = $this->get_current_tab();
52
- ?>
53
- <div class="wrap">
54
- <div id="poststuff"><div id="post-body">
55
- <?php
56
- $this->render_menu_tabs();
57
- //$tab_keys = array_keys($this->menu_tabs);
58
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
59
- ?>
60
- </div></div>
61
- </div><!-- end of wrap -->
62
- <?php
63
- }
64
-
65
- function render_tab1()
66
- {
67
- global $wpdb, $aio_wp_security;
68
- $old_db_prefix = $wpdb->prefix;
69
- $new_db_prefix = '';
70
- $perform_db_change = false;
71
-
72
- if (isset($_POST['aiowps_db_prefix_change']))//Do form submission tasks
73
- {
74
- $nonce=$_REQUEST['_wpnonce'];
75
- if (!wp_verify_nonce($nonce, 'aiowpsec-db-prefix-change-nonce'))
76
- {
77
- $aio_wp_security->debug_logger->log_debug("Nonce check failed for DB prefix change operation!",4);
78
- die(__('Nonce check failed for DB prefix change operation!','aiowpsecurity'));
79
- }
80
- if( isset($_POST['aiowps_enable_random_prefix']))
81
- {//User has elected to generate a random DB prefix
82
- $string = AIOWPSecurity_Utility::generate_alpha_numeric_random_string('6');
83
- $new_db_prefix = $string . '_';
84
- $perform_db_change = true;
85
- }else
86
- {
87
- if (empty($_POST['aiowps_new_manual_db_prefix']))
88
- {
89
- $this->show_msg_error(__('Please enter a value for the DB prefix.', 'aiowpsecurity'));
90
- }
91
- else
92
- {
93
- //User has chosen their own DB prefix value
94
- $new_db_prefix = wp_strip_all_tags( trim( $_POST['aiowps_new_manual_db_prefix'] ) );
95
- $error = $wpdb->set_prefix( $new_db_prefix );
96
- if(is_wp_error($error))
97
- {
98
- wp_die( __('<strong>ERROR</strong>: The table prefix can only contain numbers, letters, and underscores.', 'aiowpsecurity') );
99
- }
100
- $perform_db_change = true;
101
- }
102
- }
103
- }
104
- ?>
105
- <h2><?php _e('Change Database Prefix', 'aiowpsecurity')?></h2>
106
- <div class="aio_blue_box">
107
- <?php
108
- echo '<p>'.__('Your WordPress DB is the most important asset of your website because it contains a lot of your site\'s precious information.', 'aiowpsecurity').'
109
- <br />'.__('The DB is also a target for hackers via methods such as SQL injections and malicious and automated code which targets certain tables.', 'aiowpsecurity').'
110
- <br />'.__('One way to add a layer of protection for your DB is to change the default WordPress table prefix from "wp_" to something else which will be difficult for hackers to guess.', 'aiowpsecurity').'
111
- <br />'.__('This feature allows you to easily change the prefix to a value of your choice or to a random value set by this plugin.', 'aiowpsecurity').'
112
- </p>';
113
- ?>
114
- </div>
115
-
116
- <div class="postbox">
117
- <h3><label for="title"><?php _e('DB Prefix Options', 'aiowpsecurity'); ?></label></h3>
118
- <div class="inside">
119
- <?php
120
- //Display security info badge
121
- global $aiowps_feature_mgr;
122
- $aiowps_feature_mgr->output_feature_details_badge("db-security-db-prefix");
123
- ?>
124
-
125
- <div class="aio_yellow_box">
126
- <?php
127
- $backup_tab_link = '<a href="admin.php?page='.AIOWPSEC_DB_SEC_MENU_SLUG.'&tab=tab2">DB Backup</a>';
128
- $info_msg = '<p>'.sprintf( __('It is recommended that you perform a %s before using this feature', 'aiowpsecurity'), $backup_tab_link).'</p>';
129
- echo $info_msg;
130
- ?>
131
- </div>
132
-
133
- <form action="" method="POST">
134
- <?php wp_nonce_field('aiowpsec-db-prefix-change-nonce'); ?>
135
- <table class="form-table">
136
- <tr valign="top">
137
- <th scope="row"><?php _e('Current DB Table Prefix', 'aiowpsecurity')?>:</th>
138
- <td>
139
- <span class="aiowpsec_field_value"><strong><?php echo $wpdb->prefix; ?></strong></span>
140
- <?php
141
- //now let's display a warning notification if default prefix is used
142
- if ($old_db_prefix == 'wp_') {
143
- echo '&nbsp;&nbsp;&nbsp;<span class="aio_error_with_icon">'.__('Your site is currently using the default WordPress DB prefix value of "wp_".
144
- To increase your site\'s security you should consider changing the DB prefix value to another value.', 'aiowpsecurity').'</span>';
145
- }
146
- ?>
147
- </td>
148
- </tr>
149
- <tr valign="top">
150
- <th scope="row"><?php _e('Generate New DB Table Prefix', 'aiowpsecurity')?>:</th>
151
- <td>
152
- <input name="aiowps_enable_random_prefix" type="checkbox" <?php if($aio_wp_security->configs->get_value('aiowps_enable_random_prefix')=='1') echo ' checked="checked"'; ?> value="1"/>
153
- <span class="description"><?php _e('Check this if you want the plugin to generate a random 6 character string for the table prefix', 'aiowpsecurity'); ?></span>
154
- <br /><?php _e('OR', 'aiowpsecurity'); ?>
155
- <br /><input size="10" name="aiowps_new_manual_db_prefix" value="<?php //echo $aio_wp_security->configs->get_value('aiowps_new_manual_db_prefix'); ?>" />
156
- <span class="description"><?php _e('Choose your own DB prefix by specifying a string which contains letters and/or numbers and/or underscores. Example: xyz_', 'aiowpsecurity'); ?></span>
157
- </td>
158
- </tr>
159
- </table>
160
- <input type="submit" name="aiowps_db_prefix_change" value="<?php _e('Change DB Prefix', 'aiowpsecurity')?>" class="button-primary" />
161
- </form>
162
- </div></div>
163
- <?php
164
- if ($perform_db_change)
165
- {
166
- //Do the DB prefix change operations
167
- $this->change_db_prefix($old_db_prefix,$new_db_prefix);
168
- }
169
- }
170
-
171
- function render_tab2()
172
- {
173
- global $aio_wp_security;
174
- if (isset($_POST['aiowps_manual_db_backup']))
175
- {
176
- $nonce=$_REQUEST['_wpnonce'];
177
- if (!wp_verify_nonce($nonce, 'aiowpsec-db-manual-change-nonce'))
178
- {
179
- $aio_wp_security->debug_logger->log_debug("Nonce check failed for manual DB backup operation!",4);
180
- die(__('Nonce check failed for manual DB backup operation!','aiowpsecurity'));
181
- }
182
-
183
- $result = $aio_wp_security->backup_obj->execute_backup();
184
- if ($result)
185
- {
186
- $backup_file_name = $aio_wp_security->backup_obj->last_backup_file_name;
187
- $backup_file_url = AIO_WP_SECURITY_URL . '/backups/'. $backup_file_name;
188
- echo '<div id="message" class="updated fade"><p>';
189
- _e('DB Backup was successfully completed! Right click on the following file name and save the backup to your computer.','aiowpsecurity');
190
- echo '<p>';
191
- _e('Your DB Backup File: ');
192
- echo '<a href="'.$backup_file_url.'" target="_blank">'.$backup_file_name.'</a>';
193
- echo '</p>';
194
- echo '</p></div>';
195
- }
196
- else
197
- {
198
- $aio_wp_security->debug_logger->log_debug("DB Backup - Backup operation failed!",4);
199
- $this->show_msg_error(__('DB Backup failed. Please check the permissions of the backup directory.','aiowpsecurity'));
200
- }
201
- }
202
-
203
- if(isset($_POST['aiowps_schedule_backups']))//Do form submission tasks
204
- {
205
- $error = '';
206
- $nonce=$_REQUEST['_wpnonce'];
207
- if (!wp_verify_nonce($nonce, 'aiowpsec-scheduled-backup-nonce'))
208
- {
209
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on scheduled DB backup options save!",4);
210
- die("Nonce check failed on scheduled DB backup options save!");
211
- }
212
-
213
- $backup_frequency = sanitize_text_field($_POST['aiowps_db_backup_frequency']);
214
- if(!is_numeric($backup_frequency))
215
- {
216
- $error .= '<br />'.__('You entered a non numeric value for the "backup time interval" field. It has been set to the default value.','aiowpsecurity');
217
- $backup_frequency = '4';//Set it to the default value for this field
218
- }
219
-
220
- $files_to_keep = sanitize_text_field($_POST['aiowps_backup_files_stored']);
221
- if(!is_numeric($files_to_keep))
222
- {
223
- $error .= '<br />'.__('You entered a non numeric value for the "number of backup files to keep" field. It has been set to the default value.','aiowpsecurity');
224
- $files_to_keep = '2';//Set it to the default value for this field
225
- }
226
-
227
- $email_address = sanitize_email($_POST['aiowps_backup_email_address']);
228
- if(!is_email($email_address))
229
- {
230
- $error .= '<br />'.__('You have entered an incorrect email address format. It has been set to your WordPress admin email as default.','aiowpsecurity');
231
- $email_address = get_bloginfo('admin_email'); //Set the default value to the blog admin email
232
- }
233
-
234
- if($error)
235
- {
236
- $this->show_msg_error(__('Attention!','aiowpsecurity').$error);
237
- }
238
-
239
- //Save all the form values to the options
240
- $aio_wp_security->configs->set_value('aiowps_enable_automated_backups',isset($_POST["aiowps_enable_automated_backups"])?'1':'');
241
- $aio_wp_security->configs->set_value('aiowps_db_backup_frequency',absint($backup_frequency));
242
- $aio_wp_security->configs->set_value('aiowps_db_backup_interval',$_POST["aiowps_db_backup_interval"]);
243
- $aio_wp_security->configs->set_value('aiowps_backup_files_stored',absint($files_to_keep));
244
- $aio_wp_security->configs->set_value('aiowps_send_backup_email_address',isset($_POST["aiowps_send_backup_email_address"])?'1':'');
245
- $aio_wp_security->configs->set_value('aiowps_backup_email_address',$email_address);
246
- $aio_wp_security->configs->save_config();
247
- $this->show_msg_settings_updated();
248
- }
249
-
250
- ?>
251
- <div class="postbox">
252
- <h3><label for="title"><?php _e('Manual Backup', 'aiowpsecurity'); ?></label></h3>
253
- <div class="inside">
254
- <form action="" method="POST">
255
- <?php wp_nonce_field('aiowpsec-db-manual-change-nonce'); ?>
256
- <table class="form-table">
257
- <tr valign="top">
258
- <span class="description"><?php _e('To create a new DB backup just click on the button below.', 'aiowpsecurity'); ?></span>
259
- </tr>
260
- </table>
261
- <input type="submit" name="aiowps_manual_db_backup" value="<?php _e('Create DB Backup Now', 'aiowpsecurity')?>" class="button-primary" />
262
- </form>
263
- </div></div>
264
- <div class="postbox">
265
- <h3><label for="title"><?php _e('Automated Scheduled Backups', 'aiowpsecurity'); ?></label></h3>
266
- <div class="inside">
267
- <?php
268
- //Display security info badge
269
- global $aiowps_feature_mgr;
270
- $aiowps_feature_mgr->output_feature_details_badge("db-security-db-backup");
271
- ?>
272
-
273
- <form action="" method="POST">
274
- <?php wp_nonce_field('aiowpsec-scheduled-backup-nonce'); ?>
275
- <table class="form-table">
276
- <tr valign="top">
277
- <th scope="row"><?php _e('Enable Automated Scheduled Backups', 'aiowpsecurity')?>:</th>
278
- <td>
279
- <input name="aiowps_enable_automated_backups" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_automated_backups')=='1') echo ' checked="checked"'; ?> value="1"/>
280
- <span class="description"><?php _e('Check this if you want the system to automatically generate backups periodically based on the settings below', 'aiowpsecurity'); ?></span>
281
- </td>
282
- </tr>
283
- <tr valign="top">
284
- <th scope="row"><?php _e('Backup Time Interval', 'aiowpsecurity')?>:</th>
285
- <td><input size="5" name="aiowps_db_backup_frequency" value="<?php echo $aio_wp_security->configs->get_value('aiowps_db_backup_frequency'); ?>" />
286
- <select id="backup_interval" name="aiowps_db_backup_interval">
287
- <option value="0" <?php selected( $aio_wp_security->configs->get_value('aiowps_db_backup_interval'), '0' ); ?>><?php _e( 'Hours', 'aiowpsecurity' ); ?></option>
288
- <option value="1" <?php selected( $aio_wp_security->configs->get_value('aiowps_db_backup_interval'), '1' ); ?>><?php _e( 'Days', 'aiowpsecurity' ); ?></option>
289
- <option value="2" <?php selected( $aio_wp_security->configs->get_value('aiowps_db_backup_interval'), '2' ); ?>><?php _e( 'Weeks', 'aiowpsecurity' ); ?></option>
290
- </select>
291
- <span class="description"><?php _e('Set the value for how often you would like an automated backup to occur', 'aiowpsecurity'); ?></span>
292
- </td>
293
- </tr>
294
- <tr valign="top">
295
- <th scope="row"><?php _e('Number of Backup Files To Keep', 'aiowpsecurity')?>:</th>
296
- <td><input size="5" name="aiowps_backup_files_stored" value="<?php echo $aio_wp_security->configs->get_value('aiowps_backup_files_stored'); ?>" />
297
- <span class="description"><?php _e('Thie field allows you to choose the number of backup files you would like to keep in the backup directory', 'aiowpsecurity'); ?></span>
298
- </td>
299
- </tr>
300
- <tr valign="top">
301
- <th scope="row"><?php _e('Send Backup File Via Email', 'aiowpsecurity')?>:</th>
302
- <td>
303
- <input name="aiowps_send_backup_email_address" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_send_backup_email_address')=='1') echo ' checked="checked"'; ?> value="1"/>
304
- <span class="description"><?php _e('Check this if you want the system to email you the backup file after a DB backup has been performed', 'aiowpsecurity'); ?></span>
305
- <br /><input size="30" name="aiowps_backup_email_address" value="<?php echo $aio_wp_security->configs->get_value('aiowps_backup_email_address'); ?>" />
306
- <span class="description"><?php _e('Enter an email address', 'aiowpsecurity'); ?></span>
307
- </td>
308
- </tr>
309
- </table>
310
- <input type="submit" name="aiowps_schedule_backups" value="<?php _e('Save Settings', 'aiowpsecurity')?>" class="button-primary" />
311
- </form>
312
- </div></div>
313
-
314
- <?php
315
- }
316
-
317
- /*
318
- * Changes the DB prefix
319
- */
320
- function change_db_prefix($table_old_prefix, $table_new_prefix)
321
- {
322
- global $wpdb, $aio_wp_security;
323
- $old_prefix_length = strlen( $table_old_prefix );
324
-
325
- //Get the table resource
326
- $result = mysql_list_tables(DB_NAME);
327
-
328
- //Count the number of tables
329
- $num_rows = mysql_num_rows( $result );
330
- $table_count = 0;
331
-
332
- //TODO - after reading up on internationalization mixed with html code I found that the WP experts say to do it as below. We will need to clean up other areas where we haven't used the following convention
333
- $info_msg_string = '<p class="aio_info_with_icon">'.sprintf( __('Starting DB prefix change.....', 'aiowpsecurity')).'</p>';
334
- $info_msg_string .= '<p class="aio_info_with_icon">'.sprintf( __('Your WordPress system has a total of %s tables and your new DB prefix will be: %s', 'aiowpsecurity'), '<strong>'.$num_rows.'</strong>', '<strong>'.$table_new_prefix.'</strong>').'</p>';
335
- echo ($info_msg_string);
336
-
337
- //Config file path
338
- $config_file = ABSPATH.'wp-config.php';
339
- //Do a back of the config file
340
- if(!AIOWPSecurity_Utility_File::backup_a_file($config_file))
341
- {
342
- echo '<div class="aio_red_box"><p>'.__('Failed to make a backup of the wp-config.php file. This operation will not go ahead.', 'aiowpsecurity').'</p></div>';
343
- return;
344
- }
345
- else{
346
- echo '<p class="aio_success_with_icon">'.__('A backup copy of your wp-config.php file was created successfully!', 'aiowpsecurity').'</p>';
347
- }
348
-
349
- //Rename all the tables name
350
- for ($i = 0; $i < $num_rows; $i++)
351
- {
352
- //Get table name with old prefix
353
- $table_old_name = mysql_tablename($result, $i);
354
-
355
- if ( strpos( $table_old_name, $table_old_prefix ) === 0 )
356
- {
357
- //Get table name with new prefix
358
- $table_new_name = $table_new_prefix . substr( $table_old_name, $old_prefix_length );
359
-
360
- //Write query to rename tables name
361
- $sql = "RENAME TABLE `".$table_old_name."` TO `".$table_new_name."`";
362
- //$sql = "RENAME TABLE %s TO %s";
363
-
364
- //Execute the query
365
- //if ( false === $wpdb->query($wpdb->prepare($sql, $table_old_name, $table_new_name)) ) //$wpdb->prepare is adding single quotes instead of backticks and hence causing the query to fail
366
- if ( false === $wpdb->query($sql) )
367
- {
368
- $error = 1;
369
- echo '<p class="aio_error_with_icon">'.sprintf( __('%s table name update failed', 'aiowpsecurity'), '<strong>'.$table_old_name.'</strong>').'</p>';
370
- $aio_wp_security->debug_logger->log_debug("DB Security Feature - Unable to change prefix of table ".$table_old_name,4);
371
- } else {
372
- $table_count++;
373
- }
374
- } else
375
- {
376
- continue;
377
- }
378
- }
379
- if ( @$error == 1 )
380
- {
381
- echo '<p class="aio_error_with_icon">'.sprintf( __('Please change the prefix manually for the above tables to: %s', 'aiowpsecurity'), '<strong>'.$table_new_prefix.'</strong>').'</p>';
382
- } else
383
- {
384
- echo '<p class="aio_success_with_icon">'.sprintf( __('%s tables had their prefix updated successfully!', 'aiowpsecurity'), '<strong>'.$table_count.'</strong>').'</p>';
385
- }
386
-
387
- //Get wp-config.php file contents and modify it with new info
388
- $config_contents = file($config_file);
389
- foreach ($config_contents as $line_num => $line) {
390
- switch (substr($line,0,16)) {
391
- case '$table_prefix =':
392
- $config_contents[$line_num] = str_replace($table_old_prefix, $table_new_prefix, $line);
393
- break;
394
- }
395
- }
396
- //Now let's modify the wp-config.php file
397
- if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents))
398
- {
399
- echo '<p class="aio_success_with_icon">'. __('wp-config.php file was updated successfully!', 'aiowpsecurity').'</p>';
400
- }else
401
- {
402
- echo '<p class="aio_error_with_icon">'.sprintf( __('The "wp-config.php" file was not able to be modified. Please modify this file manually using your favourite editor and search
403
- for variable "$table_prefix" and assign the following value to that variable: %s', 'aiowpsecurity'), '<strong>'.$table_new_prefix.'</strong>').'</p>';
404
- $aio_wp_security->debug_logger->log_debug("DB Security Feature - Unable to modify wp-config.php",4);
405
- }
406
-
407
- //Now let's update the options table
408
- $update_option_table_query = "UPDATE " . $table_new_prefix . "options
409
- SET option_name = '".$table_new_prefix ."user_roles'
410
- WHERE option_name = '".$table_old_prefix."user_roles'
411
- LIMIT 1";
412
-
413
- if ( false === $wpdb->query($update_option_table_query) )
414
- {
415
- echo "<p class='error'>Changing value: ",
416
- $table_old_prefix,
417
- "user_roles in table ",
418
- $table_new_prefix,
419
- "options to ",
420
- $table_new_prefix,
421
- "user_roles</p>";
422
-
423
- echo '<p class="aio_error_with_icon">'.sprintf( __('There was an error when updating the options table.', 'aiowpsecurity')).'</p>';
424
- $aio_wp_security->debug_logger->log_debug("DB Security Feature - Error when updating the options table",4);//Log the highly unlikely event of DB error
425
- } else
426
- {
427
- echo '<p class="aio_success_with_icon">'.sprintf( __('The options table records which had references to the old DB prefix were updated successfully!', 'aiowpsecurity')).'</p>';
428
- }
429
- //Now let's update the user meta table
430
- $custom_sql = "SELECT user_id, meta_key
431
- FROM " . $table_new_prefix . "usermeta
432
- WHERE meta_key
433
- LIKE '" . $table_old_prefix . "%'";
434
-
435
- $meta_keys = $wpdb->get_results( $custom_sql );
436
-
437
- $error_update_usermeta = '';
438
-
439
- //Update all meta_key field values which have the old table prefix in user_meta table
440
- foreach ($meta_keys as $meta_key ) {
441
-
442
- //Create new meta key
443
- $new_meta_key = $table_new_prefix . substr( $meta_key->meta_key, $old_prefix_length );
444
-
445
- $update_user_meta_sql = "UPDATE " . $table_new_prefix . "usermeta
446
- SET meta_key='" . $new_meta_key . "'
447
- WHERE meta_key='" . $meta_key->meta_key . "'
448
- AND user_id='" . $meta_key->user_id."'";
449
-
450
- if (false === $wpdb->query($update_user_meta_sql))
451
- {
452
- $error_update_usermeta .= '<p class="aio_error_with_icon">'.sprintf( __('Error updating user_meta table where new meta_key = %s, old meta_key = %s and user_id = %s.', 'aiowpsecurity'),$new_meta_key,$meta_key->meta_key,$meta_key->user_id).'</p>';
453
- echo $error_update_usermeta;
454
- $aio_wp_security->debug_logger->log_debug("DB Security Feature - Error updating user_meta table where new meta_key = ".$new_meta_key." old meta_key = ".$meta_key->meta_key." and user_id = ".$meta_key->user_id,4);//Log the highly unlikely event of DB error
455
- }
456
-
457
- }
458
- echo '<p class="aio_success_with_icon">'.__('The usermeta table records which had references to the old DB prefix were updated successfully!', 'aiowpsecurity').'</p>';
459
- //Display tasks finished message
460
- $tasks_finished_msg_string = '<p class="aio_info_with_icon">'. __('DB prefix change tasks have been completed.', 'aiowpsecurity').'</p>';
461
- echo ($tasks_finished_msg_string);
462
- }
463
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-filesystem-menu.php DELETED
@@ -1,500 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Filescan_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_FILESYSTEM_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'File Permissions',
10
- 'tab2' => 'PHP File Editing',
11
- 'tab3' => 'Host System Logs',
12
- );
13
-
14
- var $menu_tabs_handler = array(
15
- 'tab1' => 'render_tab1',
16
- 'tab2' => 'render_tab2',
17
- 'tab3' => 'render_tab3',
18
- );
19
-
20
- function __construct()
21
- {
22
- $this->render_menu_page();
23
- add_action( 'admin_footer', array( &$this, 'filesystem_menu_footer_code' ) );
24
- }
25
-
26
- function get_current_tab()
27
- {
28
- $tab_keys = array_keys($this->menu_tabs);
29
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
30
- return $tab;
31
- }
32
-
33
- /*
34
- * Renders our tabs of this menu as nav items
35
- */
36
- function render_menu_tabs()
37
- {
38
- $current_tab = $this->get_current_tab();
39
-
40
- echo '<h2 class="nav-tab-wrapper">';
41
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
42
- {
43
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
44
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
45
- }
46
- echo '</h2>';
47
- }
48
-
49
- /*
50
- * The menu rendering goes here
51
- */
52
- function render_menu_page()
53
- {
54
- $tab = $this->get_current_tab();
55
- ?>
56
- <div class="wrap">
57
- <div id="poststuff"><div id="post-body">
58
- <?php
59
- $this->render_menu_tabs();
60
- //$tab_keys = array_keys($this->menu_tabs);
61
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
62
- ?>
63
- </div></div>
64
- </div><!-- end of wrap -->
65
- <?php
66
- }
67
-
68
- function render_tab1()
69
- {
70
- //if this is the case there is no need to display a "fix permissions" button
71
- global $wpdb, $aio_wp_security;
72
- if (isset($_POST['aiowps_fix_permissions']))
73
- {
74
- $nonce=$_REQUEST['_wpnonce'];
75
- if (!wp_verify_nonce($nonce, 'aiowpsec-fix-permissions-nonce'))
76
- {
77
- $aio_wp_security->debug_logger->log_debug("Nonce check failed for manual DB backup operation!",4);
78
- die(__('Nonce check failed for manual DB backup operation!','aiowpsecurity'));
79
- }
80
- if (isset($_POST['aiowps_permission_chg_file']))
81
- {
82
- $folder_or_file = $_POST['aiowps_permission_chg_file'];
83
- $rec_perm_oct_string = $_POST['aiowps_recommended_permissions']; //Convert the octal string to dec so the chmod func will accept it
84
- $rec_perm_dec = octdec($rec_perm_oct_string); //Convert the octal string to dec so the chmod func will accept it
85
- $perm_result = @chmod($_POST['aiowps_permission_chg_file'], $rec_perm_dec);
86
- if ($perm_result === true)
87
- {
88
- $msg = sprintf( __('The permissions for %s were succesfully changed to %s', 'aiowpsecurity'), $folder_or_file, $rec_perm_oct_string);
89
- $this->show_msg_updated($msg);
90
- }else if($perm_result === false)
91
- {
92
- $msg = sprintf( __('Unable to change permissions for %s!', 'aiowpsecurity'), $folder_or_file);
93
- $this->show_msg_error($msg);
94
- }
95
- }
96
- }
97
- ?>
98
- <h2><?php _e('File Permissions Scan', 'aiowpsecurity')?></h2>
99
- <div class="aio_blue_box">
100
- <?php
101
- echo '<p>'.__('Your WordPress file and folder permission settings govern the accessability and read/write privileges of the files and folders which make up your WP installation.', 'aiowpsecurity').'
102
- <br />'.__('Your WP installation already comes with reasonably secure file permission settings for the filesystem.', 'aiowpsecurity').'
103
- <br />'.__('However, sometimes people or other plugins modify the various permission settings of certain core WP folders or files such that they end up making their site less secure because they chose the wrong permission values.', 'aiowpsecurity').'
104
- <br />'.__('This feature will scan the critical WP core folders and files and will highlight any permission settings which are insecure.', 'aiowpsecurity').'
105
- </p>';
106
- ?>
107
- </div>
108
-
109
- <div class="postbox">
110
- <h3><label for="title"><?php _e('WP Directory and File Permissions Scan Results', 'aiowpsecurity'); ?></label></h3>
111
- <div class="inside">
112
- <?php
113
- //Display security info badge
114
- global $aiowps_feature_mgr;
115
- $aiowps_feature_mgr->output_feature_details_badge("filesystem-file-permissions");
116
- ?>
117
- <form action="" method="POST">
118
- <?php wp_nonce_field('aiowpsec-fix-permissions-nonce'); ?>
119
- <table class="widefat file_permission_table">
120
- <thead>
121
- <tr>
122
- <th><?php _e('Name', 'aiowpsecurity') ?></th>
123
- <th><?php _e('File/Folder', 'aiowpsecurity') ?></th>
124
- <th><?php _e('Current Permissions', 'aiowpsecurity') ?></th>
125
- <th><?php _e('Recommended Permissions', 'aiowpsecurity') ?></th>
126
- <th><?php _e('Recommended Action', 'aiowpsecurity') ?></th>
127
- </tr>
128
- </thead>
129
- <tbody>
130
- <?php
131
- $util = new AIOWPSecurity_Utility_File;
132
- $files_dirs_to_check = $util->files_and_dirs_to_check;
133
- foreach ($files_dirs_to_check as $file_or_dir)
134
- {
135
- $this->show_wp_filesystem_permission_status($file_or_dir['name'],$file_or_dir['path'],$file_or_dir['permissions']);
136
- }
137
- ?>
138
- </tbody>
139
- <tfoot>
140
- <tr>
141
- <th><?php _e('Name', 'aiowpsecurity') ?></th>
142
- <th><?php _e('File/Folder', 'aiowpsecurity') ?></th>
143
- <th><?php _e('Current Permissions', 'aiowpsecurity') ?></th>
144
- <th><?php _e('Recommended Permissions', 'aiowpsecurity') ?></th>
145
- <th><?php _e('Recommended Action', 'aiowpsecurity') ?></th>
146
- </tfoot>
147
- </table>
148
- </form>
149
- </div></div>
150
- <?php
151
- }
152
-
153
- function render_tab2()
154
- {
155
- global $aio_wp_security;
156
-
157
- if(isset($_POST['aiowps_disable_file_edit']))//Do form submission tasks
158
- {
159
- $nonce=$_REQUEST['_wpnonce'];
160
- if (!wp_verify_nonce($nonce, 'aiowpsec-disable-file-edit-nonce'))
161
- {
162
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on disable PHP file edit options save!",4);
163
- die("Nonce check failed on disable PHP file edit options save!");
164
- }
165
-
166
- if(isset($_POST['aiowps_disable_file_editing']))
167
- {
168
-
169
- $res = $this->disable_file_edits();
170
- } else
171
- {
172
- $res = $this->enable_file_edits();
173
- }
174
- if ($res)
175
- {
176
- //Save settings if no errors
177
- $aio_wp_security->configs->set_value('aiowps_disable_file_editing',isset($_POST["aiowps_disable_file_editing"])?'1':'');
178
- $aio_wp_security->configs->save_config();
179
- }
180
- //$this->show_msg_settings_updated();
181
-
182
- }
183
- ?>
184
- <h2><?php _e('File Editing', 'aiowpsecurity')?></h2>
185
- <div class="aio_blue_box">
186
- <?php
187
- echo '<p>'.__('The Wordpress Dashboard by default allows administrators to edit PHP files, such as plugin and theme files.', 'aiowpsecurity').'
188
- <br />'.__('This is often the first tool an attacker will use if able to login, since it allows code execution.', 'aiowpsecurity').'
189
- <br />'.__('This feature will disable the ability for people to edit PHP files via the dashboard.', 'aiowpsecurity').'
190
- </p>';
191
- ?>
192
- </div>
193
-
194
- <div class="postbox">
195
- <h3><label for="title"><?php _e('Disable PHP File Editing', 'aiowpsecurity'); ?></label></h3>
196
- <div class="inside">
197
- <?php
198
- //Display security info badge
199
- global $aiowps_feature_mgr;
200
- $aiowps_feature_mgr->output_feature_details_badge("filesystem-file-editing");
201
- ?>
202
-
203
- <form action="" method="POST">
204
- <?php wp_nonce_field('aiowpsec-disable-file-edit-nonce'); ?>
205
- <table class="form-table">
206
- <tr valign="top">
207
- <th scope="row"><?php _e('Disable Ability To Edit PHP Files', 'aiowpsecurity')?>:</th>
208
- <td>
209
- <input name="aiowps_disable_file_editing" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_disable_file_editing')=='1') echo ' checked="checked"'; ?> value="1"/>
210
- <span class="description"><?php _e('Check this if you want to remove the ability for people to edit PHP files via the WP dashboard', 'aiowpsecurity'); ?></span>
211
- </td>
212
- </tr>
213
- </table>
214
- <input type="submit" name="aiowps_disable_file_edit" value="<?php _e('Save Settings', 'aiowpsecurity')?>" class="button-primary" />
215
- </form>
216
- </div></div>
217
- <?php
218
- }
219
-
220
- function render_tab3()
221
- {
222
- global $aio_wp_security;
223
-
224
- ?>
225
- <h2><?php _e('System Logs', 'aiowpsecurity')?></h2>
226
- <div class="aio_blue_box">
227
- <?php
228
- echo '<p>'.__('Sometimes your hosting platform will produce error or warning logs in a file called "error_log".', 'aiowpsecurity').'
229
- <br />'.__('Depending on the nature and cause of the error or warning, your hosting server can create multiple instances of this file in numerous directory locations of your WordPress installation.', 'aiowpsecurity').'
230
- <br />'.__('By occassionally viewing the contents of these logs files you can keep informed of any underlying problems on your system which you might need to address.', 'aiowpsecurity').'
231
- </p>';
232
- ?>
233
- </div>
234
-
235
- <div class="postbox">
236
- <h3><label for="title"><?php _e('View System Logs', 'aiowpsecurity'); ?></label></h3>
237
- <div class="inside">
238
- <p>Please click the button below to view the latest system logs:</p>
239
- <form action="" method="POST">
240
- <?php wp_nonce_field('aiowpsec-view-system-logs-nonce'); ?>
241
- <input type="submit" name="aiowps_search_error_files" value="<?php _e('View Latest System Logs', 'aiowpsecurity'); ?>" class="button-primary search-error-files" />
242
- <span class="aiowps_loading_1">
243
- <img src="<?php echo AIO_WP_SECURITY_URL.'/images/loading.gif'; ?>" alt="<?php __('Loading...', 'aiowpsecurity'); ?>" />
244
- </span>
245
- </form>
246
- </div></div>
247
- <?php
248
- if (isset($_POST['aiowps_search_error_files']))
249
- {
250
- $nonce=$_REQUEST['_wpnonce'];
251
- if (!wp_verify_nonce($nonce, 'aiowpsec-view-system-logs-nonce'))
252
- {
253
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on view system log operation!",4);
254
- die("Nonce check failed on view system log operation!");
255
- }
256
-
257
- $logResults = AIOWPSecurity_Utility_File::recursive_file_search('error_log', 0, ABSPATH);
258
- if (empty($logResults) || $logResults == NULL || $logResults == '')
259
- {
260
- $this->show_msg_updated(__('No system logs were found!', 'aiowpsecurity'));
261
- }
262
- else
263
- {
264
- foreach($logResults as $file)
265
- {
266
- $this->display_system_logs_in_table($file);
267
- }
268
- }
269
- }
270
- }
271
-
272
- /*
273
- * Scans WP key core files and directory permissions and populates a wp wide_fat table
274
- * Displays a red background entry with a "Fix" button for permissions which are "777"
275
- * Displays a yellow background entry with a "Fix" button for permissions which are less secure than the recommended
276
- * Displays a green entry for permissions which are as secure or better than the recommended
277
- */
278
- function show_wp_filesystem_permission_status($name,$path,$recommended)
279
- {
280
- $fix = false;
281
- $configmod = AIOWPSecurity_Utility_File::get_file_permission($path);
282
- if ($configmod == "0777"){
283
- $trclass = "aio_table_row_red"; //Display a red background if permissions are set as least secure ("777")
284
- $fix = true;
285
- }
286
- else if($configmod != $recommended)
287
- {
288
- //$res = $this->is_file_permission_secure($recommended, $configmod);
289
- $res = AIOWPSecurity_Utility_File::is_file_permission_secure($recommended, $configmod);
290
- if ($res)
291
- {
292
- $trclass = "aio_table_row_green"; //If the current permissions are even tighter than recommended then display a green row
293
- $fix = true;
294
- }
295
- else
296
- {
297
- $trclass = "aio_table_row_yellow"; //Display a yellow background if permissions are set to something different than recommended
298
- $fix = true;
299
- }
300
- }
301
- else
302
- {
303
- $trclass = "aio_table_row_green";
304
- }
305
- echo "<tr class=".$trclass.">";
306
- echo '<td>' . $name . "</td>";
307
- echo '<td>'. $path ."</td>";
308
- echo '<td>' . $configmod . '</td>';
309
- echo '<td>' . $recommended . '</td>';
310
- if ($fix)
311
- {
312
- echo '<td>
313
- <input type="submit" name="aiowps_fix_permissions" value="'.__('Set Recommended Permissions','aiowpsecurity').'" class="button-secondary" />
314
- <input type="hidden" name="aiowps_permission_chg_file" value="'.$path.'"/>
315
- <input type="hidden" name="aiowps_recommended_permissions" value="'.$recommended.'"/>
316
- </td>';
317
- } else
318
- {
319
- echo '<td>'.__('No Action Required', 'aiowpsecurity').'</td>';
320
- }
321
- echo "</tr>";
322
- }
323
-
324
-
325
- /*
326
- * Modifies the wp-config.php file to disable PHP file editing from the admin panel
327
- * This func will add the following code:
328
- * define('DISALLOW_FILE_EDIT', false);
329
- *
330
- * NOTE: This function will firstly check if the above code already exists and it will modify the bool value, otherwise it will insert the code mentioned above
331
- */
332
- function disable_file_edits()
333
- {
334
- global $aio_wp_security;
335
- $edit_file_config_entry_exists = false;
336
-
337
- //Config file path
338
- $config_file = ABSPATH.'wp-config.php';
339
-
340
- //Get wp-config.php file contents so we can check if the "DISALLOW_FILE_EDIT" variable already exists
341
- $config_contents = file($config_file);
342
- foreach ($config_contents as $line_num => $line)
343
- {
344
- if (strpos($line, "'DISALLOW_FILE_EDIT', false"))
345
- {
346
- $config_contents[$line_num] = str_replace('false', 'true', $line);
347
- $edit_file_config_entry_exists = true;
348
- //$this->show_msg_updated(__('Settings Saved - The ability to edit PHP files via the admin the panel has been DISABLED.', 'aiowpsecurity'));
349
- } else if(strpos($line, "'DISALLOW_FILE_EDIT', true"))
350
- {
351
- $edit_file_config_entry_exists = true;
352
- $this->show_msg_updated(__('Your system config file is already configured to disallow PHP file editing.', 'aiowpsecurity'));
353
- return true;
354
-
355
- }
356
- }
357
-
358
- if ($edit_file_config_entry_exists)
359
- {
360
- //Now let's modify the wp-config.php file
361
- if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents))
362
- {
363
- $this->show_msg_updated(__('Settings Saved - Your system is now configured to not allow PHP file editing.', 'aiowpsecurity'));
364
- return true;
365
- }else
366
- {
367
- $this->show_msg_error(__('Operation failed! Unable to modify wp-config.php file!', 'aiowpsecurity'));
368
- $aio_wp_security->debug_logger->log_debug("Disable PHP File Edit - Unable to modify wp-config.php",4);
369
- return false;
370
- }
371
- }else
372
- {
373
- //Make a backup of the config file
374
- if(!AIOWPSecurity_Utility_File::backup_a_file($config_file))
375
- {
376
- $this->show_msg_error(__('Failed to make a backup of the wp-config.php file. This operation will not go ahead.', 'aiowpsecurity'));
377
- $aio_wp_security->debug_logger->log_debug("Disable PHP File Edit - Failed to make a backup of the wp-config.php file.",4);
378
- return false;
379
- }
380
- else{
381
- $this->show_msg_updated(__('A backup copy of your wp-config.php file was created successfully....', 'aiowpsecurity'));
382
- }
383
-
384
- //Construct the config code which we will insert into wp-config.php
385
- $new_snippet = "//Disable File Edits\n";
386
- $new_snippet .= 'define(\'DISALLOW_FILE_EDIT\', true);';
387
- $write_result = file_put_contents($config_file, $new_snippet, FILE_APPEND | LOCK_EX);
388
- if ($write_result)
389
- {
390
- $this->show_msg_updated(__('Settings Saved - Your system is now configured to not allow PHP file editing.', 'aiowpsecurity'));
391
- }else
392
- {
393
- $this->show_msg_error(__('Operation failed! Unable to modify wp-config.php file!', 'aiowpsecurity'));
394
- }
395
- }
396
- return $write_result; //will return true or false depending on whether file write was successful
397
- }
398
-
399
- /*
400
- * Modifies the wp-config.php file to allow PHP file editing from the admin panel
401
- * This func will modify the following code by replacing "true" with "false":
402
- * define('DISALLOW_FILE_EDIT', true);
403
- */
404
-
405
- function enable_file_edits()
406
- {
407
- global $aio_wp_security;
408
- $edit_file_config_entry_exists = false;
409
-
410
- //Config file path
411
- $config_file = ABSPATH.'wp-config.php';
412
-
413
- //Get wp-config.php file contents
414
- $config_contents = file($config_file);
415
- foreach ($config_contents as $line_num => $line)
416
- {
417
- if (strpos($line, "'DISALLOW_FILE_EDIT', true"))
418
- {
419
- $config_contents[$line_num] = str_replace('true', 'false', $line);
420
- $edit_file_config_entry_exists = true;
421
- } else if(strpos($line, "'DISALLOW_FILE_EDIT', false"))
422
- {
423
- $edit_file_config_entry_exists = true;
424
- $this->show_msg_updated(__('Your system config file is already configured to allow PHP file editing.', 'aiowpsecurity'));
425
- return true;
426
- }
427
- }
428
-
429
- if (!$edit_file_config_entry_exists)
430
- {
431
- //if the DISALLOW_FILE_EDIT settings don't exist in wp-config.php then we don't need to do anything
432
- $this->show_msg_updated(__('Your system config file is already configured to allow PHP file editing.', 'aiowpsecurity'));
433
- return true;
434
- } else
435
- {
436
- //Now let's modify the wp-config.php file
437
- if (AIOWPSecurity_Utility_File::write_content_to_file($config_file, $config_contents))
438
- {
439
- $this->show_msg_updated(__('Settings Saved - Your system is now configured to allow PHP file editing.', 'aiowpsecurity'));
440
- return true;
441
- }else
442
- {
443
- $this->show_msg_error(__('Operation failed! Unable to modify wp-config.php file!', 'aiowpsecurity'));
444
- $aio_wp_security->debug_logger->log_debug("Disable PHP File Edit - Unable to modify wp-config.php",4);
445
- return false;
446
- }
447
- }
448
- }
449
-
450
- function filesystem_menu_footer_code()
451
- {
452
- ?>
453
- <script type="text/javascript">
454
- /* <![CDATA[ */
455
- jQuery(document).ready(function($) {
456
- loading_span = $('.aiowps_loading_1');
457
- loading_span.hide(); //hide the spinner gif after page has successfully loaded
458
- $('.search-error-files').on("click",function(){
459
- loading_span.show();
460
- });
461
- });
462
- /* ]]> */
463
- </script>
464
- <?php
465
- }
466
-
467
- function display_system_logs_in_table($filepath)
468
- {
469
- global $aio_wp_security;
470
- //Get contents of the error_log file
471
- $error_file_contents = file($filepath);
472
- if (!$error_file_contents)
473
- {
474
- //TODO - error could not read file, display notice???
475
- $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Filescan_Menu - Unable to read file: ".$filepath,4);
476
-
477
- }
478
- $last_50_entries = array_slice($error_file_contents, -50); //extract the last 50 entries
479
- ?>
480
- <table class="widefat file_permission_table">
481
- <thead>
482
- <tr>
483
- <th><?php echo(sprintf(__('Showing latest entries of error_log file: %s', 'aiowpsecurity'),'<strong>'.$filepath.'</strong>')); ?></th>
484
- </tr>
485
- </thead>
486
- <tbody>
487
- <?php
488
- foreach ($last_50_entries as $entry)
489
- {
490
- echo "<tr>";
491
- echo '<td>' . $entry . "</td>";
492
- echo "</tr>";
493
- }
494
- ?>
495
- </tbody>
496
- </table>
497
- <?php
498
-
499
- }
500
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-firewall-menu.php DELETED
@@ -1,445 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Firewall_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_FIREWALL_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'Basic Firewall Rules',
10
- 'tab2' => 'Additional Firewall Rules',
11
- 'tab3' => '5G Blacklist Firewall Rules',
12
- );
13
-
14
- var $menu_tabs_handler = array(
15
- 'tab1' => 'render_tab1',
16
- 'tab2' => 'render_tab2',
17
- 'tab3' => 'render_tab3',
18
- );
19
-
20
- function __construct()
21
- {
22
- $this->render_menu_page();
23
- }
24
-
25
- function get_current_tab()
26
- {
27
- $tab_keys = array_keys($this->menu_tabs);
28
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
29
- return $tab;
30
- }
31
-
32
- /*
33
- * Renders our tabs of this menu as nav items
34
- */
35
- function render_menu_tabs()
36
- {
37
- $current_tab = $this->get_current_tab();
38
-
39
- echo '<h2 class="nav-tab-wrapper">';
40
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
41
- {
42
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
43
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
44
- }
45
- echo '</h2>';
46
- }
47
-
48
- /*
49
- * The menu rendering goes here
50
- */
51
- function render_menu_page()
52
- {
53
- $tab = $this->get_current_tab();
54
- ?>
55
- <div class="wrap">
56
- <div id="poststuff"><div id="post-body">
57
- <?php
58
- $this->render_menu_tabs();
59
- //$tab_keys = array_keys($this->menu_tabs);
60
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
61
- ?>
62
- </div></div>
63
- </div><!-- end of wrap -->
64
- <?php
65
- }
66
-
67
- function render_tab1()
68
- {
69
- global $aio_wp_security;
70
- if(isset($_POST['aiowps_apply_basic_firewall_settings']))//Do form submission tasks
71
- {
72
- $nonce=$_REQUEST['_wpnonce'];
73
- if (!wp_verify_nonce($nonce, 'aiowpsec-enable-basic-firewall-nonce'))
74
- {
75
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on enable basic firewall settings!",4);
76
- die("Nonce check failed on enable basic firewall settings!");
77
- }
78
-
79
- //Save settings
80
- if(isset($_POST['aiowps_enable_basic_firewall']))
81
- {
82
- $aio_wp_security->configs->set_value('aiowps_enable_basic_firewall','1');
83
- }
84
- else
85
- {
86
- $aio_wp_security->configs->set_value('aiowps_enable_basic_firewall','');
87
- }
88
-
89
- //Commit the config settings
90
- $aio_wp_security->configs->save_config();
91
-
92
- //Now let's write the applicable rules to the .htaccess file
93
- $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess();
94
-
95
- if ($res)
96
- {
97
- $this->show_msg_updated(__('You have successfully saved the Basic Firewall Protection configuration', 'aiowpsecurity'));
98
- }
99
- else if($res == -1)
100
- {
101
- $this->show_msg_error(__('Could not write to the .htaccess file. Please check the file permissions.', 'aiowpsecurity'));
102
- }
103
- }
104
-
105
- ?>
106
- <h2><?php _e('Firewall Settings', 'aiowpsecurity')?></h2>
107
- <div class="aio_blue_box">
108
- <?php
109
- $backup_tab_link = '<a href="admin.php?page='.AIOWPSEC_SETTINGS_MENU_SLUG.'&tab=tab2" target="_blank">backup</a>';
110
- $info_msg = sprintf( __('This should not have any impact on your site\'s general functionality but if you wish you can take a %s of your .htaccess file before proceeding.', 'aiowpsecurity'), $backup_tab_link);
111
- echo '<p>'.__('This feature allows you to activate some basic firewall security protection rules for your site.', 'aiowpsecurity').
112
- '<br />'.__('The firewall functionality is achieved via the insertion of special code into your currently active .htaccess file.', 'aiowpsecurity').
113
- '<br />'.$info_msg.'</p>';
114
- ?>
115
- </div>
116
-
117
- <div class="postbox">
118
- <h3><label for="title"><?php _e('Basic Firewall Settings', 'aiowpsecurity'); ?></label></h3>
119
- <div class="inside">
120
- <?php
121
- //Display security info badge
122
- global $aiowps_feature_mgr;
123
- $aiowps_feature_mgr->output_feature_details_badge("firewall-basic-rules");
124
- ?>
125
- <form action="" method="POST">
126
- <?php wp_nonce_field('aiowpsec-enable-basic-firewall-nonce'); ?>
127
- <table class="form-table">
128
- <tr valign="top">
129
- <th scope="row"><?php _e('Enable Basic Firewall Protection', 'aiowpsecurity')?>:</th>
130
- <td>
131
- <input name="aiowps_enable_basic_firewall" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_basic_firewall')=='1') echo ' checked="checked"'; ?> value="1"/>
132
- <span class="description"><?php _e('Check this if you want to apply basic firewall protection to your site.', 'aiowpsecurity'); ?></span>
133
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
134
- <div class="aiowps_more_info_body">
135
- <?php
136
- echo '<p class="description">'.__('This setting will implement the following basic firewall protection mechanisms on your site:', 'aiowpsecurity').'</p>';
137
- echo '<p class="description">'.__('1) Protect your htaccess file by denying access to it.', 'aiowpsecurity').'</p>';
138
- echo '<p class="description">'.__('2) Disable the server signature.', 'aiowpsecurity').'</p>';
139
- echo '<p class="description">'.__('3) Limit file upload size (10MB).', 'aiowpsecurity').'</p>';
140
- echo '<p class="description">'.__('4) Protect your wp-config.php file by denying access to it.', 'aiowpsecurity').'</p>';
141
- echo '<p class="description">'.__('The above firewall features will be applied via your .htaccess file and should not affect your site\'s overall functionality.', 'aiowpsecurity').'</p>';
142
- echo '<p class="description">'.__('You are still advised to take a backup of your active .htaccess file just in case.', 'aiowpsecurity').'</p>';
143
- ?>
144
- </div>
145
- </td>
146
- </tr>
147
- </table>
148
- <input type="submit" name="aiowps_apply_basic_firewall_settings" value="<?php _e('Save Basic Firewall Settings', 'aiowpsecurity')?>" class="button-primary" />
149
- </form>
150
- </div></div>
151
- <?php
152
- }
153
-
154
- function render_tab2()
155
- {
156
- global $aio_wp_security;
157
- if(isset($_POST['aiowps_apply_additional_firewall_settings']))//Do advanced firewall submission tasks
158
- {
159
- $nonce=$_REQUEST['_wpnonce'];
160
- if (!wp_verify_nonce($nonce, 'aiowpsec-enable-additional-firewall-nonce'))
161
- {
162
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on enable advanced firewall settings!",4);
163
- die("Nonce check failed on enable advanced firewall settings!");
164
- }
165
-
166
- //Save settings
167
- if(isset($_POST['aiowps_disable_trace_and_track']))
168
- {
169
- $aio_wp_security->configs->set_value('aiowps_disable_trace_and_track','1');
170
- }
171
- else
172
- {
173
- $aio_wp_security->configs->set_value('aiowps_disable_trace_and_track','');
174
- }
175
-
176
- if(isset($_POST['aiowps_forbid_proxy_comments']))
177
- {
178
- $aio_wp_security->configs->set_value('aiowps_forbid_proxy_comments','1');
179
- }
180
- else
181
- {
182
- $aio_wp_security->configs->set_value('aiowps_forbid_proxy_comments','');
183
- }
184
-
185
- if(isset($_POST['aiowps_deny_bad_query_strings']))
186
- {
187
- $aio_wp_security->configs->set_value('aiowps_deny_bad_query_strings','1');
188
- }
189
- else
190
- {
191
- $aio_wp_security->configs->set_value('aiowps_deny_bad_query_strings','');
192
- }
193
-
194
- if(isset($_POST['aiowps_advanced_char_string_filter']))
195
- {
196
- $aio_wp_security->configs->set_value('aiowps_advanced_char_string_filter','1');
197
- }
198
- else
199
- {
200
- $aio_wp_security->configs->set_value('aiowps_advanced_char_string_filter','');
201
- }
202
-
203
- //Commit the config settings
204
- $aio_wp_security->configs->save_config();
205
-
206
- //Now let's write the applicable rules to the .htaccess file
207
- $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess();
208
-
209
- if ($res)
210
- {
211
- $this->show_msg_updated(__('You have successfully saved the Additional Firewall Protection configuration', 'aiowpsecurity'));
212
- }
213
- else if($res == -1)
214
- {
215
- $this->show_msg_error(__('Could not write to the .htaccess file. Please check the file permissions.', 'aiowpsecurity'));
216
- }
217
-
218
- }
219
- ?>
220
- <h2><?php _e('Additional Firewall Protection', 'aiowpsecurity')?></h2>
221
- <div class="aio_blue_box">
222
- <?php
223
- $backup_tab_link = '<a href="admin.php?page='.AIOWPSEC_SETTINGS_MENU_SLUG.'&tab=tab2" target="_blank">backup</a>';
224
- $info_msg = sprintf( __('Due to the nature of the code being inserted to the .htaccess file, this feature may break some functionality for certain plugins and you are therefore advised to take a %s of .htaccess before applying this configuration.', 'aiowpsecurity'), $backup_tab_link);
225
-
226
- echo '<p>'.__('This feature allows you to activate more advanced firewall settings to your site.', 'aiowpsecurity').
227
- '<br />'.__('The advanced firewall rules are applied via the insertion of special code to your currently active .htaccess file.', 'aiowpsecurity').
228
- '<br />'.$info_msg.'</p>';
229
- ?>
230
- </div>
231
-
232
- <form action="" method="POST">
233
- <?php wp_nonce_field('aiowpsec-enable-additional-firewall-nonce'); ?>
234
-
235
- <div class="postbox">
236
- <h3><label for="title"><?php _e('Trace and Track', 'aiowpsecurity'); ?></label></h3>
237
- <div class="inside">
238
- <?php
239
- //Display security info badge
240
- global $aiowps_feature_mgr;
241
- $aiowps_feature_mgr->output_feature_details_badge("firewall-disable-trace-track");
242
- ?>
243
- <table class="form-table">
244
- <tr valign="top">
245
- <th scope="row"><?php _e('Disable Trace and Track', 'aiowpsecurity')?>:</th>
246
- <td>
247
- <input name="aiowps_disable_trace_and_track" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_disable_trace_and_track')=='1') echo ' checked="checked"'; ?> value="1"/>
248
- <span class="description"><?php _e('Check this if you want to disable trace and track.', 'aiowpsecurity'); ?></span>
249
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
250
- <div class="aiowps_more_info_body">
251
- <p class="description">
252
- <?php
253
- _e('HTTP Trace attack (XST) can be used to return header requests and grab cookies and other information.', 'aiowpsecurity');
254
- echo '<br />';
255
- _e('This hacking technique is usually used together with cross site scripting attacks (XSS).', 'aiowpsecurity');
256
- echo '<br />';
257
- _e('Disabling trace and track on your site will help prevent HTTP Trace attacks.', 'aiowpsecurity');
258
- ?>
259
- </p>
260
- </div>
261
- </td>
262
- </tr>
263
- </table>
264
- </div></div>
265
- <div class="postbox">
266
- <h3><label for="title"><?php _e('Proxy Comment Posting', 'aiowpsecurity'); ?></label></h3>
267
- <div class="inside">
268
- <?php
269
- //Display security info badge
270
- global $aiowps_feature_mgr;
271
- $aiowps_feature_mgr->output_feature_details_badge("firewall-forbid-proxy-comments");
272
- ?>
273
-
274
- <table class="form-table">
275
- <tr valign="top">
276
- <th scope="row"><?php _e('Forbid Proxy Comment Posting', 'aiowpsecurity')?>:</th>
277
- <td>
278
- <input name="aiowps_forbid_proxy_comments" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_forbid_proxy_comments')=='1') echo ' checked="checked"'; ?> value="1"/>
279
- <span class="description"><?php _e('Check this if you want to forbid proxy comment posting.', 'aiowpsecurity'); ?></span>
280
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
281
- <div class="aiowps_more_info_body">
282
- <p class="description">
283
- <?php
284
- _e('This setting will deny any requests that use a proxy server when posting comments.', 'aiowpsecurity');
285
- echo '<br />'.__('By forbidding proxy comments you are in effect eliminating some SPAM and other proxy requests.', 'aiowpsecurity');
286
- ?>
287
- </p>
288
- </div>
289
- </td>
290
- </tr>
291
- </table>
292
- </div></div>
293
- <div class="postbox">
294
- <h3><label for="title"><?php _e('Bad Query Strings', 'aiowpsecurity'); ?></label></h3>
295
- <div class="inside">
296
- <?php
297
- //Display security info badge
298
- global $aiowps_feature_mgr;
299
- $aiowps_feature_mgr->output_feature_details_badge("firewall-deny-bad-queries");
300
- ?>
301
-
302
- <table class="form-table">
303
- <tr valign="top">
304
- <th scope="row"><?php _e('Deny Bad Query Strings', 'aiowpsecurity')?>:</th>
305
- <td>
306
- <input name="aiowps_deny_bad_query_strings" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_deny_bad_query_strings')=='1') echo ' checked="checked"'; ?> value="1"/>
307
- <span class="description"><?php _e('This will help protect you against malicious queries via XSS.', 'aiowpsecurity'); ?></span>
308
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
309
- <div class="aiowps_more_info_body">
310
- <p class="description">
311
- <?php
312
- _e('This feature will write rules in your .htaccess file to prevent malicious string attacks on your site using XSS.', 'aiowpsecurity');
313
- echo '<br />'.__('NOTE: Some of these strings might be used for plugins or themes and hence this might break some functionality.', 'aiowpsecurity');
314
- echo '<br /><strong>'.__('You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature.', 'aiowpsecurity').'<strong>';
315
- ?>
316
- </p>
317
- </div>
318
- </td>
319
- </tr>
320
- </table>
321
- </div></div>
322
- <div class="postbox">
323
- <h3><label for="title"><?php _e('Advanced Character String Filter', 'aiowpsecurity'); ?></label></h3>
324
- <div class="inside">
325
- <?php
326
- //Display security info badge
327
- global $aiowps_feature_mgr;
328
- $aiowps_feature_mgr->output_feature_details_badge("firewall-advanced-character-string-filter");
329
- ?>
330
-
331
- <table class="form-table">
332
- <tr valign="top">
333
- <th scope="row"><?php _e('Enable Advanced Character String Filter', 'aiowpsecurity')?>:</th>
334
- <td>
335
- <input name="aiowps_advanced_char_string_filter" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_advanced_char_string_filter')=='1') echo ' checked="checked"'; ?> value="1"/>
336
- <span class="description"><?php _e('This will block bad character matches from XSS.', 'aiowpsecurity'); ?></span>
337
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
338
- <div class="aiowps_more_info_body">
339
- <p class="description">
340
- <?php
341
- _e('This is an advanced character string filter to prevent malicious string attacks on your site coming from Cross Site Scripting (XSS).', 'aiowpsecurity');
342
- echo '<br />'.__('This setting matches for common malicious string patterns and exploits and will produce a 403 error for the hacker attempting the query.', 'aiowpsecurity');
343
- echo '<br />'.__('NOTE: Some strings for this setting might break some functionality.', 'aiowpsecurity');
344
- echo '<br /><strong>'.__('You are therefore strongly advised to take a backup of your active .htaccess file before applying this feature.', 'aiowpsecurity').'<strong>';
345
- ?>
346
- </p>
347
- </div>
348
- </td>
349
- </tr>
350
- </table>
351
- </div></div>
352
- <input type="submit" name="aiowps_apply_additional_firewall_settings" value="<?php _e('Save Additional Firewall Settings', 'aiowpsecurity')?>" class="button-primary" />
353
- </form>
354
- <?php
355
- }
356
-
357
- function render_tab3()
358
- {
359
- global $aio_wp_security;
360
- if(isset($_POST['aiowps_apply_5g_firewall_settings']))//Do form submission tasks
361
- {
362
- $nonce=$_REQUEST['_wpnonce'];
363
- if (!wp_verify_nonce($nonce, 'aiowpsec-enable-5g-firewall-nonce'))
364
- {
365
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on enable 5G firewall settings!",4);
366
- die("Nonce check failed on enable 5G firewall settings!");
367
- }
368
-
369
- //Save settings
370
- if(isset($_POST['aiowps_enable_5g_firewall']))
371
- {
372
- $aio_wp_security->configs->set_value('aiowps_enable_5g_firewall','1');
373
- }
374
- else
375
- {
376
- $aio_wp_security->configs->set_value('aiowps_enable_5g_firewall','');
377
- }
378
-
379
- //Commit the config settings
380
- $aio_wp_security->configs->save_config();
381
-
382
- //Now let's write the applicable rules to the .htaccess file
383
- $res = AIOWPSecurity_Utility_Htaccess::write_to_htaccess();
384
-
385
- if ($res)
386
- {
387
- $this->show_msg_updated(__('You have successfully saved the 5G Firewall Protection configuration', 'aiowpsecurity'));
388
- }
389
- else if($res == -1)
390
- {
391
- $this->show_msg_error(__('Could not write to the .htaccess file. Please check the file permissions.', 'aiowpsecurity'));
392
- }
393
- }
394
-
395
- ?>
396
- <h2><?php _e('Firewall Settings', 'aiowpsecurity')?></h2>
397
- <div class="aio_blue_box">
398
- <?php
399
- $backup_tab_link = '<a href="admin.php?page='.AIOWPSEC_SETTINGS_MENU_SLUG.'&tab=tab2" target="_blank">backup</a>';
400
- $info_msg = '<p>'.sprintf( __('This feature allows you to activate the 5G firewall security protection rules designed and produced by %s.', 'aiowpsecurity'), '<a href="http://perishablepress.com/5g-blacklist-2013/" target="_blank">Perishable Press</a>').'</p>';
401
- $info_msg .= '<p>'.__('The 5G Blacklist is a simple, flexible blacklist that helps reduce the number of malicious URL requests that hit your website.', 'aiowpsecurity').'</p>';
402
- $info_msg .= '<p>'.__('The added advantage of applying the 5G firewall to your site is that it has been tested and confirmed by the people at PerishablePress.com to be an optimal and least disruptive set of .htaccess security rules for general WP sites running on an Apache server or similar.', 'aiowpsecurity').'</p>';
403
- $info_msg .= '<p>'.sprintf( __('Therefore the 5G firewall rules should not have any impact on your site\'s general functionality but if you wish you can take a %s of your .htaccess file before proceeding.', 'aiowpsecurity'), $backup_tab_link).'</p>';
404
- echo $info_msg;
405
- ?>
406
- </div>
407
-
408
- <div class="postbox">
409
- <h3><label for="title"><?php _e('5G Blacklist/Firewall Settings', 'aiowpsecurity'); ?></label></h3>
410
- <div class="inside">
411
- <?php
412
- //Display security info badge
413
- global $aiowps_feature_mgr;
414
- $aiowps_feature_mgr->output_feature_details_badge("firewall-enable-5g-blacklist");
415
- ?>
416
-
417
- <form action="" method="POST">
418
- <?php wp_nonce_field('aiowpsec-enable-5g-firewall-nonce'); ?>
419
- <table class="form-table">
420
- <tr valign="top">
421
- <th scope="row"><?php _e('Enable 5G Firewall Protection', 'aiowpsecurity')?>:</th>
422
- <td>
423
- <input name="aiowps_enable_5g_firewall" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_5g_firewall')=='1') echo ' checked="checked"'; ?> value="1"/>
424
- <span class="description"><?php _e('Check this if you want to apply the 5G Blacklist firewall protection from perishablepress.com to your site.', 'aiowpsecurity'); ?></span>
425
- <span class="aiowps_more_info_anchor"><span class="aiowps_more_info_toggle_char">+</span><span class="aiowps_more_info_toggle_text"><?php _e('More Info', 'aiowpsecurity'); ?></span></span>
426
- <div class="aiowps_more_info_body">
427
- <?php
428
- echo '<p class="description">'.__('This setting will implement the 5G security firewall protection mechanisms on your site which include the following things:', 'aiowpsecurity').'</p>';
429
- echo '<p class="description">'.__('1) Block forbidden characters commonly used in exploitative attacks.', 'aiowpsecurity').'</p>';
430
- echo '<p class="description">'.__('2) Block malicious encoded URL characters such as the ".css(" string.', 'aiowpsecurity').'</p>';
431
- echo '<p class="description">'.__('3) Guard against the common patterns and specific exploits in the root portion of targeted URLs.', 'aiowpsecurity').'</p>';
432
- echo '<p class="description">'.__('4) Stop attackers from manipulating query strings by disallowing illicit characters.', 'aiowpsecurity').'</p>';
433
- echo '<p class="description">'.__('....and much more.', 'aiowpsecurity').'</p>';
434
- ?>
435
- </div>
436
- </td>
437
- </tr>
438
- </table>
439
- <input type="submit" name="aiowps_apply_5g_firewall_settings" value="<?php _e('Save 5G Firewall Settings', 'aiowpsecurity')?>" class="button-primary" />
440
- </form>
441
- </div></div>
442
- <?php
443
- }
444
-
445
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-list-acct-activity.php DELETED
@@ -1,159 +0,0 @@
1
- <?php
2
- class AIOWPSecurity_List_Account_Activity extends AIOWPSecurity_List_Table {
3
-
4
- function __construct(){
5
- global $status, $page;
6
-
7
- //Set parent defaults
8
- parent::__construct( array(
9
- 'singular' => 'item', //singular name of the listed records
10
- 'plural' => 'items', //plural name of the listed records
11
- 'ajax' => false //does this table support ajax?
12
- ) );
13
-
14
- }
15
-
16
- function column_default($item, $column_name){
17
- return $item[$column_name];
18
- }
19
-
20
- function column_user_id($item){
21
- $tab = strip_tags($_REQUEST['tab']);
22
- //Build row actions
23
- $actions = array(
24
- 'delete' => sprintf('<a href="admin.php?page=%s&tab=%s&action=%s&activity_login_rec=%s" onclick="return confirm(\'Are you sure you want to delete this item?\')">Delete</a>',AIOWPSEC_USER_LOGIN_MENU_SLUG,$tab,'delete_acct_activity_rec',$item['id']),
25
- );
26
-
27
- //Return the user_login contents
28
- return sprintf('%1$s <span style="color:silver"></span>%2$s',
29
- /*$1%s*/ $item['user_id'],
30
- /*$2%s*/ $this->row_actions($actions)
31
- );
32
- }
33
-
34
-
35
- function column_cb($item){
36
- return sprintf(
37
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
38
- /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label
39
- /*$2%s*/ $item['id'] //The value of the checkbox should be the record's id
40
- );
41
- }
42
-
43
- function get_columns(){
44
- $columns = array(
45
- 'cb' => '<input type="checkbox" />', //Render a checkbox
46
- 'user_id' => 'User ID',
47
- 'user_login' => 'Username',
48
- 'login_date' => 'Login Date',
49
- 'logout_date' => 'Logout Date',
50
- 'login_ip' => 'IP'
51
- );
52
- return $columns;
53
- }
54
-
55
- function get_sortable_columns() {
56
- $sortable_columns = array(
57
- 'user_id' => array('user_id',false),
58
- 'user_login' => array('user_login',false),
59
- 'login_date' => array('login_date',false),
60
- 'login_ip' => array('login_ip',false),
61
- 'logout_date' => array('logout_date',false),
62
- );
63
- return $sortable_columns;
64
- }
65
-
66
- function get_bulk_actions() {
67
- $actions = array(
68
- 'delete' => 'Delete'
69
- );
70
- return $actions;
71
- }
72
-
73
- function process_bulk_action() {
74
- if('delete'===$this->current_action())
75
- {//Process delete bulk actions
76
- if(!isset($_REQUEST['item']))
77
- {
78
- $error_msg = '<div id="message" class="error"><p><strong>';
79
- $error_msg .= __('Please select some records using the checkboxes','aiowpsecurity');
80
- $error_msg .= '</strong></p></div>';
81
- _e($error_msg);
82
- } else{
83
- $this->delete_login_activity_records(($_REQUEST['item']));
84
- }
85
- }
86
- }
87
-
88
-
89
-
90
- /*
91
- * This function will delete selected records from the "user_login_activity" table.
92
- * The function accepts either an array of IDs or a single ID
93
- */
94
- function delete_login_activity_records($entries)
95
- {
96
- global $wpdb;
97
- $login_activity_table = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
98
- if (is_array($entries))
99
- {
100
- //Delete multiple records
101
- $id_list = "(" .implode(",",$entries) .")"; //Create comma separate list for DB operation
102
- $delete_command = "DELETE FROM ".$login_activity_table." WHERE id IN ".$id_list;
103
- $result = $wpdb->query($delete_command);
104
- if($result != NULL)
105
- {
106
- $success_msg = '<div id="message" class="updated fade"><p><strong>';
107
- $success_msg .= __('The selected entries were deleted successfully!','aiowpsecurity');
108
- $success_msg .= '</strong></p></div>';
109
- _e($success_msg);
110
- }
111
- }
112
- elseif ($entries != NULL)
113
- {
114
- //Delete single record
115
- $delete_command = "DELETE FROM ".$login_activity_table." WHERE id = '".absint($entries)."'";
116
- $result = $wpdb->query($delete_command);
117
- if($result != NULL)
118
- {
119
- $success_msg = '<div id="message" class="updated fade"><p><strong>';
120
- $success_msg .= __('The selected entry was deleted successfully!','aiowpsecurity');
121
- $success_msg .= '</strong></p></div>';
122
- _e($success_msg);
123
- }
124
- }
125
- }
126
-
127
- function prepare_items() {
128
- /**
129
- * First, lets decide how many records per page to show
130
- */
131
- $per_page = 20;
132
- $columns = $this->get_columns();
133
- $hidden = array();
134
- $sortable = $this->get_sortable_columns();
135
-
136
- $this->_column_headers = array($columns, $hidden, $sortable);
137
-
138
- $this->process_bulk_action();
139
-
140
- global $wpdb;
141
- $login_activity_table = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
142
-
143
- /* -- Ordering parameters -- */
144
- //Parameters that are going to be used to order the result
145
- $orderby = !empty($_GET["orderby"]) ? mysql_real_escape_string($_GET["orderby"]) : 'login_date';
146
- $order = !empty($_GET["order"]) ? mysql_real_escape_string($_GET["order"]) : 'DESC';
147
-
148
- $data = $wpdb->get_results("SELECT * FROM $login_activity_table ORDER BY $orderby $order LIMIT 50", ARRAY_A); //Get the last 50 records
149
- $current_page = $this->get_pagenum();
150
- $total_items = count($data);
151
- $data = array_slice($data,(($current_page-1)*$per_page),$per_page);
152
- $this->items = $data;
153
- $this->set_pagination_args( array(
154
- 'total_items' => $total_items, //WE have to calculate the total number of items
155
- 'per_page' => $per_page, //WE have to determine how many items to show on a page
156
- 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages
157
- ) );
158
- }
159
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-list-comment-spammer-ip.php DELETED
@@ -1,195 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_List_Comment_Spammer_IP extends AIOWPSecurity_List_Table {
4
-
5
- function __construct(){
6
- global $status, $page;
7
-
8
- //Set parent defaults
9
- parent::__construct( array(
10
- 'singular' => 'item', //singular name of the listed records
11
- 'plural' => 'items', //plural name of the listed records
12
- 'ajax' => false //does this table support ajax?
13
- ) );
14
-
15
- }
16
-
17
- function column_default($item, $column_name){
18
- return $item[$column_name];
19
- }
20
-
21
- function column_comment_author_IP($item){
22
- $tab = strip_tags($_REQUEST['tab']);
23
- //Build row actions
24
- $actions = array(
25
- 'block' => sprintf('<a href="admin.php?page=%s&tab=%s&action=%s&spammer_ip=%s" onclick="return confirm(\'Are you sure you want to add this IP address to your blacklist?\')">Block</a>',AIOWPSEC_BLACKLIST_MENU_SLUG,$tab,'block_spammer_ip',$item['comment_author_IP']),
26
- );
27
-
28
- //Return the user_login contents
29
- return sprintf('%1$s <span style="color:silver"></span>%2$s',
30
- /*$1%s*/ $item['comment_author_IP'],
31
- /*$2%s*/ $this->row_actions($actions)
32
- );
33
- }
34
-
35
-
36
- function column_cb($item){
37
- return sprintf(
38
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
39
- /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label
40
- /*$2%s*/ $item['comment_author_IP'] //The value of the checkbox should be the record's id
41
- );
42
- }
43
-
44
- function get_columns(){
45
- $columns = array(
46
- 'cb' => '<input type="checkbox" />', //Render a checkbox
47
- 'comment_author_IP' => 'Spammer IP',
48
- 'amount' => 'Number of SPAM Comments From This IP',
49
- );
50
- return $columns;
51
- }
52
-
53
- function get_sortable_columns() {
54
- $sortable_columns = array(
55
- 'comment_author_IP' => array('comment_author_IP',false),
56
- 'amount' => array('amount',false),
57
- );
58
- return $sortable_columns;
59
- }
60
-
61
- function get_bulk_actions() {
62
- $actions = array(
63
- 'block' => 'Block'
64
- );
65
- return $actions;
66
- }
67
-
68
- function process_bulk_action() {
69
- global $aio_wp_security;
70
- if('block'===$this->current_action())
71
- {
72
- //Process block bulk actions
73
- if(!isset($_REQUEST['item']))
74
- {
75
- $error_msg = '<div id="message" class="error"><p><strong>';
76
- $error_msg .= __('Please select some records using the checkboxes','aiowpsecurity');
77
- $error_msg .= '</strong></p></div>';
78
- _e($error_msg);
79
- } else {
80
- $this->block_spammer_ip_records(($_REQUEST['item']));
81
- }
82
- }
83
- }
84
-
85
-
86
-
87
- /*
88
- * This function will add the selected IP addresses to the blacklist.
89
- * The function accepts either an array of IDs or a single ID
90
- */
91
- function block_spammer_ip_records($entries)
92
- {
93
- global $wpdb, $aio_wp_security;
94
- $raw_banned_ip_list = $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses');
95
- $currently_banned_ips = explode(PHP_EOL, $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'));
96
- if (is_array($entries))
97
- {
98
- //Bulk selection using checkboxes were used
99
- foreach ($entries as $ip_add)
100
- {
101
- if (!empty($currently_banned_ips) && !(sizeof($currently_banned_ips) == 1 && trim($currently_banned_ips[0]) == ''))
102
- {
103
- //Check if the IP address is already in the blacklist. If not add it to the list.
104
- if (!in_array($ip_add, $currently_banned_ips))
105
- {
106
- $raw_banned_ip_list .= PHP_EOL.$ip_add;
107
- }
108
- }
109
- else
110
- {
111
- //if blacklist is currently empty just add all IP addresses to the list regardless
112
- $raw_banned_ip_list .= PHP_EOL.$ip_add;
113
- }
114
- }
115
- }
116
- else if ($entries != NULL)
117
- {
118
- //individual entry where "block" link was clicked
119
- //Check if the IP address is already in the blacklist. If not add it to the list.
120
- if (!in_array($entries, $currently_banned_ips))
121
- {
122
- $raw_banned_ip_list .= PHP_EOL.$entries;
123
- }
124
- }
125
-
126
- //Let's save the selected IP addresses to the blacklist config
127
- $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses',$raw_banned_ip_list); //Save the blocked IP address config variable with the newly added addresses
128
- $aio_wp_security->configs->save_config();
129
- AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP addresses were saved in the blacklist configuration settings.','aiowpsecurity'));
130
-
131
- //Let's check if the Enable Blacklisting flag has been set - If so, we will write the new data to the .htaccess file.
132
- if($aio_wp_security->configs->get_value('aiowps_enable_blacklisting')=='1')
133
- {
134
- $write_result = AIOWPSecurity_Utility_Htaccess::write_to_htaccess();
135
- if ($write_result == -1)
136
- {
137
- AIOWPSecurity_Admin_Menu::show_msg_error_st(__('The plugin was unable to write to the .htaccess file. Please edit file manually.','aiowpsecurity'));
138
- $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_Blacklist_Menu - The plugin was unable to write to the .htaccess file.");
139
- }
140
- else
141
- {
142
-
143
- AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The .htaccess file was successfully modified to include the selected IP addresses.','aiowpsecurity'));
144
- }
145
- }
146
- else
147
- {
148
- $blacklist_settings_link = '<a href="admin.php?page='.AIOWPSEC_BLACKLIST_MENU_SLUG.'">Ban Users</a>';
149
- $info_msg = '<p>'.__('NOTE: The .htaccess file was not modified because you have disabled the "Enable IP or User Agent Blacklisting" check box.', 'aiowpsecurity').
150
- '<br />'.sprintf( __('To block these IP addresses you will need to enable the above flag in the %s menu', 'aiowpsecurity'), $blacklist_settings_link).'</p>';
151
- AIOWPSecurity_Admin_Menu::show_msg_updated_st($info_msg);
152
- }
153
- }
154
-
155
- function prepare_items() {
156
- //First, lets decide how many records per page to show
157
- $per_page = 20;
158
- $columns = $this->get_columns();
159
- $hidden = array();
160
- $sortable = $this->get_sortable_columns();
161
-
162
- $this->_column_headers = array($columns, $hidden, $sortable);
163
-
164
- $this->process_bulk_action();
165
-
166
- global $wpdb;
167
- global $aio_wp_security;
168
- $minimum_comments_per_ip = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments');
169
- if(empty($minimum_comments_per_ip)){
170
- $minimum_comments_per_ip = 5;
171
- }
172
- /* -- Ordering parameters -- */
173
- //Parameters that are going to be used to order the result
174
- $orderby = !empty($_GET["orderby"]) ? mysql_real_escape_string($_GET["orderby"]) : 'amount';
175
- $order = !empty($_GET["order"]) ? mysql_real_escape_string($_GET["order"]) : 'DESC';
176
-
177
- $sql = "SELECT comment_author_IP, COUNT(*) AS amount
178
- FROM $wpdb->comments
179
- WHERE comment_approved = 'spam'
180
- GROUP BY comment_author_IP
181
- HAVING amount >= $minimum_comments_per_ip
182
- ORDER BY $orderby $order
183
- ";
184
- $data = $wpdb->get_results($sql, ARRAY_A);
185
- $current_page = $this->get_pagenum();
186
- $total_items = count($data);
187
- $data = array_slice($data,(($current_page-1)*$per_page),$per_page);
188
- $this->items = $data;
189
- $this->set_pagination_args( array(
190
- 'total_items' => $total_items, //WE have to calculate the total number of items
191
- 'per_page' => $per_page, //WE have to determine how many items to show on a page
192
- 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages
193
- ));
194
- }
195
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-list-locked-ip.php DELETED
@@ -1,194 +0,0 @@
1
- <?php
2
- class AIOWPSecurity_List_Locked_IP extends AIOWPSecurity_List_Table {
3
-
4
- function __construct(){
5
- global $status, $page;
6
-
7
- //Set parent defaults
8
- parent::__construct( array(
9
- 'singular' => 'item', //singular name of the listed records
10
- 'plural' => 'items', //plural name of the listed records
11
- 'ajax' => false //does this table support ajax?
12
- ) );
13
-
14
- }
15
-
16
- function column_default($item, $column_name){
17
- return $item[$column_name];
18
- }
19
-
20
- function column_failed_login_ip($item){
21
- $tab = strip_tags($_REQUEST['tab']);
22
- //Build row actions
23
- $actions = array(
24
- 'unlock' => sprintf('<a href="admin.php?page=%s&tab=%s&action=%s&lockdown_id=%s" onclick="return confirm(\'Are you sure you want to unlock this address range?\')">Unlock</a>',AIOWPSEC_USER_LOGIN_MENU_SLUG,$tab,'unlock_ip',$item['id']),
25
- 'delete' => sprintf('<a href="admin.php?page=%s&tab=%s&action=%s&lockdown_id=%s" onclick="return confirm(\'Are you sure you want to delete this item?\')">Delete</a>',AIOWPSEC_USER_LOGIN_MENU_SLUG,$tab,'delete_blocked_ip',$item['id']),
26
- );
27
-
28
- //Return the user_login contents
29
- return sprintf('%1$s <span style="color:silver"></span>%2$s',
30
- /*$1%s*/ $item['failed_login_ip'],
31
- /*$2%s*/ $this->row_actions($actions)
32
- );
33
- }
34
-
35
-
36
- function column_cb($item){
37
- return sprintf(
38
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
39
- /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label
40
- /*$2%s*/ $item['id'] //The value of the checkbox should be the record's id
41
- );
42
- }
43
-
44
- function get_columns(){
45
- $columns = array(
46
- 'cb' => '<input type="checkbox" />', //Render a checkbox
47
- 'failed_login_ip' => 'Locked IP Range',
48
- 'user_id' => 'User ID',
49
- 'user_login' => 'Username',
50
- 'lockdown_date' => 'Date Locked',
51
- 'release_date' => 'Release Date'
52
- );
53
- return $columns;
54
- }
55
-
56
- function get_sortable_columns() {
57
- $sortable_columns = array(
58
- 'failed_login_ip' => array('failed_login_ip',false),
59
- 'user_id' => array('user_id',false),
60
- 'user_login' => array('user_login',false),
61
- 'lockdown_date' => array('lockdown_date',false),
62
- 'release_date' => array('release_date',false)
63
- );
64
- return $sortable_columns;
65
- }
66
-
67
- function get_bulk_actions() {
68
- $actions = array(
69
- 'unlock' => 'Unlock',
70
- 'delete' => 'Delete'
71
- );
72
- return $actions;
73
- }
74
-
75
- function process_bulk_action() {
76
- if('delete'===$this->current_action())
77
- {//Process delete bulk actions
78
- if(!isset($_REQUEST['item']))
79
- {
80
- AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes','aiowpsecurity'));
81
- }else
82
- {
83
- $this->delete_lockdown_records(($_REQUEST['item']));
84
- }
85
- }
86
-
87
- if('unlock'===$this->current_action())
88
- {//Process unlock bulk actions
89
- if(!isset($_REQUEST['item']))
90
- {
91
- AIOWPSecurity_Admin_Menu::show_msg_error_st(__('Please select some records using the checkboxes','aiowpsecurity'));
92
- }else
93
- {
94
- $this->unlock_ip_range(($_REQUEST['item']));
95
- }
96
- }
97
- }
98
-
99
-
100
- /*
101
- * This function will unlock an IP range by modifying the "release_date" column of a record in the "login_lockdown" table
102
- */
103
- function unlock_ip_range($entries)
104
- {
105
- global $wpdb;
106
- $lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
107
- if (is_array($entries))
108
- {
109
- //Unlock multiple records
110
- $id_list = "(" .implode(",",$entries) .")"; //Create comma separate list for DB operation
111
- $unlock_command = "UPDATE ".$lockdown_table." SET release_date = now() WHERE id IN ".$id_list;
112
- $result = $wpdb->query($unlock_command);
113
- if($result != NULL)
114
- {
115
- AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP ranges were unlocked successfully!','aiowpsecurity'));
116
- }
117
- } elseif ($entries != NULL)
118
- {
119
- //Delete single record
120
- $unlock_command = "UPDATE ".$lockdown_table." SET release_date = now() WHERE id = '".absint($entries)."'";
121
- $result = $wpdb->query($unlock_command);
122
- if($result != NULL)
123
- {
124
- AIOWPSecurity_Admin_Menu::show_msg_updated_st(__('The selected IP range was unlocked successfully!','aiowpsecurity'));
125
- }
126
- }
127
- }
128
-
129
- /*
130
- * This function will delete selected records from the "login_lockdown" table.
131
- * The function accepts either an array of IDs or a single ID
132
- */
133
- function delete_lockdown_records($entries)
134
- {
135
- global $wpdb;
136
- $lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
137
- if (is_array($entries))
138
- {
139
- //Delete multiple records
140
- $id_list = "(" .implode(",",$entries) .")"; //Create comma separate list for DB operation
141
- $delete_command = "DELETE FROM ".$lockdown_table." WHERE id IN ".$id_list;
142
- $result = $wpdb->query($delete_command);
143
- if($result != NULL)
144
- {
145
- AIOWPSecurity_Admin_Menu::show_msg_record_deleted_st();
146
- }
147
- }
148
- elseif ($entries != NULL)
149
- {
150
- //Delete single record
151
- $delete_command = "DELETE FROM ".$lockdown_table." WHERE id = '".absint($entries)."'";
152
- $result = $wpdb->query($delete_command);
153
- if($result != NULL)
154
- {
155
- AIOWPSecurity_Admin_Menu::show_msg_record_deleted_st();
156
- }
157
- }
158
- }
159
-
160
- function prepare_items() {
161
- /**
162
- * First, lets decide how many records per page to show
163
- */
164
- $per_page = 20;
165
- $columns = $this->get_columns();
166
- $hidden = array();
167
- $sortable = $this->get_sortable_columns();
168
-
169
- $this->_column_headers = array($columns, $hidden, $sortable);
170
-
171
- $this->process_bulk_action();
172
-
173
- global $wpdb;
174
- $lockdown_table_name = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
175
-
176
- /* -- Ordering parameters -- */
177
- //Parameters that are going to be used to order the result
178
- $orderby = !empty($_GET["orderby"]) ? mysql_real_escape_string($_GET["orderby"]) : 'lockdown_date';
179
- $order = !empty($_GET["order"]) ? mysql_real_escape_string($_GET["order"]) : 'DESC';
180
-
181
- $data = $wpdb->get_results("SELECT * FROM $lockdown_table_name WHERE release_date > now() ORDER BY $orderby $order", ARRAY_A);
182
- //$data = $wpdb->get_results("SELECT ID, floor((UNIX_TIMESTAMP(release_date)-UNIX_TIMESTAMP(now()))/60) AS minutes_left, ".
183
- // "failed_login_IP FROM $lockdown_table_name WHERE release_date > now()", ARRAY_A);
184
- $current_page = $this->get_pagenum();
185
- $total_items = count($data);
186
- $data = array_slice($data,(($current_page-1)*$per_page),$per_page);
187
- $this->items = $data;
188
- $this->set_pagination_args( array(
189
- 'total_items' => $total_items, //WE have to calculate the total number of items
190
- 'per_page' => $per_page, //WE have to determine how many items to show on a page
191
- 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages
192
- ) );
193
- }
194
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-list-login-fails.php DELETED
@@ -1,158 +0,0 @@
1
- <?php
2
- class AIOWPSecurity_List_Login_Failed_Attempts extends AIOWPSecurity_List_Table {
3
-
4
- function __construct(){
5
- global $status, $page;
6
-
7
- //Set parent defaults
8
- parent::__construct( array(
9
- 'singular' => 'item', //singular name of the listed records
10
- 'plural' => 'items', //plural name of the listed records
11
- 'ajax' => false //does this table support ajax?
12
- ) );
13
-
14
- }
15
-
16
- function column_default($item, $column_name){
17
- return $item[$column_name];
18
- }
19
-
20
- function column_login_attempt_ip($item){
21
- $tab = strip_tags($_REQUEST['tab']);
22
- //Build row actions
23
- $actions = array(
24
- 'delete' => sprintf('<a href="admin.php?page=%s&tab=%s&action=%s&failed_login_id=%s" onclick="return confirm(\'Are you sure you want to delete this item?\')">Delete</a>',AIOWPSEC_USER_LOGIN_MENU_SLUG,$tab,'delete_failed_login_rec',$item['id']),
25
- );
26
-
27
- //Return the user_login contents
28
- return sprintf('%1$s <span style="color:silver"></span>%2$s',
29
- /*$1%s*/ $item['login_attempt_ip'],
30
- /*$2%s*/ $this->row_actions($actions)
31
- );
32
- }
33
-
34
-
35
- function column_cb($item){
36
- return sprintf(
37
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
38
- /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label
39
- /*$2%s*/ $item['id'] //The value of the checkbox should be the record's id
40
- );
41
- }
42
-
43
- function get_columns(){
44
- $columns = array(
45
- 'cb' => '<input type="checkbox" />', //Render a checkbox
46
- 'login_attempt_ip' => 'Login IP Range',
47
- 'user_id' => 'User ID',
48
- 'user_login' => 'Username',
49
- 'failed_login_date' => 'Date'
50
- );
51
- return $columns;
52
- }
53
-
54
- function get_sortable_columns() {
55
- $sortable_columns = array(
56
- 'login_attempt_ip' => array('login_attempt_ip',false),
57
- 'user_id' => array('user_id',false),
58
- 'user_login' => array('user_login',false),
59
- 'failed_login_date' => array('failed_login_date',false),
60
- );
61
- return $sortable_columns;
62
- }
63
-
64
- function get_bulk_actions() {
65
- $actions = array(
66
- 'delete' => 'Delete'
67
- );
68
- return $actions;
69
- }
70
-
71
- function process_bulk_action() {
72
- global $aio_wp_security;
73
- if('delete'===$this->current_action())
74
- {//Process delete bulk actions
75
- if(!isset($_REQUEST['item']))
76
- {
77
- $error_msg = '<div id="message" class="error"><p><strong>';
78
- $error_msg .= __('Please select some records using the checkboxes','aiowpsecurity');
79
- $error_msg .= '</strong></p></div>';
80
- _e($error_msg);
81
- } else{
82
- $this->delete_login_failed_records(($_REQUEST['item']));
83
-
84
- }
85
- }
86
- }
87
-
88
-
89
-
90
- /*
91
- * This function will delete selected records from the "failed_logins" table.
92
- * The function accepts either an array of IDs or a single ID
93
- */
94
- function delete_login_failed_records($entries)
95
- {
96
- global $wpdb, $aio_wp_security;
97
- $failed_login_table = AIOWPSEC_TBL_FAILED_LOGINS;
98
- if (is_array($entries))
99
- {
100
- //Delete multiple records
101
- $id_list = "(" .implode(",",$entries) .")"; //Create comma separate list for DB operation
102
- $delete_command = "DELETE FROM ".$failed_login_table." WHERE ID IN ".$id_list;
103
- $result = $wpdb->query($delete_command);
104
- if($result != NULL)
105
- {
106
- $success_msg = '<div id="message" class="updated fade"><p><strong>';
107
- $success_msg .= __('The selected entries were deleted successfully!','aiowpsecurity');
108
- $success_msg .= '</strong></p></div>';
109
- _e($success_msg);
110
- }
111
- } elseif ($entries != NULL)
112
- {
113
- //Delete single record
114
- $delete_command = "DELETE FROM ".$failed_login_table." WHERE ID = '".absint($entries)."'";
115
- $result = $wpdb->query($delete_command);
116
- if($result != NULL)
117
- {
118
- $success_msg = '<div id="message" class="updated fade"><p><strong>';
119
- $success_msg .= __('The selected entry was deleted successfully!','aiowpsecurity');
120
- $success_msg .= '</strong></p></div>';
121
- _e($success_msg);
122
- }
123
- }
124
- }
125
-
126
- function prepare_items() {
127
- /**
128
- * First, lets decide how many records per page to show
129
- */
130
- $per_page = 20;
131
- $columns = $this->get_columns();
132
- $hidden = array();
133
- $sortable = $this->get_sortable_columns();
134
-
135
- $this->_column_headers = array($columns, $hidden, $sortable);
136
-
137
- $this->process_bulk_action();
138
-
139
- global $wpdb;
140
- $failed_logins_table_name = AIOWPSEC_TBL_FAILED_LOGINS;
141
-
142
- /* -- Ordering parameters -- */
143
- //Parameters that are going to be used to order the result
144
- $orderby = !empty($_GET["orderby"]) ? mysql_real_escape_string($_GET["orderby"]) : 'failed_login_date';
145
- $order = !empty($_GET["order"]) ? mysql_real_escape_string($_GET["order"]) : 'DESC';
146
-
147
- $data = $wpdb->get_results("SELECT * FROM $failed_logins_table_name ORDER BY $orderby $order", ARRAY_A);
148
- $current_page = $this->get_pagenum();
149
- $total_items = count($data);
150
- $data = array_slice($data,(($current_page-1)*$per_page),$per_page);
151
- $this->items = $data;
152
- $this->set_pagination_args( array(
153
- 'total_items' => $total_items, //WE have to calculate the total number of items
154
- 'per_page' => $per_page, //WE have to determine how many items to show on a page
155
- 'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages
156
- ) );
157
- }
158
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-settings-menu.php DELETED
@@ -1,433 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Settings_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_SETTINGS_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'General Settings',
10
- 'tab2' => '.htaccess File',
11
- 'tab3' => 'wp-config.php File',
12
- );
13
-
14
- var $menu_tabs_handler = array(
15
- 'tab1' => 'render_tab1',
16
- 'tab2' => 'render_tab2',
17
- 'tab3' => 'render_tab3',
18
- );
19
-
20
- function __construct()
21
- {
22
- $this->render_menu_page();
23
- }
24
-
25
- function get_current_tab()
26
- {
27
- $tab_keys = array_keys($this->menu_tabs);
28
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
29
- return $tab;
30
- }
31
-
32
- /*
33
- * Renders our tabs of this menu as nav items
34
- */
35
- function render_menu_tabs()
36
- {
37
- $current_tab = $this->get_current_tab();
38
-
39
- echo '<h2 class="nav-tab-wrapper">';
40
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
41
- {
42
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
43
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
44
- }
45
- echo '</h2>';
46
- }
47
-
48
- /*
49
- * The menu rendering goes here
50
- */
51
- function render_menu_page()
52
- {
53
- $tab = $this->get_current_tab();
54
- ?>
55
- <div class="wrap">
56
- <div id="poststuff"><div id="post-body">
57
- <?php
58
- $this->render_menu_tabs();
59
- //$tab_keys = array_keys($this->menu_tabs);
60
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
61
- ?>
62
- </div></div>
63
- </div><!-- end of wrap -->
64
- <?php
65
- }
66
-
67
- function render_tab1()
68
- {
69
- global $aio_wp_security;
70
- if(isset($_POST['aiowpsec_disable_all_features']))//Do form submission tasks
71
- {
72
- $nonce=$_REQUEST['_wpnonce'];
73
- if (!wp_verify_nonce($nonce, 'aiowpsec-disable-all-features'))
74
- {
75
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on disable all security features!",4);
76
- die("Nonce check failed on disable all security features!");
77
- }
78
- AIOWPSecurity_Configure_Settings::turn_off_all_security_features();
79
- $this->show_msg_updated(__('All the security features have been disabled successfully!', 'aiowpsecurity'));
80
- }
81
-
82
-
83
- ?>
84
- <div class="aio_grey_box">
85
- <p>For information, updates and documentation, please visit the <a href="http://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin" target="_blank">AIO WP Security & Firewall Plugin</a> Page.</p>
86
- <p><a href="http://www.tipsandtricks-hq.com/development-center" target="_blank">Follow us</a> on Twitter, Google+ or via Email to stay upto date about the new security features of this plugin.</p>
87
- </div>
88
-
89
- <div class="postbox">
90
- <h3><label for="title"><?php _e('WP Security Plugin', 'aiowpsecurity'); ?></label></h3>
91
- <div class="inside">
92
- <p><?php _e('Thank you for using our WordPress security plugin. There are a lot of security features in this plugin.', 'aiowpsecurity'); ?></p>
93
- <p><?php _e('Go through each menu items and enable the security options to add more security to your site.', 'aiowpsecurity'); ?></p>
94
- <p><?php _e('It is a good practice to take a backup of your .htaccess file, database and wp-config.php file before activating the security features. This plugin has options that you can use to backup those resources easily.', 'aiowpsecurity'); ?></p>
95
- <p>
96
- <ul class="aiowps_admin_ul_grp1">
97
- <li><a href="admin.php?page=aiowpsec_database&tab=tab2" target="_blank"><?php _e('Backup your database', 'aiowpsecurity'); ?></a></li>
98
- <li><a href="admin.php?page=aiowpsec_settings&tab=tab2" target="_blank"><?php _e('Backup .htaccess file', 'aiowpsecurity'); ?></a></li>
99
- <li><a href="admin.php?page=aiowpsec_settings&tab=tab3" target="_blank"><?php _e('Backup wp-config.php file', 'aiowpsecurity'); ?></a></li>
100
- </ul>
101
- </p>
102
- </div></div>
103
-
104
- <div class="postbox">
105
- <h3><label for="title"><?php _e('Disable Security Features', 'aiowpsecurity'); ?></label></h3>
106
- <div class="inside">
107
- <form method="post" action="<?php echo $_SERVER["REQUEST_URI"]; ?>">
108
- <?php wp_nonce_field('aiowpsec-disable-all-features'); ?>
109
- <div class="aio_blue_box">
110
- <?php
111
- echo '<p>'.__('If you think that some plugin functionality on your site is broken due to a security feature you enabled in this plugin, then use the following option to turn off all the security features of this plugin.', 'aiowpsecurity').'</p>';
112
- ?>
113
- </div>
114
- <div class="submit">
115
- <input type="submit" name="aiowpsec_disable_all_features" value="<?php _e('Disable All Security Features'); ?>" />
116
- </div>
117
- </form>
118
- </div></div>
119
- <?php
120
- }
121
-
122
- function render_tab2()
123
- {
124
- global $aio_wp_security;
125
-
126
- if(isset($_POST['aiowps_save_htaccess']))//Do form submission tasks
127
- {
128
- $nonce=$_REQUEST['_wpnonce'];
129
- if (!wp_verify_nonce($nonce, 'aiowpsec-save-htaccess-nonce'))
130
- {
131
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on htaccess file save!",4);
132
- die("Nonce check failed on htaccess file save!");
133
- }
134
- $htaccess_path = ABSPATH . '.htaccess';
135
- $result = AIOWPSecurity_Utility_File::backup_a_file($htaccess_path); //Backup the htaccess file
136
-
137
- if ($result)
138
- {
139
- if (rename(ABSPATH.'.htaccess.backup', ABSPATH.'htaccess_backup.txt'))
140
- {
141
- $backup_file_url = AIOWPSEC_WP_URL . '/htaccess_backup.txt';
142
- echo '<div id="message" class="updated fade"><p>';
143
- _e('Your .htaccess file was successfully backed up! Right click on the following file name and save the backup to your computer.','aiowpsecurity');
144
- echo '<p>';
145
- _e('Your .htaccess File: ');
146
- echo '<a href="'.$backup_file_url.'" target="_blank">'.$backup_file_url.'</a>';
147
- echo '</p>';
148
- echo '</p></div>';
149
- }
150
- else
151
- {
152
- $aio_wp_security->debug_logger->log_debug("htaccess file rename failed during backup!",4);
153
- $this->show_msg_error(__('htaccess file rename failed during backup. Please check your root directory for the backup file using FTP.','aiowpsecurity'));
154
- }
155
- }
156
- else
157
- {
158
- $aio_wp_security->debug_logger->log_debug("htaccess - Backup operation failed!",4);
159
- $this->show_msg_error(__('htaccess backup failed.','aiowpsecurity'));
160
- }
161
- }
162
-
163
- if(isset($_POST['aiowps_restore_htaccess_button']))//Do form submission tasks
164
- {
165
- $nonce=$_REQUEST['_wpnonce'];
166
- if (!wp_verify_nonce($nonce, 'aiowpsec-restore-htaccess-nonce'))
167
- {
168
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on htaccess file restore!",4);
169
- die("Nonce check failed on htaccess file restore!");
170
- }
171
-
172
- if (empty($_POST['aiowps_htaccess_file']))
173
- {
174
- $this->show_msg_error(__('Please choose a .htaccess to restore from.', 'aiowpsecurity'));
175
- }
176
- else
177
- {
178
- //Let's copy the uploaded .htaccess file into the active root file
179
- $new_htaccess_file_path = trim($_POST['aiowps_htaccess_file']);
180
- //TODO
181
- //Verify that file chosen has contents which are relevant to .htaccess file
182
- $is_htaccess = AIOWPSecurity_Utility_Htaccess::check_if_htaccess_contents($new_htaccess_file_path);
183
- if ($is_htaccess == 1)
184
- {
185
- $active_root_htaccess = ABSPATH.'.htaccess';
186
- if (!copy($new_htaccess_file_path, $active_root_htaccess))
187
- {
188
- //Failed to make a backup copy
189
- $aio_wp_security->debug_logger->log_debug("htaccess - Restore from .htaccess operation failed!",4);
190
- $this->show_msg_error(__('htaccess file restore failed. Please attempt to restore the .htaccess manually using FTP.','aiowpsecurity'));
191
- }
192
- else
193
- {
194
- $this->show_msg_updated(__('Your .htaccess file has successfully been restored!', 'aiowpsecurity'));
195
- }
196
- }
197
- else
198
- {
199
- $aio_wp_security->debug_logger->log_debug("htaccess restore failed - Contents of restore file appear invalid!",4);
200
- $this->show_msg_error(__('htaccess Restore operation failed! Please check the contents of the file you are trying to restore from.','aiowpsecurity'));
201
- }
202
- }
203
- }
204
-
205
- ?>
206
- <h2><?php _e('.htaccess File Operations', 'aiowpsecurity')?></h2>
207
- <div class="aio_blue_box">
208
- <?php
209
- echo '<p>'.__('Your ".htaccess" file is a key component of your website\'s security and it can be modified to implement various levels of protection mechanisms.', 'aiowpsecurity').'
210
- <br />'.__('This feature allows you to backup and save your currently active .htaccess file should you need to re-use the the backed up file in the future.', 'aiowpsecurity').'
211
- <br />'.__('You can also restore your site\'s .htaccess settings using a backed up .htaccess file.', 'aiowpsecurity').'
212
- </p>';
213
- ?>
214
- </div>
215
-
216
- <div class="postbox">
217
- <h3><label for="title"><?php _e('Save the current .htaccess file', 'aiowpsecurity'); ?></label></h3>
218
- <div class="inside">
219
- <form action="" method="POST">
220
- <?php wp_nonce_field('aiowpsec-save-htaccess-nonce'); ?>
221
- <p class="description"><?php _e('Click the button below to backup and save the currently active .htaccess file.', 'aiowpsecurity'); ?></p>
222
- <input type="submit" name="aiowps_save_htaccess" value="<?php _e('Backup .htaccess File', 'aiowpsecurity')?>" class="button-primary" />
223
- </form>
224
- </div></div>
225
- <div class="postbox">
226
- <h3><label for="title"><?php _e('Restore from a backed up .htaccess file', 'aiowpsecurity'); ?></label></h3>
227
- <div class="inside">
228
- <form action="" method="POST">
229
- <?php wp_nonce_field('aiowpsec-restore-htaccess-nonce'); ?>
230
- <table class="form-table">
231
- <tr valign="top">
232
- <th scope="row"><?php _e('.htaccess file to restore from', 'aiowpsecurity')?>:</th>
233
- <td>
234
- <input type="button" id="aiowps_htaccess_file_button" name="aiowps_htaccess_file_button" class="button rbutton" value="Select Your htaccess File" />
235
- <input name="aiowps_htaccess_file" type="text" id="aiowps_htaccess_file" value="" size="80" />
236
- <p class="description">
237
- <?php
238
- _e('After selecting your file, click the button below to restore your site using the backed up htaccess file (htaccess_backup.txt).', 'aiowpsecurity');
239
- ?>
240
- </p>
241
- </td>
242
- </tr>
243
- </table>
244
- <input type="submit" name="aiowps_restore_htaccess_button" value="<?php _e('Restore .htaccess File', 'aiowpsecurity')?>" class="button-primary" />
245
- </form>
246
- </div></div>
247
- <div class="postbox">
248
- <h3><label for="title"><?php _e('View Contents of the currently active .htaccess file', 'aiowpsecurity'); ?></label></h3>
249
- <div class="inside">
250
- <?php
251
- $ht_file = ABSPATH . '.htaccess';
252
- $ht_contents = AIOWPSecurity_Utility_File::get_file_contents($ht_file);
253
- //echo $ht_contents;
254
- ?>
255
- <textarea class="aio_text_area_file_output aio_half_width aio_spacer_10_tb" rows="15" readonly><?php echo $ht_contents; ?></textarea>
256
- </div></div>
257
-
258
- <?php
259
- }
260
-
261
- function render_tab3()
262
- {
263
- global $aio_wp_security;
264
-
265
- if(isset($_POST['aiowps_save_wp_config']))//Do form submission tasks
266
- {
267
- $nonce=$_REQUEST['_wpnonce'];
268
- if (!wp_verify_nonce($nonce, 'aiowpsec-save-wp-config-nonce'))
269
- {
270
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on wp_config file save!",4);
271
- die("Nonce check failed on wp_config file save!");
272
- }
273
- $wp_config_path = ABSPATH . 'wp-config.php';
274
- $result = AIOWPSecurity_Utility_File::backup_a_file($wp_config_path); //Backup the wp_config.php file
275
-
276
- if ($result)
277
- {
278
- if (rename(ABSPATH.'wp-config.php.backup', ABSPATH.'wp-config.php.backup.txt'))
279
- {
280
- $backup_file_url = AIOWPSEC_WP_URL . '/wp-config.php.backup.txt';
281
- echo '<div id="message" class="updated fade"><p>';
282
- _e('Your wp-config.php file was successfully backed up! Right click on the following file name and save the backup to your computer.','aiowpsecurity');
283
- echo '<p>';
284
- _e('Your wp-config.php File: ');
285
- echo '<a href="'.$backup_file_url.'" target="_blank">'.$backup_file_url.'</a>';
286
- echo '</p>';
287
- echo '</p></div>';
288
- }
289
- else
290
- {
291
- $aio_wp_security->debug_logger->log_debug("wp-config.php file rename failed during backup!",4);
292
- $this->show_msg_error(__('wp-config.php file rename failed during backup. Please check your root directory for the backup file using FTP.','aiowpsecurity'));
293
- }
294
- }
295
- else
296
- {
297
- $aio_wp_security->debug_logger->log_debug("wp-config.php - Backup operation failed!",4);
298
- $this->show_msg_error(__('wp-config.php backup failed.','aiowpsecurity'));
299
- }
300
- }
301
-
302
- if(isset($_POST['aiowps_restore_wp_config_button']))//Do form submission tasks
303
- {
304
- $nonce=$_REQUEST['_wpnonce'];
305
- if (!wp_verify_nonce($nonce, 'aiowpsec-restore-wp-config-nonce'))
306
- {
307
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on wp-config file restore!",4);
308
- die("Nonce check failed on wp-config file restore!");
309
- }
310
-
311
- if (empty($_POST['aiowps_wp_config_file']))
312
- {
313
- $this->show_msg_error(__('Please choose a wp-config.php file to restore from.', 'aiowpsecurity'));
314
- }
315
- else
316
- {
317
- //Let's copy the uploaded wp-config.php file into the active root file
318
- $new_wp_config_file_path = trim($_POST['aiowps_wp_config_file']);
319
- //TODO
320
- //Verify that file chosen has contents which are relevant to .htaccess file
321
- $is_wp_config = $this->check_if_wp_config_contents($new_wp_config_file_path); //TODO - write the function
322
- if ($is_wp_config == 1)
323
- {
324
- $active_root_wp_config = ABSPATH.'wp-config.php';
325
- if (!copy($new_wp_config_file_path, $active_root_wp_config))
326
- {
327
- //Failed to make a backup copy
328
- $aio_wp_security->debug_logger->log_debug("wp-config.php - Restore from backed up wp-config operation failed!",4);
329
- $this->show_msg_error(__('wp-config.php file restore failed. Please attempt to restore this file manually using FTP.','aiowpsecurity'));
330
- }
331
- else
332
- {
333
- $this->show_msg_updated(__('Your wp-config.php file has successfully been restored!', 'aiowpsecurity'));
334
- }
335
- }
336
- else
337
- {
338
- $aio_wp_security->debug_logger->log_debug("wp-config.php restore failed - Contents of restore file appear invalid!",4);
339
- $this->show_msg_error(__('wp-config.php Restore operation failed! Please check the contents of the file you are trying to restore from.','aiowpsecurity'));
340
- }
341
- }
342
- }
343
-
344
- ?>
345
- <h2><?php _e('wp-config.php File Operations', 'aiowpsecurity')?></h2>
346
- <div class="aio_blue_box">
347
- <?php
348
- echo '<p>'.__('Your "wp-config.php" file is one of the most important in your WordPress installation. It is a primary configuration file and contains crucial things such as details of your database and other critical components.', 'aiowpsecurity').'
349
- <br />'.__('This feature allows you to backup and save your currently active wp-config.php file should you need to re-use the the backed up file in the future.', 'aiowpsecurity').'
350
- <br />'.__('You can also restore your site\'s wp-config.php settings using a backed up wp-config.php file.', 'aiowpsecurity').'
351
- </p>';
352
- ?>
353
- </div>
354
-
355
- <div class="postbox">
356
- <h3><label for="title"><?php _e('Save the current wp-config.php file', 'aiowpsecurity'); ?></label></h3>
357
- <div class="inside">
358
- <form action="" method="POST">
359
- <?php wp_nonce_field('aiowpsec-save-wp-config-nonce'); ?>
360
- <p class="description"><?php _e('Click the button below to backup and save the currently active wp-config.php file.', 'aiowpsecurity'); ?></p>
361
- <input type="submit" name="aiowps_save_wp_config" value="<?php _e('Backup wp-config.php File', 'aiowpsecurity')?>" class="button-primary" />
362
- </form>
363
- </div></div>
364
- <div class="postbox">
365
- <h3><label for="title"><?php _e('Restore from a backed up wp-config file', 'aiowpsecurity'); ?></label></h3>
366
- <div class="inside">
367
- <form action="" method="POST">
368
- <?php wp_nonce_field('aiowpsec-restore-wp-config-nonce'); ?>
369
- <table class="form-table">
370
- <tr valign="top">
371
- <th scope="row"><?php _e('wp-config file to restore from', 'aiowpsecurity')?>:</th>
372
- <td>
373
- <input type="button" id="aiowps_wp_config_file_button" name="aiowps_wp_config_file_button" class="button rbutton" value="Select Your wp-config File" />
374
- <input name="aiowps_wp_config_file" type="text" id="aiowps_wp_config_file" value="" size="80" />
375
- <p class="description">
376
- <?php
377
- _e('After selecting your file click the button below to restore your site using the backed up wp-config file (wp-config.php.backup.txt).', 'aiowpsecurity');
378
- ?>
379
- </p>
380
- </td>
381
- </tr>
382
- </table>
383
- <input type="submit" name="aiowps_restore_wp_config_button" value="<?php _e('Restore wp-config File', 'aiowpsecurity')?>" class="button-primary" />
384
- </form>
385
- </div></div>
386
- <div class="postbox">
387
- <h3><label for="title"><?php _e('View Contents of the currently active wp-config.php file', 'aiowpsecurity'); ?></label></h3>
388
- <div class="inside">
389
- <?php
390
- $wp_config_file = ABSPATH . 'wp-config.php';
391
- $wp_config_contents = AIOWPSecurity_Utility_File::get_file_contents($wp_config_file);
392
- ?>
393
- <textarea class="aio_text_area_file_output aio_width_80 aio_spacer_10_tb" rows="20" readonly><?php echo $wp_config_contents; ?></textarea>
394
- </div></div>
395
-
396
- <?php
397
- }
398
-
399
- function check_if_wp_config_contents($wp_file)
400
- {
401
- $is_wp_config = false;
402
-
403
- $file_contents = file($wp_file);
404
-
405
- if ($file_contents == '' || $file_contents == NULL || $file_contents == false)
406
- {
407
- return -1;
408
- }
409
- foreach ($file_contents as $line)
410
- {
411
- if ((strpos($line, "define('DB_NAME'") !== false))
412
- {
413
- $is_wp_config = true; //It appears that we have some sort of wp-config.php file
414
- break;
415
- }
416
- else
417
- {
418
- //see if we're at the end of the section
419
- $is_wp_config = false;
420
- }
421
- }
422
- if ($is_wp_config)
423
- {
424
- return 1;
425
- }
426
- else
427
- {
428
- return -1;
429
- }
430
-
431
- }
432
-
433
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-user-accounts-menu.php DELETED
@@ -1,289 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_User_Accounts_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_USER_ACCOUNTS_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'WP Username',
10
- 'tab2' => 'Display Name'
11
- );
12
- var $menu_tabs_handler = array(
13
- 'tab1' => 'render_tab1',
14
- 'tab2' => 'render_tab2',
15
- );
16
- function __construct()
17
- {
18
- $this->render_user_account_menu_page();
19
- }
20
-
21
- function get_current_tab()
22
- {
23
- $tab_keys = array_keys($this->menu_tabs);
24
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
25
- return $tab;
26
- }
27
-
28
- /*
29
- * Renders our tabs of this menu as nav items
30
- */
31
- function render_menu_tabs()
32
- {
33
- $current_tab = $this->get_current_tab();
34
-
35
- echo '<h2 class="nav-tab-wrapper">';
36
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
37
- {
38
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
39
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
40
- }
41
- echo '</h2>';
42
- }
43
-
44
- /*
45
- * The menu rendering goes here
46
- */
47
- function render_user_account_menu_page()
48
- {
49
- $tab = $this->get_current_tab();
50
- ?>
51
- <div class="wrap">
52
- <div id="poststuff"><div id="post-body">
53
- <?php
54
- $this->render_menu_tabs();
55
- //$tab_keys = array_keys($this->menu_tabs);
56
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
57
- ?>
58
- </div></div>
59
- </div><!-- end of wrap -->
60
- <?php
61
- }
62
-
63
- function render_tab1()
64
- {
65
- if (isset($_POST['aiowps_change_admin_username']))//Do form submission tasks
66
- {
67
- echo $this->validate_change_username_form();
68
- }
69
- ?>
70
- <h2><?php _e('Admin User Security', 'aiowpsecurity')?></h2>
71
- <div class="aio_blue_box">
72
- <?php
73
- echo '<p>'.__('By default, WordPress sets the administrator username to "admin" at installation time.', 'aiowpsecurity').'
74
- <br />'.__('A lot of hackers try to take advantage of this information by attempting "Brute Force Login Attacks" where they repeatedly try to guess the password by using "admin" for username.', 'aiowpsecurity').'
75
- <br />'.__('From a security perspective, changing the default "admin" user name is one of the first and smartest things you should do on your site.', 'aiowpsecurity').'
76
- <br /><br />'.__('This feature will allow you to change your default "admin" user name to a more secure name of your choosing.', 'aiowpsecurity').'
77
- </p>';
78
- ?>
79
- </div>
80
-
81
- <?php
82
- //display a list of all administrator accounts for this site
83
- $postbox_title = __('List of Administrator Accounts', 'aiowpsecurity');
84
- //TODO: Multi-site: might need to put separate code for multi-site, ie, check if multi-site and then call get_all_admin_accounts($blog_id).
85
- //if (is_multisite()) { //get admin accounts for current site
86
- // $blog_id = get_current_blog_id();
87
- // $this->postbox($postbox_title, $this->get_all_admin_accounts($blog_id));
88
- //} else {
89
- $this->postbox($postbox_title, $this->get_all_admin_accounts());
90
- //}
91
- ?>
92
- <div class="postbox">
93
- <h3><label for="title"><?php _e('Change Admin Username', 'aiowpsecurity')?></label></h3>
94
- <div class="inside">
95
- <?php
96
- global $aiowps_feature_mgr;
97
- $aiowps_feature_mgr->output_feature_details_badge("user-accounts-change-admin-user");
98
-
99
- if (AIOWPSecurity_Utility::check_user_exists('admin'))
100
- {
101
- echo '<div class="aio_red_box"><p>'.__('Your site currently has an account which uses the default "admin" username.
102
- It is highly recommended that you change this name to something else.
103
- Use the following field to change the admin username.', 'aiowpsecurity').'</p></div>';
104
- ?>
105
- <form action="" method="POST">
106
- <?php wp_nonce_field('aiowpsec-change-admin-nonce'); ?>
107
- <table class="form-table">
108
- <tr valign="top">
109
- <th scope="row"><label for="NewUserName"> <?php _e('New Admin Username', 'aiowpsecurity')?>:</label></th>
110
- <td><input size="16" name="aiowps_new_user_name" />
111
- <p class="description"><?php _e('Choose a new username for admin.', 'aiowpsecurity'); ?></p>
112
- </td>
113
- </tr>
114
- </table>
115
- <input type="submit" name="aiowps_change_admin_username" value="<?php _e('Change Username', 'aiowpsecurity')?>" class="button-primary" />
116
- <div class="aio_spacer_15"></div>
117
- <p class="description"><?php _e('NOTE: If you are currently logged in as "admin" you will be automatically logged out after changing your username and will be required to log back in.', 'aiowpsecurity')?></p>
118
- </form>
119
- <?php
120
- }
121
- else
122
- {
123
- echo '<div id="aios_message" class="aio_green_box"><p><strong>';
124
- _e ('No action required! ', 'aiowpsecurity');
125
- echo '</strong><br />';
126
- _e ('Your site does not have any account which uses the default "admin" username. ', 'aiowpsecurity');
127
- _e ('This is good security practice.', 'aiowpsecurity');
128
- echo '</p></div>';
129
- }
130
- ?>
131
- </div>
132
- </div>
133
- <?php
134
- }
135
-
136
- function render_tab2()
137
- {
138
- ?>
139
- <h2><?php _e('Display Name Security', 'aiowpsecurity')?></h2>
140
- <div class="aio_blue_box">
141
- <?php
142
- echo '<p>'.__('When you submit a post or answer a comment, WordPress will usually display your "nickname".', 'aiowpsecurity').'
143
- <br />'.__('By default the nickname is set to the login (or user) name of your account.', 'aiowpsecurity').'
144
- <br />'.__('From a security perspective, leaving your nickname the same as your user name is bad practice because it gives a hacker at least half of your account\'s login credentials.', 'aiowpsecurity').'
145
- <br /><br />'.__('Therefore to further tighten your site\'s security you are advised to change your <strong>nickname</strong> and <strong>Display name</strong> to be different from your <strong>Username</strong>.', 'aiowpsecurity').'
146
- </p>';
147
- ?>
148
- </div>
149
-
150
- <div class="postbox">
151
- <h3><label for="title"><?php _e('Modify Accounts With Identical Login Name & Display Name', 'aiowpsecurity')?></label></h3>
152
- <div class="inside">
153
- <?php
154
- global $aiowps_feature_mgr;
155
- $aiowps_feature_mgr->output_feature_details_badge("user-accounts-display-name");
156
-
157
- //now let's find any accounts which have login name same as display name
158
- $login_nick_name_accounts = AIOWPSecurity_Utility::check_identical_login_and_nick_names();
159
- if ($login_nick_name_accounts) {
160
- echo '<div class="aio_red_box"><p>'.__('Your site currently has the following accounts which have an identical login name and display name.', 'aiowpsecurity').'
161
- <span class="description">('.__('Click on the link to edit the settings of that particular user account', 'aiowpsecurity').'</span></p></div>';
162
- ?>
163
- <table class="form-table">
164
- <?php
165
- $edit_user_page = get_option('siteurl').'/wp-admin/user-edit.php?user_id=';
166
- foreach ($login_nick_name_accounts as $usr){
167
- echo '<tr valign="top">';
168
- // echo '<th scope="row"><label for="UserID'.$usr['ID'].'"> Login Name: </label></th>';
169
- echo '<td><a href="'.$edit_user_page.$usr['ID'].'" target="_blank">'.$usr['user_login'].'</a>';
170
- echo '</tr>';
171
- }
172
- ?>
173
- </table>
174
- <?php
175
- } else {
176
- echo '<div id="aios_message" class="aio_green_box"><p><strong>'.__('No action required.', 'aiowpsecurity').'</strong>
177
- <br />'.__('Your site does not have a user account where the display name is identical to the username.', 'aiowpsecurity').'</p></div>';
178
- }
179
- ?>
180
- </div>
181
- </div>
182
- <?php
183
- }
184
-
185
- function validate_change_username_form()
186
- {
187
- global $wpdb;
188
- global $aio_wp_security;
189
- $errors = '';
190
- $nonce=$_REQUEST['_wpnonce'];
191
- if (!wp_verify_nonce($nonce, 'aiowpsec-change-admin-nonce'))
192
- {
193
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on admin username change operation!",4);
194
- die(__('Nonce check failed on admin username change operation!','aiowpsecurity'));
195
- }
196
- if (!empty($_POST['aiowps_new_user_name'])) {
197
- $new_username = sanitize_text_field($_POST['aiowps_new_user_name']);
198
- if (validate_username($new_username))
199
- {
200
- if (AIOWPSecurity_Utility::check_user_exists($new_username)){
201
- $errors .= __('Username ', 'aiowpsecurity').$new_username.__(' already exists. Please enter another value. ', 'aiowpsecurity');
202
- }
203
- else
204
- {
205
- //let's check if currently logged in username is 'admin'
206
- global $user_login;
207
- get_currentuserinfo();
208
- if (strtolower($user_login) == 'admin'){
209
- $username_is_admin = TRUE;
210
- } else {
211
- $username_is_admin = FALSE;
212
- }
213
- //Now let's change the username
214
- $result = $wpdb->query("UPDATE `" . $wpdb->users . "` SET user_login = '" . $wpdb->escape($new_username) . "' WHERE user_login='admin';");
215
- if (!$result) {
216
- //There was an error updating the users table
217
- $user_update_error = __('The database update operation of the user account failed!', 'aiowpsecurity');
218
- //TODO## - add error logging here
219
- $return_msg = '<div id="message" class="updated fade"><p>'.$user_update_error.'</p></div>';
220
- return $return_msg;
221
- }
222
-
223
- //If user is logged in with username "admin" then log user out and send to login page so they can login again
224
- if ($username_is_admin) {
225
- //Lets logout the user
226
- $aio_wp_security->debug_logger->log_debug("Logging User Out with login ".$user_login. " because they changed their username.");
227
- $after_logout_url = AIOWPSecurity_Utility::get_current_page_url();
228
- $after_logout_payload = 'redirect_to='.$after_logout_url.'&msg='.$aio_wp_security->user_login_obj->key_login_msg.'=admin_user_changed';//Place the handle for the login screen message in the URL
229
- $encrypted_payload = base64_encode($after_logout_payload);
230
- $logout_url = AIOWPSEC_WP_URL.'?aiowpsec_do_log_out=1';
231
- $logout_url = AIOWPSecurity_Utility::add_query_data_to_url($logout_url, 'al_additional_data', $encrypted_payload);
232
- AIOWPSecurity_Utility::redirect_to_url($logout_url);
233
- }
234
-
235
- //TODO - multisite considerations
236
- // if ( is_multisite() ) { //process sitemeta if we're in a multi-site situation
237
- // $oldAdmins = $wpdb->get_var( "SELECT meta_value FROM `" . $wpdb->sitemeta . "` WHERE meta_key = 'site_admins'" );
238
- // $newAdmins = str_replace( '5:"admin"', strlen( $newuser ) . ':"' . $wpdb->escape( $new_username ) . '"', $oldAdmins );
239
- // $wpdb->query( "UPDATE `" . $wpdb->sitemeta . "` SET meta_value = '" . $wpdb->escape( $newAdmins ) . "' WHERE meta_key = 'site_admins'" );
240
- // }
241
- }
242
- }
243
- else {//An invalid username was entered
244
- $errors .= __('You entered an invalid username. Please enter another value. ', 'aiowpsecurity');
245
- }
246
- }
247
- else {//No username value was entered
248
- $errors .= __('Please enter a value for your username. ', 'aiowpsecurity');
249
- }
250
-
251
- if (strlen($errors)> 0){//We have some validation or other error
252
- $return_msg = '<div id="message" class="error"><p>' . $errors . '</p></div>';
253
- }
254
- else{
255
- $return_msg = '<div id="message" class="updated fade"><p>'.__('Username Successfully Changed!', 'aiowpsecurity').'</p></div>';
256
- }
257
- return $return_msg;
258
- }
259
-
260
-
261
- /*
262
- * This function will retrieve all user accounts which have 'administrator' role and will return html code with results in a table
263
- */
264
- function get_all_admin_accounts($blog_id='') {
265
- //TODO: Have included the "blog_id" variable for future use for cases where people want to search particular blog (eg, multi-site)
266
- if ($blog_id) {
267
- $admin_users = get_users('blog_id='.$blog_id.'orderby=login&role=administrator');
268
- } else {
269
- $admin_users = get_users('orderby=login&role=administrator');
270
- }
271
- //now let's put the results in an HTML table
272
- $account_output = "";
273
- if ($admin_users != NULL) {
274
- $account_output .= '<table>';
275
- $account_output .= '<tr><th>'.__('Account Login Name', 'aiowpsecurity').'</th></tr>';
276
- foreach ($admin_users as $entry) {
277
- $account_output .= '<tr>';
278
- if ($entry->user_login == 'admin') {
279
- $account_output .= '<td style="color:red; font-weight: bold;">'.$entry->user_login.'</td>';
280
- }else {
281
- $account_output .= '<td>'.$entry->user_login.'</td>';
282
- }
283
- $account_output .= '</tr>';
284
- }
285
- $account_output .= '</table>';
286
- }
287
- return $account_output;
288
- }
289
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-user-login-menu.php DELETED
@@ -1,435 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_User_Login_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_USER_LOGIN_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'Login Lockdown',
10
- 'tab2' => 'Failed Login Records',
11
- 'tab3' => 'Force Logout',
12
- 'tab4' => 'Account Activity',
13
- );
14
- var $menu_tabs_handler = array(
15
- 'tab1' => 'render_tab1',
16
- 'tab2' => 'render_tab2',
17
- 'tab3' => 'render_tab3',
18
- 'tab4' => 'render_tab4',
19
- );
20
-
21
- function __construct()
22
- {
23
- $this->render_user_login_menu_page();
24
- }
25
-
26
- function get_current_tab()
27
- {
28
- $tab_keys = array_keys($this->menu_tabs);
29
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
30
- return $tab;
31
- }
32
-
33
- /*
34
- * Renders our tabs of this menu as nav items
35
- */
36
- function render_menu_tabs()
37
- {
38
- $current_tab = $this->get_current_tab();
39
-
40
- echo '<h2 class="nav-tab-wrapper">';
41
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
42
- {
43
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
44
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
45
- }
46
- echo '</h2>';
47
- }
48
-
49
- /*
50
- * The menu rendering goes here
51
- */
52
- function render_user_login_menu_page()
53
- {
54
- $tab = $this->get_current_tab();
55
- ?>
56
- <div class="wrap">
57
- <div id="poststuff"><div id="post-body">
58
- <?php
59
- $this->render_menu_tabs();
60
- //$tab_keys = array_keys($this->menu_tabs);
61
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
62
- ?>
63
- </div></div>
64
- </div><!-- end of wrap -->
65
- <?php
66
- }
67
-
68
- function render_tab1()
69
- {
70
- global $aio_wp_security;
71
- include_once 'wp-security-list-locked-ip.php'; //For rendering the AIOWPSecurity_List_Table in tab1
72
- $locked_ip_list = new AIOWPSecurity_List_Locked_IP(); //For rendering the AIOWPSecurity_List_Table in tab1
73
-
74
- if(isset($_POST['aiowps_login_lockdown']))//Do form submission tasks
75
- {
76
- $error = '';
77
- $nonce=$_REQUEST['_wpnonce'];
78
- if (!wp_verify_nonce($nonce, 'aiowpsec-login-lockdown-nonce'))
79
- {
80
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on login lockdown options save!",4);
81
- die("Nonce check failed on login lockdown options save!");
82
- }
83
-
84
- $max_login_attempt_val = sanitize_text_field($_POST['aiowps_max_login_attempts']);
85
- if(!is_numeric($max_login_attempt_val))
86
- {
87
- $error .= '<br />'.__('You entered a non numeric value for the max login attempts field. It has been set to the default value.','aiowpsecurity');
88
- $max_login_attempt_val = '3';//Set it to the default value for this field
89
- }
90
-
91
- $login_retry_time_period = sanitize_text_field($_POST['aiowps_retry_time_period']);
92
- if(!is_numeric($login_retry_time_period))
93
- {
94
- $error .= '<br />'.__('You entered a non numeric value for the login retry time period field. It has been set to the default value.','aiowpsecurity');
95
- $login_retry_time_period = '5';//Set it to the default value for this field
96
- }
97
-
98
- $lockout_time_length = sanitize_text_field($_POST['aiowps_lockout_time_length']);
99
- if(!is_numeric($lockout_time_length))
100
- {
101
- $error .= '<br />'.__('You entered a non numeric value for the lockout time length field. It has been set to the default value.','aiowpsecurity');
102
- $lockout_time_length = '60';//Set it to the default value for this field
103
- }
104
-
105
- $email_address = sanitize_email($_POST['aiowps_email_address']);
106
- if(!is_email($email_address))
107
- {
108
- $error .= '<br />'.__('You have entered an incorrect email address format. It has been set to your WordPress admin email as default.','aiowpsecurity');
109
- $email_address = get_bloginfo('admin_email'); //Set the default value to the blog admin email
110
- }
111
-
112
- if($error)
113
- {
114
- $this->show_msg_error(__('Attention!','aiowpsecurity').$error);
115
- }
116
-
117
- //Save all the form values to the options
118
- $aio_wp_security->configs->set_value('aiowps_enable_login_lockdown',isset($_POST["aiowps_enable_login_lockdown"])?'1':'');
119
- $aio_wp_security->configs->set_value('aiowps_max_login_attempts',absint($max_login_attempt_val));
120
- $aio_wp_security->configs->set_value('aiowps_retry_time_period',absint($login_retry_time_period));
121
- $aio_wp_security->configs->set_value('aiowps_lockout_time_length',absint($lockout_time_length));
122
- $aio_wp_security->configs->set_value('aiowps_set_generic_login_msg',isset($_POST["aiowps_set_generic_login_msg"])?'1':'');
123
- $aio_wp_security->configs->set_value('aiowps_enable_email_notify',isset($_POST["aiowps_enable_email_notify"])?'1':'');
124
- $aio_wp_security->configs->set_value('aiowps_email_address',$email_address);
125
- $aio_wp_security->configs->save_config();
126
- $this->show_msg_settings_updated();
127
- }
128
-
129
-
130
- if(isset($_REQUEST['action'])) //Do list table form row action tasks
131
- {
132
- if($_REQUEST['action'] == 'delete_blocked_ip'){ //Delete link was clicked for a row in list table
133
- $locked_ip_list->delete_lockdown_records(strip_tags($_REQUEST['lockdown_id']));
134
- }
135
-
136
- if($_REQUEST['action'] == 'unlock_ip'){ //Unlock link was clicked for a row in list table
137
- $locked_ip_list->unlock_ip_range(strip_tags($_REQUEST['lockdown_id']));
138
- }
139
- }
140
- ?>
141
- <h2><?php _e('Login Lockdown Configuration', 'aiowpsecurity')?></h2>
142
- <div class="aio_blue_box">
143
- <?php
144
- echo '<p>'.__('One of the ways hackers try to compromise sites is via a ', 'aiowpsecurity').'<strong>'.__('Brute Force Login Attack', 'aiowpsecurity').'</strong>.
145
- <br />'.__('This is where attackers use repeated login attempts until they guess the password.', 'aiowpsecurity').'
146
- <br />'.__('Apart from choosing strong passwords, monitoring and blocking IP addresses which are involved in repeated login failures in a short period of time is a very effective way to stop these types of attacks.', 'aiowpsecurity').'
147
- </p>';
148
- ?>
149
- </div>
150
-
151
- <div class="postbox">
152
- <h3><label for="title"><?php _e('Login Lockdown Options', 'aiowpsecurity'); ?></label></h3>
153
- <div class="inside">
154
- <?php
155
- //Display security info badge
156
- global $aiowps_feature_mgr;
157
- $aiowps_feature_mgr->output_feature_details_badge("user-login-login-lockdown");
158
- ?>
159
-
160
- <form action="" method="POST">
161
- <?php wp_nonce_field('aiowpsec-login-lockdown-nonce'); ?>
162
- <table class="form-table">
163
- <tr valign="top">
164
- <th scope="row"><?php _e('Enable Login Lockdown Feature', 'aiowpsecurity')?>:</th>
165
- <td>
166
- <input name="aiowps_enable_login_lockdown" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_login_lockdown')=='1') echo ' checked="checked"'; ?> value="1"/>
167
- <span class="description"><?php _e('Check this if you want to enable the login lockdown feature and apply the settings below', 'aiowpsecurity'); ?></span>
168
- </td>
169
- </tr>
170
- <tr valign="top">
171
- <th scope="row"><?php _e('Max Login Attempts', 'aiowpsecurity')?>:</th>
172
- <td><input size="5" name="aiowps_max_login_attempts" value="<?php echo $aio_wp_security->configs->get_value('aiowps_max_login_attempts'); ?>" />
173
- <span class="description"><?php _e('Set the value for the maximum login retries before IP address is locked out', 'aiowpsecurity'); ?></span>
174
- </td>
175
- </tr>
176
- <tr valign="top">
177
- <th scope="row"><?php _e('Login Retry Time Period (min)', 'aiowpsecurity')?>:</th>
178
- <td><input size="5" name="aiowps_retry_time_period" value="<?php echo $aio_wp_security->configs->get_value('aiowps_retry_time_period'); ?>" />
179
- <span class="description"><?php _e('If the maximum number of failed login attempts for a particular IP address occur within this time period the plugin will lock out that address', 'aiowpsecurity'); ?></span>
180
- </td>
181
- </tr>
182
- <tr valign="top">
183
- <th scope="row"><?php _e('Time Length of Lockout (min)', 'aiowpsecurity')?>:</th>
184
- <td><input size="5" name="aiowps_lockout_time_length" value="<?php echo $aio_wp_security->configs->get_value('aiowps_lockout_time_length'); ?>" />
185
- <span class="description"><?php _e('Set the length of time for which a particular IP address will be prevented from logging in', 'aiowpsecurity'); ?></span>
186
- </td>
187
- </tr>
188
- <tr valign="top">
189
- <th scope="row"><?php _e('Display Generic Error Message', 'aiowpsecurity')?>:</th>
190
- <td>
191
- <input name="aiowps_set_generic_login_msg" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_set_generic_login_msg')=='1') echo ' checked="checked"'; ?> value="1"/>
192
- <span class="description"><?php _e('Check this if you want to show a generic error message when a login attempt fails', 'aiowpsecurity'); ?></span>
193
- </td>
194
- </tr>
195
- <tr valign="top">
196
- <th scope="row"><?php _e('Notify By Email', 'aiowpsecurity')?>:</th>
197
- <td>
198
- <input name="aiowps_enable_email_notify" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_email_notify')=='1') echo ' checked="checked"'; ?> value="1"/>
199
- <span class="description"><?php _e('Check this if you want to receive an email when someone has been locked out due to maximum failed login attempts', 'aiowpsecurity'); ?></span>
200
- <br /><input size="30" name="aiowps_email_address" value="<?php echo $aio_wp_security->configs->get_value('aiowps_email_address'); ?>" />
201
- <span class="description"><?php _e('Enter an email address', 'aiowpsecurity'); ?></span>
202
- </td>
203
- </tr>
204
- </table>
205
- <input type="submit" name="aiowps_login_lockdown" value="<?php _e('Save Settings', 'aiowpsecurity')?>" class="button-primary" />
206
- </form>
207
- </div></div>
208
- <div class="postbox">
209
- <h3><label for="title"><?php _e('Currently Locked Out IP Address Ranges', 'aiowpsecurity'); ?></label></h3>
210
- <div class="inside">
211
- <?php
212
- //Fetch, prepare, sort, and filter our data...
213
- $locked_ip_list->prepare_items();
214
- //echo "put table of locked entries here";
215
- ?>
216
- <form id="tables-filter" method="get" onSubmit="return confirm('Are you sure you want to perform this bulk operation on the selected entries?');">
217
- <!-- For plugins, we also need to ensure that the form posts back to our current page -->
218
- <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
219
- <input type="hidden" name="tab" value="<?php echo $_REQUEST['tab']; ?>" />
220
- <!-- Now we can render the completed list table -->
221
- <?php $locked_ip_list->display(); ?>
222
- </form>
223
- </div></div>
224
- <?php
225
- }
226
-
227
- function render_tab2()
228
- {
229
- include_once 'wp-security-list-login-fails.php'; //For rendering the AIOWPSecurity_List_Table in tab2
230
- $failed_login_list = new AIOWPSecurity_List_Login_Failed_Attempts(); //For rendering the AIOWPSecurity_List_Table in tab2
231
- if(isset($_REQUEST['action'])) //Do row action tasks for list table form for failed logins
232
- {
233
- if($_REQUEST['action'] == 'delete_failed_login_rec'){ //Delete link was clicked for a row in list table
234
- $failed_login_list->delete_login_failed_records(strip_tags($_REQUEST['failed_login_id']));
235
- }
236
- }
237
- ?>
238
- <div class="aio_blue_box">
239
- <?php
240
- echo '<p>'.__('This tab displays the failed login attempts for your site.', 'aiowpsecurity').'
241
- <br />'.__('The information below can be handy if you need to do security investigations because it will show you the IP range, username and ID (if applicable) and the time/date of the failed login attempt.', 'aiowpsecurity').'
242
- </p>';
243
- ?>
244
- </div>
245
- <div class="postbox">
246
- <h3><label for="title"><?php _e('Failed Login Records', 'aiowpsecurity'); ?></label></h3>
247
- <div class="inside">
248
- <?php
249
- //Fetch, prepare, sort, and filter our data...
250
- $failed_login_list->prepare_items();
251
- //echo "put table of locked entries here";
252
- ?>
253
- <form id="tables-filter" method="get" onSubmit="return confirm('Are you sure you want to perform this bulk operation on the selected entries?');">
254
- <!-- For plugins, we also need to ensure that the form posts back to our current page -->
255
- <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
256
- <input type="hidden" name="tab" value="<?php echo $_REQUEST['tab']; ?>" />
257
- <!-- Now we can render the completed list table -->
258
- <?php $failed_login_list->display(); ?>
259
- </form>
260
- </div></div>
261
- <?php
262
- }
263
-
264
- function render_tab3()
265
- {
266
- global $aio_wp_security;
267
- if(isset($_POST['aiowpsec_save_force_logout_settings']))//Do form submission tasks
268
- {
269
- $error = '';
270
- $nonce=$_REQUEST['_wpnonce'];
271
- if (!wp_verify_nonce($nonce, 'aiowpsec-force-logout-settings-nonce'))
272
- {
273
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on force logout options save!",4);
274
- die("Nonce check failed on force logout options save!");
275
- }
276
-
277
- $logout_time_period = sanitize_text_field($_POST['aiowps_logout_time_period']);
278
- if(!is_numeric($logout_time_period))
279
- {
280
- $error .= '<br />'.__('You entered a non numeric value for the logout time period field. It has been set to the default value.','aiowpsecurity');
281
- $logout_time_period = '1';//Set it to the default value for this field
282
- }
283
-
284
- if($error)
285
- {
286
- $this->show_msg_error(__('Attention!','aiowpsecurity').$error);
287
- }
288
-
289
- //Save all the form values to the options
290
- $aio_wp_security->configs->set_value('aiowps_logout_time_period',absint($logout_time_period));
291
- $aio_wp_security->configs->set_value('aiowps_enable_forced_logout',isset($_POST["aiowps_enable_forced_logout"])?'1':'');
292
- $aio_wp_security->configs->save_config();
293
- $this->show_msg_settings_updated();
294
- }
295
- ?>
296
- <div class="aio_blue_box">
297
- <?php
298
- echo '<p>'.__('Setting an expiry period for your WP administration session is a simple way to protect against unauthorized access to your site from your computer.', 'aiowpsecurity').'
299
- <br />'.__('This feature allows you to specify a time period in minutes after which the admin session will expire and the user will be forced to log back in.', 'aiowpsecurity').'
300
- </p>';
301
- ?>
302
- </div>
303
- <div class="postbox">
304
- <h3><label for="title"><?php _e('Force User Logout Options', 'aiowpsecurity'); ?></label></h3>
305
- <div class="inside">
306
- <?php
307
- //Display security info badge
308
- global $aiowps_feature_mgr;
309
- $aiowps_feature_mgr->output_feature_details_badge("user-login-force-logout");
310
- ?>
311
-
312
- <form action="" method="POST">
313
- <?php wp_nonce_field('aiowpsec-force-logout-settings-nonce'); ?>
314
- <table class="form-table">
315
- <tr valign="top">
316
- <th scope="row"><?php _e('Enable Force WP User Logout', 'aiowpsecurity')?>:</th>
317
- <td>
318
- <input name="aiowps_enable_forced_logout" type="checkbox"<?php if($aio_wp_security->configs->get_value('aiowps_enable_forced_logout')=='1') echo ' checked="checked"'; ?> value="1"/>
319
- <span class="description"><?php _e('Check this if you want to force a wp user to be logged out after a configured amount of time', 'aiowpsecurity'); ?></span>
320
- </td>
321
- </tr>
322
- <tr valign="top">
323
- <th scope="row"><?php _e('Logout the WP User After XX Minutes', 'aiowpsecurity')?>:</th>
324
- <td><input size="5" name="aiowps_logout_time_period" value="<?php echo $aio_wp_security->configs->get_value('aiowps_logout_time_period'); ?>" />
325
- <span class="description"><?php _e('(Minutes) The user will be forced to log back in after this time period has elapased.', 'aiowpsecurity'); ?></span>
326
- </td>
327
- </tr>
328
- </table>
329
- <input type="submit" name="aiowpsec_save_force_logout_settings" value="<?php _e('Save Settings', 'aiowpsecurity')?>" class="button-primary" />
330
- </form>
331
- </div></div>
332
- <?php
333
- }
334
-
335
- function render_tab4()
336
- {
337
- //TODO - needs completing...
338
- include_once 'wp-security-list-acct-activity.php'; //For rendering the AIOWPSecurity_List_Table in tab4
339
- $acct_activity_list = new AIOWPSecurity_List_Account_Activity(); //For rendering the AIOWPSecurity_List_Table in tab2
340
- if(isset($_REQUEST['action'])) //Do row action tasks for list table form for login activity display
341
- {
342
- if($_REQUEST['action'] == 'delete_acct_activity_rec'){ //Delete link was clicked for a row in list table
343
- $acct_activity_list->delete_login_activity_records(strip_tags($_REQUEST['activity_login_rec']));
344
- }
345
- }
346
- ?>
347
- <div class="aio_blue_box">
348
- <?php
349
- echo '<p>'.__('This tab displays the login activity for WordPress admin accounts registered with your site.', 'aiowpsecurity').'
350
- <br />'.__('The information below can be handy if you need to do security investigations because it will show you the last 50 recent login events by username, IP address and time/date.', 'aiowpsecurity').'
351
- </p>';
352
- ?>
353
- </div>
354
- <div class="postbox">
355
- <h3><label for="title"><?php _e('Account Activity Logs', 'aiowpsecurity'); ?></label></h3>
356
- <div class="inside">
357
- <?php
358
- //Fetch, prepare, sort, and filter our data...
359
- $acct_activity_list->prepare_items();
360
- //echo "put table of locked entries here";
361
- ?>
362
- <form id="tables-filter" method="get" onSubmit="return confirm('Are you sure you want to perform this bulk operation on the selected entries?');">
363
- <!-- For plugins, we also need to ensure that the form posts back to our current page -->
364
- <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?>" />
365
- <input type="hidden" name="tab" value="<?php echo $_REQUEST['tab']; ?>" />
366
- <!-- Now we can render the completed list table -->
367
- <?php $acct_activity_list->display(); ?>
368
- </form>
369
- </div></div>
370
- <?php
371
- }
372
-
373
-
374
- /*
375
- * This function will unlock an IP range by modifying the "release_date" column of a record in the "login_lockdown" table
376
- */
377
- function unlock_ip_range($entries)
378
- {
379
- global $wpdb, $aio_wp_security;
380
- $lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
381
- if (is_array($entries))
382
- {
383
- //Unlock multiple records
384
- $id_list = "(" .implode(",",$entries) .")"; //Create comma separate list for DB operation
385
- $unlock_command = "UPDATE ".$lockdown_table." SET release_date = now() WHERE ID IN ".$id_list;
386
- $result = $wpdb->query($unlock_command);
387
- if($result != NULL)
388
- {
389
- $this->show_msg_updated(__('The selected IP ranges were unlocked successfully!','aiowpsecurity'));
390
- }
391
- } elseif ($entries != NULL)
392
- {
393
- //Delete single record
394
- $unlock_command = "UPDATE ".$lockdown_table." SET release_date = now() WHERE ID = '".absint($entries)."'";
395
- $result = $wpdb->query($unlock_command);
396
- if($result != NULL)
397
- {
398
- $this->show_msg_updated(__('The selected IP range was unlocked successfully!','aiowpsecurity'));
399
- }
400
- }
401
- //$aio_wp_security->debug_logger->log_debug("IP range unlocked from login_lockdown table - lockdown ID: ".$lockdown_id,0);
402
- }
403
-
404
- /*
405
- * This function will delete selected records from the "login_lockdown" table.
406
- * The function accepts either an array of IDs or a single ID
407
- */
408
- function delete_lockdown_records($entries)
409
- {
410
- global $wpdb, $aio_wp_security;
411
- $lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
412
- if (is_array($entries))
413
- {
414
- //Delete multiple records
415
- $id_list = "(" .implode(",",$entries) .")"; //Create comma separate list for DB operation
416
- $delete_command = "DELETE FROM ".$lockdown_table." WHERE ID IN ".$id_list;
417
- $result = $wpdb->query($delete_command);
418
- if($result != NULL)
419
- {
420
- $this->show_msg_updated(__('The selected records were deleted successfully!','aiowpsecurity'));
421
- }
422
- } elseif ($entries != NULL)
423
- {
424
- //Delete single record
425
- $delete_command = "DELETE FROM ".$lockdown_table." WHERE ID = '".absint($entries)."'";
426
- $result = $wpdb->query($delete_command);
427
- if($result != NULL)
428
- {
429
- $this->show_msg_updated(__('The selected record was deleted successfully!','aiowpsecurity'));
430
- }
431
- //$aio_wp_security->debug_logger->log_debug("Record deleted from login_lockdown table - lockdown ID: ".$entries,0);
432
- }
433
- }
434
-
435
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/admin/wp-security-whois-menu.php DELETED
@@ -1,126 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_WhoIs_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_WHOIS_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'WhoIS Lookup',
10
- );
11
-
12
- var $menu_tabs_handler = array(
13
- 'tab1' => 'render_tab1',
14
- );
15
-
16
- function __construct()
17
- {
18
- $this->render_menu_page();
19
- }
20
-
21
- function get_current_tab()
22
- {
23
- $tab_keys = array_keys($this->menu_tabs);
24
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
25
- return $tab;
26
- }
27
-
28
- /*
29
- * Renders our tabs of this menu as nav items
30
- */
31
- function render_menu_tabs()
32
- {
33
- $current_tab = $this->get_current_tab();
34
-
35
- echo '<h2 class="nav-tab-wrapper">';
36
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
37
- {
38
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
39
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
40
- }
41
- echo '</h2>';
42
- }
43
-
44
- /*
45
- * The menu rendering goes here
46
- */
47
- function render_menu_page()
48
- {
49
- $tab = $this->get_current_tab();
50
- ?>
51
- <div class="wrap">
52
- <div id="poststuff"><div id="post-body">
53
- <?php
54
- $this->render_menu_tabs();
55
- //$tab_keys = array_keys($this->menu_tabs);
56
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
57
- ?>
58
- </div></div>
59
- </div><!-- end of wrap -->
60
- <?php
61
- }
62
-
63
- function render_tab1()
64
- {
65
- global $aio_wp_security;
66
-
67
- ?>
68
- <h2><?php _e('WHOIS Lookup Information', 'aiowpsecurity')?></h2>
69
- <div class="aio_blue_box">
70
- <?php
71
- echo '<p>'.__('This feature allows you to look up more detailed information about an IP address or domain name by querying the WHOIS API.', 'aiowpsecurity').'
72
- </p>';
73
- ?>
74
- </div>
75
-
76
- <div class="postbox">
77
- <h3><label for="title"><?php _e('Perform a WHOIS Lookup for an IP or Domain Name', 'aiowpsecurity'); ?></label></h3>
78
- <div class="inside">
79
- <p>Please click the button below to view the latest system logs:</p>
80
- <form action="" method="POST">
81
- <?php wp_nonce_field('aiowpsec-whois-lookup-nonce'); ?>
82
- <table class="form-table">
83
- <tr valign="top">
84
- <th scope="row"><?php _e('Enter IP Address or Domain Name', 'aiowpsecurity')?>:</th>
85
- <td><input size="20" name="aiowps_whois_lookup_field" value="<?php //echo $aio_wp_security->configs->get_value('aiowps_whois_lookup_field'); ?>" />
86
- <span class="description"><?php _e('Enter an IP address or domain name. Example: 111.11.12.13 OR some-domain-name.com', 'aiowpsecurity'); ?></span>
87
- </td>
88
- </tr>
89
- </table>
90
- <input type="submit" name="aiowps_whois_lookup" value="<?php _e('Perform IP or Domain Lookup', 'aiowpsecurity')?>" class="button-primary ip-domain-lookup" />
91
- </form>
92
- </div></div>
93
- <?php
94
- if (isset($_POST['aiowps_whois_lookup']))
95
- {
96
- $nonce=$_REQUEST['_wpnonce'];
97
- if (!wp_verify_nonce($nonce, 'aiowpsec-whois-lookup-nonce'))
98
- {
99
- $aio_wp_security->debug_logger->log_debug("Nonce check failed on WHOIS lookup!",4);
100
- die("Nonce check failed on WHOIS lookup!");
101
- }
102
-
103
- require_once(AIO_WP_SECURITY_LIB_PATH.'/whois/whois.main.php');
104
- require_once(AIO_WP_SECURITY_LIB_PATH.'/whois/whois.utils.php');
105
- $input_val = trim($_POST['aiowps_whois_lookup_field']);
106
- if (filter_var($input_val, FILTER_VALIDATE_IP) || filter_var(gethostbyname($input_val), FILTER_VALIDATE_IP))
107
- {
108
- //$info_msg_string = '<p class="aio_info_with_icon">'.sprintf( __('WHOIS lookup successfully completed. Please see the results below:', 'aiowpsecurity')).'</p>';
109
- //echo ($info_msg_string);
110
- $this->show_msg_updated(__('WHOIS lookup successfully completed. Please see the results below:', 'aiowpsecurity'));
111
- $whois = new Whois();
112
- $result = $whois->Lookup($input_val);
113
- if (!empty($result['rawdata']))
114
- {
115
- $utils = new utils;
116
- $winfo = $utils->showHTML($result);
117
- echo $winfo;
118
- }
119
- }
120
- else
121
- {
122
- $this->show_msg_error(__('You have entered an incorrectly formatted IP address or domain name. Please try again.','aiowpsecurity'));
123
- }
124
- }
125
- }
126
- } //end class
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/grade-system/wp-security-feature-item-manager.php DELETED
@@ -1,388 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Feature_Item_Manager
4
- {
5
- var $feature_items;
6
- var $total_points = 0;
7
- var $total_achievable_points = 0;
8
-
9
- var $feature_point_1 = "5";
10
- var $feature_point_2 = "10";
11
- var $feature_point_3 = "15";
12
- var $feature_point_4 = "20";
13
- var $sec_level_basic = "1";
14
- var $sec_level_inter = "2";
15
- var $sec_level_advanced = "3";
16
- var $feature_active = "active";
17
- var $feature_inactive = "inactive";
18
- var $feature_partial = "partial";
19
-
20
- function __construct(){
21
-
22
- }
23
-
24
- function initialize_features()
25
- {
26
- $this->feature_items = array();
27
-
28
- //User Accounts Menu Features
29
- //Change Admin Username
30
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("user-accounts-change-admin-user", "Change Admin Username", $this->feature_point_3, $this->sec_level_basic);
31
- //Change Display Name
32
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("user-accounts-display-name", "Change Display Name", $this->feature_point_1, $this->sec_level_basic);
33
-
34
- //User Login Menu Features
35
- //Locking Lockdown
36
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("user-login-login-lockdown", "Login Lockdown", $this->feature_point_4, $this->sec_level_basic);
37
- //Force Logout
38
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("user-login-force-logout", "Force Logout", $this->feature_point_1, $this->sec_level_basic);
39
-
40
- //Database Security Menu Features
41
- //DB Prefix
42
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("db-security-db-prefix", "DB Prefix", $this->feature_point_2, $this->sec_level_inter);
43
- //DB Backup
44
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("db-security-db-backup", "DB Backup", $this->feature_point_4, $this->sec_level_basic);
45
-
46
- //File System Security Menu Features
47
- //File Permissions
48
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("filesystem-file-permissions", "File Permissions", $this->feature_point_4, $this->sec_level_basic);
49
- //PHP File Editing
50
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("filesystem-file-editing", "File Editing", $this->feature_point_2, $this->sec_level_basic);
51
-
52
- //Blacklist Manager Menu Features
53
- //IP and user agent blacklisting
54
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("blacklist-manager-ip-user-agent-blacklisting", "IP and User Agent Blacklisting", $this->feature_point_3, $this->sec_level_inter);
55
-
56
- //Firewall Menu Features
57
- //Basic firewall
58
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("firewall-basic-rules", "Enable Basic Firewall", $this->feature_point_3, $this->sec_level_basic);
59
- //Advanced firewall
60
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("firewall-disable-trace-track", "Disable Trace and Track", $this->feature_point_2, $this->sec_level_advanced);
61
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("firewall-forbid-proxy-comments", "Forbid Proxy Comments", $this->feature_point_2, $this->sec_level_advanced);
62
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("firewall-deny-bad-queries", "Deny Bad Queries", $this->feature_point_3, $this->sec_level_advanced);
63
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("firewall-advanced-character-string-filter", "Advanced Character String Filter", $this->feature_point_3, $this->sec_level_advanced);
64
- $this->feature_items[] = new AIOWPSecurity_Feature_Item("firewall-enable-5g-blacklist", "5G Blacklist", $this->feature_point_4, $this->sec_level_advanced);
65
-
66
- }
67
-
68
- function get_feature_item_by_id($feature_id)
69
- {
70
- foreach($this->feature_items as $item)
71
- {
72
- if($item->feature_id == $feature_id)
73
- {
74
- return $item;
75
- }
76
- }
77
- return "";
78
- }
79
-
80
- function output_feature_details_badge($feature_id)
81
- {
82
- $cau_feature_item = $this->get_feature_item_by_id($feature_id);
83
- $cau_security_level = $cau_feature_item->security_level;
84
- $cau_security_points = $cau_feature_item->item_points;
85
- $cau_your_points = 0;
86
- if($cau_feature_item->feature_status == $this->feature_active){
87
- $cau_your_points = $cau_security_points;
88
- }
89
- $level_str = $cau_feature_item->get_security_level_string($cau_security_level);
90
- ?>
91
- <div class="aiowps_feature_details_badge">
92
- <div class="aiowps_feature_details_badge_difficulty" title="Feature Difficulty">
93
- <span class="aiowps_feature_details_badge_difficulty_text"><?php _e($level_str, 'aiowpsecurity'); ?></span>
94
- </div>
95
- <div class="aiowps_feature_details_badge_points" title="Security Points">
96
- <span class="aiowps_feature_details_badge_points_text"><?php echo $cau_your_points .'/'. $cau_security_points; ?></span>
97
- </div>
98
- </div>
99
- <?php
100
- }
101
-
102
- function check_and_set_feature_status()
103
- {
104
- foreach($this->feature_items as $item)
105
- {
106
- if($item->feature_id == "user-accounts-change-admin-user")
107
- {
108
- $this->check_user_accounts_change_admin_user_feature($item);
109
- }
110
- if($item->feature_id == "user-accounts-display-name")
111
- {
112
- $this->check_user_accounts_display_name_feature($item);
113
- }
114
-
115
- if($item->feature_id == "db-security-db-prefix")
116
- {
117
- $this->check_db_security_db_prefix_feature($item);
118
- }
119
- if($item->feature_id == "db-security-db-backup")
120
- {
121
- $this->check_db_security_db_backup_feature($item);
122
- }
123
-
124
- if($item->feature_id == "user-login-login-lockdown")
125
- {
126
- $this->check_login_lockdown_feature($item);
127
- }
128
- if($item->feature_id == "user-login-force-logout")
129
- {
130
- $this->check_force_logout_feature($item);
131
- }
132
-
133
- if($item->feature_id == "filesystem-file-permissions")
134
- {
135
- $this->check_filesystem_permissions_feature($item);
136
- }
137
- if($item->feature_id == "filesystem-file-editing")
138
- {
139
- $this->check_filesystem_file_editing_feature($item);
140
- }
141
-
142
- if($item->feature_id == "blacklist-manager-ip-user-agent-blacklisting")
143
- {
144
- $this->check_enable_ip_useragent_blacklist_feature($item);
145
- }
146
-
147
- if($item->feature_id == "firewall-basic-rules")
148
- {
149
- $this->check_enable_basic_firewall_feature($item);
150
- }
151
- if($item->feature_id == "firewall-disable-trace-track")
152
- {
153
- $this->check_disable_trace_track_firewall_feature($item);
154
- }
155
- if($item->feature_id == "firewall-forbid-proxy-comments")
156
- {
157
- $this->check_forbid_proxy_comments_firewall_feature($item);
158
- }
159
- if($item->feature_id == "firewall-deny-bad-queries")
160
- {
161
- $this->check_deny_bad_queries_firewall_feature($item);
162
- }
163
- if($item->feature_id == "firewall-advanced-character-string-filter")
164
- {
165
- $this->check_advanced_char_string_filter_firewall_feature($item);
166
- }
167
- if($item->feature_id == "firewall-enable-5g-blacklist")
168
- {
169
- $this->check_enable_5G_blacklist_firewall_feature($item);
170
- }
171
-
172
- }
173
- }
174
-
175
- function calculate_total_points()
176
- {
177
- foreach($this->feature_items as $item)
178
- {
179
- if($item->feature_status == "active")
180
- {
181
- $this->total_points = $this->total_points + intval($item->item_points);
182
- }
183
- }
184
- }
185
-
186
- function get_total_site_points()
187
- {
188
- return $this->total_points;
189
- }
190
-
191
- function get_total_achievable_points()
192
- {
193
- foreach($this->feature_items as $item)
194
- {
195
- $this->total_achievable_points = $this->total_achievable_points + intval($item->item_points);
196
- }
197
- return $this->total_achievable_points;
198
- }
199
-
200
- function check_user_accounts_change_admin_user_feature($item)
201
- {
202
- if (AIOWPSecurity_Utility::check_user_exists('admin')) {
203
- $item->set_feature_status($this->feature_inactive);
204
- }
205
- else
206
- {
207
- $item->set_feature_status($this->feature_active);
208
- }
209
- }
210
-
211
- function check_user_accounts_display_name_feature($item)
212
- {
213
- if (AIOWPSecurity_Utility::check_identical_login_and_nick_names()) {
214
- $item->set_feature_status($this->feature_inactive);
215
- }
216
- else
217
- {
218
- $item->set_feature_status($this->feature_active);
219
- }
220
- }
221
-
222
- function check_login_lockdown_feature($item)
223
- {
224
- global $aio_wp_security;
225
- if ($aio_wp_security->configs->get_value('aiowps_enable_login_lockdown') == '1') {
226
- $item->set_feature_status($this->feature_active);
227
- }
228
- else
229
- {
230
- $item->set_feature_status($this->feature_inactive);
231
- }
232
- }
233
-
234
- function check_force_logout_feature($item)
235
- {
236
- global $aio_wp_security;
237
- if ($aio_wp_security->configs->get_value('aiowps_enable_forced_logout') == '1') {
238
- $item->set_feature_status($this->feature_active);
239
- }
240
- else
241
- {
242
- $item->set_feature_status($this->feature_inactive);
243
- }
244
- }
245
-
246
- function check_db_security_db_prefix_feature($item)
247
- {
248
- global $wpdb;
249
- if ($wpdb->prefix == 'wp_') {
250
- $item->set_feature_status($this->feature_inactive);
251
- }
252
- else
253
- {
254
- $item->set_feature_status($this->feature_active);
255
- }
256
- }
257
-
258
- function check_db_security_db_backup_feature($item)
259
- {
260
- global $aio_wp_security;
261
- if ($aio_wp_security->configs->get_value('aiowps_enable_automated_backups') == '1') {
262
- $item->set_feature_status($this->feature_active);
263
- }
264
- else
265
- {
266
- $item->set_feature_status($this->feature_inactive);
267
- }
268
- }
269
-
270
- function check_filesystem_permissions_feature($item)
271
- {
272
- //TODO
273
- $is_secure = 1;
274
- $util = new AIOWPSecurity_Utility_File;
275
- $files_dirs_to_check = $util->files_and_dirs_to_check;
276
- foreach ($files_dirs_to_check as $file_or_dir)
277
- {
278
- $actual_perm = AIOWPSecurity_Utility_File::get_file_permission($file_or_dir['path']);
279
- $is_secure = $is_secure*AIOWPSecurity_Utility_File::is_file_permission_secure($file_or_dir['permissions'], $actual_perm);
280
- }
281
-
282
- //Only if all of the files' permissions are deemed secure give this a thumbs up
283
- if ($is_secure == 1)
284
- {
285
- $item->set_feature_status($this->feature_active);
286
- }
287
- else
288
- {
289
- $item->set_feature_status($this->feature_inactive);
290
- }
291
- }
292
-
293
- function check_filesystem_file_editing_feature($item)
294
- {
295
- global $aio_wp_security;
296
- if ($aio_wp_security->configs->get_value('aiowps_disable_file_editing') == '1') {
297
- $item->set_feature_status($this->feature_active);
298
- }
299
- else
300
- {
301
- $item->set_feature_status($this->feature_inactive);
302
- }
303
- }
304
-
305
- function check_enable_ip_useragent_blacklist_feature($item)
306
- {
307
- global $aio_wp_security;
308
- if ($aio_wp_security->configs->get_value('aiowps_enable_blacklisting') == '1') {
309
- $item->set_feature_status($this->feature_active);
310
- }
311
- else
312
- {
313
- $item->set_feature_status($this->feature_inactive);
314
- }
315
- }
316
-
317
- function check_enable_basic_firewall_feature($item)
318
- {
319
- global $aio_wp_security;
320
- if ($aio_wp_security->configs->get_value('aiowps_enable_basic_firewall') == '1') {
321
- $item->set_feature_status($this->feature_active);
322
- }
323
- else
324
- {
325
- $item->set_feature_status($this->feature_inactive);
326
- }
327
- }
328
-
329
- function check_disable_trace_track_firewall_feature($item)
330
- {
331
- global $aio_wp_security;
332
- if ($aio_wp_security->configs->get_value('aiowps_disable_trace_and_track') == '1') {
333
- $item->set_feature_status($this->feature_active);
334
- }
335
- else
336
- {
337
- $item->set_feature_status($this->feature_inactive);
338
- }
339
- }
340
- function check_forbid_proxy_comments_firewall_feature($item)
341
- {
342
- global $aio_wp_security;
343
- if ($aio_wp_security->configs->get_value('aiowps_forbid_proxy_comments') == '1') {
344
- $item->set_feature_status($this->feature_active);
345
- }
346
- else
347
- {
348
- $item->set_feature_status($this->feature_inactive);
349
- }
350
- }
351
-
352
- function check_deny_bad_queries_firewall_feature($item)
353
- {
354
- global $aio_wp_security;
355
- if ($aio_wp_security->configs->get_value('aiowps_deny_bad_query_strings') == '1') {
356
- $item->set_feature_status($this->feature_active);
357
- }
358
- else
359
- {
360
- $item->set_feature_status($this->feature_inactive);
361
- }
362
- }
363
-
364
- function check_advanced_char_string_filter_firewall_feature($item)
365
- {
366
- global $aio_wp_security;
367
- if ($aio_wp_security->configs->get_value('aiowps_advanced_char_string_filter') == '1') {
368
- $item->set_feature_status($this->feature_active);
369
- }
370
- else
371
- {
372
- $item->set_feature_status($this->feature_inactive);
373
- }
374
- }
375
-
376
- function check_enable_5G_blacklist_firewall_feature($item)
377
- {
378
- global $aio_wp_security;
379
- if ($aio_wp_security->configs->get_value('aiowps_enable_5g_firewall') == '1') {
380
- $item->set_feature_status($this->feature_active);
381
- }
382
- else
383
- {
384
- $item->set_feature_status($this->feature_inactive);
385
- }
386
- }
387
-
388
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/grade-system/wp-security-feature-item.php DELETED
@@ -1,40 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Feature_Item
4
- {
5
- var $feature_id;//Example "user-accounts-tab1-change-admin-user"
6
- var $feature_name;
7
- var $item_points;
8
- var $security_level;//1, 2 or 3
9
-
10
- var $feature_status;//active, inactive, partial
11
-
12
- function __construct($feature_id,$feature_name,$item_points,$security_level){
13
- $this->feature_id = $feature_id;
14
- $this->feature_name = $feature_name;
15
- $this->item_points = $item_points;
16
- $this->security_level = $security_level;
17
- }
18
-
19
- function set_feature_status($status)
20
- {
21
- $this->feature_status = $status;
22
- }
23
-
24
- function get_security_level_string($level)
25
- {
26
- $level_string = "";
27
- if($level == "1"){
28
- $level_string = "Basic";
29
- }
30
- else if($level == "2"){
31
- $level_string = "Intermediate";
32
- }
33
- else if($level == "3"){
34
- $level_string = "Advanced";
35
- }
36
- return $level_string;
37
- }
38
-
39
- }
40
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-backup.php DELETED
@@ -1,191 +0,0 @@
1
- <?php
2
- class AIOWPSecurity_Backup
3
- {
4
- var $last_backup_file_name;//Stores the name of the last backup file when execute_backup function is called
5
- var $last_backup_file_path;
6
-
7
- function __construct()
8
- {
9
- add_action('aiowps_perform_scheduled_backup_tasks', array(&$this, 'aiowps_scheduled_backup_handler')); //TODO - this action never gets fired - need to investigate
10
- }
11
-
12
- /**
13
- * This function will perform a database backup
14
- */
15
- function execute_backup()
16
- {
17
- global $wpdb, $aio_wp_security;
18
-
19
- @ini_set( 'auto_detect_line_endings', true );
20
-
21
- //get all of the tables
22
- $tables = $wpdb->get_results( 'SHOW TABLES', ARRAY_N );
23
- $return = '';
24
-
25
- //cycle through each table
26
- foreach($tables as $table)
27
- {
28
- $result = $wpdb->get_results( 'SELECT * FROM `' . $table[0] . '`;', ARRAY_N );
29
- $num_fields = sizeof( $wpdb->get_results( 'DESCRIBE `' . $table[0] . '`;' ) );
30
-
31
- $return.= 'DROP TABLE IF EXISTS `' . $table[0] . '`;';
32
- $row2 = $wpdb->get_row( 'SHOW CREATE TABLE `' . $table[0] . '`;', ARRAY_N );
33
- $return.= PHP_EOL . PHP_EOL . $row2[1] . ";" . PHP_EOL . PHP_EOL;
34
-
35
- foreach( $result as $row )
36
- {
37
- $return .= 'INSERT INTO `' . $table[0] . '` VALUES(';
38
-
39
- for( $j=0; $j < $num_fields; $j++ ) {
40
-
41
- $row[$j] = addslashes( $row[$j] );
42
- $row[$j] = ereg_replace( PHP_EOL, "\n", $row[$j] );
43
-
44
- if ( isset( $row[$j] ) ) {
45
- $return .= '"' . $row[$j] . '"' ;
46
- } else {
47
- $return.= '""';
48
- }
49
-
50
- if ( $j < ( $num_fields - 1 ) ) {
51
- $return .= ',';
52
- }
53
-
54
- }
55
- $return .= ");" . PHP_EOL;
56
- }
57
- $return .= PHP_EOL . PHP_EOL;
58
- }
59
- $return .= PHP_EOL . PHP_EOL;
60
-
61
- //save file
62
- $file = 'database-backup-' . current_time( 'timestamp' );
63
- $handle = @fopen( AIO_WP_SECURITY_BACKUPS_PATH . '/' . $file . '.sql', 'w+' );
64
- $fw_res = @fwrite( $handle, $return );
65
- if (!$fw_res)
66
- {
67
- return false;
68
- }
69
- @fclose( $handle );
70
-
71
- //zip the file
72
- if ( class_exists( 'ZipArchive' ) )
73
- {
74
- $zip = new ZipArchive();
75
- $archive = $zip->open(AIO_WP_SECURITY_BACKUPS_PATH . '/' . $file . '.zip', ZipArchive::CREATE);
76
- $zip->addFile(AIO_WP_SECURITY_BACKUPS_PATH . '/' . $file . '.sql', $file . '.sql' );
77
- $zip->close();
78
-
79
- //delete .sql and keep zip
80
- @unlink( AIO_WP_SECURITY_BACKUPS_PATH . '/' . $file . '.sql' );
81
- $fileext = '.zip';
82
- } else
83
- {
84
- $fileext = '.sql';
85
- }
86
- $this->last_backup_file_name = $file . $fileext;//database-backup-1367644822.zip or database-backup-1367644822.sql
87
- $this->last_backup_file_path = AIO_WP_SECURITY_BACKUPS_PATH. '/' . $file . $fileext;
88
-
89
- $this->aiowps_send_backup_email(); //Send backup file via email if applicable
90
- $this->aiowps_delete_backup_files();
91
- return true;
92
- }
93
-
94
- function aiowps_send_backup_email()
95
- {
96
- global $aio_wp_security;
97
- if ( $aio_wp_security->configs->get_value('aiowps_send_backup_email_address') == '1' )
98
- {
99
- //Get the right email address.
100
- if ( is_email( $aio_wp_security->configs->get_value('aiowps_send_backup_email_address') ) )
101
- {
102
- $toaddress = $aio_wp_security->configs->get_value('aiowps_send_backup_email_address');
103
- } else
104
- {
105
- $toaddress = get_site_option( 'admin_email' );
106
- }
107
-
108
- $to = $toaddress;
109
- $headers = 'From: ' . get_option( 'blogname' ) . ' <' . $to . '>' . PHP_EOL;
110
- $subject = __( 'All In One WP Security - Site Database Backup', 'aiowpsecurity' ) . ' ' . date( 'l, F jS, Y \a\\t g:i a', current_time( 'timestamp' ) );
111
- $attachment = array( $this->last_backup_file_path );
112
- $message = __( 'Attached is your latest DB backup file for site URL', 'aiowpsecurity' ) . ' ' . get_option( 'siteurl' ) . __( ' generated on', 'aiowpsecurity' ) . ' ' . date( 'l, F jS, Y \a\\t g:i a', current_time( 'timestamp' ) );
113
-
114
- wp_mail( $to, $subject, $message, $headers, $attachment );
115
- }
116
- }
117
-
118
- function aiowps_delete_backup_files()
119
- {
120
- global $aio_wp_security;
121
- if ( $aio_wp_security->configs->get_value('aiowps_backup_files_stored') > 0 )
122
- {
123
- $files = scandir( AIO_WP_SECURITY_BACKUPS_PATH. '/', 1 );
124
-
125
- $count = 0;
126
-
127
- foreach ( $files as $file )
128
- {
129
- if ( strstr( $file, 'database-backup' ) )
130
- {
131
- if ( $count >= $aio_wp_security->configs->get_value('aiowps_backup_files_stored') )
132
- {
133
- @unlink( AIO_WP_SECURITY_BACKUPS_PATH. '/' . $file );
134
- }
135
- $count++;
136
- }
137
-
138
- }
139
- }
140
- }
141
-
142
- function aiowps_scheduled_backup_handler()
143
- {
144
- global $aio_wp_security;
145
- if($aio_wp_security->configs->get_value('aiowps_enable_automated_backups')=='1')
146
- {
147
- $aio_wp_security->debug_logger->log_debug_cron("DB Backup - Scheduled backup is enabled. Checking if a backup needs to be done now...");
148
- $current_time = strtotime(current_time('mysql'));
149
- $backup_frequency = $aio_wp_security->configs->get_value('aiowps_db_backup_frequency'); //Number of hours or days or months interval per backup
150
- $interval_setting = $aio_wp_security->configs->get_value('aiowps_db_backup_interval'); //Hours/Days/Months
151
- switch($interval_setting)
152
- {
153
- case '0':
154
- $interval = 'hours';
155
- break;
156
- case '1':
157
- $interval = 'days';
158
- break;
159
- case '2':
160
- $interval = 'weeks';
161
- break;
162
- }
163
- $last_backup_time = $aio_wp_security->configs->get_value('aiowps_last_backup_time');
164
- if ($last_backup_time != NULL)
165
- {
166
- $last_backup_time = strtotime($aio_wp_security->configs->get_value('aiowps_last_backup_time'));
167
- $next_backup_time = strtotime("+".abs($backup_frequency).$interval, $last_backup_time);
168
- if ($next_backup_time <= $current_time)
169
- {
170
- //It's time to do a backup
171
- $result = $this->execute_backup();
172
- if ($result)
173
- {
174
- $aio_wp_security->configs->set_value('aiowps_last_backup_time', current_time('mysql'));
175
- $aio_wp_security->debug_logger->log_debug_cron("DB Backup - Scheduled backup was successfully completed.");
176
- }
177
- else
178
- {
179
- $aio_wp_security->debug_logger->log_debug_cron("DB Backup - Scheduled backup operation failed!",4);
180
- }
181
- }
182
- }
183
- else
184
- {
185
- //Set the last backup time to now so it can trigger for the next scheduled period
186
- $aio_wp_security->configs->set_value('aiowps_last_backup_time', current_time('mysql'));
187
- $aio_wp_security->configs->save_config();
188
- }
189
- }
190
- }
191
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-config.php DELETED
@@ -1,54 +0,0 @@
1
- <?php
2
- class AIOWPSecurity_Config{
3
- var $configs;
4
- var $message_stack;
5
- static $_this;
6
-
7
- function __construct(){
8
- $this->message_stack = new stdClass();
9
- }
10
-
11
- function load_config(){
12
- $this->configs = get_option('aio_wp_security_configs');
13
- }
14
-
15
- function get_value($key){
16
- return isset($this->configs[$key])?$this->configs[$key] : '';
17
- }
18
-
19
- function set_value($key, $value){
20
- $this->configs[$key] = $value;
21
- }
22
-
23
- function add_value($key, $value){
24
- if (array_key_exists($key, $this->configs)){
25
- //Don't update the value for this key
26
- }
27
- else{//It is safe to update the value for this key
28
- $this->configs[$key] = $value;
29
- }
30
- }
31
-
32
- function save_config(){
33
- update_option('aio_wp_security_configs', $this->configs);
34
- }
35
-
36
- function get_stacked_message($key){
37
- if(isset($this->message_stack->{$key}))
38
- return $this->message_stack->{$key};
39
- return "";
40
- }
41
-
42
- function set_stacked_message($key,$value){
43
- $this->message_stack->{$key} = $value;
44
- }
45
-
46
- static function get_instance(){
47
- if(empty(self::$_this)){
48
- self::$_this = new AIOWPSecurity_Config();
49
- self::$_this->load_config();
50
- return self::$_this;
51
- }
52
- return self::$_this;
53
- }
54
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-configure-settings.php DELETED
@@ -1,70 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Configure_Settings
4
- {
5
- function __construct(){
6
-
7
- }
8
-
9
- static function set_default_settings()
10
- {
11
- global $aio_wp_security;
12
- //User password feature
13
-
14
- //Lockdown feature
15
- $aio_wp_security->configs->set_value('aiowps_enable_login_lockdown','');//Checkbox
16
- $aio_wp_security->configs->set_value('aiowps_max_login_attempts','3');
17
- $aio_wp_security->configs->set_value('aiowps_retry_time_period','5');
18
- $aio_wp_security->configs->set_value('aiowps_lockout_time_length','60');
19
- $aio_wp_security->configs->set_value('aiowps_set_generic_login_msg','');//Checkbox
20
- $aio_wp_security->configs->set_value('aiowps_enable_email_notify','');//Checkbox
21
- //$aio_wp_security->configs->set_value('aiowps_email_address','');//text field
22
- $aio_wp_security->configs->set_value('aiowps_enable_forced_logout','');//Checkbox
23
- $aio_wp_security->configs->set_value('aiowps_logout_time_period','60');
24
-
25
- //DB Security feature
26
- //$aio_wp_security->configs->set_value('aiowps_new_manual_db_pefix',''); //text field
27
- $aio_wp_security->configs->set_value('aiowps_enable_random_prefix','');//Checkbox
28
- $aio_wp_security->configs->set_value('aiowps_enable_automated_backups','');//Checkbox
29
- $aio_wp_security->configs->set_value('aiowps_db_backup_frequency','4');
30
- $aio_wp_security->configs->set_value('aiowps_db_backup_interval','2'); //Dropdown box where (0,1,2) => (hours,days,weeks)
31
- $aio_wp_security->configs->set_value('aiowps_backup_files_stored','2');
32
- $aio_wp_security->configs->set_value('aiowps_send_backup_email_address','');//Checkbox
33
- $aio_wp_security->configs->set_value('aiowps_backup_email_address','');
34
-
35
- //Filesystem Security feature
36
- $aio_wp_security->configs->set_value('aiowps_disable_file_editing','');//Checkbox
37
-
38
- //Blacklist feature
39
- $aio_wp_security->configs->set_value('aiowps_enable_blacklisting','');//Checkbox
40
- $aio_wp_security->configs->set_value('aiowps_banned_ip_addresses','');
41
-
42
- //Firewall features
43
- $aio_wp_security->configs->set_value('aiowps_enable_basic_firewall','');//Checkbox
44
- $aio_wp_security->configs->set_value('aiowps_disable_trace_and_track','');//Checkbox
45
- $aio_wp_security->configs->set_value('aiowps_forbid_proxy_comments','');//Checkbox
46
- $aio_wp_security->configs->set_value('aiowps_deny_bad_query_strings','');//Checkbox
47
- $aio_wp_security->configs->set_value('aiowps_advanced_char_string_filter','');//Checkbox
48
- $aio_wp_security->configs->set_value('aiowps_enable_5g_firewall','');//Checkbox
49
-
50
- //TODO - keep adding default opitons for any fields that require it
51
-
52
- //Save it
53
- $aio_wp_security->configs->save_config();
54
- }
55
-
56
- static function turn_off_all_security_features()
57
- {
58
- AIOWPSecurity_Configure_Settings::set_default_settings();
59
- }
60
-
61
- static function restore_to_factory_default()
62
- {
63
- //TOOD - complete the implementation
64
- //restore wp_config_file();//TODO - //TODO - write implementation in the utility class
65
- //restore site_htaccess_file();//TODO - write implementation in the utility class
66
- //AIOWPSecurity_Configure_Settings::set_default_settings();
67
- //Maybe allow them to revert the DB Prefix too?
68
- //File permissions
69
- }
70
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-cronjob-handler.php DELETED
@@ -1,27 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Cronjob_Handler {
4
- function __construct()
5
- {
6
- add_action ('aiowps_hourly_cron_event', array(&$this, 'aiowps_hourly_cron_event_handler'));
7
- //add_action ('aiowps_daily_cron_event', array(&$this, 'aiowps_daily_cron_event_handler'));
8
- }
9
-
10
- function aiowps_hourly_cron_event_handler()
11
- {
12
- //Do stuff that needs checking every hours
13
- global $aio_wp_security;
14
- $aio_wp_security->debug_logger->log_debug_cron("Cronjob_Handler - Hourly cron handler got fired.");
15
-
16
- //do_action('aiowps_force_logout_check');
17
- //do_action('aiowps_check_password_stuff');
18
- do_action('aiowps_perform_scheduled_backup_tasks');
19
- }
20
-
21
- // function aiowps_daily_cron_event_handler()
22
- // {
23
- //
24
- // }
25
-
26
- }
27
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-debug-logger.php DELETED
@@ -1,100 +0,0 @@
1
- <?php
2
- /*
3
- * Logs debug data to a file. Here is an example usage
4
- * global $aio_wp_security;
5
- * $aio_wp_security->debug_logger->log_debug("Log messaged goes here");
6
- */
7
- class AIOWPSecurity_Logger
8
- {
9
- var $log_folder_path;
10
- var $default_log_file = 'wp-security-log.txt';
11
- var $default_log_file_cron = 'wp-security-log-cron-job.txt';
12
- var $debug_enabled = false;
13
- var $debug_status = array('SUCCESS','STATUS','NOTICE','WARNING','FAILURE','CRITICAL');
14
- var $section_break_marker = "\n----------------------------------------------------------\n\n";
15
- var $log_reset_marker = "-------- Log File Reset --------\n";
16
-
17
- function __construct()
18
- {
19
- $this->log_folder_path = AIO_WP_SECURITY_PATH . '/logs';
20
- //TODO - check config and if debug is enabled then set the enabled flag to true
21
- $this->debug_enabled = true;
22
- }
23
-
24
- function get_debug_timestamp()
25
- {
26
- return '['.date('m/d/Y g:i A').'] - ';
27
- }
28
-
29
- function get_debug_status($level)
30
- {
31
- $size = count($this->debug_status);
32
- if($level >= $size){
33
- return 'UNKNOWN';
34
- }
35
- else{
36
- return $this->debug_status[$level];
37
- }
38
- }
39
-
40
- function get_section_break($section_break)
41
- {
42
- if ($section_break) {
43
- return $this->section_break_marker;
44
- }
45
- return "";
46
- }
47
-
48
- function append_to_file($content,$file_name)
49
- {
50
- if(empty($file_name))$file_name = $this->default_log_file;
51
- $debug_log_file = $this->log_folder_path.'/'.$file_name;
52
- $fp=fopen($debug_log_file,'a');
53
- fwrite($fp, $content);
54
- fclose($fp);
55
- }
56
-
57
- function reset_log_file($file_name='')
58
- {
59
- if(empty($file_name))$file_name = $this->default_log_file;
60
- $debug_log_file = $this->log_folder_path.'/'.$file_name;
61
- $content = $this->get_debug_timestamp().$this->log_reset_marker;
62
- $fp=fopen($debug_log_file,'w');
63
- fwrite($fp, $content);
64
- fclose($fp);
65
- }
66
-
67
- function log_debug($message,$level=0,$section_break=false,$file_name='')
68
- {
69
- if (!$this->debug_enabled) return;
70
- $content = $this->get_debug_timestamp();//Timestamp
71
- $content .= $this->get_debug_status($level);//Debug status
72
- $content .= ' : ';
73
- $content .= $message . "\n";
74
- $content .= $this->get_section_break($section_break);
75
- $this->append_to_file($content, $file_name);
76
- }
77
-
78
- function log_debug_cron($message,$level=0,$section_break=false)
79
- {
80
- if (!$this->debug_enabled) return;
81
- $content = $this->get_debug_timestamp();//Timestamp
82
- $content .= $this->get_debug_status($level);//Debug status
83
- $content .= ' : ';
84
- $content .= $message . "\n";
85
- $content .= $this->get_section_break($section_break);
86
- //$file_name = $this->default_log_file_cron;
87
- $this->append_to_file($content, $this->default_log_file_cron);
88
- }
89
-
90
- //TODO - this function need to be completed
91
- static function log_debug_st($message,$level=0,$section_break=false,$file_name='')
92
- {
93
- $content = "\n". $message . "\n";
94
- $debug_log_file = 'wp-security-log-static.txt';
95
- //$debug_log_file = AIO_WP_SECURITY_PATH .'/wp-security-log.txt';
96
- $fp=fopen($debug_log_file,'a');
97
- fwrite($fp, $content);
98
- fclose($fp);
99
- }
100
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-installer.php DELETED
@@ -1,73 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Installer
4
- {
5
- static function run_installer()
6
- {
7
- global $wpdb;
8
- if (function_exists('is_multisite') && is_multisite())
9
- {
10
- // check if it is a network activation - if so, run the activation function for each blog id
11
- if (isset($_GET['networkwide']) && ($_GET['networkwide'] == 1))
12
- {
13
- $old_blog = $wpdb->blogid;
14
- // Get all blog ids
15
- $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
16
- foreach ($blogids as $blog_id) {
17
- switch_to_blog($blog_id);
18
- AIOWPSecurity_Installer::create_db_tables();
19
- }
20
- switch_to_blog($old_blog);
21
- return;
22
- }
23
- }
24
- AIOWPSecurity_Installer::create_db_tables();
25
- }
26
-
27
- static function create_db_tables()
28
- {
29
- //global $wpdb;
30
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
31
-
32
- //"User Login" related tables
33
- $lockdown_tbl_name = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
34
- $failed_login_tbl_name = AIOWPSEC_TBL_FAILED_LOGINS;
35
- $user_login_activity_tbl_name = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
36
-
37
- $ld_tbl_sql = "CREATE TABLE " . $lockdown_tbl_name . " (
38
- id bigint(20) NOT NULL AUTO_INCREMENT,
39
- user_id bigint(20) NOT NULL,
40
- user_login VARCHAR(150) NOT NULL,
41
- lockdown_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
42
- release_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
43
- failed_login_ip varchar(100) NOT NULL DEFAULT '',
44
- PRIMARY KEY (id)
45
- )ENGINE=MyISAM DEFAULT CHARSET=utf8;";
46
- dbDelta($ld_tbl_sql);
47
-
48
- $fl_tbl_sql = "CREATE TABLE " . $failed_login_tbl_name . " (
49
- id bigint(20) NOT NULL AUTO_INCREMENT,
50
- user_id bigint(20) NOT NULL,
51
- user_login VARCHAR(150) NOT NULL,
52
- failed_login_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
53
- login_attempt_ip varchar(100) NOT NULL DEFAULT '',
54
- PRIMARY KEY (id)
55
- )ENGINE=MyISAM DEFAULT CHARSET=utf8;";
56
- dbDelta($fl_tbl_sql);
57
-
58
- $ula_tbl_sql = "CREATE TABLE " . $user_login_activity_tbl_name . " (
59
- id bigint(20) NOT NULL AUTO_INCREMENT,
60
- user_id bigint(20) NOT NULL,
61
- user_login VARCHAR(150) NOT NULL,
62
- login_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
63
- logout_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
64
- login_ip varchar(100) NOT NULL DEFAULT '',
65
- login_country varchar(150) NOT NULL DEFAULT '',
66
- browser_type varchar(150) NOT NULL DEFAULT '',
67
- PRIMARY KEY (id)
68
- )ENGINE=MyISAM DEFAULT CHARSET=utf8;";
69
- dbDelta($ula_tbl_sql);
70
-
71
- update_option("aiowpsec_db_version", AIO_WP_SECURITY_DB_VERSION);
72
- }
73
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-user-login.php DELETED
@@ -1,373 +0,0 @@
1
- <?php
2
- class AIOWPSecurity_User_Login
3
- {
4
- /**
5
- * This will store a URI query string key for passing messages to the login form
6
- * @var string
7
- */
8
- var $key_login_msg;
9
-
10
- function __construct()
11
- {
12
- $this->initialize();
13
- remove_filter('authenticate', 'wp_authenticate_username_password', 20, 3);
14
- add_filter('authenticate', array(&$this, 'aiowp_auth_login'), 10, 3);
15
- add_action('aiowps_force_logout_check', array(&$this, 'aiowps_force_logout_action_handler'));
16
- //add_action('wp_login', array(&$this, 'wp_login_action_handler'), 10, 2);
17
- add_action('clear_auth_cookie', array(&$this, 'wp_logout_action_handler'));
18
- add_filter('login_message', array(&$this, 'aiowps_login_message')); //WP filter to add or modify messages on the login page
19
- }
20
-
21
- protected function initialize()
22
- {
23
- $this->key_login_msg = 'aiowps_login_msg_id';
24
- }
25
-
26
-
27
- /*
28
- * This function will take care of the authentication operations
29
- * It will return a WP_User object if successful or WP_Error if not
30
- */
31
- function aiowp_auth_login($user, $username, $password)
32
- {
33
- global $aio_wp_security;
34
- $login_attempts_permitted = $aio_wp_security->configs->get_value('aiowps_max_login_attempts');
35
-
36
- $user_locked = $this->check_locked_user();
37
- if ($user_locked != NULL) {
38
- $aio_wp_security->debug_logger->log_debug("Login attempt from blocked IP range - ".$user_locked['failed_login_IP'],2);
39
- return new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Login failed because your IP address has been blocked due to too many failed login attempts.
40
- Please contact the administrator.', 'aiowpsecurity'));
41
- }
42
-
43
- if ( is_a($user, 'WP_User') ) { return $user; } //Existing WP core code
44
-
45
- if ( empty($username) || empty($password) ) { //Existing WP core code
46
- $error = new WP_Error();
47
- if (empty($username)){
48
- $error->add('empty_username', __('<strong>ERROR</strong>: The username field is empty.', 'aiowpsecurity'));
49
- }
50
-
51
- if (empty($password)){
52
- $error->add('empty_password', __('<strong>ERROR</strong>: The password field is empty.', 'aiowpsecurity'));
53
- }
54
- return $error;
55
- }
56
-
57
- $userdata = get_user_by('login',$username);
58
- if (!$userdata)
59
- {
60
- //This means an unknown username is being used for login
61
- $this->increment_failed_logins($username);
62
- if($login_attempts_permitted <= $this->get_login_fail_count())
63
- {
64
- $this->lock_the_user(__('unknown','aiowpsecurity'));
65
- }
66
- if($aio_wp_security->configs->get_value('aiowps_set_generic_login_msg')=='1')
67
- {
68
- //Return generic error message if configured
69
- return new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid login credentials.', 'aiowpsecurity'));
70
- } else
71
- {
72
- return new WP_Error('invalid_username', __('<strong>ERROR</strong>: Invalid username.', 'aiowpsecurity'));
73
- }
74
- }
75
-
76
- $userdata = apply_filters('wp_authenticate_user', $userdata, $password); //Existing WP core code
77
- if ( is_wp_error($userdata) ) { //Existing WP core code
78
- return $userdata;
79
- }
80
-
81
- if ( !wp_check_password($password, $userdata->user_pass, $userdata->ID) )
82
- {
83
- //This means wrong password was entered
84
- $this->increment_failed_logins($username);
85
- if($login_attempts_permitted <= $this->get_login_fail_count())
86
- {
87
- $this->lock_the_user($username);
88
- }
89
- if($aio_wp_security->configs->get_value('aiowps_set_generic_login_msg')=='1')
90
- {
91
- //Return generic error message if configured
92
- return new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid login credentials.', 'aiowpsecurity'));
93
- } else
94
- {
95
- return new WP_Error('incorrect_password', sprintf(__('<strong>ERROR</strong>: Incorrect password. <a href="%s" title="Password Lost and Found">Lost your password</a>?', 'aiowpsecurity'), site_url('wp-login.php?action=lostpassword', 'login')));
96
- }
97
- }
98
-
99
- $user = new WP_User($userdata->ID);
100
- return $user;
101
- }
102
-
103
- /*
104
- * This function queries the aiowps_login_lockdown table.
105
- * If the release_date has not expired AND the current visitor IP addr matches
106
- * it will return a record
107
- */
108
- function check_locked_user()
109
- {
110
- global $wpdb;
111
- $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
112
- $ip_range = $this->get_sanitized_ip_range(); //Get the IP range of the current user
113
- $locked_user = $wpdb->get_var("SELECT user_id FROM $login_lockdown_table " .
114
- "WHERE release_date > now() AND " .
115
- "failed_login_IP LIKE '" . $wpdb->escape($ip_range) . "%'");
116
- return $locked_user;
117
- }
118
-
119
- /*
120
- * This function queries the aiowps_failed_logins table and returns the number of failures for current IP range within allowed failure period
121
- */
122
- function get_login_fail_count()
123
- {
124
- global $wpdb, $aio_wp_security;
125
- $failed_logins_table = AIOWPSEC_TBL_FAILED_LOGINS;
126
- $login_retry_interval = $aio_wp_security->configs->get_value('aiowps_retry_time_period');
127
-
128
- $ip_range = $this->get_sanitized_ip_range(); //Get the IP range of the current user
129
- $login_failures = $wpdb->get_var("SELECT COUNT(ID) FROM $failed_logins_table " .
130
- "WHERE failed_login_date + INTERVAL " .
131
- $login_retry_interval . " MINUTE > now() AND " .
132
- "login_attempt_ip LIKE '" . $wpdb->escape($ip_range) . "%'");
133
- return $login_failures;
134
- }
135
-
136
- /*
137
- * Adds an entry to the aiowps_lockdowns table
138
- */
139
- function lock_the_user($username='')
140
- {
141
- global $wpdb, $aio_wp_security;
142
- $login_lockdown_table = AIOWPSEC_TBL_LOGIN_LOCKDOWN;
143
- $lockout_time_length = $aio_wp_security->configs->get_value('aiowps_lockout_time_length');
144
-
145
- $ip_range = $this->get_sanitized_ip_range(); //Get the IP range of the current user
146
- $username = sanitize_user($username);
147
- $user = get_user_by('login',$username); //Returns WP_User object if exists
148
- if ($user)
149
- {
150
- //If the login attempt was made using a valid user set variables for DB storage later on
151
- $user_id = $user->ID;
152
- } else {
153
- //If the login attempt was made using a non-existent user then let's set user_id to blank and record the attempted user login name for DB storage later on
154
- $user_id = '';
155
- }
156
-
157
- $insert = "INSERT INTO " . $login_lockdown_table . " (user_id, user_login, lockdown_date, release_date, failed_login_IP) " .
158
- "VALUES ('" . $user_id . "', '" . $username . "', now(), date_add(now(), INTERVAL " .
159
- $lockout_time_length . " MINUTE), '" . $wpdb->escape($ip_range) . "')";
160
- $result = $wpdb->query($insert);
161
- if ($result > 0)
162
- {
163
- do_action('aiowps_lockdown_event', $ip_range, $username);
164
- $this->send_notification_email($username, $ip_range);
165
- $aio_wp_security->debug_logger->log_debug("The following IP address range has been locked out for exceeding the maximum login attempts: ".$ip_range,2);//Log the lockdown event
166
- }
167
- else if ($result == FALSE)
168
- {
169
- $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_lockdown_table,4);//Log the highly unlikely event of DB error
170
- }
171
- }
172
-
173
- /*
174
- * Adds an entry to the aiowps_failed_logins table
175
- */
176
- function increment_failed_logins($username='')
177
- {
178
- global $wpdb, $aio_wp_security;
179
- //$login_attempts_permitted = $aio_wp_security->configs->get_value('aiowps_max_login_attempts');
180
- //$lockout_time_length = $aio_wp_security->configs->get_value('aiowps_lockout_time_length');
181
- $login_fails_table = AIOWPSEC_TBL_FAILED_LOGINS;
182
- $ip_range = $this->get_sanitized_ip_range(); //Get the IP range of the current user
183
-
184
- $username = sanitize_user($username);
185
- $user = get_user_by('login',$username); //Returns WP_User object if it exists
186
- if ($user)
187
- {
188
- //If the login attempt was made using a valid user set variables for DB storage later on
189
- $user_id = $user->ID;
190
- } else {
191
- //If the login attempt was made using a non-existent user then let's set user_id to blank and record the attempted user login name for DB storage later on
192
- $user_id = '';
193
- }
194
- $insert = "INSERT INTO " . $login_fails_table . " (user_id, user_login, failed_login_date, login_attempt_ip) " .
195
- "VALUES ('" . $user_id . "', '" . $username . "', now(), '" . $wpdb->escape($ip_range) . "')";
196
- $result = $wpdb->query($insert);
197
- if ($result == FALSE)
198
- {
199
- $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_fails_table,4);//Log the highly unlikely event of DB error
200
- }
201
-
202
- }
203
-
204
- /*
205
- * Returns the first three octets of a sanitized IP address so it can used as an IP address range
206
- */
207
- function get_sanitized_ip_range()
208
- {
209
- global $aio_wp_security;
210
- $ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //Get the IP address of user
211
- $ip_range = '';
212
- $valid_ip = filter_var($ip, FILTER_VALIDATE_IP); //Sanitize the IP address
213
- if ($valid_ip)
214
- {
215
- $ip_range = substr($valid_ip, 0 , strrpos ($valid_ip, ".")); //strip last portion of address to leave an IP range
216
- }
217
- else
218
- {
219
- //Write log if the 'REMOTE_ADDR' contains something which is not an IP
220
- $aio_wp_security->debug_logger->log_debug("AIOWPSecurity_User_Login - Invalid IP received ".$ip,4);
221
- }
222
- return $ip_range;
223
- }
224
-
225
- /*
226
- * This function queries the aiowps_failed_logins table and returns the number of failures for current IP range within allowed failure period
227
- */
228
- function send_notification_email($username, $ip_range)
229
- {
230
- global $aio_wp_security;
231
- $email_notification_enabled = $aio_wp_security->configs->get_value('aiowps_enable_email_notify');
232
- $to_email_address = $aio_wp_security->configs->get_value('aiowps_email_address');
233
- $email_msg = '';
234
- if ($email_notification_enabled == 1)
235
- {
236
- $subject = '['.get_option('siteurl').'] '. __('Site Lockout Notification','aiowpsecurity');
237
- $email_msg .= __('A lockdown event has occurred due to too many failed login attempts with the following user details','aiowpsecurity')."\n";
238
- $email_msg .= __('Username: '.($username?$username:"Unknown"),'aiowpsecurity')."\n";
239
- $email_msg .= __('IP Range: '.$ip_range,'aiowpsecurity')."\n\n";
240
- $email_msg .= __('Log into your site\'s WordPress administration panel to see the duration of the lockout or to unlock the user.','aiowpsecurity')."\n";
241
- $email_header = 'From: '.get_bloginfo( 'name' ).' <'.get_bloginfo('admin_email').'>' . "\r\n\\";
242
- $sendMail = wp_mail($to_email_address, $subject, $email_msg, $email_header);
243
- }
244
- }
245
-
246
-
247
- /*
248
- * This function will check the settings and log the user after the configured time period
249
- */
250
- function aiowps_force_logout_action_handler()
251
- {
252
- global $aio_wp_security;
253
- //$aio_wp_security->debug_logger->log_debug("Force Logout - Checking if any user need to be logged out...");
254
- if($aio_wp_security->configs->get_value('aiowps_enable_forced_logout')=='1') //if this feature is enabled then do something
255
- {
256
- if(is_user_logged_in())
257
- {
258
- $current_user = wp_get_current_user();
259
- $user_id = $current_user->ID;
260
- $current_time = current_time('mysql');
261
- $login_time = $this->get_wp_user_last_login_time($user_id);
262
- $diff = strtotime($current_time) - strtotime($login_time);
263
- $logout_time_interval_value = $aio_wp_security->configs->get_value('aiowps_logout_time_period');
264
- $logout_time_interval_val_seconds = $logout_time_interval_value * 60;
265
- if($diff > $logout_time_interval_val_seconds)
266
- {
267
- $aio_wp_security->debug_logger->log_debug("Force Logout - This user logged in more than (".$logout_time_interval_value.") minutes ago. Doing a force log out for the user with username: ".$current_user->user_login);
268
- $this->wp_logout_action_handler(); //this will register the logout time/date in the logout_date column
269
-
270
- $curr_page_url = AIOWPSecurity_Utility::get_current_page_url();
271
- $after_logout_payload = 'redirect_to='.$curr_page_url.'&msg='.$this->key_login_msg.'=session_expired';
272
- $encrypted_payload = base64_encode($after_logout_payload);
273
- $logout_url = AIOWPSEC_WP_URL.'?aiowpsec_do_log_out=1';
274
- $logout_url = AIOWPSecurity_Utility::add_query_data_to_url($logout_url, 'al_additional_data', $encrypted_payload);
275
- AIOWPSecurity_Utility::redirect_to_url($logout_url);
276
- }
277
- }
278
- }
279
- }
280
-
281
- function get_wp_user_last_login_time($user_id)
282
- {
283
- $last_login = get_user_meta($user_id, 'last_login_time', true);
284
- return $last_login;
285
- }
286
-
287
- function wp_login_action_handler($user_login, $user)
288
- {
289
- global $wpdb, $aio_wp_security;
290
- $login_activity_table = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
291
- $login_date_time = current_time('mysql');
292
- update_user_meta($user->ID, 'last_login_time', $login_date_time); //store last login time in meta table
293
- $curr_ip_address = AIOWPSecurity_Utility_IP::get_user_ip_address();
294
- $insert = "INSERT INTO " . $login_activity_table . " (user_id, user_login, login_date, login_ip) " .
295
- "VALUES ('" . $user->ID . "', '" . $user_login . "', '" . $login_date_time . "', '" . $curr_ip_address . "')";
296
- $result = $wpdb->query($insert);
297
- if ($result == FALSE)
298
- {
299
- $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_activity_table,4);//Log the highly unlikely event of DB error
300
- }
301
-
302
- }
303
-
304
- /**
305
- * The handler for logout events, ie, uses the WP "clear_auth_cookies" action.
306
-
307
- * Modifies the login activity record for the current user by registering the logout time/date in the logout_date column.
308
- * (NOTE: Because of the way we are doing a force logout, the "clear_auth_cookies" hook does not fire.
309
- * upon auto logout. The current workaround is to call this function directly from the aiowps_force_logout_action_handler() when
310
- * an auto logout occurs due to the "force logout" feature).
311
- *
312
- */
313
- function wp_logout_action_handler()
314
- {
315
- global $wpdb, $aio_wp_security;
316
- $current_user = wp_get_current_user();
317
- $ip_addr = AIOWPSecurity_Utility_IP::get_user_ip_address();
318
- $user_id = $current_user->ID;
319
- $login_activity_table = AIOWPSEC_TBL_USER_LOGIN_ACTIVITY;
320
- $logout_date_time = current_time('mysql');
321
- $data = array('logout_date' => $logout_date_time);
322
- $where = array('user_id' => $user_id,
323
- 'login_ip' => $ip_addr,
324
- 'logout_date' => '0000-00-00 00:00:00');
325
- $result = $wpdb->update($login_activity_table, $data, $where);
326
- if ($result == FALSE)
327
- {
328
- $aio_wp_security->debug_logger->log_debug("Error inserting record into ".$login_activity_table,4);//Log the highly unlikely event of DB error
329
- }
330
- }
331
-
332
- /**
333
- * The handler for the WP "login_message" filter
334
- * Adds custom messages to the other messages that appear above the login form.
335
- *
336
- * NOTE: This method is automatically called by WordPress for displaying
337
- * text above the login form.
338
- *
339
- * @param string $message the output from earlier login_message filters
340
- * @return string
341
- *
342
- */
343
- function aiowps_login_message($message = '')
344
- {
345
- global $aio_wp_security;
346
- $msg = '';
347
- if(isset($_GET[$this->key_login_msg]) && !empty($_GET[$this->key_login_msg]))
348
- {
349
- $logout_msg = strip_tags($_GET[$this->key_login_msg]);
350
- }
351
- if (!empty($logout_msg))
352
- {
353
- switch ($logout_msg) {
354
- case 'session_expired':
355
- $msg = sprintf(__('Your session has expired because it has been over %d minutes since your last login.', 'aiowpsecurity'), $aio_wp_security->configs->get_value('aiowps_logout_time_period'));
356
- $msg .= ' ' . __('Please log back in to continue.', 'aiowpsecurity');
357
- break;
358
- case 'admin_user_changed':
359
- $msg = __('You were logged out because you just changed the "admin" username.', 'aiowpsecurity');
360
- $msg .= ' ' . __('Please log back in to continue.', 'aiowpsecurity');
361
- break;
362
- default:
363
- }
364
- }
365
- if (!empty($msg))
366
- {
367
- $msg = htmlspecialchars($msg, ENT_QUOTES, 'UTF-8');
368
- $message .= '<p class="login message">'. $msg . '</p>';
369
- }
370
- return $message;
371
- }
372
-
373
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-utility-file.php DELETED
@@ -1,230 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Utility_File
4
- {
5
-
6
- /* This variable will be an array which will contain all of the files and/or directories we wish to check permissions for */
7
- public $files_and_dirs_to_check;
8
-
9
- function __construct(){
10
- /* Let's initiliaze our class variable array with all of the files and/or directories we wish to check permissions for.
11
- * NOTE: we can add to this list in future if we wish
12
- */
13
- $this->files_and_dirs_to_check = array(
14
- array('name'=>'root directory','path'=>ABSPATH,'permissions'=>'0755'),
15
- array('name'=>'wp-includes/','path'=>ABSPATH."wp-includes",'permissions'=>'0755'),
16
- array('name'=>'.htaccess','path'=>ABSPATH.".htaccess",'permissions'=>'0644'),
17
- array('name'=>'wp-admin/index.php','path'=>ABSPATH."wp-admin/index.php",'permissions'=>'0644'),
18
- array('name'=>'wp-admin/js/','path'=>ABSPATH."wp-admin/js/",'permissions'=>'0755'),
19
- array('name'=>'wp-content/themes/','path'=>ABSPATH."wp-content/themes",'permissions'=>'0755'),
20
- array('name'=>'wp-content/plugins/','path'=>ABSPATH."wp-content/plugins",'permissions'=>'0755'),
21
- array('name'=>'wp-admin/','path'=>ABSPATH."wp-admin",'permissions'=>'0755'),
22
- array('name'=>'wp-content/','path'=>ABSPATH."wp-content",'permissions'=>'0755'),
23
- array('name'=>'wp-config.php','path'=>ABSPATH."wp-config.php",'permissions'=>'0644')
24
- //Add as many files or dirs as needed by following the convention above
25
- );
26
-
27
- }
28
-
29
- static function write_content_to_file($file_path, $new_contents)
30
- {
31
- @chmod($file_path, 0777);
32
- if (is_writeable($file_path))
33
- {
34
- $handle = fopen($file_path, 'w');
35
- foreach( $new_contents as $line ) {
36
- fwrite($handle, $line);
37
- }
38
- fclose($handle);
39
- @chmod($file_path, 0644); //Let's change the file back to a secure permission setting
40
- return true;
41
- } else {
42
- return false;
43
- }
44
- }
45
-
46
- static function backup_a_file($src_file_path, $suffix = 'backup')
47
- {
48
- $backup_file_path = $src_file_path . '.' . $suffix;
49
- if (!copy($src_file_path, $backup_file_path)) {
50
- //Failed to make a backup copy
51
- return false;
52
- }
53
- return true;
54
- }
55
-
56
- static function recursive_file_search($pattern='*', $flags = 0, $path='')
57
- {
58
- $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
59
- $files=glob($path.$pattern, $flags);
60
- foreach ($paths as $path) { $files=array_merge($files,AIOWPSecurity_Utility_File::recursive_file_search($pattern, $flags, $path)); }
61
- return $files;
62
- }
63
-
64
- /*
65
- * Useful when wanting to echo file contents to screen with <br /> tags
66
- */
67
- static function get_file_contents_with_br($src_file)
68
- {
69
- $file_contents = file_get_contents($src_file);
70
- return nl2br($file_contents);
71
- }
72
-
73
- /*
74
- * Useful when wanting to echo file contents inside textarea
75
- */
76
- static function get_file_contents($src_file)
77
- {
78
- $file_contents = file_get_contents($src_file);
79
- return $file_contents;
80
- }
81
-
82
- /*
83
- * Returns the file's permission value eg, "0755"
84
- */
85
- static function get_file_permission($filepath)
86
- {
87
- if (!function_exists('fileperms'))
88
- {
89
- $perms = '-1';
90
- }
91
- else
92
- {
93
- clearstatcache();
94
- $perms = substr(sprintf("%o", @fileperms($filepath)), -4);
95
- }
96
- return $perms;
97
- }
98
-
99
- /*
100
- * This function will compare the current permission value for a file or dir with the recommended value.
101
- * It will compare the individual "execute", "write" and "read" bits for the "public", "group" and "owner" permissions.
102
- * If the permissions for an actual bit value are greater than the recommended value it returns '0' (=less secure)
103
- * Otherwise it returns '1' which means it is secure
104
- * Accepts permission value parameters in octal, ie, "0777" or "777"
105
- */
106
- static function is_file_permission_secure($recommended, $actual)
107
- {
108
- $result = 1; //initialize return result
109
-
110
- //Check "public" permissions
111
- $public_value_actual = substr($actual,-1,1); //get dec value for actual public permission
112
- $public_value_rec = substr($recommended,-1,1); //get dec value for recommended public permission
113
-
114
- $pva_bin = decbin($public_value_actual); //Convert value to binary
115
- $pvr_bin = decbin($public_value_rec); //Convert value to binary
116
- //Compare the "executable" bit values for the public actual versus the recommended
117
- if (substr($pva_bin,-1,1)<=substr($pvr_bin,-1,1))
118
- {
119
- //The "execute" bit is the same or less as the recommended value
120
- $result = 1*$result;
121
- }else
122
- {
123
- //The "execute" bit is switched on for the actual value - meaning it is less secure
124
- $result = 0*$result;
125
- }
126
-
127
- //Compare the "write" bit values for the public actual versus the recommended
128
- if (substr($pva_bin,-2,1)<=substr($pvr_bin,-2,1))
129
- {
130
- //The "write" bit is the same or less as the recommended value
131
- $result = 1*$result;
132
- }else
133
- {
134
- //The "write" bit is switched on for the actual value - meaning it is less secure
135
- $result = 0*$result;
136
- }
137
-
138
- //Compare the "read" bit values for the public actual versus the recommended
139
- if (substr($pva_bin,-3,1)<=substr($pvr_bin,-3,1))
140
- {
141
- //The "read" bit is the same or less as the recommended value
142
- $result = 1*$result;
143
- }else
144
- {
145
- //The "read" bit is switched on for the actual value - meaning it is less secure
146
- $result = 0*$result;
147
- }
148
-
149
- //Check "group" permissions
150
- $group_value_actual = substr($actual,-2,1);
151
- $group_value_rec = substr($recommended,-2,1);
152
- $gva_bin = decbin($group_value_actual); //Convert value to binary
153
- $gvr_bin = decbin($group_value_rec); //Convert value to binary
154
-
155
- //Compare the "executable" bit values for the group actual versus the recommended
156
- if (substr($gva_bin,-1,1)<=substr($gvr_bin,-1,1))
157
- {
158
- //The "execute" bit is the same or less as the recommended value
159
- $result = 1*$result;
160
- }else
161
- {
162
- //The "execute" bit is switched on for the actual value - meaning it is less secure
163
- $result = 0*$result;
164
- }
165
-
166
- //Compare the "write" bit values for the public actual versus the recommended
167
- if (substr($gva_bin,-2,1)<=substr($gvr_bin,-2,1))
168
- {
169
- //The "write" bit is the same or less as the recommended value
170
- $result = 1*$result;
171
- }else
172
- {
173
- //The "write" bit is switched on for the actual value - meaning it is less secure
174
- $result = 0*$result;
175
- }
176
-
177
- //Compare the "read" bit values for the public actual versus the recommended
178
- if (substr($gva_bin,-3,1)<=substr($gvr_bin,-3,1))
179
- {
180
- //The "read" bit is the same or less as the recommended value
181
- $result = 1*$result;
182
- }else
183
- {
184
- //The "read" bit is switched on for the actual value - meaning it is less secure
185
- $result = 0*$result;
186
- }
187
-
188
- //Check "owner" permissions
189
- $owner_value_actual = substr($actual,-3,1);
190
- $owner_value_rec = substr($recommended,-3,1);
191
- $ova_bin = decbin($owner_value_actual); //Convert value to binary
192
- $ovr_bin = decbin($owner_value_rec); //Convert value to binary
193
-
194
- //Compare the "executable" bit values for the group actual versus the recommended
195
- if (substr($ova_bin,-1,1)<=substr($ovr_bin,-1,1))
196
- {
197
- //The "execute" bit is the same or less as the recommended value
198
- $result = 1*$result;
199
- }else
200
- {
201
- //The "execute" bit is switched on for the actual value - meaning it is less secure
202
- $result = 0*$result;
203
- }
204
-
205
- //Compare the "write" bit values for the public actual versus the recommended
206
- if (substr($ova_bin,-2,1)<=substr($ovr_bin,-2,1))
207
- {
208
- //The "write" bit is the same or less as the recommended value
209
- $result = 1*$result;
210
- }else
211
- {
212
- //The "write" bit is switched on for the actual value - meaning it is less secure
213
- $result = 0*$result;
214
- }
215
-
216
- //Compare the "read" bit values for the public actual versus the recommended
217
- if (substr($ova_bin,-3,1)<=substr($ovr_bin,-3,1))
218
- {
219
- //The "read" bit is the same or less as the recommended value
220
- $result = 1*$result;
221
- }else
222
- {
223
- //The "read" bit is switched on for the actual value - meaning it is less secure
224
- $result = 0*$result;
225
- }
226
-
227
- return $result;
228
- }
229
-
230
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-utility-htaccess.php DELETED
@@ -1,783 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Utility_Htaccess
4
- {
5
- //The following variables will store the comment markers for each of features added to the .htacces file
6
- //This will make it easy to locate the blocks of code for deletion if someone disables a feature
7
- public static $ip_blacklist_marker_start = '#AIOWPS_IP_BLACKLIST_START';
8
- public static $ip_blacklist_marker_end = '#AIOWPS_IP_BLACKLIST_END';
9
-
10
- public static $basic_htaccess_rules_marker_start = '#AIOWPS_BASIC_HTACCESS_RULES_START';
11
- public static $basic_htaccess_rules_marker_end = '#AIOWPS_BASIC_HTACCESS_RULES_END';
12
-
13
- public static $user_agent_blacklist_marker_start = '#AIOWPS_USER_AGENT_BLACKLIST_START';
14
- public static $user_agent_blacklist_marker_end = '#AIOWPS_USER_AGENT_BLACKLIST_END';
15
-
16
- public static $disable_trace_track_marker_start = '#AIOWPS_DISABLE_TRACE_TRACK_START';
17
- public static $disable_trace_track_marker_end = '#AIOWPS_DISABLE_TRACE_TRACK_END';
18
-
19
- public static $forbid_proxy_comments_marker_start = '#AIOWPS_FORBID_PROXY_COMMENTS_START';
20
- public static $forbid_proxy_comments_marker_end = '#AIOWPS_FORBID_PROXY_COMMENTS_END';
21
-
22
- public static $deny_bad_query_strings_marker_start = '#AIOWPS_DENY_BAD_QUERY_STRINGS_START';
23
- public static $deny_bad_query_strings_marker_end = '#AIOWPS_DENY_BAD_QUERY_STRINGS_END';
24
-
25
- public static $advanced_char_string_filter_marker_start = '#AIOWPS_ADVANCED_CHAR_STRING_FILTER_START';
26
- public static $advanced_char_string_filter_marker_end = '#AIOWPS_ADVANCED_CHAR_STRING_FILTER_END';
27
-
28
- public static $five_g_blacklist_marker_start = '#AIOWPS_FIVE_G_BLACKLIST_START';
29
- public static $five_g_blacklist_marker_end = '#AIOWPS_FIVE_G_BLACKLIST_END';
30
-
31
- // TODO - enter more markers as new .htaccess features are added
32
-
33
- function __construct(){
34
- //NOP
35
- }
36
-
37
- static function write_to_htaccess()
38
- {
39
- //clean up old rules first
40
- if (AIOWPSecurity_Utility_Htaccess::delete_from_htaccess() == -1)
41
- {
42
- return -1; //unable to write to the file
43
- }
44
-
45
- $htaccess = ABSPATH . '.htaccess';
46
- //get the subdirectory if it is installed in one
47
- $siteurl = explode( '/', get_option( 'siteurl' ) );
48
- if (isset($siteurl[3]))
49
- {
50
- $dir = '/' . $siteurl[3] . '/';
51
- }
52
- else
53
- {
54
- $dir = '/';
55
- }
56
-
57
- if (!$f = @fopen($htaccess, 'a+'))
58
- {
59
- @chmod( $htaccess, 0644 );
60
- if (!$f = @fopen( $htaccess, 'a+'))
61
- {
62
- return -1;
63
- }
64
- }
65
- AIOWPSecurity_Utility_File::backup_a_file($htaccess); //TODO - we dont want to continually be backing up the htaccess file
66
- @ini_set( 'auto_detect_line_endings', true );
67
- $ht = explode( PHP_EOL, implode( '', file( $htaccess ) ) ); //parse each line of file into array
68
-
69
- $rules = AIOWPSecurity_Utility_Htaccess::getrules();
70
- if ($rules == -1)
71
- {
72
- return -1;
73
- }
74
-
75
- $rulesarray = explode( PHP_EOL, $rules );
76
- $contents = array_merge( $rulesarray, $ht );
77
-
78
- if (!$f = @fopen($htaccess, 'w+'))
79
- {
80
- return -1; //we can't write to the file
81
- }
82
-
83
- $blank = false;
84
-
85
- //write each line to file
86
- foreach ( $contents as $insertline )
87
- {
88
- if ( trim( $insertline ) == '' )
89
- {
90
- if ( $blank == false )
91
- {
92
- fwrite( $f, PHP_EOL . trim( $insertline ) );
93
- }
94
- $blank = true;
95
- }
96
- else
97
- {
98
- $blank = false;
99
- fwrite( $f, PHP_EOL . trim( $insertline ) );
100
- }
101
- }
102
- @fclose( $f );
103
- return 1; //success
104
- }
105
-
106
- /*
107
- * This function will delete the code which has been added to the .htaccess file by this plugin
108
- * It will try to find the comment markers "# BEGIN All In One WP Security" and "# END All In One WP Security" and delete contents in between
109
- */
110
- function delete_from_htaccess($section = 'All In One WP Security')
111
- {
112
- //TODO
113
- $htaccess = ABSPATH . '.htaccess';
114
-
115
- @ini_set('auto_detect_line_endings', true);
116
- if (!file_exists($htaccess))
117
- {
118
- $ht = @fopen($htaccess, 'a+');
119
- @fclose($ht);
120
- }
121
- $ht_contents = explode(PHP_EOL, implode('', file($htaccess))); //parse each line of file into array
122
- if ($ht_contents)
123
- { //as long as there are lines in the file
124
- $state = true;
125
- if (!$f = @fopen($htaccess, 'w+'))
126
- {
127
- @chmod( $htaccess, 0644 );
128
- if (!$f = @fopen( $htaccess, 'w+'))
129
- {
130
- return -1;
131
- }
132
- }
133
-
134
- foreach ( $ht_contents as $n => $markerline )
135
- { //for each line in the file
136
- if (strpos($markerline, '# BEGIN ' . $section) !== false)
137
- { //if we're at the beginning of the section
138
- $state = false;
139
- }
140
- if ($state == true)
141
- { //as long as we're not in the section keep writing
142
- fwrite($f, trim($markerline) . PHP_EOL);
143
- }
144
- if (strpos($markerline, '# END ' . $section) !== false)
145
- { //see if we're at the end of the section
146
- $state = true;
147
- }
148
- }
149
- @fclose($f);
150
- return 1;
151
- }
152
- return 1;
153
- }
154
-
155
- static function getrules()
156
- {
157
- $rules = "";
158
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_basic_htaccess();
159
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_blacklist();
160
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_disable_trace_and_track();
161
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_forbid_proxy_comment_posting();
162
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_deny_bad_query_strings();
163
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_advanced_character_string_filter();
164
- $rules .= AIOWPSecurity_Utility_Htaccess::getrules_5g_blacklist();
165
- //TODO: The following utility functions are ready to use when we write the menu pages for these features
166
-
167
- //Add more functions for features as needed
168
- //$rules .= AIOWPSecurity_Utility_Htaccess::getrules_somefeature();
169
-
170
- //Add outer markers if we have rules
171
- if ($rules != '')
172
- {
173
- $rules = "# BEGIN All In One WP Security" . PHP_EOL . $rules . "# END All In One WP Security" . PHP_EOL;
174
- }
175
-
176
- return $rules;
177
- }
178
-
179
- static function getrules_blacklist()
180
- {
181
- global $aio_wp_security;
182
- @ini_set( 'auto_detect_line_endings', true );
183
-
184
- //figure out what server they're using
185
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
186
- {
187
- $aiowps_server = 'apache';
188
- }
189
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
190
- {
191
- $aiowps_server = 'nginx';
192
- }
193
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
194
- {
195
- $aiowps_server = 'litespeed';
196
- }
197
- else
198
- { //unsupported server
199
- return -1;
200
- }
201
-
202
- $rules = '';
203
- if($aio_wp_security->configs->get_value('aiowps_enable_blacklisting')=='1')
204
- {
205
- //Let's do the list of blacklisted IPs first
206
- $hosts = explode(PHP_EOL, $aio_wp_security->configs->get_value('aiowps_banned_ip_addresses'));
207
- if (!empty($hosts) && !(sizeof($hosts) == 1 && trim($hosts[0]) == ''))
208
- {
209
- if ( $aiowps_server == 'apache' || $aiowps_server == 'litespeed' )
210
- {
211
- $rules .= AIOWPSecurity_Utility_Htaccess::$ip_blacklist_marker_start . PHP_EOL; //Add feature marker start
212
- $rules .= "Order allow,deny" . PHP_EOL .
213
- "Allow from all" . PHP_EOL;
214
- }
215
- $phosts = array();
216
- foreach ($hosts as $host)
217
- {
218
- $host = trim($host);
219
- if (!in_array($host, $phosts))
220
- {
221
- if (strstr($host, '*'))
222
- {
223
- $parts = array_reverse (explode('.', $host));
224
- $netmask = 32;
225
- foreach ($parts as $part)
226
- {
227
- if (strstr(trim($part), '*'))
228
- {
229
- $netmask = $netmask - 8;
230
-
231
- }
232
- }
233
- $dhost = trim( str_replace('*', '0', implode( '.', array_reverse( $parts ) ) ) . '/' . $netmask );
234
- if (strlen($dhost) > 4)
235
- {
236
- if ($aiowps_server == 'apache' || $aiowps_server == 'litespeed')
237
- {
238
- $trule = "Deny from " . $dhost . PHP_EOL;
239
- if (trim($trule) != 'Deny From')
240
- {
241
- $rules .= $trule;
242
- }
243
- }
244
- else
245
- {
246
- $rules .= "\tdeny " . $dhost . ';' . PHP_EOL;
247
- }
248
- }
249
- }
250
- else
251
- {
252
- $dhost = trim( $host );
253
- if (strlen($dhost) > 4)
254
- {
255
- if ($aiowps_server == 'apache' || $aiowps_server == 'litespeed' )
256
- {
257
- $rules .= "Deny from " . $dhost . PHP_EOL;
258
- }
259
- else
260
- {
261
- $rules .= "\tdeny " . $dhost. ";" . PHP_EOL;
262
- }
263
- }
264
- }
265
- }
266
- $phosts[] = $host;
267
- }
268
- $rules .= AIOWPSecurity_Utility_Htaccess::$ip_blacklist_marker_end . PHP_EOL; //Add feature marker end
269
- }
270
- //Now let's do the user agent list
271
- $user_agents = explode(PHP_EOL, $aio_wp_security->configs->get_value('aiowps_banned_user_agents'));
272
- if (!empty($user_agents) && !(sizeof($user_agents) == 1 && trim($user_agents[0]) == ''))
273
- {
274
- if ($aiowps_server == 'apache' || $aiowps_server == 'litespeed')
275
- {
276
- $rules .= AIOWPSecurity_Utility_Htaccess::$user_agent_blacklist_marker_start . PHP_EOL; //Add feature marker start
277
- //Start mod_rewrite rules
278
- $rules .= "<IfModule mod_rewrite.c>" . PHP_EOL . "RewriteEngine On" . PHP_EOL . PHP_EOL;
279
- $count = 1;
280
- foreach ( $user_agents as $agent )
281
- {
282
- $rules .= "RewriteCond %{HTTP_USER_AGENT} ^" . trim( $agent );
283
- if ( $count < sizeof( $user_agents ) )
284
- {
285
- $rules .= " [NC,OR]" . PHP_EOL;
286
- $count++;
287
- }
288
- else
289
- {
290
- $rules .= " [NC]" . PHP_EOL;
291
- }
292
-
293
- }
294
- $rules .= "RewriteRule ^(.*)$ - [F,L]" . PHP_EOL . PHP_EOL;
295
- }
296
- else
297
- {
298
- $count = 1;
299
- $alist = '';
300
- foreach ( $user_agents as $agent )
301
- {
302
- $alist .= trim( $agent );
303
- if ( $count < sizeof( $user_agents ) )
304
- {
305
- $alist .= '|';
306
- $count++;
307
- }
308
- }
309
- $rules .= "\tif (\$http_user_agent ~* " . $alist . ") { return 403; }" . PHP_EOL;
310
- }
311
- }
312
-
313
- //close mod_rewrite
314
- if (strlen($aio_wp_security->configs->get_value('aiowps_banned_user_agents')) > 0)
315
- {
316
- if (($aiowps_server == 'apache' || $aiowps_server == 'litespeed'))
317
- {
318
- $rules .= "</IfModule>" . PHP_EOL;
319
- $rules .= AIOWPSecurity_Utility_Htaccess::$user_agent_blacklist_marker_end . PHP_EOL; //Add feature marker end
320
- }
321
- }
322
- }
323
-
324
- return implode( PHP_EOL, array_diff( explode( PHP_EOL, $rules ), array( 'Deny from ', 'Deny from' ) ) );
325
- }
326
-
327
- /*
328
- * TODO - info
329
- */
330
- static function getrules_basic_htaccess()
331
- {
332
- global $aio_wp_security;
333
- @ini_set( 'auto_detect_line_endings', true );
334
-
335
- //figure out what server they're using
336
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
337
- {
338
- $aiowps_server = 'apache';
339
- }
340
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
341
- {
342
- $aiowps_server = 'nginx';
343
- }
344
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
345
- {
346
- $aiowps_server = 'litespeed';
347
- }
348
- else
349
- { //unsupported server
350
- return -1;
351
- }
352
-
353
- $rules = '';
354
- if($aio_wp_security->configs->get_value('aiowps_enable_basic_firewall')=='1')
355
- {
356
- $rules .= AIOWPSecurity_Utility_Htaccess::$basic_htaccess_rules_marker_start . PHP_EOL; //Add feature marker start
357
- //limit indexing of directories
358
- $rules .= 'Options All -Indexes' . PHP_EOL;
359
- //protect the htaccess file - this is done by default with apache config file but we are including it here for good measure
360
- $rules .= '<files .htaccess>' . PHP_EOL;
361
- $rules .= 'order allow,deny' . PHP_EOL;
362
- $rules .= 'deny from all' . PHP_EOL;
363
- $rules .= '</files>' . PHP_EOL;
364
-
365
- //disable the server signature
366
- $rules .= 'ServerSignature Off' . PHP_EOL;
367
-
368
- //limit file uploads to 10mb
369
- $rules .= 'LimitRequestBody 10240000' . PHP_EOL;
370
-
371
- // protect wpconfig.php.
372
- $rules .= '<files wp-config.php>' . PHP_EOL;
373
- $rules .= 'order allow,deny' . PHP_EOL;
374
- $rules .= 'deny from all' . PHP_EOL;
375
- $rules .= '</files>' . PHP_EOL;
376
-
377
- $rules .= AIOWPSecurity_Utility_Htaccess::$basic_htaccess_rules_marker_end . PHP_EOL; //Add feature marker end
378
- }
379
- return $rules;
380
- }
381
-
382
- /*
383
- * This function will write rules to disable trace and track.
384
- * HTTP Trace attack (XST) can be used to return header requests
385
- * and grab cookies and other information and is used along with
386
- * a cross site scripting attacks (XSS)
387
- */
388
- static function getrules_disable_trace_and_track()
389
- {
390
- global $aio_wp_security;
391
- @ini_set( 'auto_detect_line_endings', true );
392
-
393
- //figure out what server they're using
394
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
395
- {
396
- $aiowps_server = 'apache';
397
- }
398
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
399
- {
400
- $aiowps_server = 'nginx';
401
- }
402
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
403
- {
404
- $aiowps_server = 'litespeed';
405
- }
406
- else
407
- { //unsupported server
408
- return -1;
409
- }
410
-
411
- $rules = '';
412
- if($aio_wp_security->configs->get_value('aiowps_disable_trace_and_track')=='1')
413
- {
414
- $rules .= AIOWPSecurity_Utility_Htaccess::$disable_trace_track_marker_start . PHP_EOL; //Add feature marker start
415
- $rules .= 'RewriteEngine On' . PHP_EOL;
416
- $rules .= 'RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)' . PHP_EOL;
417
- $rules .= 'RewriteRule .* - [F]' . PHP_EOL;
418
- $rules .= AIOWPSecurity_Utility_Htaccess::$disable_trace_track_marker_end . PHP_EOL; //Add feature marker end
419
- }
420
-
421
- return $rules;
422
- }
423
-
424
- /*
425
- * This function will write rules to prevent proxy comment posting.
426
- * This will deny any requests that use a proxy server when posting
427
- * to comments eliminating some spam and proxy requests, script
428
- * courtesy of perishablepress.com
429
- */
430
- static function getrules_forbid_proxy_comment_posting()
431
- {
432
- global $aio_wp_security;
433
- @ini_set( 'auto_detect_line_endings', true );
434
-
435
- //figure out what server they're using
436
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
437
- {
438
- $aiowps_server = 'apache';
439
- }
440
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
441
- {
442
- $aiowps_server = 'nginx';
443
- }
444
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
445
- {
446
- $aiowps_server = 'litespeed';
447
- }
448
- else
449
- { //unsupported server
450
- return -1;
451
- }
452
-
453
- $rules = '';
454
- if($aio_wp_security->configs->get_value('aiowps_forbid_proxy_comments')=='1')
455
- {
456
- $rules .= AIOWPSecurity_Utility_Htaccess::$forbid_proxy_comments_marker_start . PHP_EOL; //Add feature marker start
457
- $rules .= 'RewriteCond %{REQUEST_METHOD} =POST' . PHP_EOL;
458
- $rules .= 'RewriteCond %{HTTP:VIA}%{HTTP:FORWARDED}%{HTTP:USERAGENT_VIA}%{HTTP:X_FORWARDED_FOR}%{HTTP:PROXY_CONNECTION} !^$ [OR]' . PHP_EOL;
459
- $rules .= 'RewriteCond %{HTTP:XPROXY_CONNECTION}%{HTTP:HTTP_PC_REMOTE_ADDR}%{HTTP:HTTP_CLIENT_IP} !^$' . PHP_EOL;
460
- $rules .= 'RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]' . PHP_EOL;
461
- $rules .= 'RewriteRule .* - [F,NS,L]' . PHP_EOL;
462
- $rules .= AIOWPSecurity_Utility_Htaccess::$forbid_proxy_comments_marker_end . PHP_EOL; //Add feature marker end
463
- }
464
-
465
- return $rules;
466
- }
467
-
468
- /*
469
- * This function will write rules to prevent malicious string attacks on your site using XSS.
470
- * NOTE: Some of these strings might be used for plugins or themes and doing so will disable the functionality.
471
- * This script is from perishablepress and is fairly safe to use and should not break anything important
472
- */
473
- //TODO - the currently commented out rules (see function below) break the site - need to investigate why or if we can tweak the rules a bit
474
- static function getrules_deny_bad_query_strings()
475
- {
476
- global $aio_wp_security;
477
- @ini_set( 'auto_detect_line_endings', true );
478
-
479
- //figure out what server they're using
480
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
481
- {
482
- $aiowps_server = 'apache';
483
- }
484
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
485
- {
486
- $aiowps_server = 'nginx';
487
- }
488
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
489
- {
490
- $aiowps_server = 'litespeed';
491
- }
492
- else
493
- { //unsupported server
494
- return -1;
495
- }
496
-
497
- $rules = '';
498
- if($aio_wp_security->configs->get_value('aiowps_deny_bad_query_strings')=='1')
499
- {
500
- $rules .= AIOWPSecurity_Utility_Htaccess::$deny_bad_query_strings_marker_start . PHP_EOL; //Add feature marker start
501
- $rules .= 'RewriteCond %{QUERY_STRING} ../ [NC,OR]' . PHP_EOL;
502
- //$rules .= 'RewriteCond %{QUERY_STRING} boot.ini [NC,OR]' . PHP_EOL;
503
- $rules .= 'RewriteCond %{QUERY_STRING} tag= [NC,OR]' . PHP_EOL;
504
- $rules .= 'RewriteCond %{QUERY_STRING} ftp: [NC,OR]' . PHP_EOL;
505
- $rules .= 'RewriteCond %{QUERY_STRING} http: [NC,OR]' . PHP_EOL;
506
- $rules .= 'RewriteCond %{QUERY_STRING} https: [NC,OR]' . PHP_EOL;
507
- $rules .= 'RewriteCond %{QUERY_STRING} mosConfig [NC,OR]' . PHP_EOL;
508
- //$rules .= 'RewriteCond %{QUERY_STRING} ^.*([|]|(|)||\'|"|;|?|*).* [NC,OR]' . PHP_EOL;
509
- //$rules .= 'RewriteCond %{QUERY_STRING} ^.*(%22|%27|%3C|%3E|%5C|%7B|%7C).* [NC,OR]' . PHP_EOL;
510
- //$rules .= 'RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F|127.0).* [NC,OR]' . PHP_EOL;
511
- $rules .= 'RewriteCond %{QUERY_STRING} ^.*(globals|encode|config|localhost|loopback).* [NC,OR]' . PHP_EOL;
512
- $rules .= 'RewriteCond %{QUERY_STRING} ^.*(request|select|insert|union|declare|drop).* [NC]' . PHP_EOL;
513
- $rules .= 'RewriteRule ^(.*)$ - [F,L]' . PHP_EOL;
514
- $rules .= AIOWPSecurity_Utility_Htaccess::$deny_bad_query_strings_marker_end . PHP_EOL; //Add feature marker end
515
- }
516
-
517
- return $rules;
518
- }
519
-
520
- /*
521
- * This function will write rules to produce an advanced character string filter to prevent malicious string attacks from Cross Site Scripting (XSS)
522
- * NOTE: Some of these strings might be used for plugins or themes and doing so will disable the functionality.
523
- * This script is from perishablepress and is fairly safe to use and should not break anything important
524
- */
525
- //TODO - the rules below break the site - need to investigate why or if we can tweak the rules a bit
526
- //RedirectMatch 403 ^
527
- //RedirectMatch 403 $
528
- //RedirectMatch 403 |
529
- //RedirectMatch 403 ..
530
- //Redirectmatch 403 select(
531
- //Redirectmatch 403 convert(
532
- //RedirectMatch 403 .inc
533
- //RedirectMatch 403 include.
534
-
535
-
536
-
537
-
538
- static function getrules_advanced_character_string_filter()
539
- {
540
- global $aio_wp_security;
541
- @ini_set( 'auto_detect_line_endings', true );
542
-
543
- //figure out what server they're using
544
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
545
- {
546
- $aiowps_server = 'apache';
547
- }
548
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
549
- {
550
- $aiowps_server = 'nginx';
551
- }
552
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
553
- {
554
- $aiowps_server = 'litespeed';
555
- }
556
- else
557
- { //unsupported server
558
- return -1;
559
- }
560
-
561
- $rules = '';
562
- if($aio_wp_security->configs->get_value('aiowps_advanced_char_string_filter')=='1')
563
- {
564
- $rules .= AIOWPSecurity_Utility_Htaccess::$advanced_char_string_filter_marker_start . PHP_EOL; //Add feature marker start
565
-
566
- $rules .= '<IfModule mod_alias.c>
567
- RedirectMatch 403 `
568
- RedirectMatch 403 {
569
- RedirectMatch 403 }
570
- RedirectMatch 403 ~
571
- RedirectMatch 403 &quot;
572
- RedirectMatch 403 &lt;
573
- RedirectMatch 403 &gt;
574
- RedirectMatch 403 //
575
- RedirectMatch 403 %0
576
- RedirectMatch 403 %A
577
- RedirectMatch 403 %B
578
- RedirectMatch 403 %C
579
- RedirectMatch 403 %D
580
- RedirectMatch 403 %E
581
- RedirectMatch 403 %F
582
- RedirectMatch 403 %22
583
- RedirectMatch 403 %27
584
- RedirectMatch 403 %28
585
- RedirectMatch 403 %29
586
- RedirectMatch 403 %3C
587
- RedirectMatch 403 %3E
588
- RedirectMatch 403 %3F
589
- RedirectMatch 403 %5B
590
- RedirectMatch 403 %5C
591
- RedirectMatch 403 %5D
592
- RedirectMatch 403 %7B
593
- RedirectMatch 403 %7C
594
- RedirectMatch 403 %7D
595
- # COMMON PATTERNS
596
- Redirectmatch 403 _vpi
597
- Redirectmatch 403 xAou6
598
- Redirectmatch 403 db_name
599
- Redirectmatch 403 /query/
600
- RedirectMatch 403 ImpEvData
601
- Redirectmatch 403 .XMLHTTP
602
- Redirectmatch 403 proxydeny
603
- RedirectMatch 403 function.
604
- Redirectmatch 403 remoteFile
605
- Redirectmatch 403 servername
606
- Redirectmatch 403 &amp;rptmode=
607
- Redirectmatch 403 sys_cpanel
608
- RedirectMatch 403 db_connect
609
- RedirectMatch 403 doeditconfig
610
- RedirectMatch 403 check_proxy
611
- Redirectmatch 403 system_user
612
- Redirectmatch 403 /(null)/
613
- Redirectmatch 403 clientrequest
614
- Redirectmatch 403 option_value
615
- RedirectMatch 403 ref.outcontrol
616
- # SPECIFIC EXPLOITS
617
- RedirectMatch 403 errors.
618
- RedirectMatch 403 config.
619
- RedirectMatch 403 display.
620
- RedirectMatch 403 register.
621
- Redirectmatch 403 password.
622
- RedirectMatch 403 maincore.
623
- RedirectMatch 403 authorize.
624
- Redirectmatch 403 macromates.
625
- RedirectMatch 403 head_auth.
626
- RedirectMatch 403 submit_links.
627
- RedirectMatch 403 change_action.
628
- Redirectmatch 403 com_facileforms/
629
- RedirectMatch 403 admin_db_utilities.
630
- RedirectMatch 403 admin.webring.docs.
631
- Redirectmatch 403 Table/Latest/index.
632
- </IfModule>' . PHP_EOL;
633
- $rules .= AIOWPSecurity_Utility_Htaccess::$advanced_char_string_filter_marker_end . PHP_EOL; //Add feature marker end
634
- }
635
-
636
- return $rules;
637
- }
638
-
639
- /*
640
- * This function contains the rules for the 5G blacklist produced by Jeff Starr from perishablepress.com
641
- * NOTE: Since Jeff regularly updates and evolves his blacklist rules, ie, 5G->6G->7G.... we will update this function to reflect the latest blacklist release
642
- */
643
-
644
-
645
- static function getrules_5g_blacklist()
646
- {
647
- global $aio_wp_security;
648
- @ini_set( 'auto_detect_line_endings', true );
649
-
650
- //figure out what server they're using
651
- if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'apache'))
652
- {
653
- $aiowps_server = 'apache';
654
- }
655
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'nginx'))
656
- {
657
- $aiowps_server = 'nginx';
658
- }
659
- else if (strstr(strtolower(filter_var($_SERVER['SERVER_SOFTWARE'], FILTER_SANITIZE_STRING)), 'litespeed'))
660
- {
661
- $aiowps_server = 'litespeed';
662
- }
663
- else
664
- { //unsupported server
665
- return -1;
666
- }
667
-
668
- $rules = '';
669
- if($aio_wp_security->configs->get_value('aiowps_enable_5g_firewall')=='1')
670
- {
671
- $rules .= AIOWPSecurity_Utility_Htaccess::$five_g_blacklist_marker_start . PHP_EOL; //Add feature marker start
672
-
673
- $rules .= '# 5G BLACKLIST/FIREWALL (2013)
674
- # @ http://perishablepress.com/5g-blacklist-2013/
675
-
676
- # 5G:[QUERY STRINGS]
677
- <IfModule mod_rewrite.c>
678
- RewriteEngine On
679
- RewriteBase /
680
- RewriteCond %{QUERY_STRING} (\"|%22).*(<|>|%3) [NC,OR]
681
- RewriteCond %{QUERY_STRING} (javascript:).*(\;) [NC,OR]
682
- RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3) [NC,OR]
683
- RewriteCond %{QUERY_STRING} (\\|\.\./|`|=\'$|=%27$) [NC,OR]
684
- RewriteCond %{QUERY_STRING} (\;|\'|\"|%22).*(union|select|insert|drop|update|md5|benchmark|or|and|if) [NC,OR]
685
- RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig) [NC,OR]
686
- RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
687
- RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
688
- RewriteRule .* - [F]
689
- </IfModule>
690
-
691
- # 5G:[USER AGENTS]
692
- <IfModule mod_setenvif.c>
693
- # SetEnvIfNoCase User-Agent ^$ keep_out
694
- SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) keep_out
695
- <limit GET POST PUT>
696
- Order Allow,Deny
697
- Allow from all
698
- Deny from env=keep_out
699
- </limit>
700
- </IfModule>
701
-
702
- # 5G:[REQUEST STRINGS]
703
- <IfModule mod_alias.c>
704
- RedirectMatch 403 (https?|ftp|php)\://
705
- RedirectMatch 403 /(https?|ima|ucp)/
706
- RedirectMatch 403 /(Permanent|Better)$
707
- RedirectMatch 403 (\=\\\'|\=\\%27|/\\\'/?|\)\.css\()$
708
- RedirectMatch 403 (\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")
709
- RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$
710
- RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php$
711
- RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_)
712
- RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae|config\.xml)
713
- RedirectMatch 403 \.well\-known/host\-meta
714
- RedirectMatch 403 /function\.array\-rand
715
- RedirectMatch 403 \)\;\$\(this\)\.html\(
716
- RedirectMatch 403 proc/self/environ
717
- RedirectMatch 403 msnbot\.htm\)\.\_
718
- RedirectMatch 403 /ref\.outcontrol
719
- RedirectMatch 403 com\_cropimage
720
- RedirectMatch 403 indonesia\.htm
721
- RedirectMatch 403 \{\$itemURL\}
722
- RedirectMatch 403 function\(\)
723
- RedirectMatch 403 labels\.rdf
724
- RedirectMatch 403 /playing.php
725
- RedirectMatch 403 muieblackcat
726
- </IfModule>
727
-
728
- # 5G:[REQUEST METHOD]
729
- <ifModule mod_rewrite.c>
730
- RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
731
- RewriteRule .* - [F]
732
- </IfModule>
733
-
734
- # 5G:[BAD IPS]
735
- <limit GET POST PUT>
736
- Order Allow,Deny
737
- Allow from all
738
- # uncomment/edit/repeat next line to block IPs
739
- # Deny from 123.456.789
740
- </limit>' . PHP_EOL;
741
- $rules .= AIOWPSecurity_Utility_Htaccess::$five_g_blacklist_marker_end . PHP_EOL; //Add feature marker end
742
- }
743
-
744
- return $rules;
745
- }
746
-
747
- /*
748
- * This function will do a quick check to see if a file's contents are actually .htaccess specific.
749
- * At the moment it will look for the following tag somewhere in the file - "# BEGIN WordPress"
750
- * If it finds the tag it will deem the file as being .htaccess specific.
751
- * This was written to supplement the .htaccess restore functionality
752
- */
753
-
754
- static function check_if_htaccess_contents($file)
755
- {
756
- $is_htaccess = false;
757
- $file_contents = file_get_contents($file);
758
-
759
- if (!$file_contents || $file_contents == 0)
760
- {
761
- return -1;
762
- }
763
-
764
- if ((strpos($file_contents, '# BEGIN WordPress') !== false) || (strpos($file_contents, '# BEGIN') !== false))
765
- {
766
- $is_htaccess = true; //It appears that we have some sort of .htacces file
767
- }
768
- else
769
- {
770
- //see if we're at the end of the section
771
- $is_htaccess = false;
772
- }
773
-
774
- if ($is_htaccess)
775
- {
776
- return 1;
777
- }
778
- else
779
- {
780
- return -1;
781
- }
782
- }
783
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-utility-ip-address.php DELETED
@@ -1,146 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Utility_IP
4
- {
5
- function __construct(){
6
- //NOP
7
- }
8
-
9
- static function get_user_ip_address()
10
- {
11
- //Let's try getting the headers if possible
12
- if ( function_exists( 'apache_request_headers' ) ) {
13
- $headers = apache_request_headers();
14
- } else {
15
- $headers = $_SERVER;
16
- }
17
-
18
- //Get the forwarded IP if it exists
19
- if (array_key_exists( 'X-Forwarded-For', $headers) ) {
20
- $userIP = $headers['X-Forwarded-For'];
21
- } else {
22
- $userIP = $_SERVER['REMOTE_ADDR'];
23
- }
24
- return $userIP;
25
- }
26
-
27
- static function create_ip_list_array_from_string_with_newline($ip_addresses)
28
- {
29
- $ip_list_array = explode(PHP_EOL, $ip_addresses);
30
- return $ip_list_array;
31
- }
32
-
33
- static function validate_ip_list($ip_list_array)
34
- {
35
- @ini_set('auto_detect_line_endings', true);
36
- $errors = '';
37
-
38
- //validate list
39
- $submitted_ips = $ip_list_array;
40
- $list = array();
41
-
42
- if(!empty($submitted_ips))
43
- {
44
- foreach($submitted_ips as $item)
45
- {
46
- $item = filter_var($item, FILTER_SANITIZE_STRING);
47
- if (strlen( $item ) > 0)
48
- {
49
- $ipParts = explode('.', $item);
50
- $isIP = 0;
51
- $partcount = 1;
52
- $goodip = true;
53
- $foundwild = false;
54
-
55
- if (count($ipParts) < 2)
56
- {
57
- $errors .= '<p>'.$item.__(' is not a valid ip address format.', 'aiowpsecurity').'</p>';
58
- continue;
59
- }
60
-
61
- foreach ($ipParts as $part)
62
- {
63
- if ($goodip == true)
64
- {
65
- if ((is_numeric(trim($part)) && trim($part) <= 255 && trim($part) >= 0) || trim($part) == '*')
66
- {
67
- $isIP++;
68
- }
69
-
70
- switch ($partcount)
71
- {
72
- case 1:
73
- if (trim($part) == '*')
74
- {
75
- $goodip = false;
76
- $errors .= '<p>'.$item.__(' is not a valid ip address format.', 'aiowpsecurity').'</p>';
77
- }
78
- break;
79
- case 2:
80
- if (trim($part) == '*')
81
- {
82
- $foundwild = true;
83
- }
84
- break;
85
- default:
86
- if (trim($part) != '*')
87
- {
88
- if ($foundwild == true)
89
- {
90
- $goodip = false;
91
- $errors .= '<p>'.$item.__(' is not a valid ip address format.', 'aiowpsecurity').'</p>';
92
- }
93
- }
94
- else
95
- {
96
- $foundwild = true;
97
- }
98
- break;
99
- }
100
-
101
- $partcount++;
102
- }
103
- }
104
- if (ip2long(trim(str_replace('*', '0', $item))) == false)
105
- { //invalid ip
106
- $errors .= '<p>'.$item.__(' is not a valid ip address format.', 'aiowpsecurity').'</p>';
107
- }
108
- elseif (strlen($item > 4 && !in_array($item, $list)))
109
- {
110
- $current_user_ip = AIOWPSecurity_Utility_IP::get_user_ip_address();
111
- if ($current_user_ip == $item)
112
- {
113
- //You can't ban your own IP
114
- $errors .= '<p>'.__('You cannot ban your own IP address: ', 'aiowpsecurity').$item.'</p>';
115
- }
116
- else
117
- {
118
- $list[] = trim($item);
119
- }
120
- }
121
- }
122
- }
123
- }
124
- else{
125
- //This function was called with an empty IP address array list
126
- }
127
-
128
- if (strlen($errors)> 0)
129
- {
130
- $return_payload = array(-1, array($errors));
131
- return $return_payload;
132
- }
133
-
134
- if (sizeof($list) >= 1)
135
- {
136
- sort($list);
137
- $list = array_unique($list, SORT_STRING);
138
-
139
- $return_payload = array(1, $list);
140
- return $return_payload;
141
- }
142
-
143
- $return_payload = array(1, array());
144
- return $return_payload;
145
- }
146
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/classes/wp-security-utility.php DELETED
@@ -1,105 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Utility
4
- {
5
- function __construct(){
6
- //NOP
7
- }
8
-
9
- static function get_current_page_url()
10
- {
11
- $pageURL = 'http';
12
- if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
13
- $pageURL .= "://";
14
- if ($_SERVER["SERVER_PORT"] != "80") {
15
- $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
16
- }
17
- else{
18
- $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
19
- }
20
- return $pageURL;
21
- }
22
-
23
- static function redirect_to_url($url,$delay='0',$exit='1')
24
- {
25
- if(empty($url)){
26
- echo "<br /><strong>Error! The URL value is empty. Please specify a correct URL value to redirect to!</strong>";
27
- exit;
28
- }
29
- if (!headers_sent()){
30
- header('Location: ' . $url);
31
- }
32
- else{
33
- echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'" />';
34
- }
35
- if($exit == '1'){
36
- exit;
37
- }
38
- }
39
-
40
- static function get_logout_url_with_after_logout_url_value($after_logout_url)
41
- {
42
- return AIOWPSEC_WP_URL.'?aiowpsec_do_log_out=1&after_logout='.$after_logout_url;
43
- }
44
-
45
- /*
46
- * Checks if a particular username exists in the WP Users table
47
- */
48
- static function check_user_exists($username)
49
- {
50
- global $wpdb;
51
-
52
- //if username is empty just return false
53
- if ( $username == '' ) {
54
- return false;
55
- }
56
-
57
- //check users table
58
- $user = $wpdb->get_var( "SELECT user_login FROM `" . $wpdb->users . "` WHERE user_login='" . sanitize_text_field( $username ) . "';" );
59
- $userid = $wpdb->get_var( "SELECT ID FROM `" . $wpdb->users . "` WHERE ID='" . sanitize_text_field( $username ) . "';" );
60
-
61
- if ( $user == $username || $userid == $username ) {
62
- return true;
63
- } else {
64
- return false;
65
- }
66
- }
67
-
68
- /*
69
- * This function will return a list of user accounts which have login and nick names which are identical
70
- */
71
- static function check_identical_login_and_nick_names() {
72
- global $wpdb;
73
- $accounts_found = $wpdb->get_results( "SELECT ID,user_login FROM `" . $wpdb->users . "` WHERE user_login<=>display_name;", ARRAY_A);
74
- return $accounts_found;
75
- }
76
-
77
-
78
- static function add_query_data_to_url($url, $name, $value)
79
- {
80
- if (strpos($url, '?') === false) {
81
- $url .= '?';
82
- } else {
83
- $url .= '&';
84
- }
85
- $url .= $name . '='. $value;
86
- return $url;
87
- }
88
-
89
-
90
- /*
91
- * Generates a random alpha-numeric number
92
- */
93
- static function generate_alpha_numeric_random_string($string_length)
94
- {
95
- //Charecters present in table prefix
96
- $allowed_chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
97
- $string = '';
98
- //Generate random string
99
- for ($i = 0; $i < $string_length; $i++) {
100
- $string .= $allowed_chars[rand(0, strlen($allowed_chars) - 1)];
101
- }
102
- return $string;
103
- }
104
-
105
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/css/wp-security-admin-styles.css DELETED
@@ -1,255 +0,0 @@
1
- .aio_half_width{width: 50%;}
2
- .aio_one_third_width{width: 33%;}
3
- .aio_width_80{width: 80%;}
4
- .aio_max_500{max-width: 500px;}
5
- .aio_spacer_15{margin-top:15px;}
6
- .aio_spacer_10_tb{margin:10px 0;}
7
- .aio_spacer_10_tblr{margin:10px;}
8
- .aio_clear_float{clear: both;}
9
- .aio_float_left{float: left;}
10
-
11
- .aiowps_admin_ul_grp1{
12
- list-style: circle;
13
- padding: 0 0 0 30px;
14
- }
15
-
16
- .aio_grey_box{
17
- margin: 10px 0 15px;
18
- background-color: #ECECEC;
19
- border: 1px solid #CFCFCF;
20
- padding: 0 0 0 1em;
21
- }
22
-
23
- .aio_yellow_box{
24
- margin: 10px 0 15px;
25
- background-color: #FFFFE0;
26
- border-color: #E6DB55;
27
- border-radius: 3px 3px 3px 3px;
28
- border-style: solid;
29
- border-width: 1px;
30
- padding: 0 0 0 1em;
31
- }
32
-
33
- .aio_blue_box{
34
- margin: 10px 0 15px;
35
- background-color: #F0F9FF;
36
- border-color: #1166BB;
37
- color: #1166BB;
38
- border-radius: 3px 3px 3px 3px;
39
- border-style: solid;
40
- border-width: 1px;
41
- padding: 0 0 0 1em;
42
- line-height: 20px;
43
- }
44
-
45
- .aio_green_box {
46
- margin: 10px 0 15px;
47
- background-color: #CCF4D6;
48
- border-color: #059B53;
49
- color: #043B14;
50
- border-radius: 3px 3px 3px 3px;
51
- border-style: solid;
52
- border-width: 1px;
53
- padding: 0 0 0 1em;
54
- }
55
-
56
- .aio_red_box {
57
- margin: 10px 0 15px;
58
- background-color: #FFEBE8;
59
- border-color: #CC0000;
60
- color: #333333;
61
- border-radius: 3px 3px 3px 3px;
62
- border-style: solid;
63
- border-width: 1px;
64
- padding: 0 0 0 1em;
65
- }
66
-
67
- .aio_success_with_icon {
68
- background-image: url("../images/success.png");
69
- background-repeat: no-repeat;
70
- color: #529901;
71
- padding-left: 20px;
72
- font-size: 14px;
73
- }
74
- .aio_error_with_icon {
75
- color: #ff0000;
76
- background-image: url("../images/error.png");
77
- background-repeat: no-repeat;
78
- padding-left: 20px;
79
- font-size: 14px;
80
- }
81
- .aio_info_with_icon {
82
- background-image: url("../images/info-icon.png");
83
- background-repeat: no-repeat;
84
- color: #1166BB;
85
- padding-left: 20px;
86
- font-size: 14px;
87
- }
88
-
89
- .file_permission_table{
90
- margin: 20px 0;
91
- }
92
- .file_permission_table thead tr th{
93
- background:#CCCCCC;
94
- }
95
- .file_permission_table td{
96
- padding: 7px;
97
- font-family: "Courier 10 Pitch",Courier,monospace;
98
- color: #262626;
99
- border-bottom: 1px solid #F2F2F2;
100
- border-top:none;
101
- }
102
- .aio_table_row_red{
103
- background-color:#FD6D73;
104
- }
105
- .aio_table_row_yellow{
106
- background-color:#F5E679;
107
- }
108
- .aio_table_row_green{
109
- background-color:#C8F18B;
110
- }
111
-
112
- .aiowps_loading_1{
113
- margin:0 5px;
114
- }
115
-
116
- .aio_text_area_file_output{
117
- background: none repeat scroll 0 0 #F9F9F9;
118
- font-family: Consolas,Monaco,monospace;
119
- font-size: 12px;
120
- outline: 0 none;
121
- }
122
-
123
- .aiowps_more_info_anchor{
124
- background-color: #D9D9D9;
125
- color: #21759B;
126
- font: 0.9em/1.455em "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif;
127
- text-decoration: none;
128
- padding: 3px 5px;
129
- }
130
- .aiowps_more_info_anchor:hover {
131
- color: #333333;
132
- cursor: pointer;
133
- }
134
- .aiowps_more_info_toggle_char {
135
- display: inline-block;
136
- margin-right: 3px;
137
- padding: 0 3px;
138
- text-align: center;
139
- background-color: #EDEDED;
140
- width: 10px;
141
- }
142
- .aiowps_more_info_body{
143
- margin: 10px 0 15px;
144
- background-color: #FFFFE0;
145
- border-color: #E6DB55;
146
- border-radius: 3px 3px 3px 3px;
147
- border-style: solid;
148
- border-width: 1px;
149
- padding: 0 0 0 1em;
150
- }
151
-
152
- .aiowps_dashboard_box_small{
153
- float:left;
154
- max-width:350px;
155
- margin-right:15px;
156
- }
157
- .aiowps_dashboard_widget_footer{
158
- background-color: #E6E6E6;
159
- padding: 10px;
160
- }
161
-
162
- .aiowps_feature_status_container{
163
- display:block;
164
- margin: 10px 0;
165
- }
166
- .aiowps_feature_status_name{
167
- width:50%;
168
- font-weight: bold;
169
- float:left;
170
- padding: 5px 10px 5px 0;
171
- }
172
- .aiowps_feature_status_bar{
173
- display:block;
174
- float:left;
175
- width: 120px;
176
- height: 26px;
177
- position: relative;
178
- background: rgba(0, 0, 0, 0.25);
179
- border-radius: 3px;
180
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1);
181
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1);
182
- }
183
- .aiowps_feature_status_label{
184
- display: block;
185
- float: left;
186
- padding: 4px;
187
- text-align: center;
188
- width: 52px;
189
- color:#F7F7F7;
190
- font-weight:bold;
191
- text-transform: uppercase;
192
- }
193
- .aiowps_feature_status_on{
194
- color: #043B14;
195
- background: #65bd63;
196
- border-radius: 3px;
197
- background-image: -webkit-linear-gradient(top, #9dd993, #65bd63);
198
- background-image: -moz-linear-gradient(top, #9dd993, #65bd63);
199
- background-image: -o-linear-gradient(top, #9dd993, #65bd63);
200
- background-image: linear-gradient(to bottom, #9dd993, #65bd63);
201
- -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
202
- box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
203
- }
204
- .aiowps_feature_status_off{
205
- color: #4D0000;
206
- background: #BD6363;
207
- border-radius: 3px;
208
- background-image: -webkit-linear-gradient(top, #D99393, #BD6363);
209
- background-image: -moz-linear-gradient(top, #D99393, #BD6363);
210
- background-image: -o-linear-gradient(top, #D99393, #BD6363);
211
- background-image: linear-gradient(top bottom, #D99393, #BD6363);
212
- -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
213
- box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
214
- }
215
-
216
- .aiowps_feature_details_badge{
217
-
218
- }
219
- .aiowps_feature_details_badge_difficulty{
220
- display: inline-block;
221
- background: url('../images/feature-difficulty-badge-bg.png') no-repeat;
222
- width:150px;
223
- height:65px;
224
- }
225
- .aiowps_feature_details_badge_difficulty_text{
226
- display: inline-block;
227
- height:36px;
228
- width: 105px;
229
- margin: 8px 0 0 36px;
230
- color: #595170;
231
- font-size:14px;
232
- font-family: helvetica;
233
- font-weight: bold;
234
- text-align: center;
235
- padding-top:7px;
236
- }
237
- .aiowps_feature_details_badge_points{
238
- display: inline-block;
239
- background: url('../images/feature-points-badge-bg.png') no-repeat;
240
- width:150px;
241
- height:65px;
242
- margin-left: 10px;
243
- }
244
- .aiowps_feature_details_badge_points_text{
245
- display: inline-block;
246
- height:36px;
247
- width: 105px;
248
- margin: 8px 0 0 36px;
249
- color: #545B5C;
250
- font-size:20px;
251
- font-family: georgia;
252
- font-weight: bold;
253
- text-align: center;
254
- padding-top:5px;
255
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/js/wp-security-admin-script.js DELETED
@@ -1,39 +0,0 @@
1
- jQuery(document).ready(function($){
2
- //Add Generic Admin Dashboard JS Code in this file
3
-
4
- //Media Uploader - start
5
- function aiowps_attach_media_uploader(key) {
6
- jQuery('#' + key + '_button').click(function() {
7
- text_element = jQuery('#' + key).attr('name');
8
- button_element = jQuery('#' + key + '_button').attr('name');
9
- tb_show('All In One Security - Please Select a File', 'media-upload.php?referer=aiowpsec&amp;TB_iframe=true&amp;post_id=0width=640&amp;height=485');
10
- return false;
11
- });
12
- window.send_to_editor = function(html) {
13
- var self_element = text_element;
14
- fileurl = jQuery(html).attr('href');
15
- jQuery('#' + self_element).val(fileurl);
16
- tb_remove();
17
- };
18
- }
19
- aiowps_attach_media_uploader('aiowps_htaccess_file');
20
- aiowps_attach_media_uploader('aiowps_wp_config_file');
21
- aiowps_attach_media_uploader('aiowps_db_file'); //TODO - for future use when we implement DB restore
22
- //End of Media Uploader
23
-
24
- //Triggers the more info toggle link
25
- $(".aiowps_more_info_body").hide();//hide the more info on page load
26
- $(".aiowps_more_info_anchor").click(function(){
27
- $(this).next(".aiowps_more_info_body").animate({ "height": "toggle"});
28
- var toogle_char_ref = $(this).find(".aiowps_more_info_toggle_char");
29
- var toggle_char_value = toogle_char_ref.text();
30
- if(toggle_char_value === "+"){
31
- toogle_char_ref.text("-");
32
- }
33
- else{
34
- toogle_char_ref.text("+");
35
- }
36
- });
37
- //End of more info toggle
38
-
39
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.cl.php DELETED
@@ -1,56 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__CL_HANDLER__'))
29
- define('__CL_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class cl_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $items = array(
38
- 'admin' => '(Administrative Contact)',
39
- 'tech' => 'Contacto Técnico (Technical Contact):',
40
- 'domain.nserver' => 'Servidores de nombre (Domain servers):',
41
- 'domain.changed' => '(Database last updated on):'
42
- );
43
-
44
- $trans = array(
45
- 'organización:' => 'organization',
46
- 'nombre :' => 'name');
47
-
48
- $r['regrinfo'] = easy_parser($data_str['rawdata'], $items, 'd-m-y', $trans);
49
- $r['regyinfo'] = array(
50
- 'referrer' => 'http://www.nic.cl',
51
- 'registrar' => 'NIC Chile'
52
- );
53
- return $r;
54
- }
55
- }
56
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.client.php DELETED
@@ -1,595 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- require_once('whois.ip.lib.php');
29
-
30
- class WhoisClient {
31
-
32
- // Recursion allowed ?
33
- var $gtld_recurse = false;
34
-
35
- // Default WHOIS port
36
- var $PORT = 43;
37
-
38
- // Maximum number of retries on connection failure
39
- var $RETRY = 0;
40
-
41
- // Time to wait between retries
42
- var $SLEEP = 2;
43
-
44
- // Read buffer size (0 == char by char)
45
- var $BUFFER = 1024;
46
-
47
- // Communications timeout
48
- var $STIMEOUT = 10;
49
-
50
- // List of servers and handlers (loaded from servers.whois)
51
- var $DATA = array();
52
-
53
- // Array to contain all query variables
54
- var $Query = array(
55
- 'tld' => '',
56
- 'type' => 'domain',
57
- 'query' => '',
58
- 'status',
59
- 'server'
60
- );
61
-
62
- // This release of the package
63
- var $CODE_VERSION = '4.2.2';
64
-
65
- // Full code and data version string (e.g. 'Whois2.php v3.01:16')
66
- var $VERSION;
67
-
68
- /*
69
- * Constructor function
70
- */
71
- function WhoisClient () {
72
- // Load DATA array
73
- @require('whois.servers.php');
74
-
75
- // Set version
76
- $this->VERSION = sprintf("phpWhois v%s-%s", $this->CODE_VERSION, $this->DATA_VERSION);
77
- }
78
-
79
- /*
80
- * Perform lookup
81
- */
82
-
83
- function GetRawData ($query) {
84
-
85
- $this->Query['query'] = $query;
86
-
87
- // clear error description
88
- if (isset($this->Query['errstr'])) unset($this->Query['errstr']);
89
-
90
- if (!isset($this->Query['server'])) {
91
- $this->Query['status'] = 'error';
92
- $this->Query['errstr'][] = 'No server specified';
93
- return(array());
94
- }
95
-
96
- // Check if protocol is http
97
-
98
- if (substr($this->Query['server'],0,7)=='http://' ||
99
- substr($this->Query['server'],0,8)=='https://')
100
- {
101
- $output = $this->httpQuery($this->Query['server']);
102
-
103
- if (!$output)
104
- {
105
- $this->Query['status'] = 'error';
106
- $this->Query['errstr'][] = 'Connect failed to: '.$this->Query['server'];
107
- return(array());
108
- }
109
-
110
- $this->Query['args'] = substr(strchr($this->Query['server'],'?'),1);
111
- $this->Query['server'] = strtok($this->Query['server'],'?');
112
-
113
- if (substr($this->Query['server'],0,7)=='http://')
114
- $this->Query['server_port'] = 80;
115
- else
116
- $this->Query['server_port'] = 483;
117
- }
118
- else
119
- {
120
- // Get args
121
-
122
- if (strpos($this->Query['server'],'?'))
123
- {
124
- $parts = explode('?',$this->Query['server']);
125
- $this->Query['server'] = trim($parts[0]);
126
- $query_args = trim($parts[1]);
127
-
128
- // replace substitution parameters
129
- $query_args = str_replace('{query}', $query, $query_args);
130
- $query_args = str_replace('{version}', 'phpWhois'.$this->CODE_VERSION, $query_args);
131
-
132
- if (strpos($query_args,'{ip}')!==false)
133
- {
134
- $query_args = str_replace('{ip}', phpwhois_getclientip(), $query_args);
135
- }
136
-
137
- if (strpos($query_args,'{hname}')!==false)
138
- {
139
- $query_args = str_replace('{hname}', gethostbyaddr(phpwhois_getclientip()), $query_args);
140
- }
141
- }
142
- else
143
- {
144
- if (empty($this->Query['args']))
145
- $query_args = $query;
146
- else
147
- $query_args = $this->Query['args'];
148
- }
149
-
150
- $this->Query['args'] = $query_args;
151
-
152
- if (substr($this->Query['server'],0,9) == 'rwhois://')
153
- {
154
- $this->Query['server'] = substr($this->Query['server'],9);
155
- }
156
-
157
- if (substr($this->Query['server'],0,8) == 'whois://')
158
- {
159
- $this->Query['server'] = substr($this->Query['server'],8);
160
- }
161
-
162
- // Get port
163
-
164
- if (strpos($this->Query['server'],':'))
165
- {
166
- $parts = explode(':',$this->Query['server']);
167
- $this->Query['server'] = trim($parts[0]);
168
- $this->Query['server_port'] = trim($parts[1]);
169
- }
170
- else
171
- $this->Query['server_port'] = $this->PORT;
172
-
173
- // Connect to whois server, or return if failed
174
-
175
- $ptr = $this->Connect();
176
-
177
- if($ptr < 0) {
178
- $this->Query['status'] = 'error';
179
- $this->Query['errstr'][] = 'Connect failed to: '.$this->Query['server'];
180
- return array();
181
- }
182
-
183
- stream_set_timeout($ptr,$this->STIMEOUT);
184
- stream_set_blocking($ptr,0);
185
-
186
- // Send query
187
- fputs($ptr, trim($query_args)."\r\n");
188
-
189
- // Prepare to receive result
190
- $raw = '';
191
- $start = time();
192
- $null = NULL;
193
- $r = array($ptr);
194
-
195
- while (!feof($ptr))
196
- {
197
- if (stream_select($r,$null,$null,$this->STIMEOUT))
198
- {
199
- $raw .= fgets($ptr, $this->BUFFER);
200
- }
201
-
202
- if (time()-$start > $this->STIMEOUT)
203
- {
204
- $this->Query['status'] = 'error';
205
- $this->Query['errstr'][] = 'Timeout reading from '.$this->Query['server'];
206
- return array();
207
- }
208
- }
209
-
210
- if (array_key_exists($this->Query['server'],$this->NON_UTF8))
211
- {
212
- $raw = utf8_encode($raw);
213
- }
214
-
215
- $output = explode("\n", $raw);
216
-
217
- // Drop empty last line (if it's empty! - saleck)
218
- if (empty($output[count($output)-1]))
219
- unset($output[count($output)-1]);
220
- }
221
-
222
- return $output;
223
- }
224
-
225
- /*
226
- * Perform lookup. Returns an array. The 'rawdata' element contains an
227
- * array of lines gathered from the whois query. If a top level domain
228
- * handler class was found for the domain, other elements will have been
229
- * populated too.
230
- */
231
-
232
- function GetData ($query='', $deep_whois=true) {
233
-
234
- // If domain to query passed in, use it, otherwise use domain from initialisation
235
- $query = !empty($query) ? $query : $this->Query['query'];
236
-
237
- $output = $this->GetRawData($query);
238
-
239
- // Create result and set 'rawdata'
240
- $result = array( 'rawdata' => $output );
241
- $result = $this->set_whois_info($result);
242
-
243
- // Return now on error
244
- if (empty($output)) return $result;
245
-
246
- // If we have a handler, post-process it with it
247
- if (isSet($this->Query['handler']))
248
- {
249
- // Keep server list
250
- $servers = $result['regyinfo']['servers'];
251
- unset($result['regyinfo']['servers']);
252
-
253
- // Process data
254
- $result = $this->Process($result,$deep_whois);
255
-
256
- // Add new servers to the server list
257
- if (isset($result['regyinfo']['servers']))
258
- $result['regyinfo']['servers'] = array_merge($servers,$result['regyinfo']['servers']);
259
- else
260
- $result['regyinfo']['servers'] = $servers;
261
-
262
- // Handler may forget to set rawdata
263
- if (!isset($result['rawdata']))
264
- $result['rawdata'] = $output;
265
- }
266
-
267
- // Type defaults to domain
268
- if (!isset($result['regyinfo']['type']))
269
- $result['regyinfo']['type'] = 'domain';
270
-
271
- // Add error information if any
272
- if (isset($this->Query['errstr']))
273
- $result['errstr'] = $this->Query['errstr'];
274
-
275
- // Fix/add nameserver information
276
- if (method_exists($this,'FixResult') && $this->Query['tld'] != 'ip')
277
- $this->FixResult($result,$query);
278
-
279
- return($result);
280
- }
281
-
282
- /*
283
- * Adds whois server query information to result
284
- */
285
-
286
- function set_whois_info ($result)
287
- {
288
- $info = array(
289
- 'server'=> $this->Query['server'],
290
- );
291
-
292
- if (!empty($this->Query['args']))
293
- $info['args'] = $this->Query['args'];
294
- else
295
- $info['args'] = $this->Query['query'];
296
-
297
- if (!empty($this->Query['server_port']))
298
- $info['port'] = $this->Query['server_port'];
299
- else
300
- $info['port'] = 43;
301
-
302
- if (isset($result['regyinfo']['whois']))
303
- unset($result['regyinfo']['whois']);
304
-
305
- if (isset($result['regyinfo']['rwhois']))
306
- unset($result['regyinfo']['rwhois']);
307
-
308
- $result['regyinfo']['servers'][] = $info;
309
-
310
- return $result;
311
- }
312
-
313
- /*
314
- * Convert html output to plain text
315
- */
316
- function httpQuery ($query) {
317
-
318
- //echo ini_get('allow_url_fopen');
319
-
320
- //if (ini_get('allow_url_fopen'))
321
- $lines = @file($this->Query['server']);
322
-
323
- if (!$lines) return false;
324
-
325
- $output = '';
326
- $pre = '';
327
-
328
- while (list($key, $val)=each($lines)) {
329
- $val = trim($val);
330
-
331
- $pos=strpos(strtoupper($val),'<PRE>');
332
- if ($pos!==false) {
333
- $pre = "\n";
334
- $output.=substr($val,0,$pos)."\n";
335
- $val = substr($val,$pos+5);
336
- }
337
- $pos=strpos(strtoupper($val),'</PRE>');
338
- if ($pos!==false) {
339
- $pre = '';
340
- $output.=substr($val,0,$pos)."\n";
341
- $val = substr($val,$pos+6);
342
- }
343
- $output.=$val.$pre;
344
- }
345
-
346
- $search = array (
347
- '<BR>', '<P>', '</TITLE>',
348
- '</H1>', '</H2>', '</H3>',
349
- '<br>', '<p>', '</title>',
350
- '</h1>', '</h2>', '</h3>' );
351
-
352
- $output = str_replace($search,"\n",$output);
353
- $output = str_replace('<TD',' <td',$output);
354
- $output = str_replace('<td',' <td',$output);
355
- $output = str_replace('<tr',"\n<tr",$output);
356
- $output = str_replace('<TR',"\n<tr",$output);
357
- $output = str_replace('&nbsp;',' ',$output);
358
- $output = strip_tags($output);
359
- $output = explode("\n",$output);
360
-
361
- $rawdata = array();
362
- $null = 0;
363
-
364
- while (list($key, $val)=each($output)) {
365
- $val=trim($val);
366
- if ($val=='') {
367
- if (++$null>2) continue;
368
- }
369
- else $null=0;
370
- $rawdata[]=$val;
371
- }
372
- return $rawdata;
373
- }
374
-
375
- /*
376
- * Open a socket to the whois server.
377
- *
378
- * Returns a socket connection pointer on success, or -1 on failure.
379
- */
380
- function Connect ($server = '') {
381
-
382
- if ($server == '')
383
- $server = $this->Query['server'];
384
-
385
- // Fail if server not set
386
- if($server == '')
387
- return(-1);
388
-
389
- // Get rid of protocol and/or get port
390
- $port = $this->Query['server_port'];
391
-
392
- $pos = strpos($server,'://');
393
-
394
- if ($pos !== false)
395
- $server = substr($server, $pos+3);
396
-
397
- $pos = strpos($server,':');
398
-
399
- if ($pos !== false)
400
- {
401
- $port = substr($server,$pos+1);
402
- $server = substr($server,0,$pos);
403
- }
404
-
405
- // Enter connection attempt loop
406
- $retry = 0;
407
-
408
- while($retry <= $this->RETRY) {
409
- // Set query status
410
- $this->Query['status'] = 'ready';
411
-
412
- // Connect to whois port
413
- $ptr = @fsockopen($server, $port, $errno, $errstr, $this->STIMEOUT);
414
-
415
- if($ptr > 0) {
416
- $this->Query['status'] = 'ok';
417
- return($ptr);
418
- }
419
-
420
- // Failed this attempt
421
- $this->Query['status'] = 'error';
422
- $this->Query['error'][] = $errstr;
423
- $retry++;
424
-
425
- // Sleep before retrying
426
- sleep($this->SLEEP);
427
- }
428
-
429
- // If we get this far, it hasn't worked
430
- return(-1);
431
- }
432
-
433
- /*
434
- * Post-process result with handler class. On success, returns the result
435
- * from the handler. On failure, returns passed result unaltered.
436
- */
437
- function Process (&$result, $deep_whois=true) {
438
-
439
- $handler_name = str_replace('.','_',$this->Query['handler']);
440
-
441
- // If the handler has not already been included somehow, include it now
442
- $HANDLER_FLAG = sprintf("__%s_HANDLER__", strtoupper($handler_name));
443
-
444
- if (!defined($HANDLER_FLAG))
445
- include($this->Query['file']);
446
-
447
- // If the handler has still not been included, append to query errors list and return
448
- if (!defined($HANDLER_FLAG))
449
- {
450
- $this->Query['errstr'][] = "Can't find $handler_name handler: ".$this->Query['file'];
451
- return($result);
452
- }
453
-
454
- if (!$this->gtld_recurse && $this->Query['file'] == 'whois.gtld.php')
455
- return $result;
456
-
457
- // Pass result to handler
458
- $object = $handler_name.'_handler';
459
-
460
- $handler = new $object('');
461
-
462
- // If handler returned an error, append it to the query errors list
463
- if(isSet($handler->Query['errstr']))
464
- $this->Query['errstr'][] = $handler->Query['errstr'];
465
-
466
- $handler->deep_whois = $deep_whois;
467
-
468
- // Process
469
- $res = $handler->parse($result,$this->Query['query']);
470
-
471
- // Return the result
472
- return $res;
473
- }
474
-
475
- /*
476
- * Does more (deeper) whois ...
477
- */
478
-
479
- function DeepWhois ($query, $result) {
480
-
481
- if (!isset($result['regyinfo']['whois'])) return $result;
482
-
483
- $this->Query['server'] = $wserver = $result['regyinfo']['whois'];
484
- unset($result['regyinfo']['whois']);
485
- $subresult = $this->GetRawData($query);
486
-
487
- if (!empty($subresult))
488
- {
489
- $result = $this->set_whois_info($result);
490
- $result['rawdata'] = $subresult;
491
-
492
- if (isset($this->WHOIS_GTLD_HANDLER[$wserver]))
493
- $this->Query['handler'] = $this->WHOIS_GTLD_HANDLER[$wserver];
494
- else
495
- {
496
- $parts = explode('.',$wserver);
497
- $hname = strtolower($parts[1]);
498
-
499
- if (($fp = @fopen('whois.gtld.'.$hname.'.php', 'r', 1)) and fclose($fp))
500
- $this->Query['handler'] = $hname;
501
- }
502
-
503
- if (!empty($this->Query['handler']))
504
- {
505
- $this->Query['file'] = sprintf('whois.gtld.%s.php', $this->Query['handler']);
506
- $regrinfo = $this->Process($subresult); //$result['rawdata']);
507
- $result['regrinfo'] = $this->merge_results($result['regrinfo'], $regrinfo);
508
- //$result['rawdata'] = $subresult;
509
- }
510
- }
511
-
512
- return $result;
513
- }
514
-
515
- /*
516
- * Merge results
517
- */
518
-
519
- function merge_results($a1, $a2) {
520
-
521
- reset($a2);
522
-
523
- while (list($key, $val) = each($a2))
524
- {
525
- if (isset($a1[$key]))
526
- {
527
- if (is_array($val))
528
- {
529
- if ($key != 'nserver')
530
- $a1[$key] = $this->merge_results($a1[$key], $val);
531
- }
532
- else
533
- {
534
- $val = trim($val);
535
- if ($val != '')
536
- $a1[$key] = $val;
537
- }
538
- }
539
- else
540
- $a1[$key] = $val;
541
- }
542
-
543
- return $a1;
544
- }
545
-
546
- function FixNameServer($nserver)
547
- {
548
- $dns = array();
549
-
550
- foreach($nserver as $val)
551
- {
552
- $val = str_replace( array('[',']','(',')'), '', trim($val));
553
- $val = str_replace("\t", ' ', $val);
554
- $parts = explode(' ', $val);
555
- $host = '';
556
- $ip = '';
557
-
558
- foreach($parts as $p)
559
- {
560
- if (substr($p,-1) == '.') $p = substr($p,0,-1);
561
-
562
- if ((ip2long($p) == - 1) or (ip2long($p) === false))
563
- {
564
- // Hostname ?
565
- if ($host == '' && preg_match('/^[\w\-]+(\.[\w\-]+)+$/',$p))
566
- {
567
- $host = $p;
568
- }
569
- }
570
- else
571
- // IP Address
572
- $ip = $p;
573
- }
574
-
575
- // Valid host name ?
576
-
577
- if ($host == '') continue;
578
-
579
- // Get ip address
580
-
581
- if ($ip == '')
582
- {
583
- $ip = gethostbyname($host);
584
- if ($ip == $host) $ip = '(DOES NOT EXIST)';
585
- }
586
-
587
- if (substr($host,-1,1) == '.') $host = substr($host,0,-1);
588
-
589
- $dns[strtolower($host)] = $ip;
590
- }
591
-
592
- return $dns;
593
- }
594
- }
595
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.de.php DELETED
@@ -1,78 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__DE_HANDLER__'))
29
- define('__DE_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class de_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $items = array(
38
- 'domain.name' => 'Domain:',
39
- 'domain.nserver.' =>'Nserver:',
40
- 'domain.nserver.#' =>'Nsentry:',
41
- 'domain.status' => 'Status:',
42
- 'domain.changed' => 'Changed:',
43
- 'domain.desc.' => 'Descr:',
44
- 'owner' => '[Holder]',
45
- 'admin' => '[Admin-C]',
46
- 'tech' => '[Tech-C]',
47
- 'zone' => '[Zone-C]'
48
- );
49
-
50
- $extra = array(
51
- 'city:' => 'address.city',
52
- 'postalcode:' => 'address.pcode',
53
- 'countrycode:' => 'address.country',
54
- 'remarks:' => '',
55
- 'sip:' => 'sip',
56
- 'type:' => ''
57
- );
58
-
59
- $r['regrinfo'] = easy_parser($data_str['rawdata'], $items, 'ymd',$extra);
60
-
61
- $r['regyinfo'] = array(
62
- 'registrar' => 'DENIC eG',
63
- 'referrer' => 'http://www.denic.de/'
64
- );
65
-
66
- if (!isset($r['regrinfo']['domain']['status']) || $r['regrinfo']['domain']['status'] == "free")
67
- {
68
- $r['regrinfo']['registered'] = 'no';
69
- }
70
- else
71
- {
72
- $r['regrinfo']['domain']['changed'] = substr($r['regrinfo']['domain']['changed'], 0, 10);
73
- $r['regrinfo']['registered'] = 'yes';
74
- }
75
- return $r;
76
- }
77
- }
78
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.gtld.namejuice.php DELETED
@@ -1,53 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__NAMEJUICE_HANDLER__'))
29
- define('__NAMEJUICE_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class namejuice_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $items = array(
38
- 'owner' => 'Registrant Contact:',
39
- 'admin' => 'Administrative Contact:',
40
- 'tech' => 'Technical Contact:',
41
- 'domain.name' => 'Domain name:',
42
- 'domain.nserver.' => 'Name Servers:',
43
- 'domain.created' => 'Creation date:',
44
- 'domain.expires' => 'Expiration date:',
45
- 'domain.changed' => 'Update date:',
46
- 'domain.status' => 'Status:',
47
- 'domain.sponsor' => 'Registration Service Provided By:'
48
- );
49
-
50
- return easy_parser($data_str, $items, 'dmy', false, true, true);
51
- }
52
- }
53
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.idna.php DELETED
@@ -1,969 +0,0 @@
1
- <?php
2
- // {{{ license
3
-
4
- /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
5
- //
6
- // +----------------------------------------------------------------------+
7
- // | This library is free software; you can redistribute it and/or modify |
8
- // | it under the terms of the GNU Lesser General Public License as |
9
- // | published by the Free Software Foundation; either version 2.1 of the |
10
- // | License, or (at your option) any later version. |
11
- // | |
12
- // | This library is distributed in the hope that it will be useful, but |
13
- // | WITHOUT ANY WARRANTY; without even the implied warranty of |
14
- // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15
- // | Lesser General Public License for more details. |
16
- // | |
17
- // | You should have received a copy of the GNU Lesser General Public |
18
- // | License along with this library; if not, write to the Free Software |
19
- // | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
20
- // | USA. |
21
- // +----------------------------------------------------------------------+
22
- //
23
-
24
- // }}}
25
-
26
- /**
27
- * Encode/decode Internationalized Domain Names.
28
- *
29
- * The class allows to convert internationalized domain names
30
- * (see RFC 3490 for details) as they can be used with various registries worldwide
31
- * to be translated between their original (localized) form and their encoded form
32
- * as it will be used in the DNS (Domain Name System).
33
- *
34
- * The class provides two public methods, encode() and decode(), which do exactly
35
- * what you would expect them to do. You are allowed to use complete domain names,
36
- * simple strings and complete email addresses as well. That means, that you might
37
- * use any of the following notations:
38
- *
39
- * - www.nörgler.com
40
- * - xn--nrgler-wxa
41
- * - xn--brse-5qa.xn--knrz-1ra.info
42
- *
43
- * Unicode input might be given as either UTF-8 string, UCS-4 string or UCS-4
44
- * array. Unicode output is available in the same formats.
45
- * You can select your preferred format via {@link set_paramter()}.
46
- *
47
- * ACE input and output is always expected to be ASCII.
48
- *
49
- * @author Matthias Sommerfeld <mso@phlylabs.de>
50
- * @copyright 2004-2007 phlyLabs Berlin, http://phlylabs.de
51
- * @version 0.5.1
52
- *
53
- */
54
- class idna_convert
55
- {
56
- /**
57
- * Holds all relevant mapping tables, loaded from a seperate file on construct
58
- * See RFC3454 for details
59
- *
60
- * @var array
61
- * @access private
62
- */
63
- var $NP = array();
64
-
65
- // Internal settings, do not mess with them
66
- var $_punycode_prefix = 'xn--';
67
- var $_invalid_ucs = 0x80000000;
68
- var $_max_ucs = 0x10FFFF;
69
- var $_base = 36;
70
- var $_tmin = 1;
71
- var $_tmax = 26;
72
- var $_skew = 38;
73
- var $_damp = 700;
74
- var $_initial_bias = 72;
75
- var $_initial_n = 0x80;
76
- var $_sbase = 0xAC00;
77
- var $_lbase = 0x1100;
78
- var $_vbase = 0x1161;
79
- var $_tbase = 0x11A7;
80
- var $_lcount = 19;
81
- var $_vcount = 21;
82
- var $_tcount = 28;
83
- var $_ncount = 588; // _vcount * _tcount
84
- var $_scount = 11172; // _lcount * _tcount * _vcount
85
- var $_error = false;
86
-
87
- // See {@link set_paramter()} for details of how to change the following
88
- // settings from within your script / application
89
- var $_api_encoding = 'utf8'; // Default input charset is UTF-8
90
- var $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden
91
- var $_strict_mode = false; // Behave strict or not
92
-
93
- // The constructor
94
- function idna_convert($options = false)
95
- {
96
- $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
97
- if (function_exists('file_get_contents')) {
98
- $this->NP = unserialize(file_get_contents(dirname(__FILE__).'/npdata.ser'));
99
- } else {
100
- $this->NP = unserialize(join('', file(dirname(__FILE__).'/npdata.ser')));
101
- }
102
- // If parameters are given, pass these to the respective method
103
- if (is_array($options)) {
104
- return $this->set_parameter($options);
105
- }
106
- return true;
107
- }
108
-
109
- /**
110
- * Sets a new option value. Available options and values:
111
- * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
112
- * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
113
- * [overlong - Unicode does not allow unnecessarily long encodings of chars,
114
- * to allow this, set this parameter to true, else to false;
115
- * default is false.]
116
- * [strict - true: strict mode, good for registration purposes - Causes errors
117
- * on failures; false: loose mode, ideal for "wildlife" applications
118
- * by silently ignoring errors and returning the original input instead
119
- *
120
- * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
121
- * @param string Value to use (if parameter 1 is a string)
122
- * @return boolean true on success, false otherwise
123
- * @access public
124
- */
125
- function set_parameter($option, $value = false)
126
- {
127
- if (!is_array($option)) {
128
- $option = array($option => $value);
129
- }
130
- foreach ($option as $k => $v) {
131
- switch ($k) {
132
- case 'encoding':
133
- switch ($v) {
134
- case 'utf8':
135
- case 'ucs4_string':
136
- case 'ucs4_array':
137
- $this->_api_encoding = $v;
138
- break;
139
- default:
140
- $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
141
- return false;
142
- }
143
- break;
144
- case 'overlong':
145
- $this->_allow_overlong = ($v) ? true : false;
146
- break;
147
- case 'strict':
148
- $this->_strict_mode = ($v) ? true : false;
149
- break;
150
- default:
151
- $this->_error('Set Parameter: Unknown option '.$k);
152
- return false;
153
- }
154
- }
155
- return true;
156
- }
157
-
158
- /**
159
- * Decode a given ACE domain name
160
- * @param string Domain name (ACE string)
161
- * [@param string Desired output encoding, see {@link set_parameter}]
162
- * @return string Decoded Domain name (UTF-8 or UCS-4)
163
- * @access public
164
- */
165
- function decode($input, $one_time_encoding = false)
166
- {
167
- // Optionally set
168
- if ($one_time_encoding) {
169
- switch ($one_time_encoding) {
170
- case 'utf8':
171
- case 'ucs4_string':
172
- case 'ucs4_array':
173
- break;
174
- default:
175
- $this->_error('Unknown encoding '.$one_time_encoding);
176
- return false;
177
- }
178
- }
179
- // Make sure to drop any newline characters around
180
- $input = trim($input);
181
-
182
- // Negotiate input and try to determine, whether it is a plain string,
183
- // an email address or something like a complete URL
184
- if (strpos($input, '@')) { // Maybe it is an email address
185
- // No no in strict mode
186
- if ($this->_strict_mode) {
187
- $this->_error('Only simple domain name parts can be handled in strict mode');
188
- return false;
189
- }
190
- list ($email_pref, $input) = explode('@', $input, 2);
191
- $arr = explode('.', $input);
192
- foreach ($arr as $k => $v) {
193
- if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
194
- $conv = $this->_decode($v);
195
- if ($conv) $arr[$k] = $conv;
196
- }
197
- }
198
- $input = join('.', $arr);
199
- $arr = explode('.', $email_pref);
200
- foreach ($arr as $k => $v) {
201
- if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
202
- $conv = $this->_decode($v);
203
- if ($conv) $arr[$k] = $conv;
204
- }
205
- }
206
- $email_pref = join('.', $arr);
207
- $return = $email_pref . '@' . $input;
208
- } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
209
- // No no in strict mode
210
- if ($this->_strict_mode) {
211
- $this->_error('Only simple domain name parts can be handled in strict mode');
212
- return false;
213
- }
214
- $parsed = parse_url($input);
215
- if (isset($parsed['host'])) {
216
- $arr = explode('.', $parsed['host']);
217
- foreach ($arr as $k => $v) {
218
- $conv = $this->_decode($v);
219
- if ($conv) $arr[$k] = $conv;
220
- }
221
- $parsed['host'] = join('.', $arr);
222
- $return =
223
- (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
224
- .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
225
- .$parsed['host']
226
- .(empty($parsed['port']) ? '' : ':'.$parsed['port'])
227
- .(empty($parsed['path']) ? '' : $parsed['path'])
228
- .(empty($parsed['query']) ? '' : '?'.$parsed['query'])
229
- .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
230
- } else { // parse_url seems to have failed, try without it
231
- $arr = explode('.', $input);
232
- foreach ($arr as $k => $v) {
233
- $conv = $this->_decode($v);
234
- $arr[$k] = ($conv) ? $conv : $v;
235
- }
236
- $return = join('.', $arr);
237
- }
238
- } else { // Otherwise we consider it being a pure domain name string
239
- $return = $this->_decode($input);
240
- if (!$return) $return = $input;
241
- }
242
- // The output is UTF-8 by default, other output formats need conversion here
243
- // If one time encoding is given, use this, else the objects property
244
- switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
245
- case 'utf8':
246
- return $return;
247
- break;
248
- case 'ucs4_string':
249
- return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
250
- break;
251
- case 'ucs4_array':
252
- return $this->_utf8_to_ucs4($return);
253
- break;
254
- default:
255
- $this->_error('Unsupported output format');
256
- return false;
257
- }
258
- }
259
-
260
- /**
261
- * Encode a given UTF-8 domain name
262
- * @param string Domain name (UTF-8 or UCS-4)
263
- * [@param string Desired input encoding, see {@link set_parameter}]
264
- * @return string Encoded Domain name (ACE string)
265
- * @access public
266
- */
267
- function encode($decoded, $one_time_encoding = false)
268
- {
269
- // Forcing conversion of input to UCS4 array
270
- // If one time encoding is given, use this, else the objects property
271
- switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
272
- case 'utf8':
273
- $decoded = $this->_utf8_to_ucs4($decoded);
274
- break;
275
- case 'ucs4_string':
276
- $decoded = $this->_ucs4_string_to_ucs4($decoded);
277
- case 'ucs4_array':
278
- break;
279
- default:
280
- $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
281
- return false;
282
- }
283
-
284
- // No input, no output, what else did you expect?
285
- if (empty($decoded)) return '';
286
-
287
- // Anchors for iteration
288
- $last_begin = 0;
289
- // Output string
290
- $output = '';
291
- foreach ($decoded as $k => $v) {
292
- // Make sure to use just the plain dot
293
- switch($v) {
294
- case 0x3002:
295
- case 0xFF0E:
296
- case 0xFF61:
297
- $decoded[$k] = 0x2E;
298
- // Right, no break here, the above are converted to dots anyway
299
- // Stumbling across an anchoring character
300
- case 0x2E:
301
- case 0x2F:
302
- case 0x3A:
303
- case 0x3F:
304
- case 0x40:
305
- // Neither email addresses nor URLs allowed in strict mode
306
- if ($this->_strict_mode) {
307
- $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
308
- return false;
309
- } else {
310
- // Skip first char
311
- if ($k) {
312
- $encoded = '';
313
- $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
314
- if ($encoded) {
315
- $output .= $encoded;
316
- } else {
317
- $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
318
- }
319
- $output .= chr($decoded[$k]);
320
- }
321
- $last_begin = $k + 1;
322
- }
323
- }
324
- }
325
- // Catch the rest of the string
326
- if ($last_begin) {
327
- $inp_len = sizeof($decoded);
328
- $encoded = '';
329
- $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
330
- if ($encoded) {
331
- $output .= $encoded;
332
- } else {
333
- $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
334
- }
335
- return $output;
336
- } else {
337
- if ($output = $this->_encode($decoded)) {
338
- return $output;
339
- } else {
340
- return $this->_ucs4_to_utf8($decoded);
341
- }
342
- }
343
- }
344
-
345
- /**
346
- * Use this method to get the last error ocurred
347
- * @param void
348
- * @return string The last error, that occured
349
- * @access public
350
- */
351
- function get_last_error()
352
- {
353
- return $this->_error;
354
- }
355
-
356
- /**
357
- * The actual decoding algorithm
358
- * @access private
359
- */
360
- function _decode($encoded)
361
- {
362
- // We do need to find the Punycode prefix
363
- if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
364
- $this->_error('This is not a punycode string');
365
- return false;
366
- }
367
- $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
368
- // If nothing left after removing the prefix, it is hopeless
369
- if (!$encode_test) {
370
- $this->_error('The given encoded string was empty');
371
- return false;
372
- }
373
- // Find last occurence of the delimiter
374
- $delim_pos = strrpos($encoded, '-');
375
- if ($delim_pos > strlen($this->_punycode_prefix)) {
376
- for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) {
377
- $decoded[] = ord($encoded{$k});
378
- }
379
- } else {
380
- $decoded = array();
381
- }
382
- $deco_len = count($decoded);
383
- $enco_len = strlen($encoded);
384
-
385
- // Wandering through the strings; init
386
- $is_first = true;
387
- $bias = $this->_initial_bias;
388
- $idx = 0;
389
- $char = $this->_initial_n;
390
-
391
- for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
392
- for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
393
- $digit = $this->_decode_digit($encoded{$enco_idx++});
394
- $idx += $digit * $w;
395
- $t = ($k <= $bias) ? $this->_tmin :
396
- (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
397
- if ($digit < $t) break;
398
- $w = (int) ($w * ($this->_base - $t));
399
- }
400
- $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
401
- $is_first = false;
402
- $char += (int) ($idx / ($deco_len + 1));
403
- $idx %= ($deco_len + 1);
404
- if ($deco_len > 0) {
405
- // Make room for the decoded char
406
- for ($i = $deco_len; $i > $idx; $i--) {
407
- $decoded[$i] = $decoded[($i - 1)];
408
- }
409
- }
410
- $decoded[$idx++] = $char;
411
- }
412
- return $this->_ucs4_to_utf8($decoded);
413
- }
414
-
415
- /**
416
- * The actual encoding algorithm
417
- * @access private
418
- */
419
- function _encode($decoded)
420
- {
421
- // We cannot encode a domain name containing the Punycode prefix
422
- $extract = strlen($this->_punycode_prefix);
423
- $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
424
- $check_deco = array_slice($decoded, 0, $extract);
425
-
426
- if ($check_pref == $check_deco) {
427
- $this->_error('This is already a punycode string');
428
- return false;
429
- }
430
- // We will not try to encode strings consisting of basic code points only
431
- $encodable = false;
432
- foreach ($decoded as $k => $v) {
433
- if ($v > 0x7a) {
434
- $encodable = true;
435
- break;
436
- }
437
- }
438
- if (!$encodable) {
439
- $this->_error('The given string does not contain encodable chars');
440
- return false;
441
- }
442
-
443
- // Do NAMEPREP
444
- $decoded = $this->_nameprep($decoded);
445
- if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
446
-
447
- $deco_len = count($decoded);
448
- if (!$deco_len) return false; // Empty array
449
-
450
- $codecount = 0; // How many chars have been consumed
451
-
452
- $encoded = '';
453
- // Copy all basic code points to output
454
- for ($i = 0; $i < $deco_len; ++$i) {
455
- $test = $decoded[$i];
456
- // Will match [-0-9a-zA-Z]
457
- if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B)
458
- || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
459
- $encoded .= chr($decoded[$i]);
460
- $codecount++;
461
- }
462
- }
463
- if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
464
-
465
- // Start with the prefix; copy it to output
466
- $encoded = $this->_punycode_prefix.$encoded;
467
-
468
- // If we have basic code points in output, add an hyphen to the end
469
- if ($codecount) $encoded .= '-';
470
-
471
- // Now find and encode all non-basic code points
472
- $is_first = true;
473
- $cur_code = $this->_initial_n;
474
- $bias = $this->_initial_bias;
475
- $delta = 0;
476
- while ($codecount < $deco_len) {
477
- // Find the smallest code point >= the current code point and
478
- // remember the last ouccrence of it in the input
479
- for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
480
- if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
481
- $next_code = $decoded[$i];
482
- }
483
- }
484
-
485
- $delta += ($next_code - $cur_code) * ($codecount + 1);
486
- $cur_code = $next_code;
487
-
488
- // Scan input again and encode all characters whose code point is $cur_code
489
- for ($i = 0; $i < $deco_len; $i++) {
490
- if ($decoded[$i] < $cur_code) {
491
- $delta++;
492
- } elseif ($decoded[$i] == $cur_code) {
493
- for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
494
- $t = ($k <= $bias) ? $this->_tmin :
495
- (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
496
- if ($q < $t) break;
497
- $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
498
- $q = (int) (($q - $t) / ($this->_base - $t));
499
- }
500
- $encoded .= $this->_encode_digit($q);
501
- $bias = $this->_adapt($delta, $codecount+1, $is_first);
502
- $codecount++;
503
- $delta = 0;
504
- $is_first = false;
505
- }
506
- }
507
- $delta++;
508
- $cur_code++;
509
- }
510
- return $encoded;
511
- }
512
-
513
- /**
514
- * Adapt the bias according to the current code point and position
515
- * @access private
516
- */
517
- function _adapt($delta, $npoints, $is_first)
518
- {
519
- $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
520
- $delta += intval($delta / $npoints);
521
- for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
522
- $delta = intval($delta / ($this->_base - $this->_tmin));
523
- }
524
- return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
525
- }
526
-
527
- /**
528
- * Encoding a certain digit
529
- * @access private
530
- */
531
- function _encode_digit($d)
532
- {
533
- return chr($d + 22 + 75 * ($d < 26));
534
- }
535
-
536
- /**
537
- * Decode a certain digit
538
- * @access private
539
- */
540
- function _decode_digit($cp)
541
- {
542
- $cp = ord($cp);
543
- return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
544
- }
545
-
546
- /**
547
- * Internal error handling method
548
- * @access private
549
- */
550
- function _error($error = '')
551
- {
552
- $this->_error = $error;
553
- }
554
-
555
- /**
556
- * Do Nameprep according to RFC3491 and RFC3454
557
- * @param array Unicode Characters
558
- * @return string Unicode Characters, Nameprep'd
559
- * @access private
560
- */
561
- function _nameprep($input)
562
- {
563
- $output = array();
564
- $error = false;
565
- //
566
- // Mapping
567
- // Walking through the input array, performing the required steps on each of
568
- // the input chars and putting the result into the output array
569
- // While mapping required chars we apply the cannonical ordering
570
- foreach ($input as $v) {
571
- // Map to nothing == skip that code point
572
- if (in_array($v, $this->NP['map_nothing'])) continue;
573
-
574
- // Try to find prohibited input
575
- if (in_array($v, $this->NP['prohibit']) || in_array($v, $this->NP['general_prohibited'])) {
576
- $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
577
- return false;
578
- }
579
- foreach ($this->NP['prohibit_ranges'] as $range) {
580
- if ($range[0] <= $v && $v <= $range[1]) {
581
- $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
582
- return false;
583
- }
584
- }
585
- //
586
- // Hangul syllable decomposition
587
- if (0xAC00 <= $v && $v <= 0xD7AF) {
588
- foreach ($this->_hangul_decompose($v) as $out) {
589
- $output[] = (int) $out;
590
- }
591
- // There's a decomposition mapping for that code point
592
- } elseif (isset($this->NP['replacemaps'][$v])) {
593
- foreach ($this->_apply_cannonical_ordering($this->NP['replacemaps'][$v]) as $out) {
594
- $output[] = (int) $out;
595
- }
596
- } else {
597
- $output[] = (int) $v;
598
- }
599
- }
600
- // Before applying any Combining, try to rearrange any Hangul syllables
601
- $output = $this->_hangul_compose($output);
602
- //
603
- // Combine code points
604
- //
605
- $last_class = 0;
606
- $last_starter = 0;
607
- $out_len = count($output);
608
- for ($i = 0; $i < $out_len; ++$i) {
609
- $class = $this->_get_combining_class($output[$i]);
610
- if ((!$last_class || $last_class > $class) && $class) {
611
- // Try to match
612
- $seq_len = $i - $last_starter;
613
- $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
614
- // On match: Replace the last starter with the composed character and remove
615
- // the now redundant non-starter(s)
616
- if ($out) {
617
- $output[$last_starter] = $out;
618
- if (count($out) != $seq_len) {
619
- for ($j = $i+1; $j < $out_len; ++$j) {
620
- $output[$j-1] = $output[$j];
621
- }
622
- unset($output[$out_len]);
623
- }
624
- // Rewind the for loop by one, since there can be more possible compositions
625
- $i--;
626
- $out_len--;
627
- $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]);
628
- continue;
629
- }
630
- }
631
- // The current class is 0
632
- if (!$class) $last_starter = $i;
633
- $last_class = $class;
634
- }
635
- return $output;
636
- }
637
-
638
- /**
639
- * Decomposes a Hangul syllable
640
- * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
641
- * @param integer 32bit UCS4 code point
642
- * @return array Either Hangul Syllable decomposed or original 32bit value as one value array
643
- * @access private
644
- */
645
- function _hangul_decompose($char)
646
- {
647
- $sindex = (int) $char - $this->_sbase;
648
- if ($sindex < 0 || $sindex >= $this->_scount) {
649
- return array($char);
650
- }
651
- $result = array();
652
- $result[] = (int) $this->_lbase + $sindex / $this->_ncount;
653
- $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
654
- $T = intval($this->_tbase + $sindex % $this->_tcount);
655
- if ($T != $this->_tbase) $result[] = $T;
656
- return $result;
657
- }
658
- /**
659
- * Ccomposes a Hangul syllable
660
- * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
661
- * @param array Decomposed UCS4 sequence
662
- * @return array UCS4 sequence with syllables composed
663
- * @access private
664
- */
665
- function _hangul_compose($input)
666
- {
667
- $inp_len = count($input);
668
- if (!$inp_len) return array();
669
- $result = array();
670
- $last = (int) $input[0];
671
- $result[] = $last; // copy first char from input to output
672
-
673
- for ($i = 1; $i < $inp_len; ++$i) {
674
- $char = (int) $input[$i];
675
- $sindex = $last - $this->_sbase;
676
- $lindex = $last - $this->_lbase;
677
- $vindex = $char - $this->_vbase;
678
- $tindex = $char - $this->_tbase;
679
- // Find out, whether two current characters are LV and T
680
- if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0)
681
- && 0 <= $tindex && $tindex <= $this->_tcount) {
682
- // create syllable of form LVT
683
- $last += $tindex;
684
- $result[(count($result) - 1)] = $last; // reset last
685
- continue; // discard char
686
- }
687
- // Find out, whether two current characters form L and V
688
- if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
689
- // create syllable of form LV
690
- $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
691
- $result[(count($result) - 1)] = $last; // reset last
692
- continue; // discard char
693
- }
694
- // if neither case was true, just add the character
695
- $last = $char;
696
- $result[] = $char;
697
- }
698
- return $result;
699
- }
700
-
701
- /**
702
- * Returns the combining class of a certain wide char
703
- * @param integer Wide char to check (32bit integer)
704
- * @return integer Combining class if found, else 0
705
- * @access private
706
- */
707
- function _get_combining_class($char)
708
- {
709
- return isset($this->NP['norm_combcls'][$char]) ? $this->NP['norm_combcls'][$char] : 0;
710
- }
711
-
712
- /**
713
- * Apllies the cannonical ordering of a decomposed UCS4 sequence
714
- * @param array Decomposed UCS4 sequence
715
- * @return array Ordered USC4 sequence
716
- * @access private
717
- */
718
- function _apply_cannonical_ordering($input)
719
- {
720
- $swap = true;
721
- $size = count($input);
722
- while ($swap) {
723
- $swap = false;
724
- $last = $this->_get_combining_class(intval($input[0]));
725
- for ($i = 0; $i < $size-1; ++$i) {
726
- $next = $this->_get_combining_class(intval($input[$i+1]));
727
- if ($next != 0 && $last > $next) {
728
- // Move item leftward until it fits
729
- for ($j = $i + 1; $j > 0; --$j) {
730
- if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break;
731
- $t = intval($input[$j]);
732
- $input[$j] = intval($input[$j-1]);
733
- $input[$j-1] = $t;
734
- $swap = true;
735
- }
736
- // Reentering the loop looking at the old character again
737
- $next = $last;
738
- }
739
- $last = $next;
740
- }
741
- }
742
- return $input;
743
- }
744
-
745
- /**
746
- * Do composition of a sequence of starter and non-starter
747
- * @param array UCS4 Decomposed sequence
748
- * @return array Ordered USC4 sequence
749
- * @access private
750
- */
751
- function _combine($input)
752
- {
753
- $inp_len = count($input);
754
- foreach ($this->NP['replacemaps'] as $np_src => $np_target) {
755
- if ($np_target[0] != $input[0]) continue;
756
- if (count($np_target) != $inp_len) continue;
757
- $hit = false;
758
- foreach ($input as $k2 => $v2) {
759
- if ($v2 == $np_target[$k2]) {
760
- $hit = true;
761
- } else {
762
- $hit = false;
763
- break;
764
- }
765
- }
766
- if ($hit) return $np_src;
767
- }
768
- return false;
769
- }
770
-
771
- /**
772
- * This converts an UTF-8 encoded string to its UCS-4 representation
773
- * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
774
- * each of the "chars". This is due to PHP not being able to handle strings with
775
- * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
776
- * The following UTF-8 encodings are supported:
777
- * bytes bits representation
778
- * 1 7 0xxxxxxx
779
- * 2 11 110xxxxx 10xxxxxx
780
- * 3 16 1110xxxx 10xxxxxx 10xxxxxx
781
- * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
782
- * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
783
- * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
784
- * Each x represents a bit that can be used to store character data.
785
- * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
786
- * @access private
787
- */
788
- function _utf8_to_ucs4($input)
789
- {
790
- $output = array();
791
- $out_len = 0;
792
- $inp_len = strlen($input);
793
- $mode = 'next';
794
- $test = 'none';
795
- for ($k = 0; $k < $inp_len; ++$k) {
796
- $v = ord($input{$k}); // Extract byte from input string
797
-
798
- if ($v < 128) { // We found an ASCII char - put into stirng as is
799
- $output[$out_len] = $v;
800
- ++$out_len;
801
- if ('add' == $mode) {
802
- $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
803
- return false;
804
- }
805
- continue;
806
- }
807
- if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
808
- $start_byte = $v;
809
- $mode = 'add';
810
- $test = 'range';
811
- if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
812
- $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
813
- $v = ($v - 192) << 6;
814
- } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
815
- $next_byte = 1;
816
- $v = ($v - 224) << 12;
817
- } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
818
- $next_byte = 2;
819
- $v = ($v - 240) << 18;
820
- } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
821
- $next_byte = 3;
822
- $v = ($v - 248) << 24;
823
- } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
824
- $next_byte = 4;
825
- $v = ($v - 252) << 30;
826
- } else {
827
- $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k);
828
- return false;
829
- }
830
- if ('add' == $mode) {
831
- $output[$out_len] = (int) $v;
832
- ++$out_len;
833
- continue;
834
- }
835
- }
836
- if ('add' == $mode) {
837
- if (!$this->_allow_overlong && $test == 'range') {
838
- $test = 'none';
839
- if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
840
- $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
841
- return false;
842
- }
843
- }
844
- if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
845
- $v = ($v - 128) << ($next_byte * 6);
846
- $output[($out_len - 1)] += $v;
847
- --$next_byte;
848
- } else {
849
- $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
850
- return false;
851
- }
852
- if ($next_byte < 0) {
853
- $mode = 'next';
854
- }
855
- }
856
- } // for
857
- return $output;
858
- }
859
-
860
- /**
861
- * Convert UCS-4 string into UTF-8 string
862
- * See _utf8_to_ucs4() for details
863
- * @access private
864
- */
865
- function _ucs4_to_utf8($input)
866
- {
867
- $output = '';
868
- $k = 0;
869
- foreach ($input as $v) {
870
- ++$k;
871
- // $v = ord($v);
872
- if ($v < 128) { // 7bit are transferred literally
873
- $output .= chr($v);
874
- } elseif ($v < (1 << 11)) { // 2 bytes
875
- $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63));
876
- } elseif ($v < (1 << 16)) { // 3 bytes
877
- $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
878
- } elseif ($v < (1 << 21)) { // 4 bytes
879
- $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63))
880
- . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
881
- } elseif ($v < (1 << 26)) { // 5 bytes
882
- $output .= chr(248 + ($v >> 24)) . chr(128 + (($v >> 18) & 63))
883
- . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63))
884
- . chr(128 + ($v & 63));
885
- } elseif ($v < (1 << 31)) { // 6 bytes
886
- $output .= chr(252 + ($v >> 30)) . chr(128 + (($v >> 24) & 63))
887
- . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63))
888
- . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
889
- } else {
890
- $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
891
- return false;
892
- }
893
- }
894
- return $output;
895
- }
896
-
897
- /**
898
- * Convert UCS-4 array into UCS-4 string
899
- *
900
- * @access private
901
- */
902
- function _ucs4_to_ucs4_string($input)
903
- {
904
- $output = '';
905
- // Take array values and split output to 4 bytes per value
906
- // The bit mask is 255, which reads &11111111
907
- foreach ($input as $v) {
908
- $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
909
- }
910
- return $output;
911
- }
912
-
913
- /**
914
- * Convert UCS-4 strin into UCS-4 garray
915
- *
916
- * @access private
917
- */
918
- function _ucs4_string_to_ucs4($input)
919
- {
920
- $output = array();
921
- $inp_len = strlen($input);
922
- // Input length must be dividable by 4
923
- if ($inp_len % 4) {
924
- $this->_error('Input UCS4 string is broken');
925
- return false;
926
- }
927
- // Empty input - return empty output
928
- if (!$inp_len) return $output;
929
- for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
930
- // Increment output position every 4 input bytes
931
- if (!($i % 4)) {
932
- $out_len++;
933
- $output[$out_len] = 0;
934
- }
935
- $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
936
- }
937
- return $output;
938
- }
939
- }
940
-
941
- /**
942
- * Adapter class for aligning the API of idna_convert with that of Net_IDNA
943
- * @author Matthias Sommerfeld <mso@phlylabs.de>
944
- */
945
- class Net_IDNA_php4 extends idna_convert
946
- {
947
- /**
948
- * Sets a new option value. Available options and values:
949
- * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
950
- * 'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
951
- * [overlong - Unicode does not allow unnecessarily long encodings of chars,
952
- * to allow this, set this parameter to true, else to false;
953
- * default is false.]
954
- * [strict - true: strict mode, good for registration purposes - Causes errors
955
- * on failures; false: loose mode, ideal for "wildlife" applications
956
- * by silently ignoring errors and returning the original input instead
957
- *
958
- * @param mixed Parameter to set (string: single parameter; array of Parameter => Value pairs)
959
- * @param string Value to use (if parameter 1 is a string)
960
- * @return boolean true on success, false otherwise
961
- * @access public
962
- */
963
- function setParams($option, $param = false)
964
- {
965
- return $this->IC->set_parameters($option, $param);
966
- }
967
- }
968
-
969
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.ip.lib.php DELETED
@@ -1,120 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- //-----------------------------------------------------------------
29
- // Check if ip adddress is valid
30
-
31
- function phpwhois_validip($ip)
32
- {
33
-
34
- if (empty($ip))
35
- return false;
36
-
37
- if ((ip2long($ip) == -1) or (ip2long($ip) === false))
38
- return false;
39
-
40
- $reserved_ips = array (
41
- array('0.0.0.0','2.255.255.255'),
42
- array('10.0.0.0','10.255.255.255'),
43
- array('127.0.0.0','127.255.255.255'),
44
- array('169.254.0.0','169.254.255.255'),
45
- array('172.16.0.0','172.31.255.255'),
46
- array('192.0.2.0','192.0.2.255'),
47
- array('192.168.0.0','192.168.255.255'),
48
- array('255.255.255.0','255.255.255.255')
49
- );
50
-
51
- foreach ($reserved_ips as $r)
52
- {
53
- $min = ip2long($r[0]);
54
- $max = ip2long($r[1]);
55
- if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
56
- }
57
-
58
- return true;
59
- }
60
-
61
- //-----------------------------------------------------------------
62
- // Get real client ip address
63
-
64
- function phpwhois_getclientip()
65
- {
66
- if (!empty($_SERVER['HTTP_CLIENT_IP']) && phpwhois_validip($_SERVER['HTTP_CLIENT_IP']))
67
- return $_SERVER['HTTP_CLIENT_IP'];
68
-
69
- if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
70
- foreach (explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']) as $ip)
71
- if (phpwhois_validip(trim($ip)))
72
- return $ip;
73
-
74
- if (!empty($_SERVER['HTTP_X_FORWARDED']) && phpwhois_validip($_SERVER['HTTP_X_FORWARDED']))
75
- return $_SERVER['HTTP_X_FORWARDED'];
76
-
77
- if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && phpwhois_validip($_SERVER['HTTP_FORWARDED_FOR']))
78
- return $_SERVER['HTTP_FORWARDED_FOR'];
79
-
80
- if (!empty($_SERVER['HTTP_FORWARDED']) && phpwhois_validip($_SERVER['HTTP_FORWARDED']))
81
- return $_SERVER['HTTP_FORWARDED'];
82
-
83
- if (!empty($_SERVER['HTTP_X_FORWARDED']) && phpwhois_validip($_SERVER['HTTP_X_FORWARDED']))
84
- return $_SERVER['HTTP_X_FORWARDED'];
85
-
86
- return $_SERVER['REMOTE_ADDR'];
87
- }
88
-
89
- //-----------------------------------------------------------------
90
- // Convert from CIDR to net range
91
-
92
- function phpwhois_cidr_conv($net)
93
- {
94
- $start = strtok($net, '/');
95
- $n = 3-substr_count($net, '.');
96
-
97
- if ($n > 0)
98
- {
99
- for ($i = $n; $i > 0; $i--)
100
- $start.= '.0';
101
- }
102
-
103
- $bits1 = str_pad(decbin(ip2long($start)), 32, '0', 'STR_PAD_LEFT');
104
- $net = pow(2, (32-substr(strstr($net, '/'), 1))) - 1;
105
- $bits2 = str_pad(decbin($net), 32, '0', 'STR_PAD_LEFT');
106
- $final = '';
107
-
108
- for ($i = 0; $i < 32; $i++)
109
- {
110
- if ($bits1[$i] == $bits2[$i])
111
- $final.= $bits1[$i];
112
- if ($bits1[$i] == 1 and $bits2[$i] == 0)
113
- $final.= $bits1[$i];
114
- if ($bits1[$i] == 0 and $bits2[$i] == 1)
115
- $final.= $bits2[$i];
116
- }
117
-
118
- return $start." - ".long2ip(bindec($final));
119
- }
120
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.ip.php DELETED
@@ -1,285 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__IP_HANDLER__'))
29
- define('__IP_HANDLER__', 1);
30
-
31
- require_once('whois.ip.lib.php');
32
-
33
- class ip_handler extends WhoisClient
34
- {
35
- // Deep whois ?
36
- var $deep_whois = true;
37
-
38
- var $HANDLER_VERSION = '1.0';
39
-
40
- var $REGISTRARS = array(
41
- 'European Regional Internet Registry/RIPE NCC' => 'whois.ripe.net',
42
- 'RIPE Network Coordination Centre' => 'whois.ripe.net',
43
- 'Asia Pacific Network Information Center' => 'whois.apnic.net',
44
- 'Asia Pacific Network Information Centre' => 'whois.apnic.net',
45
- 'Latin American and Caribbean IP address Regional Registry' => 'whois.lacnic.net',
46
- 'African Network Information Center' => 'whois.afrinic.net'
47
- );
48
-
49
- var $HANDLERS = array(
50
- 'whois.krnic.net' => 'krnic',
51
- 'whois.apnic.net' => 'apnic',
52
- 'whois.ripe.net' => 'ripe',
53
- 'whois.arin.net' => 'arin',
54
- 'whois.lacnic.net' => 'lacnic',
55
- 'whois.afrinic.net' => 'afrinic'
56
- );
57
-
58
- var $more_data = array(); // More queries to get more accurated data
59
- var $done = array();
60
-
61
- function parse($data, $query)
62
- {
63
- $result['regrinfo'] = array();
64
- $result['regyinfo'] = array();
65
- $result['regyinfo']['registrar'] = 'American Registry for Internet Numbers (ARIN)';
66
- $result['rawdata'] = array();
67
-
68
- if (strpos($query,'.') === false)
69
- $result['regyinfo']['type'] = 'AS';
70
- else
71
- $result['regyinfo']['type'] = 'ip';
72
-
73
- if (!$this->deep_whois) return null;
74
-
75
- $this->Query = array();
76
- $this->Query['server'] = 'whois.arin.net';
77
- $this->Query['query'] = $query;
78
-
79
- $rawdata = $data['rawdata'];
80
-
81
- if (empty($rawdata)) return $result;
82
-
83
- $presults[] = $rawdata;
84
- $ip = ip2long($query);
85
- $done = array();
86
-
87
- while (count($presults) > 0)
88
- {
89
- $rwdata = array_shift($presults);
90
- $found = false;
91
-
92
- foreach($rwdata as $line)
93
- {
94
- if (!strncmp($line,'American Registry for Internet Numbers',38)) continue;
95
-
96
- $p = strpos($line, '(NETBLK-');
97
-
98
- if ($p === false) $p = strpos($line, '(NET-');
99
-
100
- if ($p !== false)
101
- {
102
- $net = strtok(substr($line,$p+1),') ');
103
- list($low,$high) = explode('-',str_replace(' ','',substr($line,$p+strlen($net)+3)));
104
-
105
- if (!isset($done[$net]) && $ip >= ip2long($low) && $ip <= ip2long($high))
106
- {
107
- $owner = substr($line,0,$p-1);
108
-
109
- if (!empty($this->REGISTRARS['owner']))
110
- {
111
- $this->handle_rwhois($this->REGISTRARS['owner'],$query);
112
- break 2;
113
- }
114
- else
115
- {
116
- $this->Query['args'] = 'n '.$net;
117
- $presults[] = $this->GetRawData($net);
118
- $done[$net] = 1;
119
- }
120
- }
121
- $found = true;
122
- }
123
- }
124
-
125
- if (!$found)
126
- {
127
- $this->Query['file'] = 'whois.ip.arin.php';
128
- $this->Query['handler'] = 'arin';
129
- $result = $this->parse_results($result,$rwdata,$query,true);
130
- }
131
- }
132
-
133
- unset($this->Query['args']);
134
-
135
- while (count($this->more_data) > 0)
136
- {
137
- $srv_data = array_shift($this->more_data);
138
- $this->Query['server'] = $srv_data['server'];
139
- unset($this->Query['handler']);
140
- // Use original query
141
- $rwdata = $this->GetRawData($srv_data['query']);
142
-
143
- if (!empty($rwdata))
144
- {
145
- if (!empty($srv_data['handler']))
146
- {
147
- $this->Query['handler'] = $srv_data['handler'];
148
-
149
- if (!empty($srv_data['file']))
150
- $this->Query['file'] = $srv_data['file'];
151
- else
152
- $this->Query['file'] = 'whois.'.$this->Query['handler'].'.php';
153
- }
154
-
155
- $result = $this->parse_results($result,$rwdata,$query,$srv_data['reset']);
156
- $result = $this->set_whois_info($result);
157
- $reset = false;
158
- }
159
- }
160
-
161
-
162
- // Normalize nameserver fields
163
-
164
- if (isset($result['regrinfo']['network']['nserver']))
165
- {
166
- if (!is_array($result['regrinfo']['network']['nserver']))
167
- {
168
- unset($result['regrinfo']['network']['nserver']);
169
- }
170
- else
171
- $result['regrinfo']['network']['nserver'] = $this->FixNameServer($result['regrinfo']['network']['nserver']);
172
- }
173
-
174
- return $result;
175
- }
176
-
177
- //-----------------------------------------------------------------
178
-
179
- function parse_results($result,$rwdata,$query,$reset)
180
- {
181
- $rwres = $this->Process($rwdata);
182
-
183
- if ($result['regyinfo']['type'] == 'AS' && !empty($rwres['regrinfo']['network']))
184
- {
185
- $rwres['regrinfo']['AS'] = $rwres['regrinfo']['network'];
186
- unset($rwres['regrinfo']['network']);
187
- }
188
-
189
- if ($reset)
190
- {
191
- $result['regrinfo'] = $rwres['regrinfo'];
192
- $result['rawdata'] = $rwdata;
193
- }
194
- else
195
- {
196
- $result['rawdata'][] = '';
197
-
198
- foreach ($rwdata as $line)
199
- $result['rawdata'][] = $line;
200
-
201
- foreach($rwres['regrinfo'] as $key => $data)
202
- {
203
- $result = $this->join_result($result,$key,$rwres);
204
- }
205
- }
206
-
207
- if ($this->deep_whois)
208
- {
209
- if (isset($rwres['regrinfo']['rwhois']))
210
- {
211
- $this->handle_rwhois($rwres['regrinfo']['rwhois'],$query);
212
- unset($result['regrinfo']['rwhois']);
213
- }
214
- else
215
- if (!@empty($rwres['regrinfo']['owner']['organization']))
216
- switch ($rwres['regrinfo']['owner']['organization'])
217
- {
218
- case 'KRNIC':
219
- $this->handle_rwhois('whois.krnic.net',$query);
220
- break;
221
-
222
- case 'African Network Information Center':
223
- $this->handle_rwhois('whois.afrinic.net',$query);
224
- break;
225
- }
226
- }
227
-
228
- if (!empty($rwres['regyinfo']))
229
- $result['regyinfo'] = array_merge($result['regyinfo'],$rwres['regyinfo']);
230
-
231
- return $result;
232
- }
233
-
234
- //-----------------------------------------------------------------
235
-
236
- function handle_rwhois($server,$query)
237
- {
238
- // Avoid querying the same server twice
239
-
240
- $parts = parse_url($server);
241
-
242
- if (empty($parts['host']))
243
- $host = $parts['path'];
244
- else
245
- $host = $parts['host'];
246
-
247
- if (array_key_exists($host,$this->done)) return;
248
-
249
- $q = array (
250
- 'query' => $query,
251
- 'server' => $server
252
- );
253
-
254
- if (isset($this->HANDLERS[$host]))
255
- {
256
- $q['handler'] = $this->HANDLERS[$host];
257
- $q['file'] = sprintf('whois.ip.%s.php', $q['handler']);
258
- $q['reset'] = true;
259
- }
260
- else
261
- {
262
- $q['handler'] = 'rwhois';
263
- $q['reset'] = false;
264
- unset($q['file']);
265
- }
266
-
267
- $this->more_data[] = $q;
268
- $this->done[$host] = 1;
269
- }
270
-
271
- //-----------------------------------------------------------------
272
-
273
- function join_result($result, $key, $newres)
274
- {
275
- if (isset($result['regrinfo'][$key]) && !array_key_exists(0,$result['regrinfo'][$key]))
276
- {
277
- $r = $result['regrinfo'][$key];
278
- $result['regrinfo'][$key] = array($r);
279
- }
280
-
281
- $result['regrinfo'][$key][] = $newres['regrinfo'][$key];
282
- return $result;
283
- }
284
- }
285
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.main.php DELETED
@@ -1,327 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- require_once('whois.client.php');
29
- require_once('whois.idna.php');
30
-
31
- class Whois extends WhoisClient
32
- {
33
- // Deep whois ?
34
- var $deep_whois = true;
35
-
36
- // Windows based ?
37
- var $windows = false;
38
-
39
- // Recursion allowed ?
40
- var $gtld_recurse = true;
41
-
42
- // Support for non-ICANN tld's
43
- var $non_icann = false;
44
-
45
- // Network Solutions registry server
46
- var $NSI_REGISTRY = 'whois.nsiregistry.net';
47
-
48
- /*
49
- * Constructor function
50
- */
51
- function Whois()
52
- {
53
- // Load DATA array
54
- @require('whois.servers.php');
55
-
56
- if ( ( substr( php_uname(), 0, 7 ) == 'Windows' ) )
57
- $this->windows = true;
58
- else
59
- $this->windows = false;
60
-
61
- // Set version
62
- $this->VERSION = sprintf("phpWhois v%s-%s", $this->CODE_VERSION, $this->DATA_VERSION);
63
- }
64
-
65
- /*
66
- * Use special whois server
67
- */
68
-
69
- function UseServer ($tld, $server)
70
- {
71
- $this->WHOIS_SPECIAL[$tld] = $server;
72
- }
73
-
74
- /*
75
- * Lookup query
76
- */
77
-
78
- function Lookup($query = '', $is_utf = true)
79
- {
80
- // start clean
81
- $this->Query = array( 'status' => '' );
82
-
83
- $query = trim($query);
84
-
85
- $IDN = new idna_convert();
86
-
87
- if ($is_utf)
88
- $query = $IDN->encode($query);
89
- else
90
- $query = $IDN->encode(utf8_encode($query));
91
-
92
- // If domain to query was not set
93
- if (!isSet($query) || $query == '')
94
- {
95
- // Configure to use default whois server
96
- $this->Query['server'] = $this->NSI_REGISTRY;
97
- return ;
98
- }
99
-
100
- // Set domain to query in query array
101
-
102
- $this->Query['query'] = $domain = strtolower($query);
103
-
104
- // If query is an ip address do ip lookup
105
-
106
- if ($query == long2ip(ip2long($query)))
107
- {
108
- // IPv4 Prepare to do lookup via the 'ip' handler
109
- $ip = @gethostbyname($query);
110
-
111
- if (isset($this->WHOIS_SPECIAL['ip']))
112
- {
113
- $this->Query['server'] = $this->WHOIS_SPECIAL['ip'];
114
- $this->Query['args'] = $ip;
115
- }
116
- else
117
- {
118
- $this->Query['server'] = 'whois.arin.net';
119
- $this->Query['args'] = "n $ip";
120
- $this->Query['file'] = 'whois.ip.php';
121
- $this->Query['handler'] = 'ip';
122
- }
123
- $this->Query['host_ip'] = $ip;
124
- $this->Query['query'] = $ip;
125
- $this->Query['tld'] = 'ip';
126
- $this->Query['host_name'] = @gethostbyaddr($ip);
127
- return $this->GetData('',$this->deep_whois);
128
- }
129
-
130
- if (strpos($query, ':'))
131
- {
132
- // IPv6 AS Prepare to do lookup via the 'ip' handler
133
- $ip = @gethostbyname($query);
134
-
135
- if (isset($this->WHOIS_SPECIAL['ip']))
136
- {
137
- $this->Query['server'] = $this->WHOIS_SPECIAL['ip'];
138
- }
139
- else
140
- {
141
- $this->Query['server'] = 'whois.ripe.net';
142
- $this->Query['file'] = 'whois.ip.ripe.php';
143
- $this->Query['handler'] = 'ripe';
144
- }
145
- $this->Query['query'] = $ip;
146
- $this->Query['tld'] = 'ip';
147
- return $this->GetData('',$this->deep_whois);
148
- }
149
-
150
- if (!strpos($query, '.'))
151
- {
152
- // AS Prepare to do lookup via the 'ip' handler
153
- $ip = @gethostbyname($query);
154
- $this->Query['server'] = 'whois.arin.net';
155
- if (strtolower(substr($ip,0,2)) == 'as')
156
- $as = substr($ip,2);
157
- else
158
- $as = $ip;
159
- $this->Query['args'] = "a $as";
160
- $this->Query['file'] = 'whois.ip.php';
161
- $this->Query['handler'] = 'ip';
162
- $this->Query['query'] = $ip;
163
- $this->Query['tld'] = 'as';
164
- return $this->GetData('',$this->deep_whois);
165
- }
166
-
167
- // Build array of all possible tld's for that domain
168
-
169
- $tld = '';
170
- $server = '';
171
- $dp = explode('.', $domain);
172
- $np = count($dp)-1;
173
- $tldtests = array();
174
-
175
- for ($i = 0; $i < $np; $i++)
176
- {
177
- array_shift($dp);
178
- $tldtests[] = implode('.', $dp);
179
- }
180
-
181
- // Search the correct whois server
182
-
183
- if ($this->non_icann)
184
- $special_tlds = array_merge($this->WHOIS_SPECIAL,$this->WHOIS_NON_ICANN);
185
- else
186
- $special_tlds = $this->WHOIS_SPECIAL;
187
-
188
- foreach($tldtests as $tld)
189
- {
190
- // Test if we know in advance that no whois server is
191
- // available for this domain and that we can get the
192
- // data via http or whois request
193
-
194
- if (isset($special_tlds[$tld]))
195
- {
196
- $val = $special_tlds[$tld];
197
-
198
- if ($val == '') return $this->Unknown();
199
-
200
- $domain = substr($query, 0, - strlen($tld) - 1);
201
- $val = str_replace('{domain}', $domain, $val);
202
- $server = str_replace('{tld}', $tld, $val);
203
- break;
204
- }
205
- }
206
-
207
- if ($server == '')
208
- foreach($tldtests as $tld)
209
- {
210
- // Determine the top level domain, and it's whois server using
211
- // DNS lookups on 'whois-servers.net'.
212
- // Assumes a valid DNS response indicates a recognised tld (!?)
213
-
214
- $cname = $tld.'.whois-servers.net';
215
-
216
- if (gethostbyname($cname) == $cname) continue;
217
- $server = $tld.'.whois-servers.net';
218
- break;
219
- }
220
-
221
- if ($tld && $server)
222
- {
223
- // If found, set tld and whois server in query array
224
- $this->Query['server'] = $server;
225
- $this->Query['tld'] = $tld;
226
- $handler = '';
227
-
228
- foreach($tldtests as $htld)
229
- {
230
- // special handler exists for the tld ?
231
-
232
- if (isSet($this->DATA[$htld]))
233
- {
234
- $handler = $this->DATA[$htld];
235
- break;
236
- }
237
-
238
- // Regular handler exists for the tld ?
239
- if (($fp = @fopen('whois.'.$htld.'.php', 'r', 1)) and fclose($fp))
240
- {
241
- $handler = $htld;
242
- break;
243
- }
244
- }
245
-
246
- // If there is a handler set it
247
-
248
- if ($handler != '')
249
- {
250
- $this->Query['file'] = "whois.$handler.php";
251
- $this->Query['handler'] = $handler;
252
- }
253
-
254
- // Special parameters ?
255
-
256
- if (isset($this->WHOIS_PARAM[$server]))
257
- $this->Query['server'] = $this->Query['server'].'?'.str_replace('$',$domain,$this->WHOIS_PARAM[$server]);
258
-
259
- $result = $this->GetData('',$this->deep_whois);
260
- $this->Checkdns($result);
261
- return $result;
262
- }
263
-
264
- // If tld not known, and domain not in DNS, return error
265
- return $this->Unknown();
266
- }
267
-
268
- /* Unsupported domains */
269
-
270
- function Unknown()
271
- {
272
- unset($this->Query['server']);
273
- $this->Query['status'] = 'error';
274
- $result['rawdata'][] = $this->Query['errstr'][] = $this->Query['query'].' domain is not supported';
275
- $this->Checkdns($result);
276
- $this->FixResult($result, $this->Query['query']);
277
- return $result;
278
- }
279
-
280
- /* Get nameservers if missing */
281
-
282
- function Checkdns(&$result)
283
- {
284
- if ($this->deep_whois && empty($result['regrinfo']['domain']['nserver']) && function_exists('dns_get_record'))
285
- {
286
- $ns = @dns_get_record($this->Query['query'],DNS_NS);
287
- if (!is_array($ns)) return;
288
- $nserver = array();
289
- foreach($ns as $row) $nserver[] = $row['target'];
290
- if (count($nserver) > 0)
291
- $result['regrinfo']['domain']['nserver'] = $this->FixNameServer($nserver);
292
- }
293
- }
294
- /*
295
- * Fix and/or add name server information
296
- */
297
-
298
- function FixResult(&$result, $domain)
299
- {
300
- // Add usual fields
301
- $result['regrinfo']['domain']['name'] = $domain;
302
-
303
- // Check if nameservers exist
304
-
305
- if (!isset($result['regrinfo']['registered']))
306
- {
307
- if (function_exists('checkdnsrr') && checkdnsrr($domain, 'NS'))
308
- $result['regrinfo']['registered'] = 'yes';
309
- else
310
- $result['regrinfo']['registered'] = 'unknown';
311
- }
312
-
313
- // Normalize nameserver fields
314
-
315
- if (isset($result['regrinfo']['domain']['nserver']))
316
- {
317
- if (!is_array($result['regrinfo']['domain']['nserver']))
318
- {
319
- unset($result['regrinfo']['domain']['nserver']);
320
- }
321
- else
322
- $result['regrinfo']['domain']['nserver'] = $this->FixNameServer($result['regrinfo']['domain']['nserver']);
323
- }
324
- }
325
- }
326
-
327
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.mobi.php DELETED
@@ -1,47 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__MOBI_HANDLER__'))
29
- define('__MOBI_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class mobi_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $r['regrinfo'] = generic_parser_b($data_str['rawdata']);
38
-
39
- if (!strncmp($data_str['rawdata'][0], 'WHOIS LIMIT EXCEEDED', 20))
40
- $r['regrinfo']['registered'] = 'unknown';
41
-
42
- $r['regyinfo']['referrer'] = 'http://www.mtld.mobi/';
43
- $r['regyinfo']['registrar'] = 'Dot Mobi Registry';
44
- return $r;
45
- }
46
- }
47
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.nl.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__NL_HANDLER__'))
29
- define('__NL_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class nl_handler
34
- {
35
- function parse($data, $query)
36
- {
37
- $items = array(
38
- 'domain.name' => 'Domain name:',
39
- 'domain.status' => 'Status:',
40
- 'domain.nserver' => 'Domain nameservers:',
41
- 'domain.created' => 'Date registered:',
42
- 'domain.changed' => 'Record last updated:',
43
- 'domain.sponsor' => 'Registrar:',
44
- 'admin' => 'Administrative contact:',
45
- 'tech' => 'Technical contact(s):'
46
- );
47
-
48
- $r['regrinfo'] = get_blocks($data['rawdata'], $items);
49
- $r['regyinfo']['referrer'] = 'http://www.domain-registry.nl';
50
- $r['regyinfo']['registrar'] = 'Stichting Internet Domeinregistratie NL';
51
-
52
- if (!isset($r['regrinfo']['domain']['status']))
53
- {
54
- $r['regrinfo']['registered'] = 'no';
55
- return $r;
56
- }
57
-
58
- if (isset($r['regrinfo']['tech']))
59
- $r['regrinfo']['tech'] = $this->get_contact($r['regrinfo']['tech']);
60
-
61
- if (isset($r['regrinfo']['zone']))
62
- $r['regrinfo']['zone'] = $this->get_contact($r['regrinfo']['zone']);
63
-
64
- if (isset($r['regrinfo']['admin']))
65
- $r['regrinfo']['admin'] = $this->get_contact($r['regrinfo']['admin']);
66
-
67
- if (isset($r['regrinfo']['owner']))
68
- $r['regrinfo']['owner'] = $this->get_contact($r['regrinfo']['owner']);
69
-
70
- $r['regrinfo']['registered'] = 'yes';
71
- format_dates($r,'dmy');
72
- return $r;
73
- }
74
-
75
- function get_contact($data)
76
- {
77
- $r = get_contact($data);
78
-
79
- if (isset($r['name']) && preg_match('/^[A-Z0-9]+-[A-Z0-9]+$/',$r['name']))
80
- {
81
- $r['handle'] = $r['name'];
82
- $r['name'] = array_shift ($r['address']);
83
- }
84
-
85
- return $r;
86
- }
87
- }
88
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.nz.php DELETED
@@ -1,102 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__NZ_HANDLER__'))
29
- define('__NZ_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class nz_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $items = array(
38
- 'domain_name:' => 'domain.name',
39
- 'query_status:' => 'domain.status',
40
- 'ns_name_01:' => 'domain.nserver.0',
41
- 'ns_name_02:' => 'domain.nserver.1',
42
- 'ns_name_03:' => 'domain.nserver.2',
43
- 'domain_dateregistered:' => 'domain.created',
44
- 'domain_datelastmodified:' => 'domain.changed',
45
- 'domain_datebilleduntil:' => 'domain.expires',
46
- 'registrar_name:' => 'domain.sponsor',
47
- 'registrant_contact_name:' => 'owner.name',
48
- 'registrant_contact_address1:' => 'owner.address.address.0',
49
- 'registrant_contact_address2:' => 'owner.address.address.1',
50
- 'registrant_contact_address3:' => 'owner.address.address.2',
51
- 'registrant_contact_postalcode:'=> 'owner.address.pcode',
52
- 'registrant_contact_city:' => 'owner.address.city',
53
- 'Registrant State/Province:' => 'owner.address.state',
54
- 'registrant_contact_country:' => 'owner.address.country',
55
- 'registrant_contact_phone:' => 'owner.phone',
56
- 'registrant_contact_fax:' => 'owner.fax',
57
- 'registrant_contact_email:' => 'owner.email',
58
- 'admin_contact_name:' => 'admin.name',
59
- 'admin_contact_address1:' => 'admin.address.address.0',
60
- 'admin_contact_address2:' => 'admin.address.address.1',
61
- 'admin_contact_address3:' => 'admin.address.address.2',
62
- 'admin_contact_postalcode:' => 'admin.address.pcode',
63
- 'admin_contact_city:' => 'admin.address.city',
64
- 'admin_contact_country:' => 'admin.address.country',
65
- 'admin_contact_phone:' => 'admin.phone',
66
- 'admin_contact_fax:' => 'admin.fax',
67
- 'admin_contact_email:' => 'admin.email',
68
- 'technical_contact_name:' => 'tech.name',
69
- 'technical_contact_address1:' => 'tech.address.address.0',
70
- 'technical_contact_address1:' => 'tech.address.address.1',
71
- 'technical_contact_address1:' => 'tech.address.address.2',
72
- 'technical_contact_postalcode:' => 'tech.address.pcode',
73
- 'technical_contact_city:' => 'tech.address.city',
74
- 'technical_contact_country:' => 'tech.address.country',
75
- 'technical_contact_phone:' => 'tech.phone',
76
- 'technical_contact_fax:' => 'tech.fax',
77
- 'technical_contact_email:' => 'tech.email'
78
- );
79
-
80
- $r['regrinfo'] = generic_parser_b($data_str['rawdata'], $items);
81
-
82
- if (!empty($r['regrinfo']['domain']['status']))
83
- $domain_status = substr($r['regrinfo']['domain']['status'],0,3);
84
- else
85
- $domain_status = '';
86
-
87
- if ($domain_status=='200')
88
- $r['regrinfo']['registered']='yes';
89
- elseif ($domain_status=='220')
90
- $r['regrinfo']['registered']='no';
91
- else
92
- $r['regrinfo']['registered']='unknown';
93
-
94
- if (!strncmp($data_str['rawdata'][0], 'WHOIS LIMIT EXCEEDED', 20))
95
- $r['regrinfo']['registered'] = 'unknown';
96
-
97
- $r['regyinfo']['referrer'] = 'http://www.dnc.org.nz';
98
- $r['regyinfo']['registrar'] = 'New Zealand Domain Name Registry Limited';
99
- return $r;
100
- }
101
- }
102
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.org.php DELETED
@@ -1,47 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__ORG_HANDLER__'))
29
- define('__ORG_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class org_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $r['regrinfo'] = generic_parser_b($data_str['rawdata']);
38
-
39
- if (!strncmp($data_str['rawdata'][0], 'WHOIS LIMIT EXCEEDED', 20))
40
- $r['regrinfo']['registered'] = 'unknown';
41
-
42
- $r['regyinfo']['referrer'] = 'http://www.pir.org/';
43
- $r['regyinfo']['registrar'] = 'Public Interest Registry';
44
- return $r;
45
- }
46
- }
47
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.parser.php DELETED
@@ -1,873 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- //-------------------------------------------------------------------------
29
-
30
- function generic_parser_a ($rawdata, $translate, $contacts, $main='domain', $dateformat='dmy')
31
- {
32
- $blocks = generic_parser_a_blocks($rawdata,$translate,$disclaimer);
33
-
34
- if (isset($disclaimer) && is_array($disclaimer))
35
- $ret['disclaimer']=$disclaimer;
36
-
37
- if (empty($blocks) || !is_array($blocks['main']))
38
- {
39
- $ret['registered']='no';
40
- return $ret;
41
- }
42
-
43
- $r = $blocks['main'];
44
- $ret['registered'] = 'yes';
45
-
46
- while (list($key,$val) = each($contacts))
47
- if (isset($r[$key]))
48
- {
49
- if (is_array($r[$key]))
50
- $blk = $r[$key][count($r[$key])-1];
51
- else
52
- $blk = $r[$key];
53
-
54
- $blk = strtoupper(strtok($blk,' '));
55
- if (isset($blocks[$blk])) $ret[$val] = $blocks[$blk];
56
- unset($r[$key]);
57
- }
58
-
59
- if ($main) $ret[$main] = $r;
60
-
61
- format_dates($ret,$dateformat);
62
- return $ret;
63
- }
64
-
65
- //-------------------------------------------------------------------------
66
-
67
- function generic_parser_a_blocks ($rawdata, $translate, &$disclaimer)
68
- {
69
- $r = array();
70
- $newblock = false;
71
- $hasdata = false;
72
- $block = array();
73
- $blocks = false;
74
- $gkey = 'main';
75
- $dend = false;
76
-
77
- while (list($key,$val)=each($rawdata))
78
- {
79
- $val=trim($val);
80
-
81
- if ($val != '' && ($val[0] == '%' || $val[0] == '#'))
82
- {
83
- if (!$dend) $disclaimer[]=trim(substr($val,1));
84
- continue;
85
- }
86
- if ($val=='')
87
- {
88
- $newblock = true;
89
- continue;
90
- }
91
- if ($newblock && $hasdata)
92
- {
93
- $blocks[$gkey] = $block;
94
- $block = array();
95
- $gkey = '';
96
- }
97
- $dend = true;
98
- $newblock = false;
99
- $k = trim(strtok($val,':'));
100
- $v = trim(substr(strstr($val,':'),1));
101
-
102
- if ($v == '') continue;
103
-
104
- $hasdata = true;
105
-
106
- if (isset($translate[$k]))
107
- {
108
- $k=$translate[$k];
109
- if ($k=='') continue;
110
- if (strstr($k,'.'))
111
- {
112
- eval("\$block".getvarname($k)."=\$v;");
113
- continue;
114
- }
115
- }
116
- else $k=strtolower($k);
117
-
118
- if ($k=='handle')
119
- {
120
- $v = strtok($v,' ');
121
- $gkey = strtoupper($v);
122
- }
123
-
124
- if (isset($block[$k]) && is_array($block[$k]))
125
- $block[$k][]=$v;
126
- else
127
- if (!isset($block[$k]) || $block[$k]=='')
128
- $block[$k]=$v;
129
- else
130
- {
131
- $x=$block[$k];
132
- unset($block[$k]);
133
- $block[$k][]=$x;
134
- $block[$k][]=$v;
135
- }
136
- }
137
-
138
- if ($hasdata) $blocks[$gkey]=$block;
139
-
140
- return $blocks;
141
- }
142
-
143
- //-------------------------------------------------------------------------
144
-
145
- function generic_parser_b ( $rawdata, $items = false, $dateformat='mdy', $hasreg=true, $scanall=false )
146
- {
147
- if (!$items)
148
- $items = array(
149
- 'Domain Name:' => 'domain.name',
150
- 'Domain ID:' => 'domain.handle',
151
- 'Sponsoring Registrar:' => 'domain.sponsor',
152
- 'Registrar ID:' => 'domain.sponsor',
153
- 'Domain Status:' => 'domain.status.',
154
- 'Status:' => 'domain.status.',
155
- 'Name Server:' => 'domain.nserver.',
156
- 'Nameservers:' => 'domain.nserver.',
157
- 'Maintainer:' => 'domain.referer',
158
-
159
- 'Domain Registration Date:' => 'domain.created',
160
- 'Domain Create Date:' => 'domain.created',
161
- 'Domain Expiration Date:' => 'domain.expires',
162
- 'Domain Last Updated Date:' => 'domain.changed',
163
- 'Creation Date:' => 'domain.created',
164
- 'Last Modification Date:' => 'domain.changed',
165
- 'Expiration Date:' => 'domain.expires',
166
- 'Created On:' => 'domain.created',
167
- 'Last Updated On:' => 'domain.changed',
168
- 'Expiration Date:' => 'domain.expires',
169
-
170
- 'Registrant ID:' => 'owner.handle',
171
- 'Registrant Name:' => 'owner.name',
172
- 'Registrant Organization:' => 'owner.organization',
173
- 'Registrant Address:' => 'owner.address.street.',
174
- 'Registrant Address1:' => 'owner.address.street.',
175
- 'Registrant Address2:' => 'owner.address.street.',
176
- 'Registrant Street:' => 'owner.address.street.',
177
- 'Registrant Street1:' => 'owner.address.street.',
178
- 'Registrant Street2:' => 'owner.address.street.',
179
- 'Registrant Street3:' => 'owner.address.street.',
180
- 'Registrant Postal Code:' => 'owner.address.pcode',
181
- 'Registrant City:' => 'owner.address.city',
182
- 'Registrant State/Province:' => 'owner.address.state',
183
- 'Registrant Country:' => 'owner.address.country',
184
- 'Registrant Country/Economy:' => 'owner.address.country',
185
- 'Registrant Phone Number:' => 'owner.phone',
186
- 'Registrant Phone:' => 'owner.phone',
187
- 'Registrant Facsimile Number:' => 'owner.fax',
188
- 'Registrant FAX:' => 'owner.fax',
189
- 'Registrant Email:' => 'owner.email',
190
- 'Registrant E-mail:' => 'owner.email',
191
-
192
- 'Administrative Contact ID:' => 'admin.handle',
193
- 'Administrative Contact Name:' => 'admin.name',
194
- 'Administrative Contact Organization:' => 'admin.organization',
195
- 'Administrative Contact Address:' => 'admin.address.street.',
196
- 'Administrative Contact Address1:' => 'admin.address.street.',
197
- 'Administrative Contact Address2:' => 'admin.address.street.',
198
- 'Administrative Contact Postal Code:' => 'admin.address.pcode',
199
- 'Administrative Contact City:' => 'admin.address.city',
200
- 'Administrative Contact State/Province:' => 'admin.address.state',
201
- 'Administrative Contact Country:' => 'admin.address.country',
202
- 'Administrative Contact Phone Number:' => 'admin.phone',
203
- 'Administrative Contact Email:' => 'admin.email',
204
- 'Administrative Contact Facsimile Number:' => 'admin.fax',
205
- 'Administrative Contact Tel:' => 'admin.phone',
206
- 'Administrative Contact Fax:' => 'admin.fax',
207
- 'Administrative ID:' => 'admin.handle',
208
- 'Administrative Name:' => 'admin.name',
209
- 'Administrative Organization:' => 'admin.organization',
210
- 'Administrative Address:' => 'admin.address.street.',
211
- 'Administrative Address1:' => 'admin.address.street.',
212
- 'Administrative Address2:' => 'admin.address.street.',
213
- 'Administrative Postal Code:' => 'admin.address.pcode',
214
- 'Administrative City:' => 'admin.address.city',
215
- 'Administrative State/Province:' => 'admin.address.state',
216
- 'Administrative Country/Economy:' => 'admin.address.country',
217
- 'Administrative Phone:' => 'admin.phone',
218
- 'Administrative E-mail:' => 'admin.email',
219
- 'Administrative Facsimile Number:' => 'admin.fax',
220
- 'Administrative Tel:' => 'admin.phone',
221
- 'Administrative FAX:' => 'admin.fax',
222
- 'Admin ID:' => 'admin.handle',
223
- 'Admin Name:' => 'admin.name',
224
- 'Admin Organization:' => 'admin.organization',
225
- 'Admin Street:' => 'admin.address.street.',
226
- 'Admin Street1:' => 'admin.address.street.',
227
- 'Admin Street2:' => 'admin.address.street.',
228
- 'Admin Street3:' => 'admin.address.street.',
229
- 'Admin Address:' => 'admin.address.street.',
230
- 'Admin Address2:' => 'admin.address.street.',
231
- 'Admin Address3:' => 'admin.address.street.',
232
- 'Admin City:' => 'admin.address.city',
233
- 'Admin State/Province:' => 'admin.address.state',
234
- 'Admin Postal Code:' => 'admin.address.pcode',
235
- 'Admin Country:' => 'admin.address.country',
236
- 'Admin Country/Economy:' => 'admin.address.country',
237
- 'Admin Phone:' => 'admin.phone',
238
- 'Admin FAX:' => 'admin.fax',
239
- 'Admin Email:' => 'admin.email',
240
- 'Admin E-mail:' => 'admin.email',
241
-
242
- 'Technical Contact ID:' => 'tech.handle',
243
- 'Technical Contact Name:' => 'tech.name',
244
- 'Technical Contact Organization:' => 'tech.organization',
245
- 'Technical Contact Address:' => 'tech.address.street.',
246
- 'Technical Contact Address1:' => 'tech.address.street.',
247
- 'Technical Contact Address2:' => 'tech.address.street.',
248
- 'Technical Contact Postal Code:' => 'tech.address.pcode',
249
- 'Technical Contact City:' => 'tech.address.city',
250
- 'Technical Contact State/Province:' => 'tech.address.state',
251
- 'Technical Contact Country:' => 'tech.address.country',
252
- 'Technical Contact Phone Number:' => 'tech.phone',
253
- 'Technical Contact Facsimile Number:' => 'tech.fax',
254
- 'Technical Contact Phone:' => 'tech.phone',
255
- 'Technical Contact Fax:' => 'tech.fax',
256
- 'Technical Contact Email:' => 'tech.email',
257
- 'Technical ID:' => 'tech.handle',
258
- 'Technical Name:' => 'tech.name',
259
- 'Technical Organization:' => 'tech.organization',
260
- 'Technical Address:' => 'tech.address.street.',
261
- 'Technical Address1:' => 'tech.address.street.',
262
- 'Technical Address2:' => 'tech.address.street.',
263
- 'Technical Postal Code:' => 'tech.address.pcode',
264
- 'Technical City:' => 'tech.address.city',
265
- 'Technical State/Province:' => 'tech.address.state',
266
- 'Technical Country/Economy:' => 'tech.address.country',
267
- 'Technical Phone Number:' => 'tech.phone',
268
- 'Technical Facsimile Number:' => 'tech.fax',
269
- 'Technical Phone:' => 'tech.phone',
270
- 'Technical Fax:' => 'tech.fax',
271
- 'Technical FAX:' => 'tech.fax',
272
- 'Technical E-mail:' => 'tech.email',
273
- 'Tech ID:' => 'tech.handle',
274
- 'Tech Name:' => 'tech.name',
275
- 'Tech Organization:' => 'tech.organization',
276
- 'Tech Address:' => 'tech.address.street.',
277
- 'Tech Address2:' => 'tech.address.street.',
278
- 'Tech Address3:' => 'tech.address.street.',
279
- 'Tech Street:' => 'tech.address.street.',
280
- 'Tech Street1:' => 'tech.address.street.',
281
- 'Tech Street2:' => 'tech.address.street.',
282
- 'Tech Street3:' => 'tech.address.street.',
283
- 'Tech City:' => 'tech.address.city',
284
- 'Tech Postal Code:' => 'tech.address.pcode',
285
- 'Tech State/Province:' => 'tech.address.state',
286
- 'Tech Country:' => 'tech.address.country',
287
- 'Tech Country/Economy:' => 'tech.address.country',
288
- 'Tech Phone:' => 'tech.phone',
289
- 'Tech FAX:' => 'tech.fax',
290
- 'Tech Email:' => 'tech.email',
291
- 'Tech E-mail:' => 'tech.email',
292
-
293
- 'Billing Contact ID:' => 'billing.handle',
294
- 'Billing Contact Name:' => 'billing.name',
295
- 'Billing Contact Organization:' => 'billing.organization',
296
- 'Billing Contact Address1:' => 'billing.address.street.',
297
- 'Billing Contact Address2:' => 'billing.address.street.',
298
- 'Billing Contact Postal Code:' => 'billing.address.pcode',
299
- 'Billing Contact City:' => 'billing.address.city',
300
- 'Billing Contact State/Province:' => 'billing.address.state',
301
- 'Billing Contact Country:' => 'billing.address.country',
302
- 'Billing Contact Phone Number:' => 'billing.phone',
303
- 'Billing Contact Facsimile Number:' => 'billing.fax',
304
- 'Billing Contact Email:' => 'billing.email',
305
- 'Billing ID:' => 'billing.handle',
306
- 'Billing Name:' => 'billing.name',
307
- 'Billing Organization:' => 'billing.organization',
308
- 'Billing Address:' => 'billing.address.street.',
309
- 'Billing Address1:' => 'billing.address.street.',
310
- 'Billing Address2:' => 'billing.address.street.',
311
- 'Billing Address3:' => 'billing.address.street.',
312
- 'Billing Street:' => 'billing.address.street.',
313
- 'Billing Street1:' => 'billing.address.street.',
314
- 'Billing Street2:' => 'billing.address.street.',
315
- 'Billing Street3:' => 'billing.address.street.',
316
- 'Billing City:' => 'billing.address.city',
317
- 'Billing Postal Code:' => 'billing.address.pcode',
318
- 'Billing State/Province:' => 'billing.address.state',
319
- 'Billing Country:' => 'billing.address.country',
320
- 'Billing Country/Economy:' => 'billing.address.country',
321
- 'Billing Phone:' => 'billing.phone',
322
- 'Billing Fax:' => 'billing.fax',
323
- 'Billing FAX:' => 'billing.fax',
324
- 'Billing Email:' => 'billing.email',
325
- 'Billing E-mail:' => 'billing.email',
326
-
327
- 'Zone ID:' => 'zone.handle',
328
- 'Zone Organization:' => 'zone.organization',
329
- 'Zone Name:' => 'zone.name',
330
- 'Zone Address:' => 'zone.address.street.',
331
- 'Zone Address 2:' => 'zone.address.street.',
332
- 'Zone City:' => 'zone.address.city',
333
- 'Zone State/Province:' => 'zone.address.state',
334
- 'Zone Postal Code:' => 'zone.address.pcode',
335
- 'Zone Country:' => 'zone.address.country',
336
- 'Zone Phone Number:' => 'zone.phone',
337
- 'Zone Fax Number:' => 'zone.fax',
338
- 'Zone Email:' => 'zone.email'
339
- );
340
-
341
- $r = '';
342
- $disok = true;
343
-
344
- while (list($key,$val) = each($rawdata))
345
- {
346
- if (trim($val) != '')
347
- {
348
- if (($val[0]=='%' || $val[0]=='#') && $disok)
349
- {
350
- $r['disclaimer'][] = trim(substr($val,1));
351
- $disok = true;
352
- continue;
353
- }
354
-
355
- $disok = false;
356
- reset($items);
357
-
358
- while (list($match, $field)=each($items))
359
- {
360
- $pos = strpos($val,$match);
361
-
362
- if ($pos !== false)
363
- {
364
- if ($field != '')
365
- {
366
- $var = '$r'.getvarname($field);
367
- $itm = trim(substr($val,$pos+strlen($match)));
368
-
369
- if ($itm!='')
370
- eval($var.'="'.str_replace('"','\"',$itm).'";');
371
- }
372
-
373
- if (!$scanall)
374
- break;
375
- }
376
- }
377
- }
378
- }
379
-
380
- if (empty($r))
381
- {
382
- if ($hasreg) $r['registered'] = 'no';
383
- }
384
- else
385
- {
386
- if ($hasreg) $r['registered'] = 'yes';
387
-
388
- $r = format_dates($r, $dateformat);
389
- }
390
-
391
- return $r;
392
- }
393
-
394
- //-------------------------------------------------------------------------
395
-
396
- function getvarname ( $vdef )
397
- {
398
- $parts = explode('.',$vdef);
399
- $var = '';
400
-
401
- foreach($parts as $mn)
402
- if ($mn == '') $var = $var.'[]';
403
- else $var = $var.'["'.$mn.'"]';
404
-
405
- return $var;
406
- }
407
-
408
- //-------------------------------------------------------------------------
409
-
410
- function get_blocks ( $rawdata, $items, $partial_match = false, $def_block = false )
411
- {
412
-
413
- $r = array();
414
- $endtag = '';
415
-
416
- while (list($key,$val) = each($rawdata))
417
- {
418
- $val = trim($val);
419
- if ($val == '') continue;
420
-
421
- $var = $found = false;
422
-
423
- foreach ($items as $field => $match)
424
- {
425
- $pos = strpos($val,$match);
426
-
427
- if ($field != '' && $pos !== false)
428
- {
429
- if ($val == $match)
430
- {
431
- $found = true;
432
- $endtag = '';
433
- $line = $val;
434
- break;
435
- }
436
-
437
- $last = substr($val,-1,1);
438
-
439
- if ($last == ':' || $last == '-' || $last == ']')
440
- {
441
- $found = true;
442
- $endtag = $last;
443
- $line = $val;
444
- }
445
- else
446
- {
447
- $var = getvarname(strtok($field,'#'));
448
- $itm = trim(substr($val,$pos+strlen($match)));
449
- eval('$r'.$var.'=$itm;');
450
- }
451
-
452
- break;
453
- }
454
- }
455
-
456
- if (!$found)
457
- {
458
- if (!$var && $def_block) $r[$def_block][] = $val;
459
- continue;
460
- }
461
-
462
- $block = array();
463
-
464
- // Block found, get data ...
465
-
466
- while (list($key,$val) = each($rawdata))
467
- {
468
- $val = trim($val);
469
-
470
- if ($val == '' || $val == str_repeat($val[0],strlen($val))) continue;
471
-
472
- $last = substr($val,-1,1);
473
- /*
474
- if ($last == $endtag)
475
- {
476
- // Another block found
477
- prev($rawdata);
478
- break;
479
- }
480
-
481
- if ($endtag == '' || $partial_match)
482
- */
483
- if ($endtag == '' || $partial_match || $last == $endtag)
484
- {
485
- //Check if this line starts another block
486
- $et = false;
487
-
488
- foreach ($items as $field => $match)
489
- {
490
- $pos = strpos($val,$match);
491
-
492
- if ($pos !== false && $pos == 0)
493
- {
494
- $et = true;
495
- break;
496
- }
497
- }
498
-
499
- if ($et)
500
- {
501
- // Another block found
502
- prev($rawdata);
503
- break;
504
- }
505
- }
506
-
507
- $block[] = $val;
508
- }
509
-
510
- if (empty($block)) continue;
511
-
512
- foreach ($items as $field => $match)
513
- {
514
- $pos = strpos($line,$match);
515
-
516
- if ($pos !== false)
517
- {
518
- $var = getvarname(strtok($field,'#'));
519
- if ($var != '[]') eval('$r'.$var.'=$block;');
520
- }
521
- }
522
- }
523
-
524
- return $r;
525
- }
526
-
527
- //-------------------------------------------------------------------------
528
-
529
- function easy_parser($data_str, $items, $date_format, $translate = false ,
530
- $has_org = false, $partial_match = false,
531
- $def_block = false )
532
- {
533
- $r = get_blocks($data_str, $items, $partial_match, $def_block);
534
- $r = get_contacts($r, $translate, $has_org);
535
- format_dates($r, $date_format);
536
- return $r;
537
- }
538
-
539
- //-------------------------------------------------------------------------
540
-
541
- function get_contacts ( $array, $extra_items='', $has_org= false )
542
- {
543
- if (isset($array['billing']))
544
- $array['billing'] = get_contact($array['billing'], $extra_items, $has_org);
545
-
546
- if (isset($array['tech']))
547
- $array['tech'] = get_contact($array['tech'], $extra_items, $has_org);
548
-
549
- if (isset($array['zone']))
550
- $array['zone'] = get_contact($array['zone'], $extra_items, $has_org);
551
-
552
- if (isset($array['admin']))
553
- $array['admin'] = get_contact($array['admin'], $extra_items, $has_org);
554
-
555
- if (isset($array['owner']))
556
- $array['owner'] = get_contact($array['owner'], $extra_items, $has_org);
557
-
558
- if (isset($array['registrar']))
559
- $array['registrar'] = get_contact($array['registrar'], $extra_items, $has_org);
560
-
561
- return $array;
562
- }
563
-
564
- //-------------------------------------------------------------------------
565
-
566
- function get_contact ( $array, $extra_items='', $has_org= false )
567
- {
568
-
569
- if (!is_array($array))
570
- return array();
571
-
572
- $items = array (
573
- 'fax..:' => 'fax',
574
- 'fax.' => 'fax',
575
- 'fax-no:' => 'fax',
576
- 'fax -' => 'fax',
577
- 'fax-' => 'fax',
578
- 'fax::' => 'fax',
579
- 'fax:' => 'fax',
580
- '[fax]' => 'fax',
581
- '(fax)' => 'fax',
582
- 'fax' => 'fax',
583
- 'tel. ' => 'phone',
584
- 'tel:' => 'phone',
585
- 'phone::' => 'phone',
586
- 'phone:' => 'phone',
587
- 'phone-' => 'phone',
588
- 'phone -' => 'phone',
589
- 'email:' => 'email',
590
- 'e-mail:' => 'email',
591
- 'company name:' => 'organization',
592
- 'organisation:' => 'organization',
593
- 'first name:' => 'name.first',
594
- 'last name:' => 'name.last',
595
- 'street:' => 'address.street',
596
- 'address:' => 'address.street.',
597
- 'language:' => '',
598
- 'location:' => 'address.city',
599
- 'country:' => 'address.country',
600
- 'name:' => 'name',
601
- 'last modified:' => 'changed'
602
- );
603
-
604
- if ($extra_items)
605
- {
606
- foreach($items as $match => $field)
607
- if (!isset($extra_items[$match]))
608
- $extra_items[$match] = $field;
609
- $items = $extra_items;
610
- }
611
-
612
- while (list($key,$val)=each($array))
613
- {
614
- $ok=true;
615
-
616
- while ($ok)
617
- {
618
- reset($items);
619
- $ok = false;
620
-
621
- while (list($match,$field) = each($items))
622
- {
623
- $pos = strpos(strtolower($val),$match);
624
-
625
- if ($pos === false) continue;
626
-
627
- $itm = trim(substr($val,$pos+strlen($match)));
628
-
629
- if ($field != '' && $itm != '')
630
- {
631
- eval('$r'.getvarname($field).'=$itm;');
632
- }
633
-
634
- $val = trim(substr($val,0,$pos));
635
-
636
- if ($val == '')
637
- {
638
- unset($array[$key]);
639
- break;
640
- }
641
- else
642
- {
643
- $array[$key] = $val;
644
- $ok = true;
645
- }
646
- //break;
647
- }
648
-
649
- if (preg_match("/([+]*[-\(\)\. x0-9]){7,}/", $val, $matches))
650
- {
651
- $phone = trim(str_replace(' ','',$matches[0]));
652
-
653
- if (strlen($phone) > 8 && !preg_match('/[0-9]{5}\-[0-9]{3}/',$phone))
654
- {
655
- if (isset($r['phone']))
656
- {
657
- if (isset($r['fax'])) continue;
658
- $r['fax'] = trim($matches[0]);
659
- }
660
- else
661
- {
662
- $r['phone'] = trim($matches[0]);
663
- }
664
-
665
- $val = str_replace($matches[0],'',$val);
666
-
667
- if ($val == '')
668
- {
669
- unset($array[$key]);
670
- continue;
671
- }
672
- else
673
- {
674
- $array[$key] = $val;
675
- $ok = true;
676
- }
677
- }
678
- }
679
-
680
- if (preg_match('/([-0-9a-zA-Z._+&\/=]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6})/',$val, $matches))
681
- {
682
- $r['email'] = $matches[0];
683
-
684
- $val = str_replace($matches[0],'',$val);
685
- $val = trim(str_replace('()','',$val));
686
-
687
- if ($val == '')
688
- {
689
- unset($array[$key]);
690
- continue;
691
- }
692
- else
693
- {
694
- if (!isset($r['name']))
695
- {
696
- $r['name'] = $val;
697
- unset($array[$key]);
698
- }
699
- else
700
- $array[$key] = $val;
701
-
702
- $ok = true;
703
- }
704
- }
705
- }
706
- }
707
-
708
- if (!isset($r['name']) && count($array)>0)
709
- {
710
- $r['name'] = array_shift($array);
711
- }
712
-
713
- if ($has_org && count($array)>0)
714
- {
715
- $r['organization'] = array_shift($array);
716
- }
717
-
718
- if (isset($r['name']) && is_array($r['name']))
719
- {
720
- $r['name'] = implode($r['name'],' ');
721
- }
722
-
723
- if (!empty($array))
724
- {
725
- if (isset($r['address']))
726
- $r['address'] = array_merge($r['address'],$array);
727
- else
728
- $r['address'] = $array;
729
- }
730
-
731
- return $r;
732
- }
733
-
734
- //-------------------------------------------------------------------------
735
-
736
- function format_dates (&$res,$format='mdy')
737
- {
738
- if (!is_array($res)) return $res;
739
-
740
- foreach ($res as $key => $val)
741
- {
742
- if (is_array($val))
743
- {
744
- if (!is_numeric($key) && ($key=='expires' || $key=='created' || $key=='changed'))
745
- {
746
- $d = get_date($val[0],$format);
747
- if ($d) $res[$key] = $d;
748
- }
749
- else
750
- {
751
- $res[$key] = format_dates($val,$format);
752
- }
753
- }
754
- else
755
- {
756
- if (!is_numeric($key) && ($key=='expires' || $key=='created' || $key=='changed'))
757
- {
758
- $d = get_date($val,$format);
759
- if ($d) $res[$key] = $d;
760
- }
761
- }
762
- }
763
-
764
- return $res;
765
- }
766
-
767
- //-------------------------------------------------------------------------
768
-
769
- function get_date($date,$format)
770
- {
771
- $months = array( 'jan'=>1, 'ene'=>1, 'feb'=>2, 'mar'=>3, 'apr'=>4, 'abr'=>4,
772
- 'may'=>5, 'jun'=>6, 'jul'=>7, 'aug'=>8, 'ago'=>8, 'sep'=>9,
773
- 'oct'=>10, 'nov'=>11, 'dec'=>12, 'dic'=>12 );
774
-
775
- $parts = explode(' ',$date);
776
-
777
- if (strpos($parts[0],'@') !== false)
778
- {
779
- unset($parts[0]);
780
- $date = implode(' ',$parts);
781
- }
782
-
783
- $date = str_replace(',',' ',trim($date));
784
- $date = str_replace('.',' ',$date);
785
- $date = str_replace('-',' ',$date);
786
- $date = str_replace('/',' ',$date);
787
- $date = str_replace("\t",' ',$date);
788
-
789
- $parts = explode(' ',$date);
790
- $res = false;
791
-
792
- if ((strlen($parts[0]) == 8 || count($parts) == 1) && is_numeric($parts[0]))
793
- {
794
- $val = $parts[0];
795
- for ($p=$i=0; $i<3; $i++)
796
- {
797
- if ($format[$i] != 'Y')
798
- {
799
- $res[$format[$i]] = substr($val,$p,2);
800
- $p += 2;
801
- }
802
- else
803
- {
804
- $res['y'] = substr($val,$p,4);
805
- $p += 4;
806
- }
807
- }
808
- }
809
- else
810
- {
811
- $format = strtolower($format);
812
-
813
- for ($p=$i=0; $p<count($parts) && $i<strlen($format); $p++)
814
- {
815
- if (trim($parts[$p]) == '')
816
- continue;
817
-
818
- if ($format[$i] != '-')
819
- {
820
- $res[$format[$i]] = $parts[$p];
821
- }
822
- $i++;
823
- }
824
- }
825
-
826
- if (!$res) return $date;
827
-
828
- $ok = false;
829
-
830
- while (!$ok)
831
- {
832
- reset($res);
833
- $ok = true;
834
-
835
- while (list($key, $val) = each($res))
836
- {
837
- if ($val == '' || $key == '') continue;
838
-
839
- if (!is_numeric($val) && isset($months[substr(strtolower($val),0,3)]))
840
- {
841
- $res[$key] = $res['m'];
842
- $res['m'] = $months[substr(strtolower($val),0,3)];
843
- $ok = false;
844
- break;
845
- }
846
-
847
- if ($key != 'y' && $key != 'Y' && $val > 1900)
848
- {
849
- $res[$key] = $res['y'];
850
- $res['y'] = $val;
851
- $ok = false;
852
- break;
853
- }
854
- }
855
- }
856
-
857
- if ($res['m'] > 12)
858
- {
859
- $v = $res['m'];
860
- $res['m'] = $res['d'];
861
- $res['d'] = $v;
862
- }
863
-
864
- if ($res['y'] < 70)
865
- $res['y'] += 2000;
866
- else
867
- if ($res['y'] <= 99)
868
- $res['y'] += 1900;
869
-
870
- return sprintf("%.4d-%02d-%02d",$res['y'],$res['m'],$res['d']);
871
- }
872
-
873
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.sc.php DELETED
@@ -1,45 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__SC_HANDLER__'))
29
- define('__SC_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class sc_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $r['regrinfo'] = generic_parser_b($data_str['rawdata'], false, 'dmy');
38
- $r['regyinfo'] = array(
39
- 'referrer' => 'http://www.nic.sc',
40
- 'registrar' => 'VCS (Pty) Limited'
41
- );
42
- return $r;
43
- }
44
- }
45
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.servers.php DELETED
@@ -1,252 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- /* servers.whois v18 Markus Welters 2004/06/25 */
29
- /* servers.whois v17 ross golder 2003/02/09 */
30
- /* servers.whois v16 mark jeftovic 2001/02/28 */
31
-
32
- $this->DATA_VERSION = '19';
33
-
34
- $this->DATA = array(
35
- 'bz' => 'gtld',
36
- 'com' => 'gtld',
37
- 'jobs' => 'gtld',
38
- 'li' => 'ch',
39
- 'net' => 'gtld',
40
- 'tv' => 'gtld',
41
- 'za.org' => 'zanet',
42
- 'za.net' => 'zanet'
43
- );
44
-
45
- /* Non UTF-8 servers */
46
-
47
- $this->NON_UTF8 = array(
48
- 'br.whois-servers.net' => 1,
49
- 'ca.whois-servers.net' => 1,
50
- 'cl.whois-servers.net' => 1,
51
- 'hu.whois-servers.net' => 1,
52
- 'is.whois-servers.net' => 1,
53
- 'pt.whois-servers.net' => 1,
54
- 'whois.interdomain.net' => 1,
55
- 'whois.lacnic.net' => 1,
56
- 'whois.nicline.com' => 1,
57
- 'whois.ripe.net' => 1
58
- );
59
-
60
- /* If whois Server needs any parameters, enter it here */
61
-
62
- $this->WHOIS_PARAM = array(
63
- 'com.whois-servers.net' => 'domain =$',
64
- 'net.whois-servers.net' => 'domain =$',
65
- 'de.whois-servers.net' => '-T dn,ace $',
66
- 'jp.whois-servers.net' => 'DOM $/e'
67
- );
68
-
69
- /* TLD's that have special whois servers or that can only be reached via HTTP */
70
-
71
- $this->WHOIS_SPECIAL = array(
72
- 'ad' => '',
73
- 'ae' => 'whois.aeda.net.ae',
74
- 'af' => 'whois.nic.af',
75
- 'ai' => 'http://whois.offshore.ai/cgi-bin/whois.pl?domain-name={domain}.ai',
76
- 'al' => '',
77
- 'az' => '',
78
- 'ba' => '',
79
- 'bb' => 'http://domains.org.bb/regsearch/getdetails.cfm?DND={domain}.bb',
80
- 'bg' => 'http://www.register.bg/bg-nic/displaydomain.pl?domain={domain}.bg&search=exist',
81
- 'bi' => 'whois.nic.bi',
82
- 'bj' => 'whois.nic.bj',
83
- 'by' => '',
84
- 'bz' => 'whois2.afilias-grs.net',
85
- 'cy' => '',
86
- 'es' => '',
87
- 'fj' => 'whois.usp.ac.fj',
88
- 'fm' => 'http://www.dot.fm/query_whois.cfm?domain={domain}&tld=fm',
89
- 'jobs' => 'jobswhois.verisign-grs.com',
90
- 'ke' => 'kenic.or.ke',
91
- 'la' => 'whois.centralnic.net',
92
- 'gr' => '',
93
- 'gs' => 'http://www.adamsnames.tc/whois/?domain={domain}.gs',
94
- 'gt' => 'http://www.gt/Inscripcion/whois.php?domain={domain}.gt',
95
- 'me' => 'whois.meregistry.net',
96
- 'mobi' => 'whois.dotmobiregistry.net',
97
- 'ms' => 'http://www.adamsnames.tc/whois/?domain={domain}.ms',
98
- 'mt' => 'http://www.um.edu.mt/cgi-bin/nic/whois?domain={domain}.mt',
99
- 'nl' => 'whois.domain-registry.nl',
100
- 'ly' => 'whois.nic.ly',
101
- 'pe' => 'kero.rcp.net.pe',
102
- 'pr' => 'whois.uprr.pr',
103
- 'pro' => 'whois.registry.pro',
104
- 'sc' => 'whois2.afilias-grs.net',
105
- 'tc' => 'http://www.adamsnames.tc/whois/?domain={domain}.tc',
106
- 'tf' => 'http://www.adamsnames.tc/whois/?domain={domain}.tf',
107
- 've' => 'whois.nic.ve',
108
- 'vg' => 'http://www.adamsnames.tc/whois/?domain={domain}.vg',
109
- // Second level
110
- 'net.au' => 'whois.aunic.net',
111
- 'ae.com' => 'whois.centralnic.net',
112
- 'br.com' => 'whois.centralnic.net',
113
- 'cn.com' => 'whois.centralnic.net',
114
- 'de.com' => 'whois.centralnic.net',
115
- 'eu.com' => 'whois.centralnic.net',
116
- 'hu.com' => 'whois.centralnic.net',
117
- 'jpn.com'=> 'whois.centralnic.net',
118
- 'kr.com' => 'whois.centralnic.net',
119
- 'gb.com' => 'whois.centralnic.net',
120
- 'no.com' => 'whois.centralnic.net',
121
- 'qc.com' => 'whois.centralnic.net',
122
- 'ru.com' => 'whois.centralnic.net',
123
- 'sa.com' => 'whois.centralnic.net',
124
- 'se.com' => 'whois.centralnic.net',
125
- 'za.com' => 'whois.centralnic.net',
126
- 'uk.com' => 'whois.centralnic.net',
127
- 'us.com' => 'whois.centralnic.net',
128
- 'uy.com' => 'whois.centralnic.net',
129
- 'gb.net' => 'whois.centralnic.net',
130
- 'se.net' => 'whois.centralnic.net',
131
- 'uk.net' => 'whois.centralnic.net',
132
- 'za.net' => 'whois.za.net',
133
- 'za.org' => 'whois.za.net',
134
- 'co.za' => 'http://co.za/cgi-bin/whois.sh?Domain={domain}.co.za',
135
- 'org.za' => 'http://www.org.za/cgi-bin/rwhois?domain={domain}.org.za&format=full'
136
- );
137
-
138
- /* handled gTLD whois servers */
139
-
140
- $this->WHOIS_GTLD_HANDLER = array(
141
- 'whois.bulkregister.com' => 'enom',
142
- 'whois.dotregistrar.com' => 'dotster',
143
- 'whois.namesdirect.com' => 'dotster',
144
- 'whois.psi-usa.info' => 'psiusa',
145
- 'whois.www.tv' => 'tvcorp',
146
- 'whois.tucows.com' => 'opensrs',
147
- 'whois.35.com' => 'onlinenic',
148
- 'whois.nominalia.com' => 'genericb',
149
- 'whois.encirca.com' => 'genericb',
150
- 'whois.corenic.net' => 'genericb'
151
- );
152
-
153
- /* Non ICANN TLD's */
154
-
155
- $this->WHOIS_NON_ICANN = array (
156
- 'agent' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
157
- 'agente' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
158
- 'america' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
159
- 'amor' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
160
- 'amore' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
161
- 'amour' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
162
- 'arte' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
163
- 'artes' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
164
- 'arts' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
165
- 'asta' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
166
- 'auction' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
167
- 'auktion' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
168
- 'boutique' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
169
- 'chat' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
170
- 'chiesa' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
171
- 'church' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
172
- 'cia' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
173
- 'ciao' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
174
- 'cie' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
175
- 'club' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
176
- 'clube' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
177
- 'com2' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
178
- 'deporte' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
179
- 'ditta' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
180
- 'earth' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
181
- 'eglise' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
182
- 'enchere' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
183
- 'escola' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
184
- 'escuela' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
185
- 'esporte' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
186
- 'etc' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
187
- 'famiglia' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
188
- 'familia' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
189
- 'familie' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
190
- 'family' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
191
- 'free' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
192
- 'hola' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
193
- 'game' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
194
- 'ges' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
195
- 'gmbh' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
196
- 'golf' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
197
- 'gratis' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
198
- 'gratuit' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
199
- 'iglesia' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
200
- 'igreja' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
201
- 'inc' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
202
- 'jeu' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
203
- 'jogo' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
204
- 'juego' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
205
- 'kids' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
206
- 'kirche' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
207
- 'krunst' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
208
- 'law' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
209
- 'legge' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
210
- 'lei' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
211
- 'leilao' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
212
- 'ley' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
213
- 'liebe' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
214
- 'lion' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
215
- 'llc' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
216
- 'llp' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
217
- 'loi' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
218
- 'loja' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
219
- 'love' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
220
- 'ltd' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
221
- 'makler' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
222
- 'med' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
223
- 'mp3' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
224
- 'not' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
225
- 'online' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
226
- 'recht' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
227
- 'reise' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
228
- 'resto' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
229
- 'school' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
230
- 'schule' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
231
- 'scifi' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
232
- 'scuola' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
233
- 'shop' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
234
- 'soc' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
235
- 'spiel' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
236
- 'sport' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
237
- 'subasta' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
238
- 'tec' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
239
- 'tech' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
240
- 'tienda' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
241
- 'travel' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
242
- 'turismo' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
243
- 'usa' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}',
244
- 'verein' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
245
- 'viaje' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
246
- 'viagem' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
247
- 'video' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
248
- 'voyage' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
249
- 'xxx' => 'http://www.new.net/search_whois.tp?domain={domain}&tld={tld}',
250
- 'z' => 'http://www.adns.net/whois.php?txtDOMAIN={domain}.{tld}'
251
- );
252
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.si.php DELETED
@@ -1,55 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- if (!defined('__SI_HANDLER__'))
29
- define('__SI_HANDLER__', 1);
30
-
31
- require_once('whois.parser.php');
32
-
33
- class si_handler
34
- {
35
- function parse($data_str, $query)
36
- {
37
- $translate = array(
38
- 'nic-hdl' => 'handle',
39
- 'nameserver' => 'nserver'
40
- );
41
-
42
- $contacts = array(
43
- 'registrant' => 'owner',
44
- 'tech-c' => 'tech'
45
- );
46
-
47
- $r['regrinfo'] = generic_parser_a($data_str['rawdata'], $translate, $contacts, 'domain', 'Ymd');
48
- $r['regyinfo'] = array(
49
- 'referrer' => 'http://www.arnes.si',
50
- 'registrar' => 'ARNES'
51
- );
52
- return $r;
53
- }
54
- }
55
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.utils.php DELETED
@@ -1,152 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
- */
27
-
28
- class utils extends Whois {
29
-
30
- // showObject() and debugObject()
31
- // - debug code to show an object or array
32
-
33
- function showObject(&$obj)
34
- {
35
- $r = $this->debugObject($obj);
36
- return "<pre>$r</pre>\n";
37
- }
38
-
39
- function debugObject($obj,$indent=0)
40
- {
41
- if (is_Array($obj))
42
- {
43
- $return = '';
44
- foreach($obj as $k => $v)
45
- {
46
- $return .= str_repeat('&nbsp;',$indent);
47
- $return .= $k."->$v\n";
48
- $return .= $this->debugObject($v,$indent+1);
49
- }
50
- return $return;
51
- }
52
- }
53
-
54
- function ns_rr_defined($query) {
55
- return checkdnsrr($query,'NS');
56
- }
57
-
58
- // get nice HTML output
59
-
60
- function showHTML($result, $link_myself=true, $params='query=$0&amp;output=nice') {
61
-
62
- // adds links fort HTML output
63
-
64
- $email_regex = "/([-_\w\.]+)(@)([-_\w\.]+)\b/i";
65
- $html_regex = "/(?:^|\b)((((http|https|ftp):\/\/)|(www\.))([\w\.]+)([,:%#&\/?~=\w+\.-]+))(?:\b|$)/is";
66
- $ip_regex = "/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/i";
67
-
68
- $out = '';
69
- $lempty = true;
70
-
71
- foreach($result['rawdata'] as $line)
72
- {
73
- $line = trim($line);
74
-
75
- if ($line == '')
76
- {
77
- if ($lempty) continue;
78
- else $lempty = true;
79
- }
80
- else
81
- $lempty = false;
82
-
83
- $out .= $line."\n";
84
- }
85
-
86
- if ($lempty) $out = trim($out);
87
-
88
- $out = strip_tags($out);
89
- $out = preg_replace ($email_regex, '<a href="mailto:$0">$0</a>', $out);
90
- $out = preg_replace_callback ($html_regex, 'href_replace', $out);
91
-
92
- if ($link_myself)
93
- {
94
- if ($params[0] == '/')
95
- $link = $params;
96
- else
97
- $link = $_SERVER['PHP_SELF'].'?'.$params;
98
-
99
- $out = preg_replace ($ip_regex, '<a href="'.$link.'">$0</a>', $out);
100
-
101
- if (isset($result['regrinfo']['domain']['nserver']))
102
- {
103
- $nserver = $result['regrinfo']['domain']['nserver'];
104
- }
105
- else
106
- $nserver = false;
107
-
108
- if (isset($result['regrinfo']['network']['nserver']))
109
- {
110
- $nserver = $result['regrinfo']['network']['nserver'];
111
- }
112
-
113
- if (is_array($nserver))
114
- {
115
- reset($nserver);
116
- while (list($host, $ip) = each($nserver))
117
- {
118
- $url = '<a href="'. str_replace('$0',$ip,$link)."\">$host</a>";
119
- $out = str_replace($host, $url, $out);
120
- $out = str_replace(strtoupper($host), $url, $out);
121
- }
122
- }
123
- }
124
-
125
- // Add bold field names
126
-
127
- $out = preg_replace ("/(?m)^([-\s\.&;'\w\t\(\)\/]+:\s*)/", '<b>$1</b>', $out);
128
-
129
- // Add italics for disclaimer
130
-
131
- $out = preg_replace ("/(?m)^(%.*)/", '<i>$0</i>', $out);
132
-
133
- return str_replace("\n","<br/>\n",$out);
134
- }
135
- }
136
-
137
- function href_replace($matches)
138
- {
139
- if (substr($matches[0],0,4)=='www.')
140
- {
141
- $web=$matches[0];
142
- $url='http://'.$web;
143
- }
144
- else
145
- {
146
- $web=$matches[0];
147
- $url=$web;
148
- }
149
-
150
- return '<a href="'.$url.'" target="_blank">'.$web.'</a>';
151
- }
152
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/lib/whois/whois.ve.php DELETED
@@ -1,75 +0,0 @@
1
- <?php
2
- /*
3
- Whois.php PHP classes to conduct whois queries
4
-
5
- Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
-
7
- Maintained by David Saez
8
-
9
- For the most recent version of this package visit:
10
-
11
- http://www.phpwhois.org
12
-
13
- This program is free software; you can redistribute it and/or
14
- modify it under the terms of the GNU General Public License
15
- as published by the Free Software Foundation; either version 2
16
- of the License, or (at your option) any later version.
17
-
18
- This program is distributed in the hope that it will be useful,
19
- but WITHOUT ANY WARRANTY; without even the implied warranty of
20
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
- GNU General Public License for more details.
22
-
23
- You should have received a copy of the GNU General Public License
24
- along with this program; if not, write to the Free Software
25
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
26
- USA.
27
- */
28
-
29
- if (!defined('__VE_HANDLER__'))
30
- define('__VE_HANDLER__', 1);
31
-
32
- require_once('whois.parser.php');
33
-
34
- class ve_handler
35
- {
36
- function parse($data_str, $query)
37
- {
38
- $items = array(
39
- 'owner' => 'Titular:',
40
- 'domain.name' => 'Nombre de Dominio:',
41
- 'admin' => 'Contacto Administrativo',
42
- 'tech' => 'Contacto Tecnico',
43
- 'billing' => 'Contacto de Cobranza:',
44
- 'domain.created' => 'Fecha de Creacion:',
45
- 'domain.changed' => 'Ultima Actualizacion:',
46
- 'domain.expires' => 'Fecha de Vencimiento:',
47
- 'domain.status' => 'Estatus del dominio:',
48
- 'domain.nserver' => 'Servidor(es) de Nombres de Dominio'
49
- );
50
-
51
- $r['regrinfo'] = get_blocks($data_str['rawdata'], $items);
52
-
53
- if (!isset($r['regrinfo']['domain']['created']) || is_array($r['regrinfo']['domain']['created']))
54
- {
55
- $r['regrinfo'] = array ( 'registered' => 'no');
56
- return $r;
57
- }
58
-
59
- $dns = array();
60
-
61
- foreach($r['regrinfo']['domain']['nserver'] as $nserv)
62
- {
63
- if ($nserv[0] == '-') $dns[] = $nserv;
64
- }
65
-
66
- $r['regrinfo']['domain']['nserver'] = $dns;
67
- $r['regrinfo'] = get_contacts($r['regrinfo']);
68
- $r['regyinfo'] = array(
69
- 'referrer' => 'http://registro.nic.ve',
70
- 'registrar' => 'NIC-Venezuela - CNTI'
71
- );
72
- return $r;
73
- }
74
- }
75
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/readme.txt DELETED
@@ -1,109 +0,0 @@
1
- === All In One WP Security & Firewall ===
2
- Contributors: Tips and Tricks HQ, wpsolutions, Peter Petreski, Ruhul Amin
3
- Donate link: http://www.tipsandtricks-hq.com/wordpress-security-and-firewall-plugin
4
- Tags: security, Anti Virus, antivirus, virus, firewall, secure, login, lockdown, htaccess, hacking, malware, vulnerability, protect, phishing, database, backup, plugin
5
- Requires at least: 3.5
6
- Tested up to: 3.6
7
- Stable tag: 1.0
8
- License: GPLv3
9
-
10
- A comprehensive, user-friendly, all in one security and firewall plugin for your WordPress site.
11
-
12
- == Description ==
13
- = A COMPREHENSIVE, EASY TO USE AND WELL SUPPORTED WORDPRESS SECURITY PLUGIN =
14
-
15
- WordPress itself is a very secure platform. However, it helps to add some extra security and firewall to your site by using a security plugin that enforces a lot of good security practices.
16
-
17
- The All In One WP Security plugin will take your website security to a whole new level.
18
-
19
- This plugin is designed and written by experts and is easy to use and understand.
20
-
21
- It offers the latest recommended WordPress security practices and techniques.
22
-
23
- All In One WP Security also uses an unprecedented security points grading system to measure how well you are protecting your site based on the security features you have activated.
24
-
25
- Below is a list of the security and firewall features offered in this plugin:
26
-
27
- = .htaccess and wp-config.php settings =
28
- * Easily backup your original .htaccess and wp-config.php files in case you will need to use them to restore broken functionality.
29
- * Modify the contents of the currently active .htaccess or wp-config.php from the admin dashboard with only a few clicks
30
-
31
- = User Accounts Security =
32
- * Detect if there is a user account which has the default "admin" username and easily change the username to a value of your choice.
33
- * The plugin will also detect if you have any WordPress user accounts which have identical login and display names. Having account's where display name is identical to login name is bad security practice because
34
- you are making it 50% easier for hackers because they already know the login name.
35
-
36
- = User Login Security =
37
- * Protect against "Brute Force Login Attack" with the Login Lockdown feature. Users with a certain IP address or range will be locked out of the system for a predetermined amount of time based on the configuration settings and you can also choose to be notified
38
- via email whenever somebody gets locked out due to too many login attempts.
39
-
40
- * As the administrator you can view a list of all locked out users which are displayed in an easily readable and navigable table which also allows you to unlock individual or bulk IP addresses at the click of a button.
41
-
42
- * Force logout of all users after a configurable time period
43
-
44
- * Monitor/View failed login attempts which show the user's IP address, User ID/Username and Date/Time of the failed login attempt
45
- * Monitor/View the account activity of all user accounts on your system by keeping track of the username, IP address, login date/time, and logout date/time.
46
-
47
- = Database Security =
48
- * Easily the default WP prefix to a value of your choice with the click of a button.
49
-
50
- * Schedule automatic backups and email notifications or make an instant DB backup whenever you want with one click.
51
-
52
- = File System Security =
53
- * Identify files or folders which have permission settings which are not secure and set the permissions to the recommend secure values with click of a button.
54
- * Protect your PHP code by disabling file editing from the WordPress administration area.
55
- * Easily view and monitor all host system logs from a single menu page and stay informed of any issues or problems occurring on your server so you can address them quickly.
56
-
57
- = WhoIs Lookup =
58
- * Perform a WhoIs lookup of a suspicious host or IP address.
59
-
60
- = Blacklist Functionality =
61
- * Ban users by specifying IP addresses or use a wild card to specify IP ranges.
62
- * Ban users by specifying user agents.
63
- * Monitor the most active IP addresses which persistently produce the most SPAM comments and instantly block them with the click of a button.
64
-
65
- = Firewall Functionality =
66
- * Instantly activate a selection of firewall settings ranging from basic, intermediate and advanced.
67
- * Enable the famous "5G Blacklist" Firewall rules courtesy of [Perishable Press](http://perishablepress.com/)
68
- * Forbid proxy comment posting
69
- * Disable trace and track
70
- * Deny bad or malicious query strings
71
- * Protect against Cross Site Scripting (XSS) by activating the comprehensive advanced character string filter.
72
-
73
- = Other Benefits =
74
- = Regular updates and additions of new security features =
75
- * WordPress Security is something that evolves over time. We will be updating the All In One WP Security plugin with new security features (and fixes if required) on a regular basis so you can rest assured that your site will be on the cutting edge of security protection techniques.
76
- * It should work smoothly with most popular WordPress plugins.
77
- * Our firewall rules are categorized into "basic", "intermediate" and "advanced". This way you can apply the firewall rules progressively without breaking your site's functionality.
78
-
79
- = Plugin Support =
80
- * If you have a question or problem with the All In One Security plugin, post it on the support forum and we will help you.
81
-
82
- = Translations =
83
- * All In One WP Security plugin can be translated to any language.
84
-
85
- == Installation ==
86
-
87
- To begin making your WordPress site more secure:
88
-
89
- 1. Upload the 'all-in-one-wp-security.zip' file from the Plugins->Add New page in the WordPress administration panel.
90
- 2. Activate the plugin through the 'Plugins' menu in WordPress
91
- 3. Go to Settings menu under 'WP Security' and use the configuration wizard or start configuring the plugin yourself.
92
-
93
- == Usage ==
94
-
95
- Go to the settings menu after you activate the plugin and follow the instructions.
96
-
97
- == Screenshots ==
98
- None
99
-
100
- == Frequently Asked Questions ==
101
- None
102
-
103
- == Upgrade Notice ==
104
- None
105
-
106
- == Changelog ==
107
-
108
- = 1.0 =
109
- - First commit to the WP repository.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/wp-security-core.php DELETED
@@ -1,204 +0,0 @@
1
- <?php
2
-
3
- if (!class_exists('AIO_WP_Security')){
4
-
5
- class AIO_WP_Security{
6
- var $version = '1.0';
7
- var $db_version = '1.2';
8
- var $plugin_url;
9
- var $plugin_path;
10
- var $configs;
11
- var $admin_init;
12
- var $debug_logger;
13
- var $cron_handler;
14
- var $user_login_obj;
15
- var $backup_obj;
16
-
17
- function __construct()
18
- {
19
- $this->load_configs();
20
- $this->define_constants();
21
- $this->includes();
22
- $this->loader_operations();
23
-
24
- add_action('init', array(&$this, 'wp_security_plugin_init'), 0);
25
- do_action('aiowpsecurity_loaded');
26
- }
27
-
28
- function plugin_url()
29
- {
30
- if ($this->plugin_url) return $this->plugin_url;
31
- return $this->plugin_url = plugins_url( basename( plugin_dir_path(__FILE__) ), basename( __FILE__ ) );
32
- }
33
-
34
- function plugin_path()
35
- {
36
- if ($this->plugin_path) return $this->plugin_path;
37
- return $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) );
38
- }
39
-
40
- function load_configs()
41
- {
42
- include_once('classes/wp-security-config.php');
43
- $this->configs = AIOWPSecurity_Config::get_instance();
44
- }
45
-
46
- function define_constants()
47
- {
48
- define('AIO_WP_SECURITY_VERSION', $this->version);
49
- define('AIO_WP_SECURITY_DB_VERSION', $this->db_version);
50
- define('AIOWPSEC_WP_URL', site_url());
51
- define('AIO_WP_SECURITY_URL', $this->plugin_url());
52
- define('AIO_WP_SECURITY_PATH', $this->plugin_path());
53
- define('AIO_WP_SECURITY_BACKUPS_PATH', AIO_WP_SECURITY_PATH.'/backups');
54
- define('AIO_WP_SECURITY_LIB_PATH', AIO_WP_SECURITY_PATH.'/lib');
55
- define('AIOWPSEC_MANAGEMENT_PERMISSION', 'add_users');
56
- define('AIOWPSEC_MENU_SLUG_PREFIX', 'aiowpsec');
57
- define('AIOWPSEC_MAIN_MENU_SLUG', 'aiowpsec');
58
- define('AIOWPSEC_SETTINGS_MENU_SLUG', 'aiowpsec_settings');
59
- define('AIOWPSEC_USER_ACCOUNTS_MENU_SLUG', 'aiowpsec_useracc');
60
- define('AIOWPSEC_USER_LOGIN_MENU_SLUG', 'aiowpsec_userlogin');
61
- define('AIOWPSEC_DB_SEC_MENU_SLUG', 'aiowpsec_database');
62
- define('AIOWPSEC_FILESYSTEM_MENU_SLUG', 'aiowpsec_filesystem');
63
- define('AIOWPSEC_WHOIS_MENU_SLUG', 'aiowpsec_whois');
64
- define('AIOWPSEC_BLACKLIST_MENU_SLUG', 'aiowpsec_blacklist');
65
- define('AIOWPSEC_FIREWALL_MENU_SLUG', 'aiowpsec_firewall');
66
-
67
- global $wpdb;
68
- define('AIOWPSEC_TBL_LOGIN_LOCKDOWN', $wpdb->prefix . 'aiowps_login_lockdown');
69
- define('AIOWPSEC_TBL_FAILED_LOGINS', $wpdb->prefix . 'aiowps_failed_logins');
70
- define('AIOWPSEC_TBL_USER_LOGIN_ACTIVITY', $wpdb->prefix . 'aiowps_login_activity');
71
-
72
- }
73
-
74
- function includes()
75
- {
76
- //Load common files for everywhere
77
- include_once('classes/wp-security-debug-logger.php');
78
- include_once('classes/wp-security-utility.php');
79
- include_once('classes/wp-security-utility-htaccess.php');
80
- include_once('classes/wp-security-utility-ip-address.php');
81
- include_once('classes/wp-security-utility-file.php');
82
-
83
- include_once('classes/wp-security-user-login.php');
84
- include_once('classes/wp-security-backup.php');
85
- include_once('classes/wp-security-cronjob-handler.php');
86
- include_once('classes/grade-system/wp-security-feature-item.php');
87
- include_once('classes/grade-system/wp-security-feature-item-manager.php');
88
-
89
- if (is_admin()){ //Load admin side only files
90
- include_once('classes/wp-security-configure-settings.php');
91
- include_once('admin/wp-security-admin-init.php');
92
- include_once('admin/general/wp-security-list-table.php');
93
-
94
- }
95
- else{ //Load front end side only files
96
- }
97
- }
98
-
99
- function loader_operations()
100
- {
101
- add_action('plugins_loaded',array(&$this, 'plugins_loaded_handler'));//plugins loaded hook
102
- $this->debug_logger = new AIOWPSecurity_Logger();
103
- if(is_admin()){
104
- $this->admin_init = new AIOWPSecurity_Admin_Init();
105
- }
106
- }
107
-
108
- function activate_handler()
109
- {
110
- //Only runs when the plugin activates
111
- include_once ('classes/wp-security-installer.php');
112
- AIOWPSecurity_Installer::run_installer();
113
- wp_schedule_event(time(), 'hourly', 'aiowps_hourly_cron_event'); //schedule an hourly cron event
114
- //wp_schedule_event(time(), 'daily', 'aiowps_daily_cron_event'); //schedule an daily cron event
115
- }
116
-
117
- function deactivate_handler()
118
- {
119
- //Only runs with the pluign is deactivated
120
- wp_clear_scheduled_hook('aiowps_hourly_cron_event');
121
- //wp_clear_scheduled_hook('aiowps_daily_cron_event');
122
- }
123
-
124
- function db_upgrade_handler()
125
- {
126
- if(is_admin()){//Check if DB needs to be upgraded
127
- if (get_option('aiowpsec_db_version') != AIO_WP_SECURITY_DB_VERSION) {
128
- include_once ('classes/wp-security-installer.php');
129
- AIOWPSecurity_Installer::run_installer();
130
- }
131
- }
132
- }
133
-
134
- function plugins_loaded_handler()
135
- {
136
- //Runs when plugins_loaded action gets fired
137
- if(is_admin()){
138
- //Do plugins_loaded operations for admin side
139
- $this->db_upgrade_handler();
140
- }
141
- $this->do_additional_plugins_loaded_tasks();
142
- }
143
-
144
- function wp_security_plugin_init()
145
- {
146
- //Set up localisation
147
- load_plugin_textdomain('aiowpsecurity', false, AIO_WP_SECURITY_PATH . "/languages" );
148
-
149
- //Plugin into code goes here... actions, filters, shortcodes goes here
150
- $this->user_login_obj = new AIOWPSecurity_User_Login();//Do the user login operation tasks
151
- $this->backup_obj = new AIOWPSecurity_Backup();//Object to handle backup tasks
152
- $this->cron_handler = new AIOWPSecurity_Cronjob_Handler();
153
-
154
- add_action('wp_head',array(&$this, 'aiowps_header_content'));
155
-
156
- add_action('wp_login', array('AIOWPSecurity_User_Login', 'wp_login_action_handler'), 10, 2);
157
- do_action('aiowps_force_logout_check');
158
- $this->do_additional_init_tasks();
159
-
160
- }
161
-
162
- function aiowps_header_content()
163
- {
164
- //NOP
165
- }
166
-
167
- function do_additional_init_tasks()
168
- {
169
- //NOP
170
- }
171
-
172
- function do_additional_plugins_loaded_tasks()
173
- {
174
- if(isset($_GET['aiowpsec_do_log_out']))
175
- {
176
- wp_logout();
177
- if(isset($_GET['after_logout']))//Redirect to the after logout url directly
178
- {
179
- $after_logout_url = esc_url($_GET['after_logout']);
180
- AIOWPSecurity_Utility::redirect_to_url($after_logout_url);
181
- }
182
- if(isset($_GET['al_additional_data']))//Inspect the payload and do redirect to login page with a msg and redirect url
183
- {
184
- $payload = strip_tags($_GET['al_additional_data']);
185
- $decoded_payload = base64_decode($payload);
186
- parse_str($decoded_payload);
187
- if(!empty($redirect_to)){
188
- $login_url = AIOWPSecurity_Utility::add_query_data_to_url(wp_login_url(),'redirect_to',$redirect_to);
189
- }
190
- if(!empty($msg)){
191
- $login_url .= '&'.$msg;
192
- }
193
- if(!empty($login_url)){
194
- AIOWPSecurity_Utility::redirect_to_url($login_url);
195
- }
196
- }
197
- }
198
- }
199
-
200
- }//End of class
201
-
202
- }//End of class not exists check
203
-
204
- $GLOBALS['aio_wp_security'] = new AIO_WP_Security();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.0/wp-security.php DELETED
@@ -1,26 +0,0 @@
1
- <?php
2
- /*
3
- Plugin Name: All In One WP Security
4
- Version: v1.0.0
5
- Plugin URI: http://www.tipsandtricks-hq.com/
6
- Author: Tips and Tricks HQ, Peter, Ruhul Amin
7
- Author URI: http://www.tipsandtricks-hq.com/
8
- Description: All round best WordPress security plugin!
9
- License: GPL2
10
- */
11
-
12
- if(!defined('ABSPATH'))exit; //Exit if accessed directly
13
-
14
- include_once('wp-security-core.php');
15
- register_activation_hook(__FILE__,array('AIO_WP_Security','activate_handler'));//activation hook
16
- register_deactivation_hook(__FILE__,array('AIO_WP_Security','deactivate_handler'));//deactivation hook
17
-
18
- function aiowps_show_plugin_settings_link($links, $file)
19
- {
20
- if ($file == plugin_basename(__FILE__)){
21
- $settings_link = '<a href="admin.php?page=aiowpsec_settings">Settings</a>';
22
- array_unshift($links, $settings_link);
23
- }
24
- return $links;
25
- }
26
- add_filter('plugin_action_links', 'aiowps_show_plugin_settings_link', 10, 2 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.1/admin/general/wp-security-list-table.php DELETED
@@ -1,907 +0,0 @@
1
- <?php
2
- /**
3
- * Base class for displaying a list of items in an ajaxified HTML table.
4
- */
5
- class AIOWPSecurity_List_Table
6
- {
7
- /**
8
- * The current list of items
9
- *
10
- * @since 3.1.0
11
- * @var array
12
- * @access protected
13
- */
14
- var $items;
15
-
16
- /**
17
- * Various information about the current table
18
- *
19
- * @since 3.1.0
20
- * @var array
21
- * @access private
22
- */
23
- var $_args;
24
-
25
- /**
26
- * Various information needed for displaying the pagination
27
- *
28
- * @since 3.1.0
29
- * @var array
30
- * @access private
31
- */
32
- var $_pagination_args = array();
33
-
34
- /**
35
- * The current screen
36
- *
37
- * @since 3.1.0
38
- * @var object
39
- * @access protected
40
- */
41
- var $screen;
42
-
43
- /**
44
- * Cached bulk actions
45
- *
46
- * @since 3.1.0
47
- * @var array
48
- * @access private
49
- */
50
- var $_actions;
51
-
52
- /**
53
- * Cached pagination output
54
- *
55
- * @since 3.1.0
56
- * @var string
57
- * @access private
58
- */
59
- var $_pagination;
60
-
61
- /**
62
- * Constructor. The child class should call this constructor from it's own constructor
63
- *
64
- * @param array $args An associative array with information about the current table
65
- * @access protected
66
- */
67
- function __construct( $args = array() ) {
68
- $args = wp_parse_args( $args, array(
69
- 'plural' => '',
70
- 'singular' => '',
71
- 'ajax' => false,
72
- 'screen' => null,
73
- ) );
74
-
75
- $this->screen = convert_to_screen( $args['screen'] );
76
-
77
- add_filter( "manage_{$this->screen->id}_columns", array( &$this, 'get_columns' ), 0 );
78
-
79
- if ( !$args['plural'] )
80
- $args['plural'] = $this->screen->base;
81
-
82
- $args['plural'] = sanitize_key( $args['plural'] );
83
- $args['singular'] = sanitize_key( $args['singular'] );
84
-
85
- $this->_args = $args;
86
-
87
- if ( $args['ajax'] ) {
88
- // wp_enqueue_script( 'list-table' );
89
- add_action( 'admin_footer', array( &$this, '_js_vars' ) );
90
- }
91
- }
92
-
93
- /**
94
- * Checks the current user's permissions
95
- * @uses wp_die()
96
- *
97
- * @since 3.1.0
98
- * @access public
99
- * @abstract
100
- */
101
- function ajax_user_can() {
102
- die( 'function AIOWPSecurity_List_Table::ajax_user_can() must be over-ridden in a sub-class.' );
103
- }
104
-
105
- /**
106
- * Prepares the list of items for displaying.
107
- * @uses AIOWPSecurity_List_Table::set_pagination_args()
108
- *
109
- * @since 3.1.0
110
- * @access public
111
- * @abstract
112
- */
113
- function prepare_items() {
114
- die( 'function AIOWPSecurity_List_Table::prepare_items() must be over-ridden in a sub-class.' );
115
- }
116
-
117
- /**
118
- * An internal method that sets all the necessary pagination arguments
119
- *
120
- * @param array $args An associative array with information about the pagination
121
- * @access protected
122
- */
123
- function set_pagination_args( $args ) {
124
- $args = wp_parse_args( $args, array(
125
- 'total_items' => 0,
126
- 'total_pages' => 0,
127
- 'per_page' => 0,
128
- ) );
129
-
130
- if ( !$args['total_pages'] && $args['per_page'] > 0 )
131
- $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] );
132
-
133
- // redirect if page number is invalid and headers are not already sent
134
- if ( ! headers_sent() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) {
135
- wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) );
136
- exit;
137
- }
138
-
139
- $this->_pagination_args = $args;
140
- }
141
-
142
- /**
143
- * Access the pagination args
144
- *
145
- * @since 3.1.0
146
- * @access public
147
- *
148
- * @param string $key
149
- * @return array
150
- */
151
- function get_pagination_arg( $key ) {
152
- if ( 'page' == $key )
153
- return $this->get_pagenum();
154
-
155
- if ( isset( $this->_pagination_args[$key] ) )
156
- return $this->_pagination_args[$key];
157
- }
158
-
159
- /**
160
- * Whether the table has items to display or not
161
- *
162
- * @since 3.1.0
163
- * @access public
164
- *
165
- * @return bool
166
- */
167
- function has_items() {
168
- return !empty( $this->items );
169
- }
170
-
171
- /**
172
- * Message to be displayed when there are no items
173
- *
174
- * @since 3.1.0
175
- * @access public
176
- */
177
- function no_items() {
178
- _e( 'No items found.' );
179
- }
180
-
181
- /**
182
- * Display the search box.
183
- *
184
- * @since 3.1.0
185
- * @access public
186
- *
187
- * @param string $text The search button text
188
- * @param string $input_id The search input id
189
- */
190
- function search_box( $text, $input_id ) {
191
- if ( empty( $_REQUEST['s'] ) && !$this->has_items() )
192
- return;
193
-
194
- $input_id = $input_id . '-search-input';
195
-
196
- if ( ! empty( $_REQUEST['orderby'] ) )
197
- echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
198
- if ( ! empty( $_REQUEST['order'] ) )
199
- echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
200
- if ( ! empty( $_REQUEST['post_mime_type'] ) )
201
- echo '<input type="hidden" name="post_mime_type" value="' . esc_attr( $_REQUEST['post_mime_type'] ) . '" />';
202
- if ( ! empty( $_REQUEST['detached'] ) )
203
- echo '<input type="hidden" name="detached" value="' . esc_attr( $_REQUEST['detached'] ) . '" />';
204
- ?>
205
- <p class="search-box">
206
- <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
207
- <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>" />
208
- <?php submit_button( $text, 'button', false, false, array('id' => 'search-submit') ); ?>
209
- </p>
210
- <?php
211
- }
212
-
213
- /**
214
- * Get an associative array ( id => link ) with the list
215
- * of views available on this table.
216
- *
217
- * @since 3.1.0
218
- * @access protected
219
- *
220
- * @return array
221
- */
222
- function get_views() {
223
- return array();
224
- }
225
-
226
- /**
227
- * Display the list of views available on this table.
228
- *
229
- * @since 3.1.0
230
- * @access public
231
- */
232
- function views() {
233
- $views = $this->get_views();
234
- $views = apply_filters( 'views_' . $this->screen->id, $views );
235
-
236
- if ( empty( $views ) )
237
- return;
238
-
239
- echo "<ul class='subsubsub'>\n";
240
- foreach ( $views as $class => $view ) {
241
- $views[ $class ] = "\t<li class='$class'>$view";
242
- }
243
- echo implode( " |</li>\n", $views ) . "</li>\n";
244
- echo "</ul>";
245
- }
246
-
247
- /**
248
- * Get an associative array ( option_name => option_title ) with the list
249
- * of bulk actions available on this table.
250
- *
251
- * @since 3.1.0
252
- * @access protected
253
- *
254
- * @return array
255
- */
256
- function get_bulk_actions() {
257
- return array();
258
- }
259
-
260
- /**
261
- * Display the bulk actions dropdown.
262
- *
263
- * @since 3.1.0
264
- * @access public
265
- */
266
- function bulk_actions() {
267
- if ( is_null( $this->_actions ) ) {
268
- $no_new_actions = $this->_actions = $this->get_bulk_actions();
269
- // This filter can currently only be used to remove actions.
270
- $this->_actions = apply_filters( 'bulk_actions-' . $this->screen->id, $this->_actions );
271
- $this->_actions = array_intersect_assoc( $this->_actions, $no_new_actions );
272
- $two = '';
273
- } else {
274
- $two = '2';
275
- }
276
-
277
- if ( empty( $this->_actions ) )
278
- return;
279
-
280
- echo "<select name='action$two'>\n";
281
- echo "<option value='-1' selected='selected'>" . __( 'Bulk Actions' ) . "</option>\n";
282
-
283
- foreach ( $this->_actions as $name => $title ) {
284
- $class = 'edit' == $name ? ' class="hide-if-no-js"' : '';
285
-
286
- echo "\t<option value='$name'$class>$title</option>\n";
287
- }
288
-
289
- echo "</select>\n";
290
-
291
- submit_button( __( 'Apply' ), 'action', false, false, array( 'id' => "doaction$two" ) );
292
- echo "\n";
293
- }
294
-
295
- /**
296
- * Get the current action selected from the bulk actions dropdown.
297
- *
298
- * @since 3.1.0
299
- * @access public
300
- *
301
- * @return string|bool The action name or False if no action was selected
302
- */
303
- function current_action() {
304
- if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] )
305
- return $_REQUEST['action'];
306
-
307
- if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] )
308
- return $_REQUEST['action2'];
309
-
310
- return false;
311
- }
312
-
313
- /**
314
- * Generate row actions div
315
- *
316
- * @since 3.1.0
317
- * @access protected
318
- *
319
- * @param array $actions The list of actions
320
- * @param bool $always_visible Whether the actions should be always visible
321
- * @return string
322
- */
323
- function row_actions( $actions, $always_visible = false ) {
324
- $action_count = count( $actions );
325
- $i = 0;
326
-
327
- if ( !$action_count )
328
- return '';
329
-
330
- $out = '<div class="' . ( $always_visible ? 'row-actions-visible' : 'row-actions' ) . '">';
331
- foreach ( $actions as $action => $link ) {
332
- ++$i;
333
- ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
334
- $out .= "<span class='$action'>$link$sep</span>";
335
- }
336
- $out .= '</div>';
337
-
338
- return $out;
339
- }
340
-
341
- /**
342
- * Display a monthly dropdown for filtering items
343
- *
344
- * @since 3.1.0
345
- * @access protected
346
- */
347
- function months_dropdown( $post_type ) {
348
- global $wpdb, $wp_locale;
349
-
350
- $months = $wpdb->get_results( $wpdb->prepare( "
351
- SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
352
- FROM $wpdb->posts
353
- WHERE post_type = %s
354
- ORDER BY post_date DESC
355
- ", $post_type ) );
356
-
357
- $month_count = count( $months );
358
-
359
- if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )
360
- return;
361
-
362
- $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
363
- ?>
364
- <select name='m'>
365
- <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates' ); ?></option>
366
- <?php
367
- foreach ( $months as $arc_row ) {
368
- if ( 0 == $arc_row->year )
369
- continue;
370
-
371
- $month = zeroise( $arc_row->month, 2 );
372
- $year = $arc_row->year;
373
-
374
- printf( "<option %s value='%s'>%s</option>\n",
375
- selected( $m, $year . $month, false ),
376
- esc_attr( $arc_row->year . $month ),
377
- /* translators: 1: month name, 2: 4-digit year */
378
- sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
379
- );
380
- }
381
- ?>
382
- </select>
383
- <?php
384
- }
385
-
386
- /**
387
- * Display a view switcher
388
- *
389
- * @since 3.1.0
390
- * @access protected
391
- */
392
- function view_switcher( $current_mode ) {
393
- $modes = array(
394
- 'list' => __( 'List View' ),
395
- 'excerpt' => __( 'Excerpt View' )
396
- );
397
-
398
- ?>
399
- <input type="hidden" name="mode" value="<?php echo esc_attr( $current_mode ); ?>" />
400
- <div class="view-switch">
401
- <?php
402
- foreach ( $modes as $mode => $title ) {
403
- $class = ( $current_mode == $mode ) ? 'class="current"' : '';
404
- echo "<a href='" . esc_url( add_query_arg( 'mode', $mode, $_SERVER['REQUEST_URI'] ) ) . "' $class><img id='view-switch-$mode' src='" . esc_url( includes_url( 'images/blank.gif' ) ) . "' width='20' height='20' title='$title' alt='$title' /></a>\n";
405
- }
406
- ?>
407
- </div>
408
- <?php
409
- }
410
-
411
- /**
412
- * Display a comment count bubble
413
- *
414
- * @since 3.1.0
415
- * @access protected
416
- *
417
- * @param int $post_id
418
- * @param int $pending_comments
419
- */
420
- function comments_bubble( $post_id, $pending_comments ) {
421
- $pending_phrase = sprintf( __( '%s pending' ), number_format( $pending_comments ) );
422
-
423
- if ( $pending_comments )
424
- echo '<strong>';
425
-
426
- echo "<a href='" . esc_url( add_query_arg( 'p', $post_id, admin_url( 'edit-comments.php' ) ) ) . "' title='" . esc_attr( $pending_phrase ) . "' class='post-com-count'><span class='comment-count'>" . number_format_i18n( get_comments_number() ) . "</span></a>";
427
-
428
- if ( $pending_comments )
429
- echo '</strong>';
430
- }
431
-
432
- /**
433
- * Get the current page number
434
- *
435
- * @since 3.1.0
436
- * @access protected
437
- *
438
- * @return int
439
- */
440
- function get_pagenum() {
441
- $pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0;
442
-
443
- if( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] )
444
- $pagenum = $this->_pagination_args['total_pages'];
445
-
446
- return max( 1, $pagenum );
447
- }
448
-
449
- /**
450
- * Get number of items to display on a single page
451
- *
452
- * @since 3.1.0
453
- * @access protected
454
- *
455
- * @return int
456
- */
457
- function get_items_per_page( $option, $default = 20 ) {
458
- $per_page = (int) get_user_option( $option );
459
- if ( empty( $per_page ) || $per_page < 1 )
460
- $per_page = $default;
461
-
462
- return (int) apply_filters( $option, $per_page );
463
- }
464
-
465
- /**
466
- * Display the pagination.
467
- *
468
- * @since 3.1.0
469
- * @access protected
470
- */
471
- function pagination( $which ) {
472
- if ( empty( $this->_pagination_args ) )
473
- return;
474
-
475
- extract( $this->_pagination_args, EXTR_SKIP );
476
-
477
- $output = '<span class="displaying-num">' . sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . '</span>';
478
-
479
- $current = $this->get_pagenum();
480
-
481
- $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
482
-
483
- $current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url );
484
-
485
- $page_links = array();
486
-
487
- $disable_first = $disable_last = '';
488
- if ( $current == 1 )
489
- $disable_first = ' disabled';
490
- if ( $current == $total_pages )
491
- $disable_last = ' disabled';
492
-
493
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
494
- 'first-page' . $disable_first,
495
- esc_attr__( 'Go to the first page' ),
496
- esc_url( remove_query_arg( 'paged', $current_url ) ),
497
- '&laquo;'
498
- );
499
-
500
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
501
- 'prev-page' . $disable_first,
502
- esc_attr__( 'Go to the previous page' ),
503
- esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
504
- '&lsaquo;'
505
- );
506
-
507
- if ( 'bottom' == $which )
508
- $html_current_page = $current;
509
- else
510
- $html_current_page = sprintf( "<input class='current-page' title='%s' type='text' name='paged' value='%s' size='%d' />",
511
- esc_attr__( 'Current page' ),
512
- $current,
513
- strlen( $total_pages )
514
- );
515
-
516
- $html_total_pages = sprintf( "<span class='total-pages'>%s</span>", number_format_i18n( $total_pages ) );
517
- $page_links[] = '<span class="paging-input">' . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . '</span>';
518
-
519
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
520
- 'next-page' . $disable_last,
521
- esc_attr__( 'Go to the next page' ),
522
- esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
523
- '&rsaquo;'
524
- );
525
-
526
- $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
527
- 'last-page' . $disable_last,
528
- esc_attr__( 'Go to the last page' ),
529
- esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
530
- '&raquo;'
531
- );
532
-
533
- $pagination_links_class = 'pagination-links';
534
- if ( ! empty( $infinite_scroll ) )
535
- $pagination_links_class = ' hide-if-js';
536
- $output .= "\n<span class='$pagination_links_class'>" . join( "\n", $page_links ) . '</span>';
537
-
538
- if ( $total_pages )
539
- $page_class = $total_pages < 2 ? ' one-page' : '';
540
- else
541
- $page_class = ' no-pages';
542
-
543
- $this->_pagination = "<div class='tablenav-pages{$page_class}'>$output</div>";
544
-
545
- echo $this->_pagination;
546
- }
547
-
548
- /**
549
- * Get a list of columns. The format is:
550
- * 'internal-name' => 'Title'
551
- *
552
- * @since 3.1.0
553
- * @access protected
554
- * @abstract
555
- *
556
- * @return array
557
- */
558
- function get_columns() {
559
- die( 'function AIOWPSecurity_List_Table::get_columns() must be over-ridden in a sub-class.' );
560
- }
561
-
562
- /**
563
- * Get a list of sortable columns. The format is:
564
- * 'internal-name' => 'orderby'
565
- * or
566
- * 'internal-name' => array( 'orderby', true )
567
- *
568
- * The second format will make the initial sorting order be descending
569
- *
570
- * @since 3.1.0
571
- * @access protected
572
- *
573
- * @return array
574
- */
575
- function get_sortable_columns() {
576
- return array();
577
- }
578
-
579
- /**
580
- * Get a list of all, hidden and sortable columns, with filter applied
581
- *
582
- * @since 3.1.0
583
- * @access protected
584
- *
585
- * @return array
586
- */
587
- function get_column_info() {
588
- if ( isset( $this->_column_headers ) )
589
- return $this->_column_headers;
590
-
591
- $columns = get_column_headers( $this->screen );
592
- $hidden = get_hidden_columns( $this->screen );
593
-
594
- $_sortable = apply_filters( "manage_{$this->screen->id}_sortable_columns", $this->get_sortable_columns() );
595
-
596
- $sortable = array();
597
- foreach ( $_sortable as $id => $data ) {
598
- if ( empty( $data ) )
599
- continue;
600
-
601
- $data = (array) $data;
602
- if ( !isset( $data[1] ) )
603
- $data[1] = false;
604
-
605
- $sortable[$id] = $data;
606
- }
607
-
608
- $this->_column_headers = array( $columns, $hidden, $sortable );
609
-
610
- return $this->_column_headers;
611
- }
612
-
613
- /**
614
- * Return number of visible columns
615
- *
616
- * @since 3.1.0
617
- * @access public
618
- *
619
- * @return int
620
- */
621
- function get_column_count() {
622
- list ( $columns, $hidden ) = $this->get_column_info();
623
- $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) );
624
- return count( $columns ) - count( $hidden );
625
- }
626
-
627
- /**
628
- * Print column headers, accounting for hidden and sortable columns.
629
- *
630
- * @since 3.1.0
631
- * @access protected
632
- *
633
- * @param bool $with_id Whether to set the id attribute or not
634
- */
635
- function print_column_headers( $with_id = true ) {
636
- list( $columns, $hidden, $sortable ) = $this->get_column_info();
637
-
638
- $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
639
- $current_url = remove_query_arg( 'paged', $current_url );
640
-
641
- if ( isset( $_GET['orderby'] ) )
642
- $current_orderby = $_GET['orderby'];
643
- else
644
- $current_orderby = '';
645
-
646
- if ( isset( $_GET['order'] ) && 'desc' == $_GET['order'] )
647
- $current_order = 'desc';
648
- else
649
- $current_order = 'asc';
650
-
651
- if ( ! empty( $columns['cb'] ) ) {
652
- static $cb_counter = 1;
653
- $columns['cb'] = '<label class="screen-reader-text" for="cb-select-all-' . $cb_counter . '">' . __( 'Select All' ) . '</label>'
654
- . '<input id="cb-select-all-' . $cb_counter . '" type="checkbox" />';
655
- $cb_counter++;
656
- }
657
-
658
- foreach ( $columns as $column_key => $column_display_name ) {
659
- $class = array( 'manage-column', "column-$column_key" );
660
-
661
- $style = '';
662
- if ( in_array( $column_key, $hidden ) )
663
- $style = 'display:none;';
664
-
665
- $style = ' style="' . $style . '"';
666
-
667
- if ( 'cb' == $column_key )
668
- $class[] = 'check-column';
669
- elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) )
670
- $class[] = 'num';
671
-
672
- if ( isset( $sortable[$column_key] ) ) {
673
- list( $orderby, $desc_first ) = $sortable[$column_key];
674
-
675
- if ( $current_orderby == $orderby ) {
676
- $order = 'asc' == $current_order ? 'desc' : 'asc';
677
- $class[] = 'sorted';
678
- $class[] = $current_order;
679
- } else {
680
- $order = $desc_first ? 'desc' : 'asc';
681
- $class[] = 'sortable';
682
- $class[] = $desc_first ? 'asc' : 'desc';
683
- }
684
-
685
- $column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
686
- }
687
-
688
- $id = $with_id ? "id='$column_key'" : '';
689
-
690
- if ( !empty( $class ) )
691
- $class = "class='" . join( ' ', $class ) . "'";
692
-
693
- echo "<th scope='col' $id $class $style>$column_display_name</th>";
694
- }
695
- }
696
-
697
- /**
698
- * Display the table
699
- *
700
- * @since 3.1.0
701
- * @access public
702
- */
703
- function display() {
704
- extract( $this->_args );
705
-
706
- $this->display_tablenav( 'top' );
707
-
708
- ?>
709
- <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">
710
- <thead>
711
- <tr>
712
- <?php $this->print_column_headers(); ?>
713
- </tr>
714
- </thead>
715
-
716
- <tfoot>
717
- <tr>
718
- <?php $this->print_column_headers( false ); ?>
719
- </tr>
720
- </tfoot>
721
-
722
- <tbody id="the-list"<?php if ( $singular ) echo " data-wp-lists='list:$singular'"; ?>>
723
- <?php $this->display_rows_or_placeholder(); ?>
724
- </tbody>
725
- </table>
726
- <?php
727
- $this->display_tablenav( 'bottom' );
728
- }
729
-
730
- /**
731
- * Get a list of CSS classes for the <table> tag
732
- *
733
- * @since 3.1.0
734
- * @access protected
735
- *
736
- * @return array
737
- */
738
- function get_table_classes() {
739
- return array( 'widefat', 'fixed', $this->_args['plural'] );
740
- }
741
-
742
- /**
743
- * Generate the table navigation above or below the table
744
- *
745
- * @since 3.1.0
746
- * @access protected
747
- */
748
- function display_tablenav( $which ) {
749
- if ( 'top' == $which )
750
- wp_nonce_field( 'bulk-' . $this->_args['plural'] );
751
- ?>
752
- <div class="tablenav <?php echo esc_attr( $which ); ?>">
753
-
754
- <div class="alignleft actions">
755
- <?php $this->bulk_actions(); ?>
756
- </div>
757
- <?php
758
- $this->extra_tablenav( $which );
759
- $this->pagination( $which );
760
- ?>
761
-
762
- <br class="clear" />
763
- </div>
764
- <?php
765
- }
766
-
767
- /**
768
- * Extra controls to be displayed between bulk actions and pagination
769
- *
770
- * @since 3.1.0
771
- * @access protected
772
- */
773
- function extra_tablenav( $which ) {}
774
-
775
- /**
776
- * Generate the <tbody> part of the table
777
- *
778
- * @since 3.1.0
779
- * @access protected
780
- */
781
- function display_rows_or_placeholder() {
782
- if ( $this->has_items() ) {
783
- $this->display_rows();
784
- } else {
785
- list( $columns, $hidden ) = $this->get_column_info();
786
- echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this->get_column_count() . '">';
787
- $this->no_items();
788
- echo '</td></tr>';
789
- }
790
- }
791
-
792
- /**
793
- * Generate the table rows
794
- *
795
- * @since 3.1.0
796
- * @access protected
797
- */
798
- function display_rows() {
799
- foreach ( $this->items as $item )
800
- $this->single_row( $item );
801
- }
802
-
803
- /**
804
- * Generates content for a single row of the table
805
- *
806
- * @since 3.1.0
807
- * @access protected
808
- *
809
- * @param object $item The current item
810
- */
811
- function single_row( $item ) {
812
- static $row_class = '';
813
- $row_class = ( $row_class == '' ? ' class="alternate"' : '' );
814
-
815
- echo '<tr' . $row_class . '>';
816
- echo $this->single_row_columns( $item );
817
- echo '</tr>';
818
- }
819
-
820
- /**
821
- * Generates the columns for a single row of the table
822
- *
823
- * @since 3.1.0
824
- * @access protected
825
- *
826
- * @param object $item The current item
827
- */
828
- function single_row_columns( $item ) {
829
- list( $columns, $hidden ) = $this->get_column_info();
830
-
831
- foreach ( $columns as $column_name => $column_display_name ) {
832
- $class = "class='$column_name column-$column_name'";
833
-
834
- $style = '';
835
- if ( in_array( $column_name, $hidden ) )
836
- $style = ' style="display:none;"';
837
-
838
- $attributes = "$class$style";
839
-
840
- if ( 'cb' == $column_name ) {
841
- echo '<th scope="row" class="check-column">';
842
- echo $this->column_cb( $item );
843
- echo '</th>';
844
- }
845
- elseif ( method_exists( $this, 'column_' . $column_name ) ) {
846
- echo "<td $attributes>";
847
- echo call_user_func( array( &$this, 'column_' . $column_name ), $item );
848
- echo "</td>";
849
- }
850
- else {
851
- echo "<td $attributes>";
852
- echo $this->column_default( $item, $column_name );
853
- echo "</td>";
854
- }
855
- }
856
- }
857
-
858
- /**
859
- * Handle an incoming ajax request (called from admin-ajax.php)
860
- *
861
- * @since 3.1.0
862
- * @access public
863
- */
864
- function ajax_response() {
865
- $this->prepare_items();
866
-
867
- extract( $this->_args );
868
- extract( $this->_pagination_args, EXTR_SKIP );
869
-
870
- ob_start();
871
- if ( ! empty( $_REQUEST['no_placeholder'] ) )
872
- $this->display_rows();
873
- else
874
- $this->display_rows_or_placeholder();
875
-
876
- $rows = ob_get_clean();
877
-
878
- $response = array( 'rows' => $rows );
879
-
880
- if ( isset( $total_items ) )
881
- $response['total_items_i18n'] = sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) );
882
-
883
- if ( isset( $total_pages ) ) {
884
- $response['total_pages'] = $total_pages;
885
- $response['total_pages_i18n'] = number_format_i18n( $total_pages );
886
- }
887
-
888
- die( json_encode( $response ) );
889
- }
890
-
891
- /**
892
- * Send required variables to JavaScript land
893
- *
894
- * @access private
895
- */
896
- function _js_vars() {
897
- $args = array(
898
- 'class' => get_class( $this ),
899
- 'screen' => array(
900
- 'id' => $this->screen->id,
901
- 'base' => $this->screen->base,
902
- )
903
- );
904
-
905
- printf( "<script type='text/javascript'>list_args = %s;</script>\n", json_encode( $args ) );
906
- }
907
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.1/admin/index.php DELETED
@@ -1,5 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Do not modify the files in this folder.
5
- */
 
 
 
 
 
tags/1.1/admin/wp-security-admin-init.php DELETED
@@ -1,167 +0,0 @@
1
- <?php
2
- /*
3
- * Inits the admin dashboard side of things.
4
- * Main admin file which loads all settings panels and sets up admin menus.
5
- */
6
- class AIOWPSecurity_Admin_Init
7
- {
8
- var $main_menu_page;
9
- var $dashboard_menu;
10
- var $settings_menu;
11
- var $user_accounts_menu;
12
- var $user_login_menu;
13
- var $db_security_menu;
14
- var $filesystem_menu;
15
- var $whois_menu;
16
- var $blacklist_menu;
17
- var $firewall_menu;
18
-
19
- function __construct()
20
- {
21
- $this->admin_includes();
22
- add_action('admin_menu', array(&$this, 'create_admin_menus'));
23
-
24
- //make sure we are on our plugin's menu pages
25
- if (isset($_GET['page']) && strpos($_GET['page'], AIOWPSEC_MENU_SLUG_PREFIX ) !== false ) {
26
- add_action('admin_print_scripts', array(&$this, 'admin_menu_page_scripts'));
27
- add_action('admin_print_styles', array(&$this, 'admin_menu_page_styles'));
28
- add_action('admin_init', array( &$this, 'admin_init_hook_handler')); //For changing button text inside media uploader (thickbox)
29
- }
30
- }
31
-
32
- function admin_includes()
33
- {
34
- include_once('wp-security-admin-menu.php');
35
- }
36
-
37
- function admin_menu_page_scripts()
38
- {
39
- wp_enqueue_script('jquery');
40
- wp_enqueue_script('postbox');
41
- wp_enqueue_script('dashboard');
42
- wp_enqueue_script('thickbox');
43
- wp_enqueue_script('media-upload');
44
- wp_register_script('aiowpsec-admin-js', AIO_WP_SECURITY_URL. '/js/wp-security-admin-script.js', array('jquery'));
45
- wp_enqueue_script('aiowpsec-admin-js');
46
- }
47
-
48
- function admin_menu_page_styles()
49
- {
50
- wp_enqueue_style('dashboard');
51
- wp_enqueue_style('thickbox');
52
- wp_enqueue_style('global');
53
- wp_enqueue_style('wp-admin');
54
- wp_enqueue_style('aiowpsec-admin-css', AIO_WP_SECURITY_URL. '/css/wp-security-admin-styles.css');
55
- }
56
-
57
- function admin_init_hook_handler()
58
- {
59
- $this->aiowps_media_uploader_modification();
60
- $this->initialize_feature_manager();
61
- }
62
-
63
- //For media uploader thickbox - change button text
64
- function aiowps_media_uploader_modification()
65
- {
66
- global $pagenow;
67
- if ('media-upload.php' == $pagenow || 'async-upload.php' == $pagenow)
68
- {
69
- // Here we will customize the 'Insert into Post' Button text inside Thickbox
70
- add_filter( 'gettext', array($this, 'aiowps_media_uploader_replace_thickbox_text'), 1, 2);
71
- }
72
- }
73
-
74
- function aiowps_media_uploader_replace_thickbox_text($translated_text, $text)
75
- {
76
- if ('Insert into Post' == $text)
77
- {
78
- $referer = strpos(wp_get_referer(), 'aiowpsec');
79
- if ($referer != '')
80
- {
81
- return ('Select File');
82
- }
83
- }
84
- return $translated_text;
85
- }
86
-
87
- function initialize_feature_manager()
88
- {
89
- $aiowps_feature_mgr = new AIOWPSecurity_Feature_Item_Manager();
90
- $aiowps_feature_mgr->initialize_features();
91
- $aiowps_feature_mgr->check_and_set_feature_status();
92
- $aiowps_feature_mgr->calculate_total_points();
93
- $GLOBALS['aiowps_feature_mgr'] = $aiowps_feature_mgr;
94
- }
95
-
96
- function create_admin_menus()
97
- {
98
- $menu_icon_url = AIO_WP_SECURITY_URL.'/images/plugin-icon.png';
99
- $this->main_menu_page = add_menu_page(__('WP Security', 'aiowpsecurity'), __('WP Security', 'aiowpsecurity'), AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_MAIN_MENU_SLUG , array(&$this, 'handle_dashboard_menu_rendering'), $menu_icon_url);
100
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Dashboard', 'aiowpsecurity'), __('Dashboard', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_MAIN_MENU_SLUG, array(&$this, 'handle_dashboard_menu_rendering'));
101
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Settings', 'aiowpsecurity'), __('Settings', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_SETTINGS_MENU_SLUG, array(&$this, 'handle_settings_menu_rendering'));
102
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('User Accounts', 'aiowpsecurity'), __('User Accounts', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_USER_ACCOUNTS_MENU_SLUG, array(&$this, 'handle_user_accounts_menu_rendering'));
103
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('User Login', 'aiowpsecurity'), __('User Login', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_USER_LOGIN_MENU_SLUG, array(&$this, 'handle_user_login_menu_rendering'));
104
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Database Security', 'aiowpsecurity'), __('Database Security', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_DB_SEC_MENU_SLUG, array(&$this, 'handle_database_menu_rendering'));
105
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Filesystem Security', 'aiowpsecurity'), __('Filesystem Security', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_FILESYSTEM_MENU_SLUG, array(&$this, 'handle_filesystem_menu_rendering'));
106
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('WHOIS Lookup', 'aiowpsecurity'), __('WHOIS Lookup', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_WHOIS_MENU_SLUG, array(&$this, 'handle_whois_menu_rendering'));
107
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Blacklist Manager', 'aiowpsecurity'), __('Blacklist Manager', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_BLACKLIST_MENU_SLUG, array(&$this, 'handle_blacklist_menu_rendering'));
108
- add_submenu_page(AIOWPSEC_MAIN_MENU_SLUG, __('Firewall', 'aiowpsecurity'), __('Firewall', 'aiowpsecurity') , AIOWPSEC_MANAGEMENT_PERMISSION, AIOWPSEC_FIREWALL_MENU_SLUG, array(&$this, 'handle_firewall_menu_rendering'));
109
- do_action('aiowpsecurity_admin_menu_created');
110
- }
111
-
112
- function handle_dashboard_menu_rendering()
113
- {
114
- include_once('wp-security-dashboard-menu.php');
115
- $this->dashboard_menu = new AIOWPSecurity_Dashboard_Menu();
116
- }
117
-
118
- function handle_settings_menu_rendering()
119
- {
120
- include_once('wp-security-settings-menu.php');
121
- $this->settings_menu = new AIOWPSecurity_Settings_Menu();
122
-
123
- }
124
-
125
- function handle_user_accounts_menu_rendering()
126
- {
127
- include_once('wp-security-user-accounts-menu.php');
128
- $this->user_accounts_menu = new AIOWPSecurity_User_Accounts_Menu();
129
- }
130
-
131
- function handle_user_login_menu_rendering()
132
- {
133
- include_once('wp-security-user-login-menu.php');
134
- $this->user_login_menu = new AIOWPSecurity_User_Login_Menu();
135
- }
136
-
137
- function handle_database_menu_rendering()
138
- {
139
- include_once('wp-security-database-menu.php');
140
- $this->db_security_menu = new AIOWPSecurity_Database_Menu();
141
- }
142
-
143
- function handle_filesystem_menu_rendering()
144
- {
145
- include_once('wp-security-filesystem-menu.php');
146
- $this->filesystem_menu = new AIOWPSecurity_Filescan_Menu();
147
- }
148
-
149
- function handle_whois_menu_rendering()
150
- {
151
- include_once('wp-security-whois-menu.php');
152
- $this->whois_menu = new AIOWPSecurity_WhoIs_Menu();
153
- }
154
-
155
- function handle_blacklist_menu_rendering()
156
- {
157
- include_once('wp-security-blacklist-menu.php');
158
- $this->blacklist_menu = new AIOWPSecurity_Blacklist_Menu();
159
- }
160
-
161
- function handle_firewall_menu_rendering()
162
- {
163
- include_once('wp-security-firewall-menu.php');
164
- $this->firewall_menu = new AIOWPSecurity_Firewall_Menu();
165
- }
166
- }//End of class
167
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.1/admin/wp-security-admin-menu.php DELETED
@@ -1,93 +0,0 @@
1
- <?php
2
-
3
- /* Parent class for all admin menu classes */
4
- abstract class AIOWPSecurity_Admin_Menu
5
- {
6
- /**
7
- * Shows postbox for settings menu
8
- *
9
- * @param string $id css ID for postbox
10
- * @param string $title title of the postbox section
11
- * @param string $content the content of the postbox
12
- **/
13
- function postbox_toggle($id, $title, $content)
14
- {
15
- //Always send string with translation markers in it
16
- ?>
17
- <div id="<?php echo $id; ?>" class="postbox">
18
- <div class="handlediv" title="Click to toggle"><br /></div>
19
- <h3 class="hndle"><span><?php echo $title; ?></span></h3>
20
- <div class="inside">
21
- <?php echo $content; ?>
22
- </div>
23
- </div>
24
- <?php
25
- }
26
-
27
- function postbox($title, $content)
28
- {
29
- //Always send string with translation markers in it
30
- ?>
31
- <div class="postbox">
32
- <h3><label for="title"><?php echo $title; ?></label></h3>
33
- <div class="inside">
34
- <?php echo $content; ?>
35
- </div>
36
- </div>
37
- <?php
38
- }
39
-
40
- function show_msg_settings_updated()
41
- {
42
- echo '<div id="message" class="updated fade"><p><strong>';
43
- _e('Settings successfully updated.','aiowpsecurity');
44
- echo '</strong></p></div>';
45
- }
46
-
47
- static function show_msg_record_deleted_st()
48
- {
49
- echo '<div id="message" class="updated fade"><p><strong>';
50
- _e('The selected record(s) deleted successfully!','aiowpsecurity');
51
- echo '</strong></p></div>';
52
- }
53
-
54
- function show_msg_updated($msg)
55
- {
56
- echo '<div id="message" class="updated fade"><p><strong>';
57
- echo $msg;
58
- echo '</strong></p></div>';
59
- }
60
-
61
- static function show_msg_updated_st($msg)
62
- {
63
- echo '<div id="message" class="updated fade"><p><strong>';
64
- echo $msg;
65
- echo '</strong></p></div>';
66
- }
67
-
68
- function show_msg_error($error_msg)
69
- {
70
- echo '<div id="message" class="error"><p><strong>';
71
- echo $error_msg;
72
- echo '</strong></p></div>';
73
- }
74
-
75
- static function show_msg_error_st($error_msg)
76
- {
77
- echo '<div id="message" class="error"><p><strong>';
78
- echo $error_msg;
79
- echo '</strong></p></div>';
80
- }
81
-
82
- function start_buffer()
83
- {
84
- ob_start();
85
- }
86
-
87
- function end_buffer_and_collect()
88
- {
89
- $output = ob_get_contents();
90
- ob_end_clean();
91
- return $output;
92
- }
93
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tags/1.1/admin/wp-security-blacklist-menu.php DELETED
@@ -1,332 +0,0 @@
1
- <?php
2
-
3
- class AIOWPSecurity_Blacklist_Menu extends AIOWPSecurity_Admin_Menu
4
- {
5
- var $menu_page_slug = AIOWPSEC_BLACKLIST_MENU_SLUG;
6
-
7
- /* Specify all the tabs of this menu in the following array */
8
- var $menu_tabs = array(
9
- 'tab1' => 'Ban Users',
10
- 'tab2' => 'SPAM Comments IP Monitoring',
11
- );
12
-
13
- var $menu_tabs_handler = array(
14
- 'tab1' => 'render_tab1',
15
- 'tab2' => 'render_tab2',
16
- );
17
-
18
- function __construct()
19
- {
20
- $this->render_menu_page();
21
- }
22
-
23
- function get_current_tab()
24
- {
25
- $tab_keys = array_keys($this->menu_tabs);
26
- $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $tab_keys[0];
27
- return $tab;
28
- }
29
-
30
- /*
31
- * Renders our tabs of this menu as nav items
32
- */
33
- function render_menu_tabs()
34
- {
35
- $current_tab = $this->get_current_tab();
36
-
37
- echo '<h2 class="nav-tab-wrapper">';
38
- foreach ( $this->menu_tabs as $tab_key => $tab_caption )
39
- {
40
- $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
41
- echo '<a class="nav-tab ' . $active . '" href="?page=' . $this->menu_page_slug . '&tab=' . $tab_key . '">' . $tab_caption . '</a>';
42
- }
43
- echo '</h2>';
44
- }
45
-
46
- /*
47
- * The menu rendering goes here
48
- */
49
- function render_menu_page()
50
- {
51
- $tab = $this->get_current_tab();
52
- ?>
53
- <div class="wrap">
54
- <div id="poststuff"><div id="post-body">
55
- <?php
56
- $this->render_menu_tabs();
57
- //$tab_keys = array_keys($this->menu_tabs);
58
- call_user_func(array(&$this, $this->menu_tabs_handler[$tab]));
59
- ?>
60
- </div></div>
61
- </div><!-- end of wrap -->
62
- <?php
63
- }
64
-