maxminddb 3.1.0__tar.gz → 3.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. {maxminddb-3.1.0 → maxminddb-3.2.0}/HISTORY.rst +27 -0
  2. {maxminddb-3.1.0/maxminddb.egg-info → maxminddb-3.2.0}/PKG-INFO +13 -7
  3. {maxminddb-3.1.0 → maxminddb-3.2.0}/README.rst +10 -4
  4. maxminddb-3.2.0/extension/libmaxminddb/.clang-format +6 -0
  5. maxminddb-3.2.0/extension/libmaxminddb/.github/dependabot.yml +22 -0
  6. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/clang-addresssanitizer.yml +28 -0
  7. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/clang-analyzer.yml +22 -0
  8. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/codeql-analysis.yml +46 -0
  9. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/dependabot-failure-watcher.yml +123 -0
  10. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/links.yml +32 -0
  11. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/pages.yml +54 -0
  12. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/precious.yml +24 -0
  13. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/test.yml +49 -0
  14. maxminddb-3.2.0/extension/libmaxminddb/.github/workflows/zizmor.yml +23 -0
  15. maxminddb-3.2.0/extension/libmaxminddb/.gitignore +49 -0
  16. maxminddb-3.2.0/extension/libmaxminddb/.gitmodules +6 -0
  17. maxminddb-3.2.0/extension/libmaxminddb/.perltidyrc +11 -0
  18. maxminddb-3.2.0/extension/libmaxminddb/.precious.toml +24 -0
  19. maxminddb-3.2.0/extension/libmaxminddb/CMakeLists.txt +168 -0
  20. maxminddb-3.2.0/extension/libmaxminddb/Changes.md +538 -0
  21. maxminddb-3.2.0/extension/libmaxminddb/LICENSE +202 -0
  22. maxminddb-3.2.0/extension/libmaxminddb/Makefile.am +48 -0
  23. maxminddb-3.2.0/extension/libmaxminddb/NOTICE +13 -0
  24. maxminddb-3.2.0/extension/libmaxminddb/README.dev.md +74 -0
  25. maxminddb-3.2.0/extension/libmaxminddb/README.fuzzing.md +42 -0
  26. maxminddb-3.2.0/extension/libmaxminddb/README.md +164 -0
  27. maxminddb-3.2.0/extension/libmaxminddb/bin/CMakeLists.txt +24 -0
  28. maxminddb-3.2.0/extension/libmaxminddb/bin/Makefile.am +14 -0
  29. maxminddb-3.2.0/extension/libmaxminddb/bin/mmdblookup.c +790 -0
  30. maxminddb-3.2.0/extension/libmaxminddb/bootstrap +21 -0
  31. maxminddb-3.2.0/extension/libmaxminddb/c_flag_overrides.cmake +7 -0
  32. maxminddb-3.2.0/extension/libmaxminddb/cmake_uninstall.cmake.in +21 -0
  33. maxminddb-3.2.0/extension/libmaxminddb/common.mk +7 -0
  34. maxminddb-3.2.0/extension/libmaxminddb/configure.ac +138 -0
  35. maxminddb-3.2.0/extension/libmaxminddb/cxx_flag_overrides.cmake +6 -0
  36. maxminddb-3.2.0/extension/libmaxminddb/dev-bin/make-man-pages.pl +120 -0
  37. maxminddb-3.2.0/extension/libmaxminddb/dev-bin/ppa-release.sh +63 -0
  38. maxminddb-3.2.0/extension/libmaxminddb/dev-bin/release.sh +123 -0
  39. maxminddb-3.2.0/extension/libmaxminddb/dev-bin/valgrind-all.pl +53 -0
  40. maxminddb-3.2.0/extension/libmaxminddb/doc/libmaxminddb.md +955 -0
  41. maxminddb-3.2.0/extension/libmaxminddb/doc/mmdblookup.md +104 -0
  42. maxminddb-3.2.0/extension/libmaxminddb/docs/assets/css/main.css +189 -0
  43. maxminddb-3.2.0/extension/libmaxminddb/docs/hugo.toml +18 -0
  44. maxminddb-3.2.0/extension/libmaxminddb/docs/layouts/404.html +24 -0
  45. maxminddb-3.2.0/extension/libmaxminddb/docs/layouts/_default/_markup/render-heading.html +4 -0
  46. maxminddb-3.2.0/extension/libmaxminddb/docs/layouts/_default/default.html +27 -0
  47. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/libmaxminddb/include/maxminddb.h +2 -0
  48. maxminddb-3.2.0/extension/libmaxminddb/include/maxminddb_config.h.cmake.in +14 -0
  49. maxminddb-3.2.0/extension/libmaxminddb/include/maxminddb_config.h.in +14 -0
  50. maxminddb-3.2.0/extension/libmaxminddb/lychee.toml +60 -0
  51. maxminddb-3.2.0/extension/libmaxminddb/mise.lock +399 -0
  52. maxminddb-3.2.0/extension/libmaxminddb/mise.toml +28 -0
  53. maxminddb-3.2.0/extension/libmaxminddb/src/Makefile.am +29 -0
  54. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/libmaxminddb/src/data-pool.c +28 -12
  55. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/libmaxminddb/src/data-pool.h +11 -7
  56. maxminddb-3.2.0/extension/libmaxminddb/src/libmaxminddb.pc.in +11 -0
  57. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/libmaxminddb/src/maxminddb.c +185 -39
  58. maxminddb-3.2.0/extension/libmaxminddb/t/CMakeLists.txt +72 -0
  59. maxminddb-3.2.0/extension/libmaxminddb/t/Makefile.am +39 -0
  60. maxminddb-3.2.0/extension/libmaxminddb/t/bad_data_size_t.c +78 -0
  61. maxminddb-3.2.0/extension/libmaxminddb/t/bad_databases_t.c +92 -0
  62. maxminddb-3.2.0/extension/libmaxminddb/t/bad_epoch_t.c +53 -0
  63. maxminddb-3.2.0/extension/libmaxminddb/t/bad_indent_t.c +64 -0
  64. maxminddb-3.2.0/extension/libmaxminddb/t/bad_pointers_t.c +60 -0
  65. maxminddb-3.2.0/extension/libmaxminddb/t/bad_search_tree_t.c +103 -0
  66. maxminddb-3.2.0/extension/libmaxminddb/t/basic_lookup_t.c +215 -0
  67. maxminddb-3.2.0/extension/libmaxminddb/t/compile_c++_t.pl +120 -0
  68. maxminddb-3.2.0/extension/libmaxminddb/t/data-pool-t.c +392 -0
  69. maxminddb-3.2.0/extension/libmaxminddb/t/data_entry_list_t.c +429 -0
  70. maxminddb-3.2.0/extension/libmaxminddb/t/data_types_t.c +533 -0
  71. maxminddb-3.2.0/extension/libmaxminddb/t/decoder_limits_t.pl +266 -0
  72. maxminddb-3.2.0/extension/libmaxminddb/t/double_close_t.c +47 -0
  73. maxminddb-3.2.0/extension/libmaxminddb/t/dump_t.c +99 -0
  74. maxminddb-3.2.0/extension/libmaxminddb/t/empty_container_metadata_t.c +43 -0
  75. maxminddb-3.2.0/extension/libmaxminddb/t/external_symbols_t.pl +114 -0
  76. maxminddb-3.2.0/extension/libmaxminddb/t/fuzz_mmdb.c +60 -0
  77. maxminddb-3.2.0/extension/libmaxminddb/t/gai_error_t.c +33 -0
  78. maxminddb-3.2.0/extension/libmaxminddb/t/get_value_pointer_bug_t.c +71 -0
  79. maxminddb-3.2.0/extension/libmaxminddb/t/get_value_t.c +404 -0
  80. maxminddb-3.2.0/extension/libmaxminddb/t/invalid_sockaddr_t.c +51 -0
  81. maxminddb-3.2.0/extension/libmaxminddb/t/ipv4_start_cache_t.c +36 -0
  82. maxminddb-3.2.0/extension/libmaxminddb/t/ipv6_lookup_in_ipv4_t.c +48 -0
  83. maxminddb-3.2.0/extension/libmaxminddb/t/max_depth_t.c +117 -0
  84. maxminddb-3.2.0/extension/libmaxminddb/t/maxminddb_test_helper.c +282 -0
  85. maxminddb-3.2.0/extension/libmaxminddb/t/maxminddb_test_helper.h +75 -0
  86. maxminddb-3.2.0/extension/libmaxminddb/t/metadata_marker_t.c +23 -0
  87. maxminddb-3.2.0/extension/libmaxminddb/t/metadata_pointers_t.c +31 -0
  88. maxminddb-3.2.0/extension/libmaxminddb/t/metadata_t.c +271 -0
  89. maxminddb-3.2.0/extension/libmaxminddb/t/mmdblookup_t.pl +158 -0
  90. maxminddb-3.2.0/extension/libmaxminddb/t/no_map_get_value_t.c +34 -0
  91. maxminddb-3.2.0/extension/libmaxminddb/t/overflow_bounds_t.c +67 -0
  92. maxminddb-3.2.0/extension/libmaxminddb/t/pointer_dos_t.c +238 -0
  93. maxminddb-3.2.0/extension/libmaxminddb/t/read_node_t.c +298 -0
  94. maxminddb-3.2.0/extension/libmaxminddb/t/threads_t.c +207 -0
  95. maxminddb-3.2.0/extension/libmaxminddb/t/version_t.c +9 -0
  96. maxminddb-3.2.0/lychee.toml +67 -0
  97. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/__init__.py +1 -1
  98. maxminddb-3.2.0/maxminddb/decoder.py +356 -0
  99. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/extension.pyi +1 -1
  100. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/reader.py +87 -64
  101. {maxminddb-3.1.0 → maxminddb-3.2.0/maxminddb.egg-info}/PKG-INFO +13 -7
  102. maxminddb-3.2.0/maxminddb.egg-info/SOURCES.txt +261 -0
  103. maxminddb-3.2.0/mise.lock +29 -0
  104. maxminddb-3.2.0/mise.toml +9 -0
  105. {maxminddb-3.1.0 → maxminddb-3.2.0}/pyproject.toml +8 -3
  106. maxminddb-3.2.0/tests/__init__.py +0 -0
  107. maxminddb-3.2.0/tests/data/.gitattributes +1 -0
  108. maxminddb-3.2.0/tests/data/.gitconfig +2 -0
  109. maxminddb-3.2.0/tests/data/.github/dependabot.yml +23 -0
  110. maxminddb-3.2.0/tests/data/.github/workflows/check-untagged-deps.yml +20 -0
  111. maxminddb-3.2.0/tests/data/.github/workflows/codeql-analysis.yml +53 -0
  112. maxminddb-3.2.0/tests/data/.github/workflows/dependabot-failure-watcher.yml +123 -0
  113. maxminddb-3.2.0/tests/data/.github/workflows/go.yml +42 -0
  114. maxminddb-3.2.0/tests/data/.github/workflows/links.yml +32 -0
  115. maxminddb-3.2.0/tests/data/.github/workflows/pages.yml +54 -0
  116. maxminddb-3.2.0/tests/data/.github/workflows/precious.yml +24 -0
  117. maxminddb-3.2.0/tests/data/.github/workflows/zizmor.yml +23 -0
  118. maxminddb-3.2.0/tests/data/.gitignore +6 -0
  119. maxminddb-3.2.0/tests/data/.golangci.yml +750 -0
  120. maxminddb-3.2.0/tests/data/.precious.toml +39 -0
  121. maxminddb-3.2.0/tests/data/LICENSE-APACHE +202 -0
  122. maxminddb-3.2.0/tests/data/LICENSE-MIT +17 -0
  123. maxminddb-3.2.0/tests/data/MaxMind-DB-spec.md +704 -0
  124. maxminddb-3.2.0/tests/data/README.md +39 -0
  125. maxminddb-3.2.0/tests/data/bad-data/README.md +14 -0
  126. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-corrupt-search-tree.mmdb +0 -0
  127. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-deep-array-nesting.mmdb +0 -0
  128. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-deep-nesting.mmdb +0 -0
  129. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-empty-array-last-in-metadata.mmdb +0 -0
  130. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-empty-map-last-in-metadata.mmdb +0 -0
  131. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-metadata-marker-only.mmdb +1 -0
  132. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-oversized-array.mmdb +0 -0
  133. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-oversized-map.mmdb +0 -0
  134. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-separator-record-max-left.mmdb +0 -0
  135. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-separator-record-min-left.mmdb +0 -0
  136. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-separator-record-min-right.mmdb +0 -0
  137. maxminddb-3.2.0/tests/data/bad-data/libmaxminddb/libmaxminddb-uint64-max-epoch.mmdb +0 -0
  138. maxminddb-3.2.0/tests/data/cmd/write-test-data/main.go +144 -0
  139. maxminddb-3.2.0/tests/data/docs/assets/css/main.css +189 -0
  140. maxminddb-3.2.0/tests/data/docs/hugo.toml +10 -0
  141. maxminddb-3.2.0/tests/data/docs/layouts/404.html +24 -0
  142. maxminddb-3.2.0/tests/data/docs/layouts/_default/_markup/render-heading.html +4 -0
  143. maxminddb-3.2.0/tests/data/docs/layouts/_default/default.html +20 -0
  144. maxminddb-3.2.0/tests/data/go.mod +11 -0
  145. maxminddb-3.2.0/tests/data/go.sum +16 -0
  146. maxminddb-3.2.0/tests/data/lychee.toml +54 -0
  147. maxminddb-3.2.0/tests/data/mise.lock +214 -0
  148. maxminddb-3.2.0/tests/data/mise.toml +34 -0
  149. maxminddb-3.2.0/tests/data/pkg/writer/baddata.go +165 -0
  150. maxminddb-3.2.0/tests/data/pkg/writer/decoder.go +178 -0
  151. maxminddb-3.2.0/tests/data/pkg/writer/geoip2.go +196 -0
  152. maxminddb-3.2.0/tests/data/pkg/writer/ip.go +39 -0
  153. maxminddb-3.2.0/tests/data/pkg/writer/maxmind.go +246 -0
  154. maxminddb-3.2.0/tests/data/pkg/writer/nestedstructures.go +73 -0
  155. maxminddb-3.2.0/tests/data/pkg/writer/pointerdos.go +502 -0
  156. maxminddb-3.2.0/tests/data/pkg/writer/pointerdos_test.go +598 -0
  157. maxminddb-3.2.0/tests/data/pkg/writer/rawmmdb.go +455 -0
  158. maxminddb-3.2.0/tests/data/pkg/writer/rawmmdb_test.go +190 -0
  159. maxminddb-3.2.0/tests/data/pkg/writer/writer.go +61 -0
  160. maxminddb-3.2.0/tests/data/source-data/GeoIP-Anonymous-Plus-Test.json +205 -0
  161. maxminddb-3.2.0/tests/data/source-data/GeoIP-Residential-Proxy-Test.json +204 -0
  162. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Anonymous-IP-Test.json +79 -0
  163. maxminddb-3.2.0/tests/data/source-data/GeoIP2-City-Test.json +13483 -0
  164. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Connection-Type-Test.json +127 -0
  165. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Country-Test.json +15978 -0
  166. maxminddb-3.2.0/tests/data/source-data/GeoIP2-DensityIncome-Test.json +14 -0
  167. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Domain-Test.json +457 -0
  168. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Enterprise-Test.json +1884 -0
  169. maxminddb-3.2.0/tests/data/source-data/GeoIP2-IP-Risk-Test.json +111 -0
  170. maxminddb-3.2.0/tests/data/source-data/GeoIP2-ISP-Test.json +12605 -0
  171. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Precision-Enterprise-Sandbox-Test.json +296 -0
  172. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Precision-Enterprise-Test.json +3727 -0
  173. maxminddb-3.2.0/tests/data/source-data/GeoIP2-Static-IP-Score-Test.json +2147 -0
  174. maxminddb-3.2.0/tests/data/source-data/GeoIP2-User-Count-Test.json +2855 -0
  175. maxminddb-3.2.0/tests/data/source-data/GeoLite2-ASN-Test.json +4120 -0
  176. maxminddb-3.2.0/tests/data/source-data/GeoLite2-City-Test.json +12969 -0
  177. maxminddb-3.2.0/tests/data/source-data/GeoLite2-Country-Test.json +11369 -0
  178. maxminddb-3.2.0/tests/data/test-data/GeoIP-Anonymous-Plus-Test.mmdb +0 -0
  179. maxminddb-3.2.0/tests/data/test-data/GeoIP-Residential-Proxy-Test.mmdb +0 -0
  180. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  181. maxminddb-3.2.0/tests/data/test-data/GeoIP2-City-Shield-Test.mmdb +0 -0
  182. maxminddb-3.2.0/tests/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  183. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  184. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Country-Shield-Test.mmdb +0 -0
  185. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  186. maxminddb-3.2.0/tests/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  187. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  188. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Enterprise-Shield-Test.mmdb +0 -0
  189. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  190. maxminddb-3.2.0/tests/data/test-data/GeoIP2-IP-Risk-Test.mmdb +0 -0
  191. maxminddb-3.2.0/tests/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  192. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Precision-Enterprise-Shield-Test.mmdb +0 -0
  193. maxminddb-3.2.0/tests/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  194. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
  195. maxminddb-3.2.0/tests/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  196. maxminddb-3.2.0/tests/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  197. maxminddb-3.2.0/tests/data/test-data/GeoLite2-City-Test.mmdb +0 -0
  198. maxminddb-3.2.0/tests/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
  199. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  200. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  201. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-decode-path-shared-budget.mmdb +0 -0
  202. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-decoder-payload-limit-over.mmdb +0 -0
  203. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-decoder-payload-limit.mmdb +0 -0
  204. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-decoder-value-limit-over.mmdb +0 -0
  205. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-decoder-value-limit-pointer-heavy.mmdb +0 -0
  206. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-decoder-value-limit.mmdb +0 -0
  207. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  208. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  209. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  210. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  211. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  212. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  213. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  214. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-metadata-payload-limit.mmdb +0 -0
  215. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  216. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  217. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  218. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  219. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  220. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-payload-amplification-dos-string.mmdb +0 -0
  221. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-payload-amplification-dos-worst-case.mmdb +0 -0
  222. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-payload-amplification-dos.mmdb +0 -0
  223. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-pointer-decoder-dos-ipv6.mmdb +0 -0
  224. maxminddb-3.2.0/tests/data/test-data/MaxMind-DB-test-pointer-decoder-dos.mmdb +0 -0
  225. maxminddb-3.2.0/tests/data/test-data/README.md +122 -0
  226. maxminddb-3.2.0/tests/decoder_test.py +528 -0
  227. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/reader_test.py +348 -5
  228. maxminddb-3.2.0/uv.lock +572 -0
  229. maxminddb-3.1.0/maxminddb/decoder.py +0 -214
  230. maxminddb-3.1.0/maxminddb.egg-info/SOURCES.txt +0 -78
  231. maxminddb-3.1.0/tests/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  232. maxminddb-3.1.0/tests/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  233. maxminddb-3.1.0/tests/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  234. maxminddb-3.1.0/tests/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  235. maxminddb-3.1.0/tests/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  236. maxminddb-3.1.0/tests/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  237. maxminddb-3.1.0/tests/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  238. maxminddb-3.1.0/tests/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  239. maxminddb-3.1.0/tests/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  240. maxminddb-3.1.0/tests/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  241. maxminddb-3.1.0/tests/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  242. maxminddb-3.1.0/tests/data/test-data/GeoLite2-City-Test.mmdb +0 -0
  243. maxminddb-3.1.0/tests/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
  244. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  245. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  246. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  247. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  248. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  249. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  250. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  251. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  252. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  253. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  254. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  255. maxminddb-3.1.0/tests/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  256. maxminddb-3.1.0/tests/decoder_test.py +0 -234
  257. maxminddb-3.1.0/uv.lock +0 -466
  258. {maxminddb-3.1.0 → maxminddb-3.2.0}/LICENSE +0 -0
  259. {maxminddb-3.1.0 → maxminddb-3.2.0}/MANIFEST.in +0 -0
  260. {maxminddb-3.1.0 → maxminddb-3.2.0}/docs/Makefile +0 -0
  261. {maxminddb-3.1.0 → maxminddb-3.2.0}/docs/conf.py +0 -0
  262. {maxminddb-3.1.0 → maxminddb-3.2.0}/docs/index.rst +0 -0
  263. {maxminddb-3.1.0 → maxminddb-3.2.0}/examples/benchmark.py +0 -0
  264. /maxminddb-3.1.0/maxminddb/py.typed → /maxminddb-3.2.0/extension/libmaxminddb/AUTHORS +0 -0
  265. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/libmaxminddb/src/maxminddb-compat-util.h +0 -0
  266. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/maxminddb.c +0 -0
  267. {maxminddb-3.1.0 → maxminddb-3.2.0}/extension/maxminddb_config.h +0 -0
  268. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/const.py +0 -0
  269. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/errors.py +0 -0
  270. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/file.py +0 -0
  271. /maxminddb-3.1.0/tests/__init__.py → /maxminddb-3.2.0/maxminddb/py.typed +0 -0
  272. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb/types.py +0 -0
  273. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb.egg-info/dependency_links.txt +0 -0
  274. {maxminddb-3.1.0 → maxminddb-3.2.0}/maxminddb.egg-info/top_level.txt +0 -0
  275. {maxminddb-3.1.0 → maxminddb-3.2.0}/setup.cfg +0 -0
  276. {maxminddb-3.1.0 → maxminddb-3.2.0}/setup.py +0 -0
  277. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/libmaxminddb/libmaxminddb-offset-integer-overflow.mmdb +0 -0
  278. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/cyclic-data-structure.mmdb +0 -0
  279. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/invalid-bytes-length.mmdb +0 -0
  280. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/invalid-data-record-offset.mmdb +0 -0
  281. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/invalid-map-key-length.mmdb +0 -0
  282. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/invalid-string-length.mmdb +0 -0
  283. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/metadata-is-an-uint128.mmdb +0 -0
  284. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-golang/unexpected-bytes.mmdb +0 -0
  285. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/bad-data/maxminddb-python/bad-unicode-in-map-key.mmdb +0 -0
  286. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
  287. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
  288. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
  289. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
  290. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb +0 -0
  291. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/data/test-data/maps-with-pointers.raw +0 -0
  292. {maxminddb-3.1.0 → maxminddb-3.2.0}/tests/threading_test.py +0 -0
@@ -3,6 +3,33 @@
3
3
  History
4
4
  -------
5
5
 
6
+ 3.2.0 (2026-09-10)
7
+ ++++++++++++++++++
8
+
9
+ * Added limits to pure Python record and metadata decoding to prevent denial
10
+ of service from crafted databases: 65,536 values, 512 nesting levels, and
11
+ 2 MiB of string and bytes payload. Exceeding a limit raises
12
+ ``InvalidDatabaseError``. CPython may reach its recursion limit earlier,
13
+ which raises the same error.
14
+ * Rejected unsigned integers longer than 16 bytes and signed integers longer
15
+ than 4 bytes before reading their payload.
16
+ * Updated the vendored libmaxminddb to 1.14.0, which adds the same resource
17
+ limits to the C extension.
18
+ * Truncated reads that previously raised ``IndexError`` or ``struct.error``
19
+ now raise ``InvalidDatabaseError``.
20
+ * The pure Python reader now rejects invalid search tree sizes when opening
21
+ a database.
22
+ * Improved pure Python lookup performance.
23
+
24
+ 3.1.1 (2026-03-05)
25
+ ++++++++++++++++++
26
+
27
+ * The vendored ``libmaxminddb`` has been updated to 1.13.3. This includes
28
+ a fix for the validation of empty maps and arrays at the end of the
29
+ metadata section. Previously, the extension would incorrectly reject
30
+ databases where a 0-element map or array was the last field in metadata.
31
+ Reported in vimt/MaxMind-DB-Writer-python#16.
32
+
6
33
  3.1.0 (2026-02-24)
7
34
  ++++++++++++++++++
8
35
 
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxminddb
3
- Version: 3.1.0
3
+ Version: 3.2.0
4
4
  Summary: Reader for the MaxMind DB format
5
5
  Author-email: Gregory Oschwald <goschwald@maxmind.com>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://www.maxmind.com/
8
- Project-URL: Documentation, https://maxminddb.readthedocs.org/
7
+ Project-URL: Homepage, https://www.maxmind.com/en/home
8
+ Project-URL: Documentation, https://maxminddb.readthedocs.io/en/latest/
9
9
  Project-URL: Source Code, https://github.com/maxmind/MaxMind-DB-Reader-python
10
10
  Project-URL: Issue Tracker, https://github.com/maxmind/MaxMind-DB-Reader-python/issues
11
11
  Classifier: Development Status :: 5 - Production/Stable
@@ -62,8 +62,8 @@ Usage
62
62
  -----
63
63
 
64
64
  To use this module, you must first download or create a MaxMind DB file. We
65
- provide `free GeoLite2 databases
66
- <https://dev.maxmind.com/geoip/geolocate-an-ip/databases?lang=en>`_. These
65
+ provide `free GeoLite databases
66
+ <https://dev.maxmind.com/geoip/geolocate-an-ip/databases/?lang=en>`_. These
67
67
  files must be decompressed with ``gunzip``.
68
68
 
69
69
  After you have obtained a database and imported the module, call
@@ -86,7 +86,7 @@ file descriptor immediately after the ``Reader`` object is created.
86
86
  The ``open_database`` function returns a ``Reader`` object. To look up an IP
87
87
  address, use the ``get`` method on this object. The method will return the
88
88
  corresponding values for the IP address from the database (e.g., a dictionary
89
- for GeoIP2/GeoLite2 databases). If the database does not contain a record for
89
+ for GeoIP/GeoLite databases). If the database does not contain a record for
90
90
  that IP address, the method will return ``None``.
91
91
 
92
92
  If you wish to also retrieve the prefix length for the record, use the
@@ -122,6 +122,11 @@ The module will return an ``InvalidDatabaseError`` if the database is corrupt
122
122
  or otherwise invalid. A ``ValueError`` will be thrown if you look up an
123
123
  invalid IP address or an IPv6 address in an IPv4 database.
124
124
 
125
+ The reader also raises ``InvalidDatabaseError`` when one record, or the
126
+ database metadata, exceeds its resource limits: 65,536 decoded values, 512
127
+ levels of nesting, or 2 MiB of string and bytes data. Real databases stay far
128
+ below these limits. Python's recursion limit may stop decoding sooner.
129
+
125
130
  Thread Safety
126
131
  -------------
127
132
 
@@ -144,5 +149,6 @@ Please report all issues with this code using the `GitHub issue tracker
144
149
  <https://github.com/maxmind/MaxMind-DB-Reader-python/issues>`_
145
150
 
146
151
  If you are having an issue with a MaxMind service that is not specific to this
147
- API, please contact `MaxMind support <https://www.maxmind.com/en/support>`_ for
152
+ API, please contact `MaxMind support
153
+ <https://support.maxmind.com/knowledge-base>`_ for
148
154
  assistance.
@@ -34,8 +34,8 @@ Usage
34
34
  -----
35
35
 
36
36
  To use this module, you must first download or create a MaxMind DB file. We
37
- provide `free GeoLite2 databases
38
- <https://dev.maxmind.com/geoip/geolocate-an-ip/databases?lang=en>`_. These
37
+ provide `free GeoLite databases
38
+ <https://dev.maxmind.com/geoip/geolocate-an-ip/databases/?lang=en>`_. These
39
39
  files must be decompressed with ``gunzip``.
40
40
 
41
41
  After you have obtained a database and imported the module, call
@@ -58,7 +58,7 @@ file descriptor immediately after the ``Reader`` object is created.
58
58
  The ``open_database`` function returns a ``Reader`` object. To look up an IP
59
59
  address, use the ``get`` method on this object. The method will return the
60
60
  corresponding values for the IP address from the database (e.g., a dictionary
61
- for GeoIP2/GeoLite2 databases). If the database does not contain a record for
61
+ for GeoIP/GeoLite databases). If the database does not contain a record for
62
62
  that IP address, the method will return ``None``.
63
63
 
64
64
  If you wish to also retrieve the prefix length for the record, use the
@@ -94,6 +94,11 @@ The module will return an ``InvalidDatabaseError`` if the database is corrupt
94
94
  or otherwise invalid. A ``ValueError`` will be thrown if you look up an
95
95
  invalid IP address or an IPv6 address in an IPv4 database.
96
96
 
97
+ The reader also raises ``InvalidDatabaseError`` when one record, or the
98
+ database metadata, exceeds its resource limits: 65,536 decoded values, 512
99
+ levels of nesting, or 2 MiB of string and bytes data. Real databases stay far
100
+ below these limits. Python's recursion limit may stop decoding sooner.
101
+
97
102
  Thread Safety
98
103
  -------------
99
104
 
@@ -116,5 +121,6 @@ Please report all issues with this code using the `GitHub issue tracker
116
121
  <https://github.com/maxmind/MaxMind-DB-Reader-python/issues>`_
117
122
 
118
123
  If you are having an issue with a MaxMind service that is not specific to this
119
- API, please contact `MaxMind support <https://www.maxmind.com/en/support>`_ for
124
+ API, please contact `MaxMind support
125
+ <https://support.maxmind.com/knowledge-base>`_ for
120
126
  assistance.
@@ -0,0 +1,6 @@
1
+ BasedOnStyle: LLVM
2
+ IndentWidth: 4
3
+ BinPackArguments: false
4
+ BinPackParameters: false
5
+ IndentCaseLabels: true
6
+ IndentPPDirectives: BeforeHash
@@ -0,0 +1,22 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ time: '14:00'
9
+ groups:
10
+ codeql:
11
+ patterns:
12
+ - github/codeql-action*
13
+ cooldown:
14
+ default-days: 7
15
+ - package-ecosystem: gitsubmodule
16
+ directory: /
17
+ schedule:
18
+ interval: weekly
19
+ day: monday
20
+ time: '14:00'
21
+ cooldown:
22
+ default-days: 7
@@ -0,0 +1,28 @@
1
+ name: Run Clang AddressSanitizer
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: '13 20 * * SUN'
7
+ permissions: {}
8
+ jobs:
9
+ addresssanitizer:
10
+ name: Clang AddressSanitizer
11
+ runs-on: ubuntu-latest
12
+ env:
13
+ ASAN_OPTIONS: strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1:detect_invalid_pointer_pairs=2
14
+ CC: clang
15
+ CXX: clang++
16
+ CFLAGS: -fsanitize=address -Wall -Wextra -Wpedantic -Wformat=2 -Walloca -Wvla -Wimplicit-fallthrough -Wcast-qual -Wconversion -Wshadow -Wundef -Wstrict-prototypes -Wswitch-enum -fstack-protector -D_FORTIFY_SOURCE=2
17
+ CXXFLAGS: -fsanitize=address
18
+ LDFLAGS: -fsanitize=address
19
+ steps:
20
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21
+ with:
22
+ submodules: true
23
+ persist-credentials: false
24
+ - run: sudo apt install clang libipc-run3-perl
25
+ - run: ./bootstrap
26
+ - run: ./configure
27
+ - run: make
28
+ - run: make check
@@ -0,0 +1,22 @@
1
+ name: Run Clang Static Analysis
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: '3 20 * * SUN'
7
+ permissions: {}
8
+ jobs:
9
+ clang-analyzer:
10
+ name: Clang static analysis
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
14
+ with:
15
+ persist-credentials: false
16
+ - run: sudo apt install clang-tools libipc-run3-perl
17
+ - run: ./bootstrap
18
+ - run: scan-build ./configure
19
+ env:
20
+ CFLAGS: -std=c99 -Wall -Wextra -Werror -Wno-unused-function -Wno-unused-parameter
21
+ - run: cd src; scan-build --status-bugs make; cd ..
22
+ - run: cd bin; scan-build --status-bugs make; cd ..
@@ -0,0 +1,46 @@
1
+ name: "Code scanning - action"
2
+
3
+ on:
4
+ push:
5
+ branches-ignore:
6
+ - 'dependabot/**'
7
+ pull_request:
8
+ schedule:
9
+ - cron: '0 7 * * 2'
10
+
11
+ jobs:
12
+ CodeQL-Build:
13
+
14
+ runs-on: ubuntu-latest
15
+
16
+ permissions:
17
+ security-events: write
18
+
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ # We must fetch at least the immediate parents so that if this is
24
+ # a pull request then we can checkout the head.
25
+ fetch-depth: 2
26
+ submodules: true
27
+ persist-credentials: false
28
+
29
+ # If this run was triggered by a pull request event, then checkout
30
+ # the head of the pull request instead of the merge commit.
31
+ - run: git checkout HEAD^2
32
+ if: ${{ github.event_name == 'pull_request' }}
33
+
34
+ # Initializes the CodeQL tools for scanning.
35
+ - name: Initialize CodeQL
36
+ uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
37
+
38
+ - run: sudo apt install libipc-run3-perl pandoc
39
+ - run: |
40
+ ./bootstrap
41
+ ./configure
42
+ make
43
+ make safedist
44
+
45
+ - name: Perform CodeQL Analysis
46
+ uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
@@ -0,0 +1,123 @@
1
+ name: Dependabot Failure Watcher
2
+
3
+ # Dependabot version updates run as GitHub Actions workflow runs named
4
+ # "Dependabot Updates". This scheduled job looks back over the past week for any
5
+ # version-update run that failed and fails itself if it finds one, so a
6
+ # silently-broken ecosystem surfaces as a red scheduled run instead of only a red
7
+ # triangle in the Dependabot tab that nobody checks. Security-update runs share
8
+ # that workflow name and are deliberately excluded -- see below.
9
+ #
10
+ # GitHub reuses the "Dependabot Updates" name for three different kinds of run:
11
+ #
12
+ # 1. A version update's scheduled scan: one run per .github/dependabot.yml
13
+ # entry, on the schedule set there. It works out what is out of date and
14
+ # opens or updates pull requests. This is the kind this watcher primarily
15
+ # exists to catch -- when a scan breaks, the whole ecosystem quietly stops
16
+ # being updated and nothing else tells anyone.
17
+ # 2. A version update's per-pull-request refresh: one run per already-open
18
+ # Dependabot pull request, rebasing or re-checking it. These are not driven
19
+ # by the schedule at all -- a push to the base branch, a rebase, or an
20
+ # "@dependabot recreate" comment triggers them, so they arrive in bursts
21
+ # after merges rather than at the scheduled time. A failure here means one
22
+ # open pull request has gone stale, which is worth knowing but is much
23
+ # narrower than a broken scan.
24
+ # 3. A security update: one ad-hoc job per vulnerable package, triggered by a
25
+ # Dependabot alert rather than by dependabot.yml at all.
26
+ #
27
+ # Kind 3 routinely fails for reasons no pull request can fix: the advisory is
28
+ # against a dependency this project does not declare directly, or no patched
29
+ # version is reachable. Counting those would keep this workflow permanently red
30
+ # and train everyone to ignore it, so they are filtered out below.
31
+ #
32
+ # Of the fields "gh run list --json" exposes, only the title separates the three
33
+ # -- event, headBranch and actor are identical. Titles come in these shapes:
34
+ #
35
+ # - "<eco> in /." -- kind 1 at the repo root, which
36
+ # has no " for " suffix
37
+ # - "<eco> in <configured-dir>" -- kind 1 elsewhere, path verbatim
38
+ # - "<eco> in / for <deps>" -- kind 2 at the repo root
39
+ # - "<eco> in <configured-dir> for <deps>" -- kind 2 elsewhere
40
+ # - "<eco> in /. for <one-dep>" -- kind 3 at the repo root
41
+ # - "<eco> in <manifest-dir> for <one-dep>" -- kind 3 elsewhere, where
42
+ # <manifest-dir> is wherever the vulnerable manifest was discovered
43
+ #
44
+ # At the root, then, kind 3 is marked by "/." AND a " for " suffix together, and
45
+ # BOTH HALVES of " in /. for " are load-bearing -- do not shorten it. Matching on
46
+ # " in /." alone would also discard every kind 1 run, which is most of the runs
47
+ # here and the shape both failures this watcher was written for actually took.
48
+ #
49
+ # Outside the root, kinds 2 and 3 cannot be told apart by title, so the filter
50
+ # has to name directories instead. e2e/js and e2e/ts (in the Node repos this
51
+ # workflow is shared with) are consumer smoke tests carrying committed
52
+ # lockfiles, so their transitive dev dependencies attract advisories that no
53
+ # pull request can fix, and nothing in them is shipped code.
54
+ #
55
+ # Be clear about the cost, because it is not zero: both Node repos configure npm
56
+ # with directories: ["/", "**/*"], and that glob does match e2e/js and e2e/ts,
57
+ # so those directories DO get version updates. Dropping the pattern therefore
58
+ # discards their kind 2 failures as well as their kind 3 ones -- there is an
59
+ # open version-update pull request under e2e/ts in both repos as this is
60
+ # written. The npm ecosystem label does not rescue the distinction either:
61
+ # Dependabot writes "npm_and_yarn" for both kinds, so "npm_and_yarn in /e2e/ts
62
+ # for js-yaml" could be either a security job or the refresh of a
63
+ # version-update pull request.
64
+ #
65
+ # Accepted deliberately anyway. Kind 1 is what this watcher primarily exists to
66
+ # catch and is still reported for those directories, so what is given up is the
67
+ # narrower "one open pull request has gone stale" signal, for two directories of
68
+ # test scaffolding, in exchange for dropping 16 unactionable failures in each of
69
+ # the two Node repos over retained history.
70
+ #
71
+ # Reading the directories out of dependabot.yml instead looks more general but is
72
+ # worse: entries may use globs (directories: ["**/*"]), which never match a title
73
+ # literally, so genuine failures would be dropped without a word. Prefer a
74
+ # denylist: when it goes stale it re-introduces noise, which is loud, whereas a
75
+ # stale allowlist hides failures, which is silent.
76
+ #
77
+ # Runs entirely within this repo (no external service). A failed scheduled run
78
+ # emails the person who last edited the cron below. Note: GitHub auto-disables
79
+ # scheduled workflows after 60 days of repo inactivity.
80
+
81
+ on:
82
+ schedule:
83
+ - cron: "17 14 * * 3" # Wednesdays 14:17 UTC
84
+ workflow_dispatch:
85
+
86
+ permissions:
87
+ actions: read
88
+
89
+ jobs:
90
+ check-dependabot-runs:
91
+ runs-on: ubuntu-latest
92
+ steps:
93
+ - name: Fail if any Dependabot version update failed in the last 8 days
94
+ env:
95
+ GH_TOKEN: ${{ github.token }}
96
+ REPO: ${{ github.repository }}
97
+ run: |
98
+ since=$(date -u -d '8 days ago' +%Y-%m-%dT%H:%M:%SZ)
99
+ # --created filters server-side, so --limit applies to runs already
100
+ # narrowed to the window rather than to all of history. Runs come back
101
+ # newest-first, so reaching the limit would drop the oldest in-window
102
+ # runs and this step would report all-clear without them -- hence a
103
+ # limit far above any plausible week's worth of runs.
104
+ runs=$(gh run list \
105
+ --repo "$REPO" \
106
+ --workflow "Dependabot Updates" \
107
+ --created ">=$since" \
108
+ --limit 500 \
109
+ --json conclusion,createdAt,displayTitle,url)
110
+ failures=$(echo "$runs" | jq '
111
+ [.[]
112
+ | select((.displayTitle | contains(" in /. for ")) | not)
113
+ | select((.displayTitle | test(" in /e2e/(js|ts) for ")) | not)
114
+ | select(.conclusion == "failure"
115
+ or .conclusion == "startup_failure"
116
+ or .conclusion == "timed_out")]')
117
+ count=$(echo "$failures" | jq 'length')
118
+ if [ "$count" -gt 0 ]; then
119
+ echo "::error::$count failed Dependabot version update run(s) in the last 8 days:"
120
+ echo "$failures" | jq -r '.[] | "- \(.displayTitle) (\(.createdAt))\n \(.url)"'
121
+ exit 1
122
+ fi
123
+ echo "No failed Dependabot version update runs in the last 8 days."
@@ -0,0 +1,32 @@
1
+ name: Links
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ schedule:
7
+ - cron: "0 13 * * 1" # weekly, to catch external link rot without a commit
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ linkChecker:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
+ with:
19
+ persist-credentials: false
20
+
21
+ - name: Setup mise
22
+ uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
23
+ with:
24
+ install: false
25
+
26
+ # Install only lychee (not the repo's full toolchain) and run the check.
27
+ - name: Check links
28
+ env:
29
+ MISE_AUTO_INSTALL: "false"
30
+ run: |
31
+ mise install lychee
32
+ mise run check-links
@@ -0,0 +1,54 @@
1
+ name: Deploy to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ workflow_dispatch:
7
+
8
+ permissions: {}
9
+
10
+ concurrency:
11
+ group: pages
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ build:
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read
19
+ steps:
20
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21
+ with:
22
+ persist-credentials: false
23
+
24
+ - name: Setup mise
25
+ uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
26
+ with:
27
+ cache: true
28
+
29
+ - name: Build docs
30
+ env:
31
+ HUGO_BASEURL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/
32
+ run: mise run build-docs
33
+
34
+ - name: Configure Pages
35
+ uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
36
+
37
+ - name: Upload artifact
38
+ uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
39
+ with:
40
+ path: docs/public
41
+
42
+ deploy:
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ permissions:
46
+ pages: write
47
+ id-token: write
48
+ environment:
49
+ name: github-pages
50
+ url: ${{ steps.deployment.outputs.page_url }}
51
+ steps:
52
+ - name: Deploy to GitHub Pages
53
+ id: deployment
54
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
@@ -0,0 +1,24 @@
1
+ name: precious
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions: {}
8
+
9
+ jobs:
10
+ precious:
11
+ name: lint
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
15
+ with:
16
+ persist-credentials: false
17
+
18
+ - name: Setup mise
19
+ uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
20
+ with:
21
+ cache: true
22
+
23
+ - name: Run precious lint
24
+ run: precious lint --all
@@ -0,0 +1,49 @@
1
+ name: Run tests
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: '3 20 * * SUN'
7
+ permissions: {}
8
+ jobs:
9
+ test-autoconf:
10
+ strategy:
11
+ matrix:
12
+ os: [ubuntu-latest, macos-latest]
13
+ cc: [gcc, clang]
14
+ posix: ['', -D_POSIX_C_SOURCE=200112L]
15
+ name: Autotools build on ${{matrix.os}} using ${{matrix.cc}} ${{matrix.posix}}
16
+ runs-on: ${{ matrix.os }}
17
+ env:
18
+ CC: ${{ matrix.cc }}
19
+ VERBOSE: 1
20
+ steps:
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ submodules: true
24
+ persist-credentials: false
25
+ - run: sudo apt install libipc-run3-perl
26
+ if: ${{ matrix.os == 'ubuntu-latest' }}
27
+ - run: brew install autoconf automake libtool
28
+ if: ${{ matrix.os == 'macos-latest' }}
29
+ - run: ./bootstrap
30
+ - run: ./configure
31
+ env:
32
+ CFLAGS: -std=c99 -Wall -Wextra -Werror -Wno-unused-function -Wno-unused-parameter ${{ matrix.posix }}
33
+ - run: make
34
+ - run: make check
35
+
36
+ test-cmake:
37
+ strategy:
38
+ matrix:
39
+ os: [ubuntu-latest, macos-latest, windows-latest]
40
+ name: CMake build on ${{matrix.os}}
41
+ runs-on: ${{ matrix.os }}
42
+ steps:
43
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
44
+ with:
45
+ submodules: true
46
+ persist-credentials: false
47
+ - run: cmake -DBUILD_TESTING=ON .
48
+ - run: cmake --build .
49
+ - run: ctest -V . -C Debug
@@ -0,0 +1,23 @@
1
+ name: GitHub Actions Security Analysis with zizmor
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ pull_request:
7
+ branches: ["**"]
8
+
9
+ permissions: {}
10
+
11
+ jobs:
12
+ zizmor:
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ security-events: write
16
+ steps:
17
+ - name: Checkout repository
18
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
+ with:
20
+ persist-credentials: false
21
+
22
+ - name: Run zizmor
23
+ uses: zizmorcore/zizmor-action@70fb788f84895a7701f5643d103d587e460b5c99 # v0.6.3
@@ -0,0 +1,49 @@
1
+ *.a
2
+ *.la
3
+ *.lo
4
+ *.o
5
+ *.so
6
+ *.swp
7
+ */.deps
8
+ */.libs
9
+ *~
10
+ .\#*
11
+ docs/.hugo_build.lock
12
+ docs/public/
13
+ /INSTALL
14
+ /autom4te.cache
15
+ /bin/country_lookup
16
+ /bin/mmdbdump
17
+ /bin/mmdblookup
18
+ /compile
19
+ /config.*
20
+ /configure
21
+ /depcomp
22
+ /generated
23
+ /include/maxminddb_config.h
24
+ /install-sh
25
+ /libmaxminddb-*
26
+ /libtool
27
+ /ltmain.sh
28
+ /man
29
+ /missing
30
+ /src/libmaxminddb.pc
31
+ /src/test-data-pool
32
+ /t/*.log
33
+ /t/*.trs
34
+ /t/*_t
35
+ /t/*-t
36
+ /test-driver
37
+ \#*\#
38
+ aclocal.m4
39
+ stamp-h*
40
+ CMakeCache.txt
41
+ CMakeFiles/
42
+ CTestTestfile.cmake
43
+ cmake_install.cmake
44
+ Makefile
45
+ Makefile.in
46
+ Testing/
47
+ install_manifest.txt
48
+ build/
49
+ .lycheecache
@@ -0,0 +1,6 @@
1
+ [submodule "t/libtap"]
2
+ path = t/libtap
3
+ url = https://github.com/zorgnax/libtap.git
4
+ [submodule "t/maxmind-db"]
5
+ path = t/maxmind-db
6
+ url = https://github.com/maxmind/MaxMind-DB.git
@@ -0,0 +1,11 @@
1
+ --blank-lines-before-packages=0
2
+ --iterations=2
3
+ --no-outdent-long-comments
4
+ -bar
5
+ -boc
6
+ -ci=4
7
+ -i=4
8
+ -l=78
9
+ -nolq
10
+ -se
11
+ -wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
@@ -0,0 +1,24 @@
1
+ exclude = [
2
+ ".git",
3
+ "maxmind-db/**",
4
+ "t/libtap/**",
5
+ "t/maxmind-db/**",
6
+ ]
7
+
8
+ [commands.clang-format]
9
+ type = "both"
10
+ cmd = ["clang-format", "-style=file"]
11
+ lint-flags = ["--dry-run", "-Werror"]
12
+ tidy-flags = ["-i"]
13
+ path-args = "file"
14
+ include = ["**/*.c", "**/*.h"]
15
+ ok-exit-codes = 0
16
+
17
+ [commands.prettier-markdown]
18
+ type = "both"
19
+ cmd = ["prettier", "--prose-wrap", "always", "--print-width", "80"]
20
+ lint-flags = ["--check"]
21
+ tidy-flags = ["--write"]
22
+ path-args = "file"
23
+ include = ["**/*.md"]
24
+ ok-exit-codes = 0