From 7af023536ad74817c2d9037445cf539f07c67c20 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 17 Nov 2024 08:07:28 +0530 Subject: [PATCH] add file in to github --- .google-cookie | 3 + duck_duck_leak/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 171 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 2360 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 350 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 588 bytes duck_duck_leak/asgi.py | 16 + duck_duck_leak/settings.py | 127 + duck_duck_leak/urls.py | 7 + duck_duck_leak/wsgi.py | 16 + manage.py | 22 + myapp/__init__.py | 0 myapp/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 162 bytes myapp/__pycache__/admin.cpython-310.pyc | Bin 0 -> 203 bytes myapp/__pycache__/apps.cpython-310.pyc | Bin 0 -> 439 bytes myapp/__pycache__/base64find.cpython-310.pyc | Bin 0 -> 1571 bytes myapp/__pycache__/cleardata.cpython-310.pyc | Bin 0 -> 650 bytes .../__pycache__/crawledlinks.cpython-310.pyc | Bin 0 -> 1677 bytes myapp/__pycache__/crypt.cpython-310.pyc | Bin 0 -> 2093 bytes myapp/__pycache__/direnum.cpython-310.pyc | Bin 0 -> 2084 bytes myapp/__pycache__/forms.cpython-310.pyc | Bin 0 -> 3289 bytes myapp/__pycache__/git_secret.cpython-310.pyc | Bin 0 -> 25896 bytes myapp/__pycache__/glsearch.cpython-310.pyc | Bin 0 -> 471 bytes myapp/__pycache__/linkchecker.cpython-310.pyc | Bin 0 -> 1281 bytes .../__pycache__/linkscraping.cpython-310.pyc | Bin 0 -> 2591 bytes .../__pycache__/linkscrapping.cpython-310.pyc | Bin 0 -> 1887 bytes myapp/__pycache__/models.cpython-310.pyc | Bin 0 -> 3434 bytes myapp/__pycache__/scraper.cpython-310.pyc | Bin 0 -> 2123 bytes myapp/__pycache__/secret.cpython-310.pyc | Bin 0 -> 25176 bytes .../__pycache__/sitemap_scan.cpython-310.pyc | Bin 0 -> 651 bytes myapp/__pycache__/subdom.cpython-310.pyc | Bin 0 -> 793 bytes myapp/__pycache__/trigger.cpython-310.pyc | Bin 0 -> 1221 bytes myapp/__pycache__/trufflehog.cpython-310.pyc | Bin 0 -> 1071 bytes myapp/__pycache__/urls.cpython-310.pyc | Bin 0 -> 1078 bytes myapp/__pycache__/views.cpython-310.pyc | Bin 0 -> 9477 bytes myapp/admin.py | 3 + myapp/apps.py | 6 + myapp/base64find.py | 49 + myapp/cleardata.py | 12 + myapp/common.txt | 4734 +++++++++++++++++ myapp/crawledlinks.py | 59 + myapp/directory-enum.txt | 74 + myapp/directoty.txt | 49 + myapp/direnum.py | 48 + myapp/find_links_only.py | 27 + myapp/forms.py | 59 + myapp/git_secret.py | 473 ++ myapp/glsearch.py | 10 + myapp/linkscraping.py | 68 + myapp/linkscrapping.py | 47 + myapp/migrations/0001_initial.py | 78 + .../0002_domainresult_decodedresult.py | 31 + .../0003_alter_decodedresult_domain_result.py | 19 + ...er_decodedresult_domain_result_and_more.py | 36 + myapp/migrations/0005_scanresult.py | 23 + myapp/migrations/0006_delete_scanresult.py | 16 + ...ve_decodedresult_domain_result_and_more.py | 48 + myapp/migrations/0008_scrapedlink.py | 22 + myapp/migrations/0009_scrapedlink11.py | 21 + myapp/migrations/0010_delete_scrapedlink.py | 16 + myapp/migrations/0011_directoryenumresult.py | 22 + myapp/migrations/0012_directoryenumeration.py | 22 + myapp/migrations/0013_gitleak.py | 23 + myapp/migrations/0014_delete_gitleak.py | 16 + .../migrations/0015_githubscan_secretscan.py | 32 + ...ink_delete_directoryenumresult_and_more.py | 28 + ...name_base_url_scrapedlink_link_and_more.py | 22 + myapp/migrations/0018_delete_scrapedlink.py | 16 + myapp/migrations/0019_scraplink.py | 21 + .../0020_rename_scraplink_linkscrap.py | 17 + myapp/migrations/0021_hashresult.py | 22 + myapp/migrations/0022_sitemapurl.py | 21 + myapp/migrations/0023_linkcheckresult.py | 22 + myapp/migrations/0024_linkresult.py | 22 + ...elete_linkcheckresult_delete_linkresult.py | 28 + .../0026_alllinkscrap_delete_scrapedlink.py | 24 + .../0027_crawledlink_delete_alllinkscrap.py | 24 + myapp/migrations/0028_delete_crawledlink.py | 16 + myapp/migrations/0029_delete_hashresult.py | 16 + myapp/migrations/0030_gitscanresult.py | 22 + ...nsitivedatafinding_delete_gitscanresult.py | 29 + .../0032_delete_sensitivedatafinding.py | 16 + myapp/migrations/0033_scrapedresource.py | 21 + ...e_scrapedresource_linkresource_and_more.py | 27 + .../0035_link_resource_delete_linkresource.py | 24 + myapp/migrations/0036_gitdataleak.py | 23 + myapp/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1524 bytes ...domainresult_decodedresult.cpython-310.pyc | Bin 0 -> 1048 bytes ...ecodedresult_domain_result.cpython-310.pyc | Bin 0 -> 784 bytes ...ult_domain_result_and_more.cpython-310.pyc | Bin 0 -> 1246 bytes .../0005_scanresult.cpython-310.pyc | Bin 0 -> 836 bytes .../0006_delete_scanresult.cpython-310.pyc | Bin 0 -> 513 bytes ...ult_domain_result_and_more.cpython-310.pyc | Bin 0 -> 894 bytes .../0008_scrapedlink.cpython-310.pyc | Bin 0 -> 816 bytes .../0009_scrapedlink11.cpython-310.pyc | Bin 0 -> 748 bytes .../0010_delete_scrapedlink.cpython-310.pyc | Bin 0 -> 518 bytes .../0011_directoryenumresult.cpython-310.pyc | Bin 0 -> 806 bytes .../0012_directoryenumeration.cpython-310.pyc | Bin 0 -> 824 bytes .../__pycache__/0013_gitleak.cpython-310.pyc | Bin 0 -> 827 bytes .../0014_delete_gitleak.cpython-310.pyc | Bin 0 -> 504 bytes ...0015_githubscan_secretscan.cpython-310.pyc | Bin 0 -> 1002 bytes ...rectoryenumresult_and_more.cpython-310.pyc | Bin 0 -> 905 bytes ..._scrapedlink_link_and_more.cpython-310.pyc | Bin 0 -> 682 bytes .../0018_delete_scrapedlink.cpython-310.pyc | Bin 0 -> 546 bytes .../0019_scraplink.cpython-310.pyc | Bin 0 -> 733 bytes ...rename_scraplink_linkscrap.cpython-310.pyc | Bin 0 -> 549 bytes .../0021_hashresult.cpython-310.pyc | Bin 0 -> 786 bytes .../0022_sitemapurl.cpython-310.pyc | Bin 0 -> 740 bytes .../0023_linkcheckresult.cpython-310.pyc | Bin 0 -> 760 bytes .../0024_linkresult.cpython-310.pyc | Bin 0 -> 755 bytes ...ckresult_delete_linkresult.cpython-310.pyc | Bin 0 -> 910 bytes ...nkscrap_delete_scrapedlink.cpython-310.pyc | Bin 0 -> 855 bytes ...edlink_delete_alllinkscrap.cpython-310.pyc | Bin 0 -> 783 bytes .../0028_delete_crawledlink.cpython-310.pyc | Bin 0 -> 536 bytes .../0029_delete_hashresult.cpython-310.pyc | Bin 0 -> 521 bytes .../0030_gitscanresult.cpython-310.pyc | Bin 0 -> 780 bytes ...nding_delete_gitscanresult.cpython-310.pyc | Bin 0 -> 1004 bytes ...elete_sensitivedatafinding.cpython-310.pyc | Bin 0 -> 564 bytes .../0033_scrapedresource.cpython-310.pyc | Bin 0 -> 727 bytes ...urce_linkresource_and_more.cpython-310.pyc | Bin 0 -> 722 bytes ...source_delete_linkresource.cpython-310.pyc | Bin 0 -> 833 bytes .../0036_gitdataleak.cpython-310.pyc | Bin 0 -> 825 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes myapp/models.py | 77 + myapp/payloads/common.txt | 4734 +++++++++++++++++ myapp/secret.py | 444 ++ myapp/sitemap_scan.py | 19 + myapp/subdom.py | 33 + myapp/templates/clear_data.html | 31 + myapp/templates/directory_enumeration.html | 19 + myapp/templates/findbase64_mul.html | 38 + myapp/templates/google_search.html | 249 + myapp/templates/index.html | 161 + myapp/templates/leak_checker.html | 19 + myapp/templates/scan_git_repo.html | 51 + myapp/templates/scan_links.html | 24 + myapp/templates/scangit_repo.html | 37 + myapp/templates/scrap_mul_links.html | 26 + myapp/templates/scrape_links.html | 26 + myapp/templates/search_results.html | 127 + myapp/templates/secret.html | 47 + myapp/templates/show_tables.html | 126 + myapp/templates/sitemap_scan.html | 20 + myapp/templates/subdomain.html | 21 + myapp/tests.py | 3 + myapp/trigger.py | 33 + myapp/urls.py | 20 + myapp/views.py | 417 ++ 149 files changed, 13597 insertions(+) create mode 100644 .google-cookie create mode 100644 duck_duck_leak/__init__.py create mode 100644 duck_duck_leak/__pycache__/__init__.cpython-310.pyc create mode 100644 duck_duck_leak/__pycache__/settings.cpython-310.pyc create mode 100644 duck_duck_leak/__pycache__/urls.cpython-310.pyc create mode 100644 duck_duck_leak/__pycache__/wsgi.cpython-310.pyc create mode 100644 duck_duck_leak/asgi.py create mode 100644 duck_duck_leak/settings.py create mode 100644 duck_duck_leak/urls.py create mode 100644 duck_duck_leak/wsgi.py create mode 100644 manage.py create mode 100644 myapp/__init__.py create mode 100644 myapp/__pycache__/__init__.cpython-310.pyc create mode 100644 myapp/__pycache__/admin.cpython-310.pyc create mode 100644 myapp/__pycache__/apps.cpython-310.pyc create mode 100644 myapp/__pycache__/base64find.cpython-310.pyc create mode 100644 myapp/__pycache__/cleardata.cpython-310.pyc create mode 100644 myapp/__pycache__/crawledlinks.cpython-310.pyc create mode 100644 myapp/__pycache__/crypt.cpython-310.pyc create mode 100644 myapp/__pycache__/direnum.cpython-310.pyc create mode 100644 myapp/__pycache__/forms.cpython-310.pyc create mode 100644 myapp/__pycache__/git_secret.cpython-310.pyc create mode 100644 myapp/__pycache__/glsearch.cpython-310.pyc create mode 100644 myapp/__pycache__/linkchecker.cpython-310.pyc create mode 100644 myapp/__pycache__/linkscraping.cpython-310.pyc create mode 100644 myapp/__pycache__/linkscrapping.cpython-310.pyc create mode 100644 myapp/__pycache__/models.cpython-310.pyc create mode 100644 myapp/__pycache__/scraper.cpython-310.pyc create mode 100644 myapp/__pycache__/secret.cpython-310.pyc create mode 100644 myapp/__pycache__/sitemap_scan.cpython-310.pyc create mode 100644 myapp/__pycache__/subdom.cpython-310.pyc create mode 100644 myapp/__pycache__/trigger.cpython-310.pyc create mode 100644 myapp/__pycache__/trufflehog.cpython-310.pyc create mode 100644 myapp/__pycache__/urls.cpython-310.pyc create mode 100644 myapp/__pycache__/views.cpython-310.pyc create mode 100644 myapp/admin.py create mode 100644 myapp/apps.py create mode 100644 myapp/base64find.py create mode 100644 myapp/cleardata.py create mode 100644 myapp/common.txt create mode 100644 myapp/crawledlinks.py create mode 100644 myapp/directory-enum.txt create mode 100644 myapp/directoty.txt create mode 100644 myapp/direnum.py create mode 100644 myapp/find_links_only.py create mode 100644 myapp/forms.py create mode 100644 myapp/git_secret.py create mode 100644 myapp/glsearch.py create mode 100644 myapp/linkscraping.py create mode 100644 myapp/linkscrapping.py create mode 100644 myapp/migrations/0001_initial.py create mode 100644 myapp/migrations/0002_domainresult_decodedresult.py create mode 100644 myapp/migrations/0003_alter_decodedresult_domain_result.py create mode 100644 myapp/migrations/0004_domainresult1_alter_decodedresult_domain_result_and_more.py create mode 100644 myapp/migrations/0005_scanresult.py create mode 100644 myapp/migrations/0006_delete_scanresult.py create mode 100644 myapp/migrations/0007_remove_decodedresult_domain_result_and_more.py create mode 100644 myapp/migrations/0008_scrapedlink.py create mode 100644 myapp/migrations/0009_scrapedlink11.py create mode 100644 myapp/migrations/0010_delete_scrapedlink.py create mode 100644 myapp/migrations/0011_directoryenumresult.py create mode 100644 myapp/migrations/0012_directoryenumeration.py create mode 100644 myapp/migrations/0013_gitleak.py create mode 100644 myapp/migrations/0014_delete_gitleak.py create mode 100644 myapp/migrations/0015_githubscan_secretscan.py create mode 100644 myapp/migrations/0016_scrapedlink_delete_directoryenumresult_and_more.py create mode 100644 myapp/migrations/0017_rename_base_url_scrapedlink_link_and_more.py create mode 100644 myapp/migrations/0018_delete_scrapedlink.py create mode 100644 myapp/migrations/0019_scraplink.py create mode 100644 myapp/migrations/0020_rename_scraplink_linkscrap.py create mode 100644 myapp/migrations/0021_hashresult.py create mode 100644 myapp/migrations/0022_sitemapurl.py create mode 100644 myapp/migrations/0023_linkcheckresult.py create mode 100644 myapp/migrations/0024_linkresult.py create mode 100644 myapp/migrations/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.py create mode 100644 myapp/migrations/0026_alllinkscrap_delete_scrapedlink.py create mode 100644 myapp/migrations/0027_crawledlink_delete_alllinkscrap.py create mode 100644 myapp/migrations/0028_delete_crawledlink.py create mode 100644 myapp/migrations/0029_delete_hashresult.py create mode 100644 myapp/migrations/0030_gitscanresult.py create mode 100644 myapp/migrations/0031_sensitivedatafinding_delete_gitscanresult.py create mode 100644 myapp/migrations/0032_delete_sensitivedatafinding.py create mode 100644 myapp/migrations/0033_scrapedresource.py create mode 100644 myapp/migrations/0034_rename_scrapedresource_linkresource_and_more.py create mode 100644 myapp/migrations/0035_link_resource_delete_linkresource.py create mode 100644 myapp/migrations/0036_gitdataleak.py create mode 100644 myapp/migrations/__init__.py create mode 100644 myapp/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0002_domainresult_decodedresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0003_alter_decodedresult_domain_result.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0004_domainresult1_alter_decodedresult_domain_result_and_more.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0005_scanresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0006_delete_scanresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0007_remove_decodedresult_domain_result_and_more.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0008_scrapedlink.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0009_scrapedlink11.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0010_delete_scrapedlink.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0011_directoryenumresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0012_directoryenumeration.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0013_gitleak.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0014_delete_gitleak.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0015_githubscan_secretscan.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0016_scrapedlink_delete_directoryenumresult_and_more.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0017_rename_base_url_scrapedlink_link_and_more.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0018_delete_scrapedlink.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0019_scraplink.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0020_rename_scraplink_linkscrap.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0021_hashresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0022_sitemapurl.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0023_linkcheckresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0024_linkresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0026_alllinkscrap_delete_scrapedlink.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0027_crawledlink_delete_alllinkscrap.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0028_delete_crawledlink.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0029_delete_hashresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0030_gitscanresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0031_sensitivedatafinding_delete_gitscanresult.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0032_delete_sensitivedatafinding.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0033_scrapedresource.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0034_rename_scrapedresource_linkresource_and_more.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0035_link_resource_delete_linkresource.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/0036_gitdataleak.cpython-310.pyc create mode 100644 myapp/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 myapp/models.py create mode 100644 myapp/payloads/common.txt create mode 100644 myapp/secret.py create mode 100644 myapp/sitemap_scan.py create mode 100644 myapp/subdom.py create mode 100644 myapp/templates/clear_data.html create mode 100644 myapp/templates/directory_enumeration.html create mode 100644 myapp/templates/findbase64_mul.html create mode 100644 myapp/templates/google_search.html create mode 100644 myapp/templates/index.html create mode 100644 myapp/templates/leak_checker.html create mode 100644 myapp/templates/scan_git_repo.html create mode 100644 myapp/templates/scan_links.html create mode 100644 myapp/templates/scangit_repo.html create mode 100644 myapp/templates/scrap_mul_links.html create mode 100644 myapp/templates/scrape_links.html create mode 100644 myapp/templates/search_results.html create mode 100644 myapp/templates/secret.html create mode 100644 myapp/templates/show_tables.html create mode 100644 myapp/templates/sitemap_scan.html create mode 100644 myapp/templates/subdomain.html create mode 100644 myapp/tests.py create mode 100644 myapp/trigger.py create mode 100644 myapp/urls.py create mode 100644 myapp/views.py diff --git a/.google-cookie b/.google-cookie new file mode 100644 index 0000000..75b5fdc --- /dev/null +++ b/.google-cookie @@ -0,0 +1,3 @@ +#LWP-Cookies-2.0 +Set-Cookie3: AEC="AZ6Zc-WthhZX5Bc5CSzrUHksLujVmgOR3T7ydYuZ6aSrG_rNy4W4c1DqgQ4"; path="/"; domain=".google.co.in"; path_spec; domain_dot; secure; expires="2025-04-21 06:48:02Z"; HttpOnly=None; SameSite=lax; version=0 +Set-Cookie3: NID="518=O3VkznglaZNpsJTwOZyWThe6drIc_74l2AegKIssCruaW3H_pz_0Dgk15-b1-XKtwL92FJ59F4BqhgKLlsR3lnhfNdNOFnBJIN94nTWA8Ys_nt9MqogfbGrhv7z_l9CPW7Aih2LAkO-nf9qcZXuMFbs8jihyDM_8k2L5s0iSv8FhhU2qeBtH68sAsN-3erSEa_g"; path="/"; domain=".google.co.in"; path_spec; domain_dot; expires="2025-04-24 06:48:02Z"; HttpOnly=None; version=0 diff --git a/duck_duck_leak/__init__.py b/duck_duck_leak/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/duck_duck_leak/__pycache__/__init__.cpython-310.pyc b/duck_duck_leak/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..645da35c16095e122515bc80d5cb087e55df1ec1 GIT binary patch literal 171 zcmd1j<>g`k02 zCSzPui?d7e3u01Ale2ZfL{4gAHkca^;>Kg+#>Z#oWtPOp>lIYq;;_lhPbtkwwFB8x J%mgG@7yy27D!>2$ literal 0 HcmV?d00001 diff --git a/duck_duck_leak/__pycache__/settings.cpython-310.pyc b/duck_duck_leak/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07ba6b3e53528c82502a1dd2d8ca7f77cfff36d0 GIT binary patch literal 2360 zcmb7GTXWk)6qXeE5;tzsq&Hd^#I#UMi5#~fO*>4fVkxPoj_rx$1~i=!vUlxlqFc4A zq|qyXqYuzG_(^)@f#DDEz%Y~}*-4Dk8G>XT?d6>B9DRGvuKjYk#KHAjvNrs_%yGY_ zoyjW?ou}~7UqB$v?;^Y}pjmScr9BZ{06F)TCp;>@5r@24MiJ-9?${l8s#ANtD?k8*AQ`A_`#A z7<)y&FV|MVd;_puKg1I8z>RA&;(HSO*e(Ib#KB)e9JsX0SU?|FtH|$DdF13cgud@q zu~!AeD)R%1c(rh#}A_oEOmtyS>wU^RH;)NbFo9R$6Hub1{-?MI)k)>cq_uo{2$84g|# z{7QUh*>*g(oVH-FWc_rZsF`z*>>z;fmc~jhLCC>} zc8KMS2*QqJJ!J$MTPJhz$~5LU3VFg_AB{~|Rn9trRB(Myu4k|RP^IBOu7h|%@Zp5& z!>L$o;BYby1^PfA>1UZbVL1H}$Ba!HZ;e=-uv&f3M>wRvzi0RNp2$2DRcLpNM!TiQA5ZaiNQXp*qy^5i1x*SF5A4WcCy9=Fr!>-64q^B~T!O)I zyCNict+m-`X^GfUwzM!k8RBPC@n=~S*pwdnA+lhzAt-YvcPS1Pmez2@uufd!*lBUR z7-{%n{N%hyTf`%7tqPUn!T4C}e}U6NC^_3ma;R+`QBj;31A+Pa}97aJ|z zfFT%wEYXwFRzp>r+K#fVC3D;DwqbR*oAq{UBbha{txi)hG(DN$(Kj2ZezQ?m(u7K8 zRmD(Jw|a6z=^D?hj-u;3?QPY1p)?yX*@iqUHa!;yZC(C&JgLtGR=9qxQF_YV$PDg^)l literal 0 HcmV?d00001 diff --git a/duck_duck_leak/__pycache__/urls.cpython-310.pyc b/duck_duck_leak/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61cef83ae402e31fc564054bbb52cda29dd98f28 GIT binary patch literal 350 zcmZvXF;2uV5Jf${CXq#*QYg^-}4pg}ZIq*aKmki#y@)s+OT{M4?wjKK+7gO0@Euv)6E_Uzj{y*zCq{G2QJKc*($y-3Y^*ds64l#=% G`u+hV=wL|z literal 0 HcmV?d00001 diff --git a/duck_duck_leak/__pycache__/wsgi.cpython-310.pyc b/duck_duck_leak/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..286f42d9a71368a247b7cad1aef5d6b1db80e226 GIT binary patch literal 588 zcmZ8f!EO^V5cN7~Qx=LiRE49jk?1Z$oGMg-NQn|bdPpmzD3W8=lZ_LvXSH@x+AAmi z0uCJbB_FtO;ukpK-3SpF$qGIR@5#2@`$7Y2eI%28NyntSfBQXtH|`HuhGwpEHphy|b++OS zXb>w_R=9-BC2>4(3_g@-!7{f1w#^e-i}xCsuuQN5`6A}x~DU;i7$9FgnPB`}zt$(oflVsr;NnO37LC<%g`kf`gqB=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w&*(xTqIJKx4 zOvbpR7H5~_7sRBLCTHt{iJa8LY%n(-#El1Yb1M@I3S#2pGxIV_;^XxSDsOSvg`kf@EdMbSEJF7{oyaOhAqU5Elyoi4=wu#vF!R#wbQch7_h?22JLdKv4!w z##^k3DY=<>ews{Cd?{IpdFlCj$@zIDMVU!OAOlu16fpxSF!9UD*(xTqIJKx4OvbpR z7H5~_7sRBLCTHt{iJa8LY%n(-#El1Yb1M@I3Sz*P=oM7n;;_lhPbtkwwPOStTMV*7 GfB^s=@-jjI literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/apps.cpython-310.pyc b/myapp/__pycache__/apps.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce7e25dc3c1dbbce34517575a5cab5964ef1705c GIT binary patch literal 439 zcmYjNy-ve05VqqKh5jt40}B#s2J!$1p_U?;=z>_HNS5h2QK{2}xEaa{3wvLJ$KW-* zGVuyb+_^>cr2Fje{P{cks==VkFh1Xpiw&+{MD`;@GQzZ{2*7|FR`Qf{cFQ0D@y0-C z{wmS{!h05XzEQRA&_L$iA*8bp*3cw8{ER2(*@M-M^_X32yI56q2JLKd=D}#S@Kh3&p89uW_!gVg x>qej%4bL7RL@eYH_qAy(TyOUy(l!BgCG~&*?XHJ47hP;Wa!F&eWY}jz@e6ExZN>lq literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/base64find.cpython-310.pyc b/myapp/__pycache__/base64find.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fd61db58e465368f5d6cf225f2015e84b6ff540 GIT binary patch literal 1571 zcmZ8hUvC^W5VyVme7U>y!kZ9cxF8I%>HJ^S+~1@;M-bye{|bL=r1E& z{0ImeFr^_3F`S^ltR%r>5)jN1Z}SUrZfP``Bwx1h~F z*4;Zi%2hnfldUYD46xD9Kf_a)cVWsOffT+%B~ti^h%1Ve=m;~s3?UpC*_wgN5}g>{ z*>_9CY~~z8VB5fL8R~8!8!2!4F-B(mRBH}V-`hO3;dWvC70bW;e0wE`R*D-dUtIg- z;kB=x-njl*b@h7)l|GJ=m_>>|=u^EA%Q%%PN(Wq9QVDG(Jk>;S?TjNe*wgNAB>DQ9 zZtbqGF+Ru`*RA_c27IF8EQQ-_xGDMriAC`G@|(N2c7Bjt$eQllD7^iG?GSy453>!_zQ{$9DGLd`(2*C^ZJ-kR)R@=cHsq2qpBu~(S^||c5Ex{7c(ESzIr&>G zgYq?8TA=t3mp?%mp$Zop3he_n29sk_k&?{F2^5yHO0o~dctk3zv}Vo;s%+)XJiy03 zA(c})_t3*PD_7CdJ;LIqYMHh2N>AJ@@ob@VOK(U{0L4dsiRFfBGp9u7$d=GS+sIHT zXSCm${t7vukb@<#gu;J;m{(G;w=ZOZKBMLYWCFN46Lj;`fjaG59I8iJ6MER|f_ z5+0(UV}c9^S*m!dg3FW4tZ|f_b=UldgZ3N&h*bpbvs*zBZ$kk8FF@bK8%8i2%d^|! zGz70=z~6;KautY;3DhHnPNk$nD51dHpdrs~(!;hxUfOQ&)fH?LsMuHHDjexkVUBBS sSFY8VHC)EBybzXoenj0I^viL^@`QhF-a%>f6oGd$2yJ)hzt%Q~H2?qr literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/cleardata.cpython-310.pyc b/myapp/__pycache__/cleardata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3849d089fc52f220661b2b570e843602d0931aae GIT binary patch literal 650 zcma))yH3L}6o&2G6KFw*hadw?Ob8*Qmdj9epz2~(s@&MBLgPBJouNAuPtlG{ypKni zcm*bo!$7lfBL6y{W1pKWd%X;Sy}swm4~)>KgMIS=Zei(55QZ48kiY~Bk9fi-z6eMl zLK2FIL?R}!NJxSa^O*mFNXmi<%EK>+i}J)~4^l2GJ}TEMn@*YqlY*9Odpax?FN{>1 zyLBVDqNbEjqtGc_YzN!9d@^-sH;Q8*&^6>8( zA%CKA@nK+m3&X5~kVMjq^l)Yw9kU*zsPl}EgI+KWd!e^!7WHaM%t)^;0~tOey@rfr z4d$j4vJP`g(hbsWyn>iyy-QvDdli>99hBKdUKU;EYNgIbc{*_dlp@wfC5YtwX@P>c zS7DgHKn%&0!Qcl!S~8*);FRnIn+8=dXD5Ub%d21%NIqlJunI>Z;*!w|cAxxmZ5r9A zA{8LKNnpQbYgMhHGp27>Y%Z$W38m!m`&Bp(heV1$=m`a{8&gqJX_>aqw?=|8F))#VS5v8zdlrvA$nYGHp_FaLqPkqarVfY*x*e|w7`Sh@pL?N zkx6t~SQljJWY=+{lY^^kTIYIsplq^}PKL_|?9Otx>4a8~OJ%Hae5kDJ=r}d1Kgf08 z*w~gv<7K$Os;Ab8K{}EBILkE0#ZGGa>BK5MiL<^>6vaiMCen3&S_EBtnyA92`NV~V zhNIn<<8aGPY{!rUwGjP`t7~QQQYXqFAXDTMqg((>MK6r|HXiCGX5^?LBYLfK2Oov1 zQ=)Id`aeIc-r4%uC~dsly06Tx&5JErCc9sHk*Rpsn|(C<-W=}(?yW?}dzq3R&`PoI zLcf6AGq*tmG@y)Lp@O#P62C$ltU=k~62A`X4S3lh`&ZOEuWwPo#36gFm%-^0m9dgo zI8Wv4pjc9o868oWDbBki#r4^UeI@d*rrv9D8a zClvJa2X)Me!>oX?WKMmXuo-zykH`@{Vgrs%^h`V_$K;qHDJ?$+M9{c={Zcr@g*>~4 z;YJ`T2>68PNRka7x+2&EmQ@&tZLukxvST{u74#CU2cvKvosi$IPC0Z;?HE4%1pX|W z&;bFwGmd|i4e}LW-GlS^K7xU3`a?+96|VIpHK|n+FCIu6OX(}^qOy>&Rj!fblcdyI zO{}X8N?QU`+|om6kyt*+^K9*@N=ln+$H#He4HmV%0kQQ>5KgGG{ZsBbeNTbD1`lo0 zC#qKm@_VYA3)kUq;tO!b`kD?1;W+^up)Fv_M{f>3T?E=w+lYPTE?jGznR_d5CjdMj zBZ@EqVgf`1EeSnrY?oe0_&FTWnANo}#r+JH3=&q*h<2E0396C0-L`JyX})c~Ui5Pd zikGF^XTK37$AWT8{}*rNtacjtrSa1|G+%7bGavc_Aw4xcDsgw5%Q92qJ~|@m?$V4~fT}G5`Po literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/crypt.cpython-310.pyc b/myapp/__pycache__/crypt.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15b0ed4db6d89984667316931001bb3f3fbb2921 GIT binary patch literal 2093 zcmb7ETXPdP6qdBIy>{Z*gj=DvEw~hyIwX#h0j9L|4e-!})Fx$c?0Pnq951ZxWmhJ6 z?>E}gYLx&^%Fv=2eJh>w>3rv$-Bm9djQ}yYer&Bi z2Ef<;W^|}x^NyI#=K=^I&;(WgiA>l*RRp(fN>wocQ3(D7k^l(`3=vgem_!7Qk#T`h zG9fS~?Qv<}C+(BczF(d?AlC=UA;COMo)dV492NLHc|qWd2zkVcW(Z%cW!>KcRusTJA39|XU{%9J2#Vd5A4oq zCVj>~tP0^-sl2liD%&eR;`Yiv9VwTViVKC*%=|PDUuzq-Y4v(059G`F*|a+;Vv9<* zORjJDk$EuJvHX~0qIS7>U3yNA9y?!i>Zg*@UR*3Zk?$@@_ej9y+`Fax z|BttuzAL}NGv@as{;vEaVYlGZ>U{#;y*yHG;gYtLEoT>sSBvF}v_Cc4zu4}@kzn~^ z`D*DxDKB2ee}>x2O$ObVe3`a!TW3_eOb70SH1tS;xJPZz%E#!rUAz_br>JV>6 zhUzdt&^@#TA-Hwo*3lup1}Xpp25yYq7$3X`fft6rjjQjd~Tv?-x$8FtkXrtA$8xGT1 z-?5SC6c06fT}Hc%tAf;E^bX_Ew(hhWmd-@eyABT+jCLH3Y|29|qf2ztr}&1-Y=Smc9P(s zjxMUCA{n{hkbVj5Vvgn*6u~wkYP1dt&q~E-ml3-H(rrb9CZ9{H51Cf7C zwt31L@JYX{hA;cD>CWr^SL6#I7=bDrS5%0VxH2x*lMwwK#FJTHJ|BF)Om+m0`(*XaPLK3W`j-D4J2e3+@D-4Pg$73G0anmo7^6RN z0R4f3=spgi-?55*!(sF*j-X%g82TBHqn~gT{fH;f4>*Rt$8q!>-iN+L2at#)r=or} Gp7;ldTtZv` literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/direnum.cpython-310.pyc b/myapp/__pycache__/direnum.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8895f5b61c8bc7721c6d0a563985d071e15366b GIT binary patch literal 2084 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 literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/git_secret.cpython-310.pyc b/myapp/__pycache__/git_secret.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a23590639f9a50348ae4ed4f38e175d0730b6f5a GIT binary patch literal 25896 zcmc&+cU&CTwT59Nfh3AR#p-C)Kr~U*&;nWklCTOGkY&T7_3qvUR>1CRXOYBcvEw*B zapJ@&PPLT8>Am;foW$vM@)D=M#Ob{{@%zrXGqW?hi=w>u$CG}0&Uf$Jd+xdI+)li- zbZG(pwVrR7h$RXNenbxEKl*wIKkXJEQ6LJZ3q~X_94TbCGNLdq8Yzkv2t^d#TPReq z2z0Sn0$MCeK$nVTpvy%mXqhMnt>BO=L?v*QSP8mHtOi{pZU9{?)-hcVxdnYXpN`^-6iTk>qP@-qi6!%Et)}FL@Q{U*aNy(>;v5| z4uH0cgP>l~0op0LKo1Guy@d}@N{2-^+&!Wf^oTeLdQ9|z-YAZPo)9NNPlHg2;-jE16CX2E`ndQ6+@BPm0{yi34CsU6 zv!I_7p9g(Nd;#>6;)|f47GDB=P<$EmbK)zY4~egWeo}l5^wZ+&pbv^~fPPMV6Z9eR zEzoZZ!%XQr;=kbjuJ|74!{Ym(KM+3z{gL=F=ugCdgT7Au6!d4}5zwEDUx5Bn{0j8f z;y0kb6~6=hz4!y@AH|fiZC$(II>i1ypu>#1fqEGA0v%y=6zCYEKA;;J z9S1tW=p@i7+pnL|0Q_!ZGzc`rXc*`;qnm-wFuDckRz@R0qm2AOV~oxM1#E3^gDc4X zA)qiL0Tf|04m81N5-4hiJ77*1f%otOES`cQjBJSE-<3@cahO0 zpgGjQx50H=*UNCF`TIQ3?TqdKdK{xWfgaE3E}$ncdLq!17(E&2DU6;9^fX3P+D}I+ z_klkH{FUH$gTD&=nH=I-K=+t>Jez$;N7yaUd+~cNqvruVUur2{4*UZ4C8;lD^dg`a zGkOWoOBuZk=zd05fUYv4xUg=ZqzNn>DCzQQMy~;SEu+@~y`Iqrn4SGXh>~ia#d1JX5Bp#eiP3o)Wf-ML9jhSG6gsU^kGI9b_kvV;RO;@zmEzeIO zS>j4Fa554OCQ{+aAV=9oQEL32w0~#qUXl+Tpb1AhFmHY^R!u}=kz_PX8dJ1DG&Y-@ z*6*K8r4m|KdsEZsS-&<`H`=vhtOlRcW-#KW^EiBci72sPI2_TmKq@{JiKQufOd_#V zG#pGt~$9r#0Cz8<%!Bm8_s_ht++9MkQe*+3= zb*|pwxQOTv_(T7ndiu3p9r%rU{5!{LvUILxUwl2-WfYG`laWwRi|9Lj_%|w>2<5I} z?DD?(cDF}!+wOVe1}lnPRf%9K6-ma7jrJE2Oa)150CgBJKkHk$E~zR}hDZX%=Wn#4 zMC1O(aC}CuIASVPjpDCHW$OE>{aC@QG)LPz#wdR~{hqNdM+V0(L&aL@ZEVOiL|LWW zuq<^NxLtO&cc5XWJ+)mmdrxFqKN|Fb`P!PySEDSRh{S?XO98!7n`+1uEYjUSudnc( z8LIYi<0I9p`+D@1{*do@pU;#$cDZ@)yg#JxrL=<=wSd`D(X`P1vNDCbKq-w~Zn1NO zu8ahRxY;_=(GOYT%xq?)=8BYM-&EJ(DykJZ%IMWdE8y$y?j0JUZV>3}>8PRRVC!V8 zqDVPO>bof7P;d8O@314jjGUFao?8fJ%jKkGXjuaK?!2kx2Dh_jlyMHEEufZEkzErq zge=bhg|O=-Cs(6>t-Zs)(=)a!(?vjwho!4*`KtB$$jO_3e^ZJBq^J;BV|`5BTf+O=Fk$)Hm;j z(JP+`MyDrcQNw2LtB`NAUUYN{sD)x*ow^vEj>fG(w&km1L&9bkc4p|fS)aa!BOH(H z41Y`?tnD(^Swh0$_$+mJq#in6pIIhP0_3f=z2DbCav( zLbe8ZY_n{#zQU4+%BUWu0a`!c6le8@Se7)@p=Ene(w2qamNhG_!e-zGDyOM`5>(AlUKtF-g8Xd3~Z7@77>_iE>NhqXk*Xf^B~ zG=V-m?`dnDPva9cAH2O1CUInCM>0yjz|eQWlo!n7CA#F0rp!9qiV!W?~wZD z)%rF5(tE0B!B|FxnWSAy`g$8;j^VHqR7u84cW_w=`erkVbh@KaJ?P~}<#NPsrgK!G zHO_YFXpPiF&FZyUtxSO1s=csamkd|CP&=Si1ty90dow1pvfoF>(kJJY!)!Cz1Us9@ zLh}3#je*4`@#^fOA*Bouk5m8@t#2jtiN_0@vyaVw<+Q5=! z^0m4z29q?A49>X4c9K|31mrhY6TU9Fz?{HTcojWJU*K=jk!6Uu)F4J%KMR_o1EC3jf2%UDZO%J5`#CXth~ja0s*6tcxbX2YyT<1{QoJsLyB5Q^j|io|Z=JbYyr z)WVgU8EW+Mq3K|FiUmo_vW3#V6u&eY3MP`;m}8Vc>bvWCnJeR%nXJZWuJ5)-aVlZ0 zQ6s6e&S=si$qOh&&5`>i>@4Y3C!^tHT#JvVs(rLfs2=hS=}naQ&?IJGLYljw=tL}- z!e=Zou>NptzicO?rkDGsC*sr5pj{ICNJ3D0TIITMK{%$86K8Ujuf=OLI)$3 zksYl?-|=sw(JV7JW-C^030fW5?Q@q?lD$M~h>ENQ7xd8UuQ%-F{Ybk!7)k}T6ndh$ zoY{crnZ=x=Kk$rrd3aV!#b@M(n!eG)GXqb%$1&Ve??YFs^%zSmnQQzse{&D6w5y^o zp{*U7CT!019&YB2?Iv~`6p|+tn|L#B;iYEDB|9sdTv>6b$RcZvGHbE|4QMU8!{hew zQ0Zo6tq%EG<_M;*b4IdaoW)EO0hc?+Wql`Hv~tq?T~2>zv7qeGl9ozK%Guo_4K3|S zWYx8`xYjo>B#p9Jk5XQ1)`K%8vk1x^D{h%ymPejAB_xh3Uf*EvS;X=LEVar>2Hxay zI>VdUHuFL4VSNVY1}vfwtNmRlliZJ`t_hvK-Q#jo1$E`A(j~IUoAoswiBR)q?OSyj zj>ojw8O$3f^{w6gr-n|S>>Z>HF*B^AfyoS&+fk%UeTN-OZi+1sQTLb?W`6hY%ogq6 zsc-T?4^Ku-d%DYMdyKM~cx)mL3!-Tk<4K`!WcPsS%)~RZSLNOlku|m-vxMn*Q20kZ zH1V{zOgw(ta;0r$X#i*fA8Z)safwD0kG|DkFYfYOqUI)(7e4C^WQo%({# z8OPBeLV9aX@I0xQG3+$9`$JjTCiz*l95R-Y;gI6=^*DFRIMXz2N^!OR&vlgM$lpe zr0!hBX%VCVrj+IKqbX;z9YlJV0c}}2iVFF*CrP9qg*nmJ?HlgvKV|8L941VWGKZ#% z!rH<{DqUuAm{;6&lz`J5vUl2ddiYrXVBZL*!rhLFpd5!^lgV(#4wHIWe(A%$p<{#H zfdSvp(3$?h9vN>oJQYc0#dG_m51;Nnj-wT4yiz)I4972+hF}X)bNQsZ`+Iu3`)`(p zfl?})pyfvFYb;O2&*di#dHPI1_=rw<1|yW~9?Yy@RKGCwnQSlF3Li zJ~fMi*Qv;DSNd4*VE^&cD0m80buKbBH$5FNw`=4`gg#btWAE`>Pn-xG?HfLJ`moeL zohK~GD4iC;L?%mA3ND}Yi5}m8D?>7drMzy(uzX|;XKt3p5;Le+Y6<#AB*4yUcBfAb zoE+?~4p5VTI>s``HX4U@xYPX=0B$vDsmUn`@sR>~DlQ~W#vp}uO?Ui<%EShFwSxEK{ZjV$X4!6}) ztd>}zwOU&bkWX{}oro~h>NusuDQ7x66scSSPbrz}2XSOCq`=ajLM?*}OY=k=hY?)k z2#3wgf&RWz!xYl`MqyXNEiI8lC%s83Bu$Y+FN&QLn#8Q4XRzk+c6!7 z4`!ru*lr8td=J17MKB*7;T60&giAf@p%M;5VTYaGmL$@bnvWfSa-7$m92Zr5LEjhG z{EYz7Bu<(}J;#nv|CPCL%%NE=m#~pFE>W1YWA|eQcT@BoP8sIhN9M~dV9Npm0iBeXB~{YtAX?6lAsxW_0*y`^SDe9Ma`WTSFJ)8FK8 zx_I#->W43ZK|9nH_Tv0aW(0rJg;o?RZdBnq6&+6dyGG9f)pqTmeDM7)*S=~iHc>05 zqp>NNh?sdWO7{w$l9iwp#7vF{JS2uXlm*L$@9(0yiL-Qh@w$VI4Q}kDaA_!tudL7x zdxesTCfnRgncj_9-*=7<^< z3r8!qCj>_ab=&r{J9gF7);D%}+Aq(iy`4DYs_VG@;B8HQ|EPb= z+c~zYtJYW~dug?~xdYafK~PT&?8-w>3y+q#UR#6_W3dqA%h zY-CY__enemh=KH)K}&eXOpQk0##7^C{X@fM5#>{1q?99Ab4k61BUzKle;?7xrWw(i z?_V=wVphYr1bf5RY-$Eh4`G&#;b#C7n`=cZb3~-JSnG(1W_YcrD;!Z}Yt!o;vE@|e zS^_Gu#tk@xQ2Gs6Z$Sc_=bI0U-bs4j;vaBZbmiIo~y?Zk*Z1G znTbgClrJJ}OQF}<3EH)EJQLTds(kS?9U@TIae1D4K>NY^MsH_V)9tsVahWztFP_*s z^rFdZKDn%y?(tx*ckMjuTPVymv#0k`kpFWoWJ=dm7=2`p)+ID|jVCc_wkvL+f6(e& zHGXlqt)6zI){t6xK8&o9Vqkq^7(sBu2e)04m=Eex`~jCvvrS*S!y~Iss6M*9owrj} z9C8HXHq&lvlOuAZLTZsQsd{U+PgX~;HwM`pODkfDaSRQ8QcT8YAu-p;i4?9kcpOX5 zd<}_D7{oxUdy&-iOMvig-s|6vg7MbUTT>bS+YdQ<21f)!!fK-`d+WI zO7p~`^@5DzXo;QrDQ~8eX2rU0wH*?SCD?4?xqXw@L|Ibl=9IZKVRfuf&?M6tv*KL0 zCJqVuey?NyDodc#X0R5{pvE%i&cuM%;mQ(o-Fi7i7$xT}rp)D1o7cu!qD>9=;4-hQ zwoE{MpVvC0%xxfCye+))3T%`q|^nII_~tkzvQ`G?r11j-~=(T+GyK zy$%-(!N`Xf15#t>Hv{{1F?}1_M9d0@%clt4!W5UR%*GJwG?phOp8kJh_RH0JhN@>@n#&^k+D0_vb&y+!B~bPARX&t9|sc>3~;S54wfTJ1p2VN^v41m z!Q_1kT5O->4h_Un?F%=VJdi=9#k_SXicBgR57zb=dB%20-Ka~G45O6IY#=BE?H=kk zORH_Uv()=ft+y@4D1|k{f*yBG_+3;Z*~g5VlR@KaMbnb{xj*A<3p?#*4YYbQjx7DC zd$-Yon2XO542_5HuE-fio7dsW5`mW%^>jkY5}d(|N=MHNL@p(w$vNHY?5d`xm6?|L zChm!*s7wd9!Wkv3As5JQnJL0K3hl)#%$X$)WE96!30asPuLZ57En8vx8)dSZt)bAa zXUiii(d#zBZm}?A-00=dr4PuyB3=L66dVFOjS7e14bb9C_c^ULdu1h*Ju+rX=rqbR zCR@tvav1UJ5@}m<8QLhP>uzXkR_W@upuM|%vXs2;^3E0m(?>+QiXO2jF?9USxH@_m&5qhc+2;t;Ms(8qo>zN~!?)`J! zit zxKkNbC=47nr^aWe19EE(>!uD%LRiEoniWEd;9#y-!cYi#YJ!+#G@==6GBMnmZE@y@Pac;`?dm+ap7zco)tbDqOP$kWtc;}S9>eU6%LFy_ z4&&IU_w>nt`Do9)@0>Z`v!qb#)>oXwwqG~BWU-%N$QLX)Sw%q3q5B0(c@JjrJ@E-U zJU`o@`J9MPSZ4cro^9x5$M|-cEr?(6BTKk(_8-Y9?@7iJctL9mk{U_Re=n&SX5Rd( z6Kk#cfjv@SH9$9RV|u;0R;Qsh^H2$ zlP?xsb_)nx*>nuWn;c2?cIT$FA~AvchGvA&H2R^w-4SKr=zud$_2Co!-N*U6zP2Zd z$7PX*W0C3UnP9AXAc(mIZrLO?eWOD{51!5X265tt%kD!mX8Azx$?EP%G8M(+G~6K2 z*E_;@_YMyC9icm~y)txzpI;Slwfpf5!b3Ol%vOW9U6}%>?Jo}=f783IoQHBpE&F>N zkGsa|9521H9L5T_d|D44ld|c~3QNaT4bp*4JFaS&ugCltvg8#YoEdNe^43NM)*8!j z36X09Hdeo}W)!<&vX#h-0nVzRZ}^KI_+uVtai&BrdUKpVT&+>s8@mv=IhYJ|V=G6~ z`6XoyE=2hoYpivCnt@2;x&c2}mt!W)U#u>2mi~MZULW=HrGNqJfyUlU9oTzpcCDBv zB+?C|fZe=ysia{(;tdS*<>Z6@kUa&-><6M3nFlP8fbz=g4jC&>qm=2GIbdsb8*bv! z_6zx@38ZHk^3Fl6{kKr+q%v^VAH>!pm4Pe>40K!+vQ%;+;Ie1Yjc11S=E&TQ|Cze_ z#d)C7Dy#$ zBlh$D1YZI}MzLdR#%QdC9Lo`^)jb>wPs@_Y0J4rPT#A#aF|-@{13&PvFK{)t?598Q zvj)EQxhGyKUf#cVzM}&lb|Jy+@aa53ajCJkSYJjhE}E+D#s+wD3V+$lsLGQOV?~ah zbRR0Xr@6%%F3_{3oBk@(-ZtC2()6B;;0lKMXPnlUez-9fipKEwAIuNoLi*cc=D%|A zQvAB{(*(Xu6wDW<3a%7hEqK<;=M{Z6rJO6eqNWSd%2lPXAcenBmR4R|@KWWjLbw)R zSpxsUo`SJ}zi7T_UY%c*UIf>f`NgTl=ZdeCq>IvvuPXCP^zPKs^b-1exI(?V=vgiE z#p&WJ%dQs8m!y`bOT;3v_-+O9Hv5(NrSr>DrB}+X7Qnq4?&b5Psq!lo>C*JFt4h+J zF1)fLy*#}ny)?b-O6Ao8vE(J{Rp@g5$obAQ_*=Xx{@+zpSP(02F3=_~;tT!16~8kD z=RImcsw%Z|T$!7*{LgzX7Mx#yrXaQ+-;{H!&aIw%L1DpsSz&=*irf~b%dFgQubiC`{^$ zW>e!0`)do0;s~B0logu7@x1K{cZY%c>ETbRAjB z(F5bj_>8d#qh%~*C~?hDF9xTl43(2t&tVm8sPrecjFMy|C`cX6D2d?ECz8Y{XW+sa z&!IG95f&ITnxP~k#$pYB$sjyw&_fd3t)_fpZ^EcN9gEUdc@JjXBGQ{o#*@a9zJ3Xc zBA3D=#h8+?v$otQ=JR$8MfAteVpMFJ%v%805e=2DGaD)(Ql{KOabn5$p=gc5abppy zntVSwRl>>l5?o^HYZOLaTaf%Ny#9W)yWLNwR%7b#iD*-)c*2iANi)^JWI7U@VrPJy z0d~&JA#Z*Zrn%~FOw3`8MD-rPUvmj)VcdD747>|ftqmg?wQ#AT6qYGvg)57S3(E?X zqKd*|;EKZKg=(R~{}&e)KdL-V`Iqw8hDX)MRg|g<@UPX!Dp#*7EPkBwnDXAwu6dlMeDd_!-6C8T`$i=}0HFMD5X% zf`VdbL;sZ`X!97QtQIN%R8{3sb&>K9b+Phyb&2vfwOIM9TB7_#U8?+9U9S95tx$fe zRw=(yS1P|$S1G?xS1UhP*Qk%EHz+?-*D60%Hz+?=H!43;Hz_|hVKZ>V+3*VTIEYifh?Rkd;PSJYLKMLs!#c_dRY08+O2$0?NL6U_A2jJk1T$ldZY3# z^`!E4^_229^(N)b>Y(x_bx3)mI;^}wJ*~W6y;XU&I;uRN`juCzW6CSkv&zfW+mtJ6 zP`O_nS6-w}EPkOnsobYVl^3W}%JbA|<+-bdQo|*dP#YTI;T8Y)fYcWy{tS@O)F1O=aswE+m*+wcPMuj+@Tg0+^IYU zu7Ljwya@cC;41i|;ETZj0lpag@8CROEz8?H1 z;2Xey489TkN8p>le+a%A{0HD$pvS}D9=N{;z7_nt;M>6e3w%5Hcffam8{j*^zYSgk z{w?rY@Na_e0{;eh9r)M5>%qSU-T?kp@J8^jfH#4E8GJYRm%y9BzX;v}J-z_m3im_c zZQ!3TxTAOv_~*d)f`1l#ANYgd`@ug0egOQ_;O*d_0zU};NpLUtC%`+vKMvjr{xR?_ z@Q;EY0{;lO5B$U6hrvGt-VHrI2;Kwt2f%y5-w%ES{C(g@!QTsh4E#Odec;27f*H&Cug@;Ah}| zE%+_quK~Xm{MFzi;I9H71%CkC5B^Hk z^jcu_TVV8DVDw#tNACqj|Al`!@f`M$bkV^lgMk??yh*zY!ii9RBFz@JBBP zMn4BePX|U{2S#rPMt=uJj|WDd2S%?4M!yF}&j&`|2S)D)M*jzf1ptN(0EQI+h8+Ng zB>;vk0ERUHhCKj=MF56P0Ip{Iea2fDKg<|b0%2e$5C)b4d4a6}hP8k{>;*6^1~6;} zFsueJ>;^C_2QX|0FsuhK><2I`2rz62FsukL>59$;7>VAvmESRi27AYfP_VAvsGSR!E9B4Ah}VAvyISR`QBBw$!2VAv&KSSDcD zCSX`6VAv;MSR`QBB(xb=C1BVk_`@;*!!`lKIswBz0mDKeFR)R-uu|}codSlX0*0*u zhP48Qy#j{C0*1{3hSdUw-2#T?0*37ZKE?QLjQbhCl`*Uu!oaQ}3@jNiY#A`D88GY_ zFf1A{Y#K1E8Zhh{Ff1D|Y#T7F8!+q}Ff1A{Y#K1E8u9|W1`Nvvf7mu)STkVQGvFZO z`x(Qk!5?-F{;+Joux-GwZosf_z!AnTW(?~Ff7mzpM;X6>F{~Z@VejBS#rS!Iu_z;d z*d_SGA_2oDv5PGb+-!sJm8}ZgY**lB3j#OW5V+Y|6x^w@y@2FOwMbReLeN6`PqGW{ NT*^JO;Esys{{ij5kmmpZ literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/glsearch.cpython-310.pyc b/myapp/__pycache__/glsearch.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5efc0052b4a15fc744edb06e7249b0b352eb398 GIT binary patch literal 471 zcmYjNJ5Iwu5S`gwCl)w>C{V88g475hgp|8i{>Ez;K~4oN2S7AXa;0sl zas?{Jj)XGOJk8tryxA!ylRY5w-lwsR06#t1HAdu$Tu%ukNX#Hd4-q7j{1rSV#Vxqj zhO*$I8EF;P(PKoT{>`FjOg<;qX9Nv&@PccMVa+=HfHiNh;}U5k4VB`}TEP8yEjsqe zI`Ktf%j1sqGB?jwRL+uO(=Wa0cXNfun@k#Bw7C(wDJ##a!d5Gn8?KwW?u*PQtSVJV z*D|(F8Wk+-6%|wD?Z;&qXDY~&A~n{sRg}S}Z>T5K_j^4*_wTf-^??3D>68?F*+%K< z0GSHYfd)Md2AZ!(&5yI~DQ4Bm96cn340e<_4c88VjRHq_f({B+AJW5(%ROgXx$Pf5 bFr96Om;NKZtp7 zAMV@y#Ay4{R)uyBc6P?Pk+rR+x@e@+O*1LSuE6{2BU%~m0W35TR1v`x710NBL={uf zWh(d*gNQ#6PDBE66W@O^DQAcEL}@E-7+6aejDoFs$ETv)1PK8e($J1vuqo@;T^ zejRz9+p+V>>;&g)>Nlh;OzxbN*W}w@`+K8TPFolB=$Ur2rm9D(EoP5{GCH3HQ=%z@ zIX}(odV~Rsx4M{VyIY^y9$?$R*Cn9t(3JM+*{%Pm+5L(7H(H=72nr^{jX?ba6kI_i zEa(+okZ0u0;GDq@khGxZQAeiH74M=2P<5RC@8JbL(^# zTYRQZt#)-)I_)_!AqM&1t}<<-WiU5N{SJyQA8U&_U#cx!-3B!TaoeES`)$@|L%JQM zbc?e0{QKF~8fnXjJcQ;9bN8_9&D!7I0uYi!6RDd=L5*+g2pYE?UElko}$TPnnlWTHUm^ z40OA@aOTiKpQTYB$V{011I#Q1NAQ>WR1BB%Zg2q2gpkC}YO`%7#_g`Y5dkQ4cWC1P dIQUwF5>guQq)(RVc#4Dt1S#Ew-!|La`2qfPH_`wA literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/linkscraping.cpython-310.pyc b/myapp/__pycache__/linkscraping.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..108b273f10ee8231031ad5806f2ace63b33cd80f GIT binary patch literal 2591 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 literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/secret.cpython-310.pyc b/myapp/__pycache__/secret.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b223556b507e337ce6a9844c555f284d4a79bae7 GIT binary patch literal 25176 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 G-1I-#31l4r literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/sitemap_scan.cpython-310.pyc b/myapp/__pycache__/sitemap_scan.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26f123d5b2569c0aecf7d4596d9ab91a118c2bc3 GIT binary patch literal 651 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 literal 0 HcmV?d00001 diff --git a/myapp/__pycache__/urls.cpython-310.pyc b/myapp/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2e788fbb600d6203bfc8d75b0c54963a6b78f4c GIT binary patch literal 1078 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 KZpn2EhyMrSJj REDIRECTS TO: http://192.168.8.101/0/ +301 0B http://192.168.8.101/D -> REDIRECTS TO: http://192.168.8.101/ducky/ +301 0B http://192.168.8.101/Image -> REDIRECTS TO: http://192.168.8.101/Image/ +301 235B http://192.168.8.101/admin -> REDIRECTS TO: http://192.168.8.101/admin/ +301 235B http://192.168.8.101/audio -> REDIRECTS TO: http://192.168.8.101/audio/ +301 0B http://192.168.8.101/atom -> REDIRECTS TO: http://192.168.8.101/feed/atom/ +301 234B http://192.168.8.101/blog -> REDIRECTS TO: http://192.168.8.101/blog/ +404 206B http://192.168.8.101/cgi-bin/ +301 233B http://192.168.8.101/css -> REDIRECTS TO: http://192.168.8.101/css/ +301 0B http://192.168.8.101/d -> REDIRECTS TO: http://192.168.8.101/ducky/ +302 0B http://192.168.8.101/dashboard -> REDIRECTS TO: http://192.168.8.101/wp-admin/ +200 0B http://192.168.8.101/favicon.ico +301 0B http://192.168.8.101/feed -> REDIRECTS TO: http://192.168.8.101/feed/ +301 236B http://192.168.8.101/images -> REDIRECTS TO: http://192.168.8.101/images/ +301 0B http://192.168.8.101/image -> REDIRECTS TO: http://192.168.8.101/image/ +301 0B http://192.168.8.101/index.php -> REDIRECTS TO: http://192.168.8.101/ +200 504KB http://192.168.8.101/intro +301 232B http://192.168.8.101/js -> REDIRECTS TO: http://192.168.8.101/js/ +200 7KB http://192.168.8.101/license +302 0B http://192.168.8.101/login -> REDIRECTS TO: http://192.168.8.101/wp-login.php +301 0B http://192.168.8.101/page1 -> REDIRECTS TO: http://192.168.8.101/ +403 94B http://192.168.8.101/phpmyadmin +200 4KB http://192.168.8.101/readme +301 0B http://192.168.8.101/rdf -> REDIRECTS TO: http://192.168.8.101/feed/rdf/ +301 0B http://192.168.8.101/render/https://www.google.com -> REDIRECTS TO: http://192.168.8.101/render/https:/www.google.com +200 41B http://192.168.8.101/robots +200 41B http://192.168.8.101/robots.txt +301 0B http://192.168.8.101/rss -> REDIRECTS TO: http://192.168.8.101/feed/ +301 0B http://192.168.8.101/rss2 -> REDIRECTS TO: http://192.168.8.101/feed/ +200 0B http://192.168.8.101/sitemap +200 0B http://192.168.8.101/sitemap.xml +301 235B http://192.168.8.101/video -> REDIRECTS TO: http://192.168.8.101/video/ +301 238B http://192.168.8.101/wp-admin -> REDIRECTS TO: http://192.168.8.101/wp-admin/ +301 240B http://192.168.8.101/wp-content -> REDIRECTS TO: http://192.168.8.101/wp-content/ +301 241B http://192.168.8.101/wp-includes -> REDIRECTS TO: http://192.168.8.101/wp-includes/ +404 0B http://192.168.8.101/wp-blog-header +200 0B http://192.168.8.101/wp-config +200 0B http://192.168.8.101/wp-cron +200 191B http://192.168.8.101/wp-links-opml +200 0B http://192.168.8.101/wp-load +403 3KB http://192.168.8.101/wp-mail +200 1KB http://192.168.8.101/wp-login +500 0B http://192.168.8.101/wp-settings +302 0B http://192.168.8.101/wp-signup -> REDIRECTS TO: http://192.168.8.101/wp-login.php?action=register +404 135B http://192.168.8.101/wp-trackback +405 42B http://192.168.8.101/xmlrpc +405 42B http://192.168.8.101/xmlrpc.php diff --git a/myapp/direnum.py b/myapp/direnum.py new file mode 100644 index 0000000..f8f1213 --- /dev/null +++ b/myapp/direnum.py @@ -0,0 +1,48 @@ +import requests +from urllib.parse import urljoin +from concurrent.futures import ThreadPoolExecutor, as_completed +import time + +def check_url(full_url): + """Send a GET request to the URL and return the URL if found.""" + try: + response = requests.get(full_url, timeout=5) # Set a timeout for the request + if response.status_code == 200: + print(f"Found: {full_url}") # Print found URL + return full_url + except requests.RequestException as e: + # Optionally log errors + print(f"Request failed for {full_url}: {e}") + return None + +def web_directory_enumeration(url, wordlist, max_workers=10): + """ + Performs fast web directory enumeration using multi-threading. + + Parameters: + url (str): The target URL for enumeration (must include protocol, e.g., http://). + wordlist (str): The path to the wordlist file containing directory names. + max_workers (int): The maximum number of threads to use for requests. + + Returns: + list: A list of found URLs that exist on the server. + """ + found_urls = [] + + # Load the wordlist from the specified file + try: + with open(wordlist, 'r') as file: + paths = [line.strip() for line in file if line.strip()] + except FileNotFoundError: + print(f"Wordlist file '{wordlist}' not found.") + return found_urls + + with ThreadPoolExecutor(max_workers=max_workers) as executor: + future_to_url = {executor.submit(check_url, urljoin(url, path)): path for path in paths} + + for future in as_completed(future_to_url): + result = future.result() + if result: + found_urls.append(result) + + return found_urls \ No newline at end of file diff --git a/myapp/find_links_only.py b/myapp/find_links_only.py new file mode 100644 index 0000000..267ded0 --- /dev/null +++ b/myapp/find_links_only.py @@ -0,0 +1,27 @@ +import re + +# Function to extract links +def find_links_in_file(input_file, output_file): + # Regular expression pattern for matching http and https URLs + url_pattern = r'(https?://[^\s]+)' + + # Read the content of the input file + with open(input_file, 'r') as file: + file_content = file.read() + + # Find all URLs that match the pattern + urls = re.findall(url_pattern, file_content) + + # Write the found URLs to the output file + with open(output_file, 'w') as output: + for url in urls: + output.write(url + '\n') + + print(f"Found {len(urls)} links and saved them to {output_file}") + +# Input and output file paths +output_file = 'directory-enum.txt' + +# Find links in the file and store them in directory-enum.txt +input_file = 'directoty.txt' +find_links_in_file(input_file, output_file) diff --git a/myapp/forms.py b/myapp/forms.py new file mode 100644 index 0000000..4795d86 --- /dev/null +++ b/myapp/forms.py @@ -0,0 +1,59 @@ +from django import forms + +class ScanForm(forms.Form): + domain = forms.CharField(label='Domain', max_length=100, required=True) + + +class GoogleSearchForm(forms.Form): + site_qry = forms.CharField(label='Search Query', max_length=255) + + +class URLScanForm(forms.Form): + urls = forms.CharField(widget=forms.Textarea(attrs={ + 'placeholder': 'Enter multiple URLs, one per line', + 'rows': 10, + 'cols': 50, + }), label='URLs to scan') + +class DomainScanForm(forms.Form): + domain = forms.URLField(label='Domain to Scan', max_length=255) + +class DomainInputForm(forms.Form): + domain = forms.CharField( + max_length=255, + label='Domain', + widget=forms.TextInput(attrs={'placeholder': 'Enter domain to enumerate'}) + ) + +class GitHubScanForm(forms.Form): + repository_url = forms.URLField(label='GitHub Repository URL', required=True) + +class SecretScanForm(forms.Form): + urls = forms.CharField(widget=forms.Textarea(attrs={'rows': 5, 'cols': 60}), label='Enter URLs (one per line)', required=True) + +class LinkScrapingForm(forms.Form): + base_url = forms.URLField(label='Enter the Base URL', required=True) + + +class LinkScrapingFormM(forms.Form): + base_urls = forms.CharField(widget=forms.Textarea, label='Enter URLs (one per line)', required=True) + +class SitemapScanForm(forms.Form): + base_url = forms.URLField(label="Enter the Base URL", required=True) + +class KeywordSearchForm(forms.Form): + keywords = forms.CharField(label="Enter keywords (comma-separated)", required=True, widget=forms.TextInput(attrs={'placeholder': 'e.g., keyword1, keyword2'})) + + +class URLScanForm(forms.Form): + urls = forms.CharField(widget=forms.Textarea, label="Enter URLs (one per line)") + +class GitRepoForm(forms.Form): + repo_url = forms.URLField(label="Git Repository URL") + +class MultiInputSearchForm(forms.Form): + input1 = forms.CharField(label='Input 1', required=True) + input2 = forms.CharField(label='Input 2', required=False) + input3 = forms.CharField(label='Input 3', required=False) + input4 = forms.CharField(label='Input 4', required=False) + input5 = forms.CharField(label='Input 5', required=False) \ No newline at end of file diff --git a/myapp/git_secret.py b/myapp/git_secret.py new file mode 100644 index 0000000..04161ff --- /dev/null +++ b/myapp/git_secret.py @@ -0,0 +1,473 @@ +# git_secret.py +import re +import os +import git +import tempfile + +# Define regex patterns for sensitive information +patterns = { + 'google_api': r'AIza[0-9A-Za-z-_]{35}', + 'google_oauth': r'ya29\.[0-9A-Za-z\-_]+', + 'google_api_key': r"(?i)AIza[0-9A-Za-z\\-_]{35}", + 'google_recaptcha_key': r"(?i)(\"|\')6[0-9a-zA-Z-_]{39}(\"|\')", + 'generic_api_key_inurl': r'https?://[^\s]+[?&](key|api_key|apikey|apiKey|ApiKey|access_token|auth|authentication|token|secret|client_id|client_secret|API_KEY|private_key)=[a-zA-Z0-9_\-]+', + 'generic_api_key_incode': r'\b(key|api_key|apikey|apiKey|ApiKey|access_token|auth|authentication|token|secret|client_id|client_secret|API_KEY|private_key)\s*=\s*["\']([a-zA-Z0-9_\-]+)["\']\s*;?', + 'firebase' : r'AAAA[A-Za-z0-9_-]{7}:[A-Za-z0-9_-]{140}', + 'firebase_api_key_pattern' : r'AIza[0-9A-Za-z-_]{35}', + 'firebase_database_url_pattern' : r'https://[a-z0-9-]+\.firebaseio\.com', + 'Firebase API Key': r"(?i)firebase_api_key[:=]\s*['\"]?([a-zA-Z0-9]{40})['\"]?", + + 'recaptcha_secret_key_pattern' : r'(?i)(?:=|\'|")?(6L[0-9A-Za-z]{39})(?:=|\'|")?', + + + #'openai_api_key_pattern' : r'(?i)sk-[a-zA-Z0-9]{48}', + 'openai_api_key': r'sk-[a-zA-Z0-9]{48}', + + + 'AWS Access Key ID': r'\bAKIA[0-9A-Z]{16}\b', + 'AWS Access Key ID': r"(?i)aws_access_key_id[:=]\s*['\"]?([A-Z0-9]{20})['\"]?", + 'AWS Secret Access Key': r"(?i)aws_secret_access_key[:=]\s*['\"]?([A-Za-z0-9/+=]{40})['\"]?", + 'aws_access_key_id': r'AWS_ACCESS_KEY_ID=([A-Z0-9]{20})', + 'aws_secret_access_key': r'AWS_SECRET_ACCESS_KEY=([A-Za-z0-9/+=]{40})', + 'aws_access_key_id': r'aws_access_key_id\s*=\s*([A-Za-z0-9]{20})', + 'aws_secret_access_key': r'aws_secret_access_key\s*=\s*([A-Za-z0-9/+=]{40})', + + + 'AWS_Access_Key': r'AKIA[0-9A-Z]{16}', + 'AWS_Secret_Key': r'(?i)aws_secret_access_key[\s:=\'"]*[A-Za-z0-9\/+=]{40}', + 'amazon_aws_access_key_id' : r'A[SK]IA[0-9A-Z]{16}', + 'amazon_mws_auth_toke' : r'amzn\\.mws\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}', + 'amazon_aws_url' : r's3\.amazonaws.com[/]+|[a-zA-Z0-9_-]*\.s3\.amazonaws.com', + 'azure_appinsights_api_key': r'x-api-key:\s*([a-zA-Z0-9-_]{32})', + 'azure_appinsights_app_id': r'https://api\.applicationinsights\.io/v1/apps/([a-zA-Z0-9-]{36})', + + + 'facebook_access_token' : r'EAACEdEose0cBA[0-9A-Za-z]+', + 'authorization_bearer' : r'bearer [a-zA-Z0-9_\-\.=:_\+\/]{5,100}', + #'authorization_api' : r'api[key|_key|\s+]+[a-zA-Z0-9_\-]{5,100}', + 'mailgun_api_key' : r'key-[0-9a-zA-Z]{32}', + + 'twilio_api_key_pattern' : r'(?:=|["\'])?(SK[0-9a-fA-F]{32})(?:["\']|;)?', + 'twilio_account_sid_pattern' : r'(?:=|["\'])?(AC[0-9a-fA-F]{32})(?:["\']|;)?', + 'twilio_app_sid_pattern' : r'(?:=|["\'])?(AP[0-9a-fA-F]{32})(?:["\']|;)?', + 'Twilio Account SID': r"(?i)twilio_account_sid[:=]\s*['\"]?([A-Za-z0-9]{34})['\"]?", + 'Twilio Auth Token': r"(?i)twilio_auth_token[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + + + 'paypal_braintree_access_token' : r'access_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32}', + 'square_oauth_secret' : r'sq0csp-[ 0-9A-Za-z\-_]{43}|sq0[a-z]{3}-[0-9A-Za-z\-_]{22,43}', + 'square_access_token' : r'sqOatp-[0-9A-Za-z\-_]{22}|EAAA[a-zA-Z0-9]{60}', + 'square_oauth_token_pattern' : r'sandbox-sq0[a-z0-9-]{22,44}', + + 'stripe_standard_api' : r'sk_live_[0-9a-zA-Z]{24}', + 'stripe_restricted_api' : r'rk_live_[0-9a-zA-Z]{24}', + 'picatic_api_key_pattern' : r'(?i)sk_live_[0-9a-z]{32}', + + 'URL API Key': r"https?://[^\s]+[?&](api[-_]?key|key|token|access[-_]?token)=\"[^\"]+\"", + #'General Token': r"(?i)(token|access[-_]?token|auth[-_]?token|client[-_]?secret|secret[-_]?key|private[-_]?key)[:=]\s*['\"]?([a-zA-Z0-9_\-]+)['\"]?", + + # GitHub keys + 'GitHub Token': r"gh[pous]_[A-Za-z0-9_]{36,40}", + 'GitHub Client ID': r"(?i)github_client_id[:=]\s*['\"]?([a-zA-Z0-9]{20})['\"]?", + 'GitHub Client Secret': r"(?i)github_client_secret[:=]\s*['\"]?([a-zA-Z0-9]{40})['\"]?", + 'github_access_token' : r'[a-zA-Z0-9_-]*:[a-zA-Z0-9_\-]+@github\.com*', + 'gitlab_access_token_pattern' : r'glpat-[0-9a-zA-Z\-]{20}', + 'github_oauth_token_pattern' : r'ghp_[0-9a-zA-Z]{36}', + 'github_private_ssh_key': r'-----BEGIN OPENSSH PRIVATE KEY-----\s([A-Za-z0-9+/=]+)\s-----END OPENSSH PRIVATE KEY-----', + 'github_client_id': r'client_id=([a-zA-Z0-9]{20})', + 'github_client_secret': r'client_secret=([a-zA-Z0-9]{40})', + + + # General API Key patterns + 'Generic API Key': r"(?i)(api[-_]?key|access[-_]?key|secret[-_]?key|client[-_]?id|client[-_]?secret)[:=]\s*['\"]?([a-zA-Z0-9_\-]{16,64})['\"]?", + + # OAuth & Access Tokens + 'OAuth Access Token': r"(?i)access_token[:=]\s*['\"]?([a-zA-Z0-9\-._~+/]+=*)['\"]?", + 'Bearer Token': r"(?i)bearer\s+[a-zA-Z0-9\-._~+/]+=*", + + # Social Media & Cloud Platform Tokens + 'Facebook Access Token': r"(?i)facebook_access_token[:=]\s*['\"]?([a-zA-Z0-9]{64})['\"]?", + 'Instagram Access Token': r"(?i)instagram_access_token[:=]\s*['\"]?([a-zA-Z0-9]{64})['\"]?", + 'Twitter API Key': r"(?i)twitter_api_key[:=]\s*['\"]?([a-zA-Z0-9]{25,35})['\"]?", + 'Twitter API Secret': r"(?i)twitter_api_secret[:=]\s*['\"]?([a-zA-Z0-9]{35,45})['\"]?", + 'foursquare_api_key_pattern' : r'(?i)FSQ[a-zA-Z0-9]{32}', + + + # Payment Platform Credentials + 'Stripe Secret Key': r"(?i)sk_live_[0-9a-zA-Z]{24}", + #'Stripe Publishable Key': r"(?i)pk_live_[0-9a-zA-Z]{24}", + 'PayPal Client ID': r"(?i)paypal_client_id[:=]\s*['\"]?([a-zA-Z0-9]{16,64})['\"]?", + 'PayPal Secret': r"(?i)paypal_secret[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + 'shopify_access_token_pattern' : r'shpat_[0-9a-fA-F]{32}', + 'sendgrid_api_key_pattern' : r'SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}', + #'twitch_api_key_pattern' : r'[a-z0-9]{30}', + 'teams_webhook_pattern' : r'https://[a-zA-Z0-9]+\.webhook\.office\.com/webhookb2/[A-Za-z0-9-]+@[A-Za-z0-9-]+/IncomingWebhook/[A-Za-z0-9-]+/[A-Za-z0-9-]+', + 'mailchimp_api_key_pattern' : r'(?i)[a-z0-9]{32}-us[0-9]{1,2}', + + + + # SaaS Service Tokens and Keys + 'SendGrid API Key': r"(?i)sendgrid_api_key[:=]\s*['\"]?([a-zA-Z0-9]{40})['\"]?", + 'Slack API Token': r"(?i)xox[baprs]-[0-9a-zA-Z]{10,48}", + 'Slack Webhook URL': r"https?://hooks.slack.com/services/[A-Za-z0-9/_]+", + 'Microsoft Azure SAS': r"(?i)SharedAccessSignature\s*sig=[a-zA-Z0-9%+/]+", + + 'Algolia API Key': r"(?i)algolia_api_key[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + 'api_key_pattern1' : r"x-algolia-api-key:\s*([a-zA-Z0-9]+)", + 'api_key_pattern2' : r"x-algolia-api-key:\s*([a-zA-Z0-9]{32})", + 'api_key_pattern3' : r"x-algolia-api-key:\s*([a-zA-Z0-9]{32})", + 'app_id_pattern' : r"x-algolia-application-id:\s*([a-zA-Z0-9]+)", + 'app_id_pattern' : r"x-algolia-application-id:\s*([a-zA-Z0-9]{8})", + + 'abtasty_api_key': r'x-api-key:\s*[a-zA-Z0-9]{32}', + 'custom_token': r'"token":"([a-zA-Z0-9_-]{43})"', + 'api_key': r'\?key=([a-zA-Z0-9]{39})', + 'API key': r'[A-Za-z0-9]{32}:[A-Za-z0-9]{32}', + 'API_key': r'API_Key:\s*([a-zA-Z0-9-_]{32})', + 'x_api_key': r'x-api-key:\s*([a-zA-Z0-9]{32})', + 'private_key_id': r'"private_key_id":\s*"([a-zA-Z0-9_-]+)"', + 'private_key': r'"private_key":\s*"([^"]+)"', + 'access_token': r'accounts\?access_token=([a-zA-Z0-9_-]+)', + 'secret_key': r'Secret_Key:\s*([a-zA-Z0-9-_]{32})', + 'access_token': r'access_token=([a-zA-Z0-9]{32,})', + 'api_key': r'api_key=([a-zA-Z0-9]{32})', + 'application_key': r'application_key=([a-zA-Z0-9]{32})', + 'api_token': r'auth_token=([a-zA-Z0-9]{32})', + 'private_token': r'private_token=([a-zA-Z0-9_-]+)', + 'access_key': r'access_key=([a-zA-Z0-9_-]+)', + 'key': r'\?Key=([a-zA-Z0-9_-]+)', + 'client_secret': r'"client_secret":\s?"([a-zA-Z0-9_-]+)"', + 'secret1': r'"secret\s*:\s*"([^"]+)"', + 'consumer_key': r'CONSUMER_KEY\s*:\s*([a-zA-Z0-9_-]+)', + 'consumer_secret': r'CONSUMER_SECRET\s*:\s*([a-zA-Z0-9_-]+)', + 'api_key': r'api_key\s*:\s*\'([a-zA-Z0-9_-]+)\'', + 'key': r'"key"\s*:\s*"([a-zA-Z0-9_-]+)"', + #'base64_encoded': r'\b([A-Za-z0-9+/=]{4})*([A-Za-z0-9+/=]{2,3})\b', + 'mongo_password': r'mongoPassword\s*:\s*"([^"]+)"', + 'authorization_token': r'payload\["Authorization"\]\s*=\s*"token\s([a-f0-9]{40})"', + 'x_api_key': r'\("x-api-key",\s*"([A-Za-z0-9]+)"\)', + 'client_id': r'client_id\s*=\s*([A-Za-z0-9-_]+)', + + + 'twitter_consumer_key': r'TWITTER_CONSUMER_KEY\s*=\s*([a-zA-Z0-9]{35})', + 'twitter_consumer_secret': r'TWITTER_CONSUMER_SECRET\s*=\s*([a-zA-Z0-9]{50})', + 'twitter_access_key': r'TWITTER_ACCESS_KEY\s*=\s*([0-9]{8}-[a-zA-Z0-9]{30})', + 'twitter_access_secret': r'TWITTER_ACCESS_SECRET\s*=\s*([a-zA-Z0-9]{50})', + 'mixpanel_token': r'MIXPANEL_TOKEN\s*=\s*([a-f0-9]{32})', + 'twitter_consumer_key': r'twitter_consumer_key\s*=\s*([a-z0-9]{35})', + 'twitter_consumer_secret': r'twitter_consumer_secret\s*=\s*([a-z0-9]{50})', + 'twitter_access_key': r'twitter_access_key\s*=\s*([0-9]{8}-[a-z0-9]{30})', + 'twitter_access_secret': r'twitter_access_secret\s*=\s*([a-z0-9]{50})', + 'mixpanel_token': r'mixpanel_token\s*=\s*([a-f0-9]{32})', + 'twitter_consumer_key': r'\btwitter_consumer_key\b|\bTWITTER_CONSUMER_KEY\b', + 'twitter_consumer_secret': r'\btwitter_consumer_secret\b|\bTWITTER_CONSUMER_SECRET\b', + 'twitter_access_key': r'\btwitter_access_key\b|\bTWITTER_ACCESS_KEY\b', + 'twitter_access_secret': r'\btwitter_access_secret\b|\bTWITTER_ACCESS_SECRET\b', + 'mixpanel_token': r'\bmixpanel_token\b|\bMIXPANEL_TOKEN\b', + + 'api_secret': r'\b(api_secret|API_SECRET)\b', + 'apidocs': r'\b(apidocs|APIDOCS)\b', + 'apiSecret': r'\b(apiSecret|APISECRET)\b', + 'app_key': r'\b(app_key|APP_KEY)\b', + 'app_secret': r'\b(app_secret|APP_SECRET)\b', + 'appkey': r'\b(appkey|APPKEY)\b', + 'appkeysecret': r'\b(appkeysecret|APPKEYSECRET)\b', + 'application_key': r'\b(application_key|APPLICATION_KEY)\b', + 'appsecret': r'\b(appsecret|APPSECRET)\b', + 'authorizationToken': r'\b(authorizationToken|AUTHORIZATIONTOKEN)\b', + 'bashrc_password': r'\b(bashrc_password|BASHRC_PASSWORD)\b', + 'bucket_password': r'\b(bucket_password|BUCKET_PASSWORD)\b', + 'codecov_token': r'\b(codecov_token|CODECOV_TOKEN)\b', + 'gmail_password': r'\b(gmail_password|GMAIL_PASSWORD)\b', + 'gmail_username': r'\b(gmail_username|GMAIL_USERNAME)\b', + 'herokuapp': r'\b(herokuapp|HEROKUAPP)\b', + 'jekyll_github_token': r'\b(JEKYLL_GITHUB_TOKEN|jekyll_github_token)\b', + 'ldap_password': r'\b(ldap_password|LDAP_PASSWORD)\b', + 'ldap_username': r'\b(ldap_username|LDAP_USERNAME)\b', + 'npmrc_auth': r'\b(npmrc _auth|NPMRC _AUTH)\b', + 'oauth_token': r'\b(oauth_token|OAUTH_TOKEN)\b', + 'slack_api': r'\b(slack_api|SLACK_API)\b', + 'slack_token': r'\b(slack_token|SLACK_TOKEN)\b', + 'sql_password': r'\b(sql_password|SQL_PASSWORD)\b', + 'ssh': r'\b(ssh|SSH)\b', + 'ssh2_auth_password': r'\b(ssh2_auth_password|SSH2_AUTH_PASSWORD)\b', + 'xoxb': r'\b(xoxb|XOXB)\b', + 'xoxp': r'\b(xoxp|XOXP)\b', + 'aws_secret_key': r'\b(aws_secret_key|AWS_SECRET_KEY)\b', + 'bucket_name': r'\b(bucket_name|BUCKET_NAME)\b', + 's3_access_key_id': r'\b(S3_ACCESS_KEY_ID|s3_access_key_id)\b', + 's3_bucket': r'\b(S3_BUCKET|s3_bucket)\b', + 's3_endpoint': r'\b(S3_ENDPOINT|s3_endpoint)\b', + 's3_secret_access_key': r'\b(S3_SECRET_ACCESS_KEY|s3_secret_access_key)\b', + 'wordpress_db_password': r'\b(WORDPRESS_DB_PASSWORD|wordpress_db_password)\b', + 'redis_password': r'\b(redis_password|REDIS_PASSWORD)\b', + 'root_password': r'\b(root_password|ROOT_PASSWORD)\b', + 'homebrew_github_api_token': r'\b(HOMEBREW_GITHUB_API_TOKEN|homebrew_github_api_token)\b', + 'huggingface_token': r'login\("your_huggingface_token_here"\)', + 'api_access_token': r'api\.set_access_token\("your_api_key_here"\)', + 'hf_api_token_env': r'os\.environ\["HF_API_TOKEN"\]\s*=\s*"your_api_key_here"', + 'hf_api_token_assignment': r'HF_API_TOKEN\s*=\s*"your_api_key_here"', + 'hf_api_token_assignment_no_quotes': r'HF_API_TOKEN\s*=\s*your_api_key_here', + 'hf_api_token_getenv': r'token\s*=\s*os\.getenv\("HF_API_TOKEN"\)', + 'use_auth_token': r'use_auth_token\s*=\s*"your_api_key_here"', + + + 'ipstack_api_key': r'\/[a-zA-Z0-9._%+-]+?\?access_key=([a-zA-Z0-9]{32})', + 'appcenter_api_token': r'X-Api-Token:\s*([a-zA-Z0-9-_]{40})', + 'facebook_access_token': r'access_token=([a-zA-Z0-9%_]{100,})', + 'hubspot_api_key': r'hapikey=([a-zA-Z0-9]{32})', + 'infura_api_key': r'infura\.io/v[0-9]+/([a-fA-F0-9]{32})', + 'npm_token': r'NPM_TOKEN="([a-f0-9-]{36})"', + 'youtube_api_key': r'https:\/\/www\.googleapis\.com\/youtube\/v3\/[^\s?&]+(?:\?[^&]+)?&key=AIza[A-Za-z0-9_-]{33}', + 'linkedin_oauth_url': r'https:\/\/www\.linkedin\.com\/oauth\/v2\/accessToken\?code=([a-zA-Z0-9_-]+)&redirect_uri=([^&]+)&client_id=([^&]+)&client_secret=([^&]+)', + 'shodan_api_key': r'https:\/\/api\.shodan\.io\/shodan\/host\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\?key=([a-zA-Z0-9]{32})', + 'bazaarvoice_passkey': r'\?conversationspasskey=([a-zA-Z0-9]{32})', + 'weblate_secret_key': r'"WEBLATE_SECRET_KEY",\s?"([a-zA-Z0-9!#%&=+_-]{50,})"', + 'access_key_secret': r'access-key-secret\s*=\s*<([a-zA-Z0-9_-]+)>', + 'access_key_id': r'access-key-id\s*=\s*<([a-zA-Z0-9_-]+)>', + 'password': r'password\s*[:=]?\s*([A-Za-z0-9!@#$%^&*(),.?":{}|<>_\-+=~;`/\\[\]<>]*?)', + 'token': r'"token"\s*:\s*"([A-Za-z0-9-_]+)"', + 'password': r'"password"\s*:\s*["\']?([^\s]+)["\']?', + 'pwd': r'"pwd"\s*:\s*["\']?([^\s]+)["\']?', + 'pword': r'"pword"\s*:\s*["\']?([^\s]+)["\']?', + 'mail_host': r'MAIL_HOST\s*=\s*["\']?([^\s]+)["\']?', + 'mail_username': r'MAIL_USERNAME\s*=\s*["\']?([^\s]+)["\']?', + 'mail_password': r'MAIL_PASSWORD\s*=\s*["\']?([^\s]+)["\']?', + + 'pusher_app_id': r'PUSHER_APP_ID\s*=\s*["\']?([^\s]+)["\']?', + 'pusher_app_key': r'PUSHER_APP_KEY\s*=\s*["\']?([^\s]+)["\']?', + 'pusher_app_secret': r'PUSHER_APP_SECRET\s*=\s*["\']?([^\s]+)["\']?', + + 'mix_pusher_app_key': r'MIX_PUSHER_APP_KEY\s*=\s*["\']?([^\s]+)["\']?', + + + 'database_host': r'"DATABASE_HOST"\s*:\s*"([A-Za-z0-9.-]+)"', + 'database_user': r'"DATABASE_USER"\s*:\s*"([A-Za-z0-9_]+)"', + 'database_password': r'"DATABASE_PASSWORD"\s*:\s*"([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)"', + 'database_name': r'"DATABASE_NAME"\s*:\s*"([A-Za-z0-9_]+)"', + 'database_host': r'"DB_HOST"\s*:\s*"([A-Za-z0-9.-]+)"', + 'database_user': r'"DB_USER"\s*:\s*"([A-Za-z0-9_]+)"', + 'database_password': r'"DB_PASSWORD"\s*:\s*"([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)"', + 'database_name': r'"DB_NAME"\s*:\s*"([A-Za-z0-9_]+)"', + 'mysql_db_port': r'DATABASE_PORT\s*=\s*(\d{4,5})', + 'mysql_db_port': r'DB_PORT\s*=\s*(\d{4,5})', + 'mysql_connection_string': r'mysql://([a-zA-Z0-9_-]+):([a-zA-Z0-9!@#$%^&*()_+={}:;,.?<>~-]+)@([a-zA-Z0-9.-]+):(\d{4,5})/([a-zA-Z0-9_-]+)', + 'mysql_access_key': r'mysql_access_key\s*=\s*["\']?([a-zA-Z0-9_-]+)["\']?', + 'mysql_secret_key': r'mysql_secret_key\s*=\s*["\']?([a-zA-Z0-9!@#$%^&*()_+={}:;,.?<>~-]+)["\']?', + + + 'oauth_token': r'"OAUTH_TOKEN"\s*:\s*"([A-Za-z0-9-_]{30,100})"', + 'username': r'"username"\s*:\s*"([A-Za-z0-9_]+)"', + 'api_secret': r"api_secret\s*=\s*'([A-Za-z0-9_!@#$%^&*()\-+=<>]+)'", + 'owner_id': r'"owner_id"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'repo_access_token': r'"repo_access_token"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'project_access_token': r'"project_access_token"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'workspace_access_token': r'"workspace_access_token"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'bitbucket_repo_access': r'bitbucket\.com/credential/[a-zA-Z0-9_\.\-]*', + 'bitbucket_project': r'bitbucket\.com/project/\{[a-f0-9\-]{36}\}', + 'bitbucket_workspace': r'bitbucket\.com/workspace/\{[a-f0-9\-]{36}\}', + + + 'email': r'\s*([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,})\s*', + 'password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'api_key': r'\s*([A-Za-z0-9-_]{32,64})\s*', + 'access_token': r'\s*([A-Za-z0-9-_]{40})\s*', + 'secret_key': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'ssh_key': r'\s*([A-Za-z0-9+/=]{100,})\s*', + 'api_secret': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'oauth_token': r'\s*([A-Za-z0-9-_]{30,100})\s*', + 'db_password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'jwt_token': r'\s*([A-Za-z0-9-_]{30,500})\s*', + 'private_key': r'\s*([A-Za-z0-9+/=]{200,})\s*', + 'public_key': r'\s*([A-Za-z0-9+/=]{200,})\s*', + 'credit_card': r'\s*(\d{16})\s*', + 'ssn': r'\s*(\d{3}-\d{2}-\d{4})\s*', + 'phone_number': r'\s*(\+?\d{1,2}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4})\s*', + 'bank_account_number': r'\s*(\d{9,18})\s*', + 'card_number': r'\s*(\d{13,19})\s*', + 'license_key': r'\s*([A-Za-z0-9-]+)\s*', + 'user_token': r'\s*([A-Za-z0-9-_]{20,50})\s*', + 'session_id': r'\s*([A-Za-z0-9]{16,64})\s*', + 'api_url': r'\s*(https?://[A-Za-z0-9.-]+(?:\.[A-Za-z]{2,6})?[^"\s]*)\s*', + 'email_address': r'\s*([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,})\s*', + 'security_code': r'\s*(\d{3,4})\s*', + 'auth_token': r'\s*([A-Za-z0-9-_]{40,})\s*', + 'customer_id': r'\s*([A-Za-z0-9]{8,32})\s*', + 'credit_card_expiry': r'\s*(\d{2}/\d{2})\s*', + 'auth_code': r'\s*([A-Za-z0-9]{6,10})\s*', + 'otp_code': r'\s*(\d{6})\s*', + 'email_password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'user_secret': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'private_key_data': r'\s*([A-Za-z0-9+/=]{100,})\s*', + 'public_key_data': r'\s*([A-Za-z0-9+/=]{100,})\s*', + 'server_password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'login_token': r'\s*([A-Za-z0-9-_]{30,100})\s*', + 'api_auth_key': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'database_url': r'\s*(https?://[A-Za-z0-9.-]+(?:\.[A-Za-z]{2,6})?[^"\s]*)\s*', + 'firebase_key': r'\s*([A-Za-z0-9-_]{40,})\s*', + 'paypal_client_secret': r'\s*([A-Za-z0-9-_]{40,})\s*', + 'google_client_id': r'\s*([A-Za-z0-9-.]{25,})\s*', + 'google_client_secret': r'\s*([A-Za-z0-9-_]{30,})\s*', + 'stripe_api_key': r'\s*([A-Za-z0-9]{24,45})\s*', + 'aws_access_key': r'\s*([A-Za-z0-9]{20})\s*', + 'aws_secret_key': r'\s*([A-Za-z0-9+/=]{40})\s*', + 'discord_token': r'\s*([A-Za-z0-9-_]{24,36})\s*', + 'linkedin_api_key': r'\s*([A-Za-z0-9-_]{30,50})\s*', + 'zoom_api_key': r'\s*([A-Za-z0-9]{32})\s*', + 'paypal_api_key': r'\s*([A-Za-z0-9]{24,45})\s*', + 'azure_subscription_key': r'\s*([A-Za-z0-9]{32})\s*', + 'gitlab_token': r'\s*([A-Za-z0-9]{20,40})\s*', + 'salesforce_api_key': r'\s*([A-Za-z0-9]{32})\s*', + 'telegram_bot_token': r'\s*([A-Za-z0-9]{45})\s*', + 'bitcoin_private_key': r'\s*([A-Za-z0-9]{51})\s*', + 'bitbucket_api_key': r'\s*([A-Za-z0-9-_]{36})\s*', + 'webhook_secret': r'\s*([A-Za-z0-9]{32})\s*', + 'vpn_key': r'\s*([A-Za-z0-9-_]{64})\s*', + 'github_personal_access_token': r'\s*([A-Za-z0-9]{40})\s*', + + + 'asana_access_token': r'Authorization:\s*Bearer\s+([a-zA-Z0-9-_]{32,64})', + 'applicationinsights_api_key': r'x-api-key:\s*([a-zA-Z0-9-_]{32})', + 'bazaarvoice_passkey': r'conversationspasskey=([a-zA-Z0-9]{32})', + 'bitly_access_token': r'access_token=([a-zA-Z0-9]{32})', + 'branch_io_key': r'v1/app/([a-zA-Z0-9]{16})\?branch_secret=', + 'branch_io_secret': r'branch_secret=([a-zA-Z0-9]{32})', + 'buildkite_access_token': r'https://api\.buildkite\.com/v2/access-token', + 'contentful_space_id': r'https://cdn\.contentful\.com/spaces/([a-zA-Z0-9]{36})/entries', + 'contentful_access_token': r'access_token=([a-zA-Z0-9]{32,64})', + 'circleci_api_token': r'circle-token=([a-zA-Z0-9]{32})', + 'cypress_record_key': r'"recordKey":"([a-zA-Z0-9]{32})"', + 'cypress_project_id': r'"projectId":"([a-zA-Z0-9]{32})"', + 'flowdock_api_token': r'"flowdock_api_token"\s*:\s*"([a-f0-9]{32})"', + 'ethereum_private_key': r'ETHEREUM_PRIVATE_KEY\s*[:=]?\s*([a-f0-9]{64})', + + + 'MailChimp API Key': r"(?i)[0-9a-f]{32}-us[0-9]{1,2}", + 'DataDog API Key': r"(?i)datadog_api_key[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + 'Heroku API Key': r"(?i)heroku_api_key[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + 'Dropbox API Key': r"(?i)dropbox_api_key[:=]\s*['\"]?([a-zA-Z0-9]{15})['\"]?", + 'discord_bot_token_pattern' : r'[A-Za-z]{24}\.[A-Za-z]{6}\.[A-Za-z0-9_-]{27}', + 'dropbox_access_token_pattern' : r'sl\.[a-zA-Z0-9_-]{15,}', + + + 'CircleCI Token': r"(?i)circleci_token[:=]\s*['\"]?([a-zA-Z0-9]{20,40})['\"]?", + 'Travis CI Token': r"(?i)travis_token[:=]\s*['\"]?([a-zA-Z0-9]{40})['\"]?", + 'GitLab Personal Access Token': r"(?i)glpat-[a-zA-Z0-9-_]{20,40}", + + + 'rsa_private_key' : r'-----BEGIN RSA PRIVATE KEY-----', + 'ssh_dsa_private_key' : r'-----BEGIN DSA PRIVATE KEY-----', + 'ssh_dc_private_key' : r'-----BEGIN EC PRIVATE KEY-----', + 'pgp_private_block' : r'-----BEGIN PGP PRIVATE KEY BLOCK-----', + 'Diffie-Hellman Parameters': r'-----BEGIN DH PARAMETERS-----', + 'PEM Certificate': r'-----BEGIN CERTIFICATE-----', + + #'json_web_token' : r'ey[A-Za-z0-9-_=]+\.[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*$', + 'slack_token' : r"\"api_token\":\"(xox[a-zA-Z]-[a-zA-Z0-9-]+)\"", + 'slack_webhook_pattern' : r'https://hooks.slack.com/services/[A-Za-z0-9]+/[A-Za-z0-9]+/[A-Za-z0-9]+', + 'slack_webhook_url': r'https:\/\/hooks\.slack\.com\/services\/([A-Z0-9]+\/[A-Z0-9]+\/[A-Z0-9]+)', + 'SSH_privKey' : r"([-]+BEGIN [^\s]+ PRIVATE KEY[-]+[\s]*[^-]*[-]+END [^\s]+ PRIVATE KEY[-]+)", + + #'Heroku API KEY' : r'\b(?:(?:heroku_)?[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\b', + #'Heroku API KEY' : r'(?i)^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$', + #'heroku_api_key_pattern' : r'(?i)heroku_[0-9a-fA-F]{32}', + + #'possible_Creds' : r"(?i)(" \ + # r"password\s*[`=:\"]+\s*[^\s]+|" \ + # r"password is\s*[`=:\"]*\s*[^\s]+|" \ + # r"pwd\s*[`=:\"]*\s*[^\s]+|" \ + # r"passwd\s*[`=:\"]+\s*[^\s]+)", + #'password_pattern' : r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$', + + # encryption + #'Base64': r'^[A-Za-z0-9+/]+={0,2}$', + + # Variations of "key" in the context of secret keys or tokens + 'URL API Key': r"https?://[^\s]+[?&](api[-_]?key|key|token|access[-_]?token)=\"[^\"]+\"", + # Passwords or other sensitive information in environment variables + 'Env_Var_Creds': r"(?i)(env\.(password|passwd|pwd|key|secret)\s*[:=]\s*[^\s]+)", + # Email + Password combinations (often seen in user data dumps) + # 'Email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}(?=\s|$)', + 'Email_Password': r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}:[^\s]+", + + # Custom patterns: e.g., secret keys + #'Custom_Secret': r"(?i)(secret[-_]?(key)?|access[-_]?(key)?|secret\s*[:=]\s*[^\s]+)", + # Common password patterns + + #'API_Key': r'(?i)(api_key|apikey|key|token|auth_token|access_token)[\s:=\'"]+\w{16,64}', + 'Bearer_Token': r'\bBearer\s+[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\b', + + # Common password hints or formats + 'Username_Password': r'\b(username|user|uname|login)[\s:=\'"]+[^\s]+[\s,;]+(pass|password|pwd|passwd)[\s:=\'"]+[^\s]+\b', + + # JWT Pattern (Common in CTFs for encoded data or tokens) + 'JWT': r'eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+', + + # cradit card + 'Credit Card': r'^(?:4[0-9]{12}(?:[0-9]{3})?)$', + + + 'phone_number' : r'^\+\d{1,3}\s?\d{4,14}$', # Matches international and US formats + #'ipv4_address' : r'\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\b', # Matches IPv4 addresses + 'http_true_client_ip' : r'http_true_client_ip:\s*(\b(?:\d{1,3}\.){3}\d{1,3}\b)', # Custom header pattern for True-Client-IP + 'http_x_arr_log_id' : r'http_x_arr_log_id:\s*[a-zA-Z0-9-]+', # Custom header pattern for X-ARR-LOG-ID + + + 'sha512_pattern' : r'\b[a-fA-F0-9]{128}\b', + 'sha512_base64_pattern' : r'\b[A-Za-z0-9+/]{86}==\b', + 'sha512_hex_pattern' : r'\b[a-fA-F0-9]{128}\b', + 'sha512_combined_pattern' : r'\b([a-fA-F0-9]{128}|[A-Za-z0-9+/]{86}==)\b', + + + #'Hex_16': r'\b[0-9a-fA-F]{16}\b', + #'Hex_24': r'\b[0-9a-fA-F]{24}\b', + #'Hex_32': r'\b[0-9a-fA-F]{32}\b', + #'Hex_40': r'\b[0-9a-fA-F]{40}\b', + #'Hex_Encoded': r'\b[0-9a-fA-F]{32,}\b', + #'Simple_Passphrase': r'\b(pass|password|pwd|passwd)[\s:=\'"]*\w+\b', + #'sensitive_terms_pattern' : r"(?i)\b(api|access|auth|client|secret|key)[-_ ]?(token|id|key|secret|code)?\b", + #'Hex_Encoded': r'\b[0-9a-fA-F]{32,}\b', + #'API_Key': r"(?i)(api[-_]?key\s*[:=]\s*[^\s]+)", + + #'MD5': r'\b[a-fA-F0-9]{32}\b', + #'Bcrypt': r'\$2[aby]?\$\d{2}\$[./A-Za-z0-9]{53}', + #'SHA-1': r'\b[a-fA-F0-9]{40}\b', + #'Bcrypt': r'\$2[aby]?\$\d{2}\$[./A-Za-z0-9]{53}', +} + +def clone_and_scan_repo(repo_url): + findings = [] # List to hold findings + # Create a temporary directory to clone the repository + with tempfile.TemporaryDirectory() as temp_dir: + try: + # Clone the repository + git.Repo.clone_from(repo_url, temp_dir) + print(f"Repository cloned to {temp_dir}") + + # Walk through the files in the cloned repository + for root, dirs, files in os.walk(temp_dir): + for file in files: + file_path = os.path.join(root, file) + + # Only scan text-based files (skip binary files) + try: + with open(file_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + + # Scan each line with regex patterns + for line_num, line in enumerate(lines, start=1): + for pattern_name, pattern in patterns.items(): + if re.search(pattern, line): + findings.append({ + 'pattern_name': pattern_name, + 'file_path': file_path, + 'line_num': line_num, + 'content': line.strip(), + }) + except (UnicodeDecodeError, IOError): + # Skip files that can't be read as text + continue + except git.exc.GitError as e: + print(f"Failed to clone repository: {e}") + + return findings diff --git a/myapp/glsearch.py b/myapp/glsearch.py new file mode 100644 index 0000000..0ab779c --- /dev/null +++ b/myapp/glsearch.py @@ -0,0 +1,10 @@ +from googlesearch import search + +def find_google_link(site_qry): + site = str(site_qry) + google_link=[] + query = f"{site}" + for j in search(query, tld="co.in", num=10, stop=10, pause=2): + google_link.append(j) + + return google_link \ No newline at end of file diff --git a/myapp/linkscraping.py b/myapp/linkscraping.py new file mode 100644 index 0000000..a71e63b --- /dev/null +++ b/myapp/linkscraping.py @@ -0,0 +1,68 @@ +# linkscraping.py +import requests +from bs4 import BeautifulSoup +import re +from urllib.parse import urljoin +from concurrent.futures import ThreadPoolExecutor + +# Define file extensions to look for +file_extensions = [ + '.js', '.php', '.bak', '.config', '.html', '.json', '.xml', '.txt', '.env', '.config', '.yml', + '.yaml', '.ini', '.log', '.backup', '.sql', '.inc', '.key', '.crt', '.pem', '.cert', '.csr', + '.pfx', '.p12', '.ovpn', '.db', '.sqlite', '.sqlite3', '.md', '.pwd', '.passwd', '.htpasswd', + '.htaccess', '.bash_history', '.ssh', '.ssh_config', '.pub', '.ppk', '.rdp', '.cfg', '.dat', + '.old', '.properties', '.xls', '.xlsx', '.doc', '.docx', '.ppt', '.pptx', '.pdf', '.rdlc', + '.pswd', '.jsp', '.aspx', '.asp', '.cfm', '.pl', '.cgi' , '.css' +] + +# Regex pattern to detect URLs with specified extensions +file_pattern = re.compile(r'(\.(js|php|html|sql|xml|json|txt|config|yml|yaml|ini|bak|backup|log|sql|inc|key|crt|pem|csr|pfx|db|sqlite|sqlite3|md|pwd|passwd|cfg|dat|xls|xlsx|doc|ppt|pdf|jsp|aspx|asp|cfm|pl|cgi)(\?.*)?)$') + +def get_links(url): + """Fetch all internal and resource links from the URL.""" + try: + response = requests.get(url, timeout=5) + if response.status_code != 200: + return [], [] + + soup = BeautifulSoup(response.text, 'html.parser') + links, resources = [], [] + + for tag in soup.find_all(['a', 'link', 'script', 'img']): + href = tag.get('href') or tag.get('src') + if href: + full_url = urljoin(url, href) + if full_url.startswith(('http', 'https')): + if re.search(file_pattern, full_url): + resources.append(full_url) + else: + links.append(full_url) + + return list(set(links)), list(set(resources)) + + except Exception as e: + print(f"Error fetching {url}: {e}") + return [], [] + +def recursive_crawl(url, visited, resources_found): + """Recursively crawl and collect resources.""" + if url in visited: + return + visited.add(url) + + links, resources = get_links(url) + resources_found.extend(resources) + + with ThreadPoolExecutor(max_workers=5) as executor: + futures = [executor.submit(recursive_crawl, link, visited, resources_found) for link in links] + for future in futures: + future.result() + +def scan_multiple_urls(urls): + """Scan multiple URLs and return all found resources.""" + all_resources = {} + for url in urls: + resources_found = [] + recursive_crawl(url, set(), resources_found) + all_resources[url] = resources_found if resources_found else ["No resources found."] + return all_resources diff --git a/myapp/linkscrapping.py b/myapp/linkscrapping.py new file mode 100644 index 0000000..40b4cd6 --- /dev/null +++ b/myapp/linkscrapping.py @@ -0,0 +1,47 @@ +import requests +from bs4 import BeautifulSoup +from urllib.parse import urljoin +from .models import Linkscrap # Import the modified Django model + +headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' +} + +file_extensions = ['.js', '.php', '.bak', '.config', '.html', '.json', '.xml', '.txt', '.env', '.config', '.yml', + '.yaml', '.ini', '.log', '.backup', '.sql', '.inc', '.key', '.crt', '.pem', '.cert', '.csr', + '.pfx', '.p12', '.ovpn', '.db', '.sqlite', '.sqlite3', '.md', '.pwd', '.passwd', '.htpasswd', + '.htaccess', '.bash_history', '.ssh', '.ssh_config', '.pub', '.ppk', '.rdp', '.cfg', '.dat', + '.old', '.properties', '.xls', '.xlsx', '.doc', '.docx', '.ppt', '.pptx', '.pdf', '.rdlc', + '.pswd', '.jsp', '.aspx', '.asp', '.cfm', '.pl', '.cgi'] + +def is_valid(url): + return url.startswith('http') or url.startswith('https') + +def find_all_links(base_url, visited, depth): + urls = [] # Array to store unique URLs + + if depth == 0: + return [] + + try: + response = requests.get(base_url, headers=headers, timeout=5) + if response.status_code == 200: + soup = BeautifulSoup(response.content, 'html.parser') + + for tag in soup.find_all(['a', 'link', 'script', 'img']): + link = tag.get('href') or tag.get('src') + + if link: + full_link = urljoin(base_url, link) + if is_valid(full_link) and full_link not in visited: + visited.add(full_link) + if any(full_link.endswith(ext) for ext in file_extensions): + urls.append(full_link) + Linkscrap.objects.get_or_create(link=full_link) + + urls.extend(find_all_links(full_link, visited, depth - 1)) + + except requests.RequestException: + pass + + return urls diff --git a/myapp/migrations/0001_initial.py b/myapp/migrations/0001_initial.py new file mode 100644 index 0000000..7b8592e --- /dev/null +++ b/myapp/migrations/0001_initial.py @@ -0,0 +1,78 @@ +# Generated by Django 4.2.16 on 2024-10-23 06:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Dirlist', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('main_url', models.URLField()), + ('directory', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Findbase64', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('base64_url', models.URLField()), + ('encoded_base64', models.CharField(max_length=255)), + ('decoded_base64', models.CharField(max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Gitleak', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('git_url', models.URLField()), + ('leak_result', models.CharField(max_length=500)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='GoogleLink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('query', models.CharField(max_length=255)), + ('link', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Secretfinder', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('secret_url', models.URLField()), + ('secret_result', models.CharField(max_length=500)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Subdomain', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain_name', models.CharField(max_length=255)), + ('subdomains', models.CharField(max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Webscrap', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('parent_urls', models.URLField()), + ('scrap_link', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0002_domainresult_decodedresult.py b/myapp/migrations/0002_domainresult_decodedresult.py new file mode 100644 index 0000000..c8500d4 --- /dev/null +++ b/myapp/migrations/0002_domainresult_decodedresult.py @@ -0,0 +1,31 @@ +# Generated by Django 4.2.16 on 2024-10-23 10:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='DomainResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain', models.CharField(max_length=255)), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='DecodedResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('encoded_str', models.TextField()), + ('decoded_str', models.TextField()), + ('domain_result', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myapp.domainresult')), + ], + ), + ] diff --git a/myapp/migrations/0003_alter_decodedresult_domain_result.py b/myapp/migrations/0003_alter_decodedresult_domain_result.py new file mode 100644 index 0000000..eddff26 --- /dev/null +++ b/myapp/migrations/0003_alter_decodedresult_domain_result.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.16 on 2024-10-23 12:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0002_domainresult_decodedresult'), + ] + + operations = [ + migrations.AlterField( + model_name='decodedresult', + name='domain_result', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decoded_results', to='myapp.domainresult'), + ), + ] diff --git a/myapp/migrations/0004_domainresult1_alter_decodedresult_domain_result_and_more.py b/myapp/migrations/0004_domainresult1_alter_decodedresult_domain_result_and_more.py new file mode 100644 index 0000000..fad977d --- /dev/null +++ b/myapp/migrations/0004_domainresult1_alter_decodedresult_domain_result_and_more.py @@ -0,0 +1,36 @@ +# Generated by Django 4.2.16 on 2024-10-23 12:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0003_alter_decodedresult_domain_result'), + ] + + operations = [ + migrations.CreateModel( + name='DomainResult1', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain', models.CharField(max_length=255)), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.AlterField( + model_name='decodedresult', + name='domain_result', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myapp.domainresult'), + ), + migrations.CreateModel( + name='DecodedResult1', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('encoded_str', models.TextField()), + ('decoded_str', models.TextField()), + ('domain_result', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decoded_results', to='myapp.domainresult')), + ], + ), + ] diff --git a/myapp/migrations/0005_scanresult.py b/myapp/migrations/0005_scanresult.py new file mode 100644 index 0000000..3451071 --- /dev/null +++ b/myapp/migrations/0005_scanresult.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.16 on 2024-10-23 15:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0004_domainresult1_alter_decodedresult_domain_result_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='ScanResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('encoded_value', models.TextField()), + ('decoded_value', models.TextField()), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0006_delete_scanresult.py b/myapp/migrations/0006_delete_scanresult.py new file mode 100644 index 0000000..98f3c1a --- /dev/null +++ b/myapp/migrations/0006_delete_scanresult.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-23 16:26 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0005_scanresult'), + ] + + operations = [ + migrations.DeleteModel( + name='ScanResult', + ), + ] diff --git a/myapp/migrations/0007_remove_decodedresult_domain_result_and_more.py b/myapp/migrations/0007_remove_decodedresult_domain_result_and_more.py new file mode 100644 index 0000000..0c87bea --- /dev/null +++ b/myapp/migrations/0007_remove_decodedresult_domain_result_and_more.py @@ -0,0 +1,48 @@ +# Generated by Django 4.2.16 on 2024-10-23 16:28 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0006_delete_scanresult'), + ] + + operations = [ + migrations.RemoveField( + model_name='decodedresult', + name='domain_result', + ), + migrations.RemoveField( + model_name='decodedresult1', + name='domain_result', + ), + migrations.DeleteModel( + name='Dirlist', + ), + migrations.DeleteModel( + name='DomainResult1', + ), + migrations.DeleteModel( + name='Findbase64', + ), + migrations.DeleteModel( + name='Gitleak', + ), + migrations.DeleteModel( + name='Secretfinder', + ), + migrations.DeleteModel( + name='Webscrap', + ), + migrations.DeleteModel( + name='DecodedResult', + ), + migrations.DeleteModel( + name='DecodedResult1', + ), + migrations.DeleteModel( + name='DomainResult', + ), + ] diff --git a/myapp/migrations/0008_scrapedlink.py b/myapp/migrations/0008_scrapedlink.py new file mode 100644 index 0000000..7406b13 --- /dev/null +++ b/myapp/migrations/0008_scrapedlink.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-24 06:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0007_remove_decodedresult_domain_result_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='ScrapedLink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain', models.CharField(max_length=255)), + ('link', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0009_scrapedlink11.py b/myapp/migrations/0009_scrapedlink11.py new file mode 100644 index 0000000..fe82b2d --- /dev/null +++ b/myapp/migrations/0009_scrapedlink11.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.16 on 2024-10-24 06:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0008_scrapedlink'), + ] + + operations = [ + migrations.CreateModel( + name='ScrapedLink11', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('link', models.URLField(unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0010_delete_scrapedlink.py b/myapp/migrations/0010_delete_scrapedlink.py new file mode 100644 index 0000000..a3c5b9b --- /dev/null +++ b/myapp/migrations/0010_delete_scrapedlink.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-24 07:11 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0009_scrapedlink11'), + ] + + operations = [ + migrations.DeleteModel( + name='ScrapedLink', + ), + ] diff --git a/myapp/migrations/0011_directoryenumresult.py b/myapp/migrations/0011_directoryenumresult.py new file mode 100644 index 0000000..9960754 --- /dev/null +++ b/myapp/migrations/0011_directoryenumresult.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-24 13:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0010_delete_scrapedlink'), + ] + + operations = [ + migrations.CreateModel( + name='DirectoryEnumResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain', models.CharField(max_length=255)), + ('link', models.CharField(max_length=500)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0012_directoryenumeration.py b/myapp/migrations/0012_directoryenumeration.py new file mode 100644 index 0000000..03dfcdd --- /dev/null +++ b/myapp/migrations/0012_directoryenumeration.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-24 13:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0011_directoryenumresult'), + ] + + operations = [ + migrations.CreateModel( + name='DirectoryEnumeration', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain', models.CharField(max_length=255)), + ('directory', models.URLField(max_length=500)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0013_gitleak.py b/myapp/migrations/0013_gitleak.py new file mode 100644 index 0000000..e260829 --- /dev/null +++ b/myapp/migrations/0013_gitleak.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.16 on 2024-10-24 15:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0012_directoryenumeration'), + ] + + operations = [ + migrations.CreateModel( + name='GitLeak', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('repo_url', models.URLField()), + ('leak_type', models.CharField(max_length=255)), + ('leak_value', models.TextField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0014_delete_gitleak.py b/myapp/migrations/0014_delete_gitleak.py new file mode 100644 index 0000000..b3e038e --- /dev/null +++ b/myapp/migrations/0014_delete_gitleak.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-24 16:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0013_gitleak'), + ] + + operations = [ + migrations.DeleteModel( + name='GitLeak', + ), + ] diff --git a/myapp/migrations/0015_githubscan_secretscan.py b/myapp/migrations/0015_githubscan_secretscan.py new file mode 100644 index 0000000..dfbbd88 --- /dev/null +++ b/myapp/migrations/0015_githubscan_secretscan.py @@ -0,0 +1,32 @@ +# Generated by Django 4.2.16 on 2024-10-25 05:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0014_delete_gitleak'), + ] + + operations = [ + migrations.CreateModel( + name='GitHubScan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('repository_url', models.URLField(max_length=255)), + ('scan_results', models.JSONField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='SecretScan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField(max_length=500)), + ('secret_type', models.CharField(max_length=100)), + ('secret_value', models.TextField()), + ('scanned_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0016_scrapedlink_delete_directoryenumresult_and_more.py b/myapp/migrations/0016_scrapedlink_delete_directoryenumresult_and_more.py new file mode 100644 index 0000000..cc39172 --- /dev/null +++ b/myapp/migrations/0016_scrapedlink_delete_directoryenumresult_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.16 on 2024-10-25 11:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0015_githubscan_secretscan'), + ] + + operations = [ + migrations.CreateModel( + name='ScrapedLink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('base_url', models.URLField()), + ('directory', models.URLField(unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.DeleteModel( + name='DirectoryEnumResult', + ), + migrations.DeleteModel( + name='ScrapedLink11', + ), + ] diff --git a/myapp/migrations/0017_rename_base_url_scrapedlink_link_and_more.py b/myapp/migrations/0017_rename_base_url_scrapedlink_link_and_more.py new file mode 100644 index 0000000..a0f7b22 --- /dev/null +++ b/myapp/migrations/0017_rename_base_url_scrapedlink_link_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-25 18:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0016_scrapedlink_delete_directoryenumresult_and_more'), + ] + + operations = [ + migrations.RenameField( + model_name='scrapedlink', + old_name='base_url', + new_name='link', + ), + migrations.RemoveField( + model_name='scrapedlink', + name='directory', + ), + ] diff --git a/myapp/migrations/0018_delete_scrapedlink.py b/myapp/migrations/0018_delete_scrapedlink.py new file mode 100644 index 0000000..6df7b37 --- /dev/null +++ b/myapp/migrations/0018_delete_scrapedlink.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-25 18:26 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0017_rename_base_url_scrapedlink_link_and_more'), + ] + + operations = [ + migrations.DeleteModel( + name='ScrapedLink', + ), + ] diff --git a/myapp/migrations/0019_scraplink.py b/myapp/migrations/0019_scraplink.py new file mode 100644 index 0000000..621bdfb --- /dev/null +++ b/myapp/migrations/0019_scraplink.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.16 on 2024-10-25 18:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0018_delete_scrapedlink'), + ] + + operations = [ + migrations.CreateModel( + name='Scraplink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('link', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0020_rename_scraplink_linkscrap.py b/myapp/migrations/0020_rename_scraplink_linkscrap.py new file mode 100644 index 0000000..35b73c6 --- /dev/null +++ b/myapp/migrations/0020_rename_scraplink_linkscrap.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.16 on 2024-10-26 03:43 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0019_scraplink'), + ] + + operations = [ + migrations.RenameModel( + old_name='Scraplink', + new_name='Linkscrap', + ), + ] diff --git a/myapp/migrations/0021_hashresult.py b/myapp/migrations/0021_hashresult.py new file mode 100644 index 0000000..5eb7bb9 --- /dev/null +++ b/myapp/migrations/0021_hashresult.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-26 05:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0020_rename_scraplink_linkscrap'), + ] + + operations = [ + migrations.CreateModel( + name='HashResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('encrypted_value', models.TextField()), + ('encryption_type', models.CharField(max_length=50)), + ], + ), + ] diff --git a/myapp/migrations/0022_sitemapurl.py b/myapp/migrations/0022_sitemapurl.py new file mode 100644 index 0000000..ba245c1 --- /dev/null +++ b/myapp/migrations/0022_sitemapurl.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.16 on 2024-10-27 15:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0021_hashresult'), + ] + + operations = [ + migrations.CreateModel( + name='SitemapURL', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField(unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0023_linkcheckresult.py b/myapp/migrations/0023_linkcheckresult.py new file mode 100644 index 0000000..cd30ae9 --- /dev/null +++ b/myapp/migrations/0023_linkcheckresult.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-29 10:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0022_sitemapurl'), + ] + + operations = [ + migrations.CreateModel( + name='LinkCheckResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('found_link', models.URLField()), + ('checked_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0024_linkresult.py b/myapp/migrations/0024_linkresult.py new file mode 100644 index 0000000..5c83a94 --- /dev/null +++ b/myapp/migrations/0024_linkresult.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-29 13:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0023_linkcheckresult'), + ] + + operations = [ + migrations.CreateModel( + name='LinkResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('found_link', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.py b/myapp/migrations/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.py new file mode 100644 index 0000000..41ff771 --- /dev/null +++ b/myapp/migrations/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.16 on 2024-10-29 14:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0024_linkresult'), + ] + + operations = [ + migrations.CreateModel( + name='ScrapedLink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain_name', models.CharField(max_length=255)), + ('link', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.DeleteModel( + name='LinkCheckResult', + ), + migrations.DeleteModel( + name='LinkResult', + ), + ] diff --git a/myapp/migrations/0026_alllinkscrap_delete_scrapedlink.py b/myapp/migrations/0026_alllinkscrap_delete_scrapedlink.py new file mode 100644 index 0000000..6963f46 --- /dev/null +++ b/myapp/migrations/0026_alllinkscrap_delete_scrapedlink.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.16 on 2024-10-29 14:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0025_scrapedlink_delete_linkcheckresult_delete_linkresult'), + ] + + operations = [ + migrations.CreateModel( + name='AllLinkScrap', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('link', models.URLField(unique=True)), + ('scraped_at', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.DeleteModel( + name='ScrapedLink', + ), + ] diff --git a/myapp/migrations/0027_crawledlink_delete_alllinkscrap.py b/myapp/migrations/0027_crawledlink_delete_alllinkscrap.py new file mode 100644 index 0000000..7ac80c7 --- /dev/null +++ b/myapp/migrations/0027_crawledlink_delete_alllinkscrap.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.16 on 2024-10-29 15:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0026_alllinkscrap_delete_scrapedlink'), + ] + + operations = [ + migrations.CreateModel( + name='CrawledLink', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('base_url', models.URLField()), + ('link', models.URLField()), + ], + ), + migrations.DeleteModel( + name='AllLinkScrap', + ), + ] diff --git a/myapp/migrations/0028_delete_crawledlink.py b/myapp/migrations/0028_delete_crawledlink.py new file mode 100644 index 0000000..b913ca3 --- /dev/null +++ b/myapp/migrations/0028_delete_crawledlink.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-29 15:53 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0027_crawledlink_delete_alllinkscrap'), + ] + + operations = [ + migrations.DeleteModel( + name='CrawledLink', + ), + ] diff --git a/myapp/migrations/0029_delete_hashresult.py b/myapp/migrations/0029_delete_hashresult.py new file mode 100644 index 0000000..be96bd6 --- /dev/null +++ b/myapp/migrations/0029_delete_hashresult.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-30 17:33 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0028_delete_crawledlink'), + ] + + operations = [ + migrations.DeleteModel( + name='HashResult', + ), + ] diff --git a/myapp/migrations/0030_gitscanresult.py b/myapp/migrations/0030_gitscanresult.py new file mode 100644 index 0000000..8f10b16 --- /dev/null +++ b/myapp/migrations/0030_gitscanresult.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.16 on 2024-10-30 18:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0029_delete_hashresult'), + ] + + operations = [ + migrations.CreateModel( + name='GitScanResult', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('repo_url', models.URLField()), + ('result_data', models.JSONField()), + ('scanned_at', models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/myapp/migrations/0031_sensitivedatafinding_delete_gitscanresult.py b/myapp/migrations/0031_sensitivedatafinding_delete_gitscanresult.py new file mode 100644 index 0000000..68b887d --- /dev/null +++ b/myapp/migrations/0031_sensitivedatafinding_delete_gitscanresult.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.16 on 2024-10-31 04:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0030_gitscanresult'), + ] + + operations = [ + migrations.CreateModel( + name='SensitiveDataFinding', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('repo_url', models.URLField()), + ('file_path', models.CharField(max_length=255)), + ('strings_found', models.JSONField()), + ('commit_id', models.CharField(max_length=100)), + ('commit_author', models.CharField(max_length=255)), + ('commit_date', models.DateTimeField()), + ('commit_message', models.TextField()), + ], + ), + migrations.DeleteModel( + name='GitScanResult', + ), + ] diff --git a/myapp/migrations/0032_delete_sensitivedatafinding.py b/myapp/migrations/0032_delete_sensitivedatafinding.py new file mode 100644 index 0000000..f971bc0 --- /dev/null +++ b/myapp/migrations/0032_delete_sensitivedatafinding.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.16 on 2024-10-31 05:05 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0031_sensitivedatafinding_delete_gitscanresult'), + ] + + operations = [ + migrations.DeleteModel( + name='SensitiveDataFinding', + ), + ] diff --git a/myapp/migrations/0033_scrapedresource.py b/myapp/migrations/0033_scrapedresource.py new file mode 100644 index 0000000..23521e1 --- /dev/null +++ b/myapp/migrations/0033_scrapedresource.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.16 on 2024-11-02 13:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0032_delete_sensitivedatafinding'), + ] + + operations = [ + migrations.CreateModel( + name='ScrapedResource', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('source_url', models.URLField()), + ('resource_url', models.URLField()), + ], + ), + ] diff --git a/myapp/migrations/0034_rename_scrapedresource_linkresource_and_more.py b/myapp/migrations/0034_rename_scrapedresource_linkresource_and_more.py new file mode 100644 index 0000000..3a8c12a --- /dev/null +++ b/myapp/migrations/0034_rename_scrapedresource_linkresource_and_more.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.16 on 2024-11-02 14:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0033_scrapedresource'), + ] + + operations = [ + migrations.RenameModel( + old_name='ScrapedResource', + new_name='LinkResource', + ), + migrations.RenameField( + model_name='linkresource', + old_name='resource_url', + new_name='resource', + ), + migrations.RenameField( + model_name='linkresource', + old_name='source_url', + new_name='url', + ), + ] diff --git a/myapp/migrations/0035_link_resource_delete_linkresource.py b/myapp/migrations/0035_link_resource_delete_linkresource.py new file mode 100644 index 0000000..9bdf4d5 --- /dev/null +++ b/myapp/migrations/0035_link_resource_delete_linkresource.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.16 on 2024-11-02 14:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0034_rename_scrapedresource_linkresource_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='Link_Resource', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url', models.URLField()), + ('resource', models.CharField(max_length=500)), + ], + ), + migrations.DeleteModel( + name='LinkResource', + ), + ] diff --git a/myapp/migrations/0036_gitdataleak.py b/myapp/migrations/0036_gitdataleak.py new file mode 100644 index 0000000..29061e2 --- /dev/null +++ b/myapp/migrations/0036_gitdataleak.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.16 on 2024-11-05 05:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('myapp', '0035_link_resource_delete_linkresource'), + ] + + operations = [ + migrations.CreateModel( + name='GitDataLeak', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pattern_name', models.CharField(max_length=100)), + ('file_path', models.CharField(max_length=255)), + ('line_num', models.IntegerField()), + ('content', models.TextField()), + ], + ), + ] diff --git a/myapp/migrations/__init__.py b/myapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/migrations/__pycache__/0001_initial.cpython-310.pyc b/myapp/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bde9b5d6ac49a903f9b41eb20c9090732dc3051 GIT binary patch literal 1524 zcma)6OK%e~5cY01$?j$oUgiA;2`LAv@(>4v5YVa>QpsY`1KStPyVW(p$nyVC|INlv*Y3Y?5aA8_p$7Tl=vHCCfybC|!wD z4w35SL(}aLf(Q7jz$OGp%i^SEbE{PfNy~xqP9tg3^L(7;?_1k;=N4E1qb1LJD^5I>y9@gp;6ma{zOJUW;2*qC#{upA$8 z&azCDotVpVaz??aG3UQnPS0gIGmbm^Us}%1WjQ~i<-!d5m!6ArnJ$g>Tpn9<7{Y2R z;8(DWu4-@NpnkS=bw$WXs7%{}uWI}8O4HE+8)PZ%N?;jqUF%B`GdZL^7-~;}6f6>Z zpo5nnJE;Piuo$!(Gm+4NjI_svgl?9~q4q}{lx0n8M4P0qDB~Q<*fD{XZ2=Ki+Fun3 z?=S^-Zfn2z8oCA~T`X}<3*WatSky@7$LuwYAPKVcFqG`y4u|D_I}2$Rs324er(WXujT)W?j3~L{h4KO7VXlM1Xcc>F$6}M99MwjC6Ub8T2_A{?As*sto?Gocd%9j&^%XqQEfGTj zz2z577N(!}VRWZ_B=RPbnC{2c^4<0`JalFH_6n$8miF6x(Cu9}U7lG3X%6v75XM8+ z@3$wnRC{S@=>{F`V6i`x`Sn-9SM6cv6352Jv8@H$w|uK%*}t6Mj#uCYV)Xn(k3aED zW;EtTOplxRDaL~p+|NeG6RdcT@316H7kS5I)FjaiPBKwgw@|Nk?-hr19}9`7d@qOX G6Q#c`dZ{A- literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0002_domainresult_decodedresult.cpython-310.pyc b/myapp/migrations/__pycache__/0002_domainresult_decodedresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5807105fdb12f0706af9017f876c7d809e6b7f7 GIT binary patch literal 1048 zcmZuw&2G~`5caMe$9A0bhl0ujfD{l>;fN4wNhm_7JkmxQHp-8eT|oUQR5>oNYvI5VsoIm}_}jQ=*y zte+~TZ%VsqZ2$*~yN0gYSH?l}dkrp|F7DLb)$jf5v(fI8OI4l!2<3Dk6o@nt&1xlUb2FTFvtP0Iilc=# zKZL*JmWqNufP})>dm)#R{Ny(?9{bI>olav$mi>ORel8gMY019%M2>0cga8=uiq$;j zwMYfGTvT4_e_-H&|DA!4ybQj1X#nD!&4OQahRuYD>te0)zGxe5!ny^l^x4YB_AMfE zOiRBeK$db~sQ|v_sfT_^6~V)>9AQ+B%dm{g2jD{h;k5^&Ymc%f5Ye4uGyZgY8QmPz z+q~=2XY={|rG&Q5i$GU2o(;-z3QS)#Y-EsZ(z?Dt*3(h<8R^Rb~omX8vaV=_I39= zy&J-=lS#K#_J@sV=>vj@3D3Xr1HlD9Ho$84qd_xNy=3xkvw<$?&a`Tb=5$ d6=ZAQNgH-g$!DUsLzCZeVmc&vBqDz3{R6d~<>UYW literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0004_domainresult1_alter_decodedresult_domain_result_and_more.cpython-310.pyc b/myapp/migrations/__pycache__/0004_domainresult1_alter_decodedresult_domain_result_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ac49d6dee4a9ba24e4f96e48a981457f9b52ec3 GIT binary patch literal 1246 zcmah}OK;RL5RRQ}n(V8kyb3=6X^~j9f)hfhWtSp^-~i>aTFG)d(~xZ*i<2#sD{$QZ z07w1>zr$Bf9Jp{qyvFtx3PQq>NB+k0H#6VZDLb8}N2C6I*@)$Q#F@c7^GCrQ4}1t-c@Q9*G+z3n2JlB-ukn%2cs;J0d73C$r)5#;FfReK z>cO7bJ2^T8HfdJx$)Go4;Eg!2gpGU*Cd3FnhLa@-=xaa-OY>l#Lqxs^Vrb48p%$T- z_S*&}K6K`s&NiV7%e2$N_M|fjC*8?1tiY)`ht;{`KK)PbGZ?;EdFv7H*~(?U3; zJ3|W}+Pw|UQ`p(o{O+(9=(e2IrPxy_YXsezsx+7CNF3mijw@8D%+eRA+lQ!j%L+vy zbJU?@|M-KH?J;VHd@eF9lKP2`>omuzmid%69CuMZ6B2;34&3Se6f>xF=Z}mDo=o}0 zs;#i^oUROFh|7Ws&9Fwz>$2xlY}0<5mO4%8=!Rw2-Jz4?xa1ZVRvuB+O1Bn~Em%GV zE=bk$)po^f zR^a<4S>;>$TWPXI(r+6vbUb(>m0Na(6m^GGbg;Q)y1Q6!mkQIQxJS(iVIqs9)Esto zWF?{JpqB<)j|N-A+dAIC=k?-LImN|mdFQEh3U1Ap*MsZh$JFA=+VK#pgSwoKVYYX0 z#hMJ|frY|A>M%jumGSTQH>MkSZE@S2fE)k6k3tqe;wkJ;kCgc%EYYk?W|7DJ;78El z>FVHSLI{w8a(i;RB_zDJ+!>0YQ~r$!%kt=>-J3%{Iw_mk)!>!dCl d6-?ycdbrgF`E+!{b@nDBRE1<#c*M^6KLO@-eNq4b literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0005_scanresult.cpython-310.pyc b/myapp/migrations/__pycache__/0005_scanresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ece29b822b1023b4c611a9ea56b17ae91cd5c7d6 GIT binary patch literal 836 zcmYjPO>Yx15VgIVba#^ghYAS}a6`(0svx)^K!sLCNVJE32x%3`ax>Ftll{WpErcsv z`yb%QU-Fd`;vaxS8G8e*Esx%_$1`s{u12GT(RjFiYxYwx_T7=IBP6m#%iJRa40z58 zp7KJZg0oi)1O%TM1jy&Xryva=JY?hE5AtPWVUr@8Y1L#^X>7l!0CO{SM^}eSzeUTO zkU^GmV5tB;<7t55yyp^Nf4&AG%^vh&?L0gc5MlpI^pz2c3B?{I|IvVMB;-Fl=ci)U zgVDL5cmudb;;!3x@1H7?*ejN*uG43mo12d$RE5e)ji$|;2U6t?Y6&_=%e&cGt9y4kB2sr zKCqNFkt7$|90?DleAlYnIXebeV+oWsL!;>MF0{~NidzJH00pST~qkOsMe;W zZjb+K1x&m7Dy}Ns8w>_lLM3rggIZ>d_NT}nEywmw5$7-o4zwqPp+ab1h`f}`%p}h5;EN9;B=r%-E&M*;-$YLeYGpARfm$?W z70G3?xUi5xys%OjDXg^PN4wXFaFJ_)ZLrfgc5Z$$%#Bt(KE(OF5aq)pFkx-FPg(?xXr{>TKAz6`Dj%SFR_^Z1PqGvd8 z=^x-9@R#<&ffIj$12DS*Cq1&#j^CU0%)WhVS78`18jqhoT7K~u`)sNuoR4nofOo~B&JTKzMO+6(wv5~s}IJGSY%Fe?{$A=@&UbU!_N<|U(Vksl*-2W6xF(^>N#xE^)nmH zu`Csa3QMi?^W6tDr#pB-)|$QPD)xLAuy4CaN}$t7JgRS`OB%W~)r^AA9M}8pbsX++ z@0aK8o|JVd_aD*!W_!;fSNCC+l*{S}7S_HD*jV{z0s`^{5JI%#gnHQh8h&GB^~oPm=D_(A zA2wHlD)rzNjkRUNga7l;aGiXqsw#d=@I|Nu^0a#2^G@7o?Y;V*|ec*1SJ?H7aOp_PHXU~XDNATNXlSh1$i$DI~VBKUL n(s@FdsUj)2;k4o0&}@R&v$oa)s%C?oc6-mcYv4La*x>%V0WecYS zr_;BT{)r83!t0CEcGsU!F;_ar7UQzQhe>^B^)vEx>UVPddU{PYHcn3`*esT1HHFn| z@xrML)xx2)C>^>MPakJLrDng{ZuWS5P_1kGYX!8LJyIbPo`3Im1b-q1e89yY|8IEj p?wr#IBABZpEf3(v73ykphmX0oyM2mf!Z&Tp4!I3)-`N#=-am6z)CT|n literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0010_delete_scrapedlink.cpython-310.pyc b/myapp/migrations/__pycache__/0010_delete_scrapedlink.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82c6425d212ae32920505603b8fe14ebc360e91b GIT binary patch literal 518 zcmYjOy-UMD6u-+Qnx?ISgWx7^0WIkwC?W+5F1AZ?34tT#9wBYM%(X*jUHwD+mu_`( zc5|ukE|vDd`|*D7-TS<%-}ea0<W(3YB}^&-x$>$Sw)=dN<_O~ke)+>~^emx~2BR^^ z#j>g+u}T(K26BiOhH_20p=O0>ccCZWFz!KfHsnSy+L>T)LCAK{Bv&S>@=D8XSQbwcm=3(|zF!sxXn#Idm$*DorAh=#_bfL^r&T;7yi$<$le?`~-gyy)iC`(nKYeQ8iU7lYM z;UT9csV_3eGHXsHIr&XS^`YaUy6&|l5ooLL#9t?Y~D?@N8T`DED zdXXdT`%->fsN6ey1XyDUSWY!sLuxbE+YP1fdu>eQPx>!)_JT<5`Oq%eJymA49gK+M zp)PO*)2hZxZGSNHh@J-X=V*6(@`0$^U?(HA^QNjNu$a!D29u+j2Pi!x<^+Qblk49y zAwjkzTs0r5`6e`fqh1>SCEK*@12SDEqWB_i34T|saX-c1_+R%TcpZ>J3CvWPRU2>| e7zdK!^19~L?lDDk-Dj)bJtqm6^_kYiz34wd80ljG literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0012_directoryenumeration.cpython-310.pyc b/myapp/migrations/__pycache__/0012_directoryenumeration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e42f334c4583132472f1db971c34c1e6fdd4ba29 GIT binary patch literal 824 zcmY*XOK%e~5VpOWba#`KB2}p30w<&#s9KH{LWPDRBw7h*FRMt#%}lpW_JzFx!WFLl zA>8>jzH;iF6GD{P-INwv9?ds1n%C!IFo+nP?bmmc?}D)(HMn_v0=x9=0}{Z1r!3rHkCUZdL%Mc2c`;o{+#UJ^PLX zvX}#l1@MH&9{STxT>!h&74YeHpbIPK{;7a~YypH2opVAxLLu~*Xh0~U=+)Yn_;Bl7 zP_`bdQERtdcyQGdHQ31(sx0G;t*z~C3EJSKD$D}&d1lbg)5@)nu8hygi0v>=XgJz; z;^k=QyS|!Ng`5~v6@u%PMrX<_y!a>;0QK*;=}tAKU=N3V7s#f9lrEBzHa<_0 z^uCnu=PIp(YXn$g4wz3gT0^8W*V}9QKd31(UTx_=)5%ksY`;$J!o4$PS~WO+^QzSb zBO3WgXV}81D3|-O-?d^<@X%n`Q;}P0fRg`0xPi7Ark)oP4P}YzZL9pRv zeEogK#L%Pv8Cn+GEElH!q+NP;gG9iD=U@6A!Pmtqudn#+{|PRes6%2bgsIAtViQi9 e;hT9I=XKMqcAv7j;BmXgC&UJ`b)_|N$NLMpzwnm; literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0013_gitleak.cpython-310.pyc b/myapp/migrations/__pycache__/0013_gitleak.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9d0a41fbd2511e8bfa206521e6468969110fcda GIT binary patch literal 827 zcmYjP&2G~`5Z+xosqG}CNC=4@K|;!bs?ZxksF0`?QriQhmnhO|o0+;!{KwiZ4Oh7K z9pK30aNR4Xz5+;;*>zDn){N$x8PD$)gF(cIF7nOzr(o=t1$W6OuuEJ$B>@b0$}&FX znV1UB_8AE9zB2HTFT5|_)C2zm8+NWJmJNl8vLx23PKvxT-K+pitGRXEC0l-%xH=_) zY|4R61@M?pJ@gkHTL8O@HSp={Ko{07{Zjz}cE1JR8EGMTLx`Yv$qDtz9y$Af>^=Ht z-P+?0+`AN%vkx28;C&Mw{_l+1>|`rdmgdp+_VX7K5{>h^&@0TF4BPI_+I~_WpjsM{ zz+}&ecjKXN`l_i5IoGIa1k)>Zk}18COI(?-LY=5I`HZH2j{2miQ06K_6KE_8+33`S zDdm&(s>G{nntaG*iJbRbr45?sri4^AMYUD);*(SW)V%NVc25&bp*k84 zOdwq;DNQ6LExk#R^uClI8Ic)0DW4O+C!?3MW7u*#U0VG!K-$SuemK@Yi)>!-aqqD@uC0# literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0014_delete_gitleak.cpython-310.pyc b/myapp/migrations/__pycache__/0014_delete_gitleak.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a664eb21083f270abb0c1da84e10bf44ae06c88 GIT binary patch literal 504 zcmYjOJ5R$f5cVVKBcv=y3`~eE5>!PnA%rSXsSE9bSVAN#)TbzIUc~9p8CHG>f5|Ho ze}Sc(-B#^M_vt>L@9sOh?Daf?cB0ObOG?O(A&2H58KSET1W6>#NKQja$(Tqc`6rPa z=$w7u-2xf z?oM{S0;b)36<1a04+hsaB1xMJ;zigVr_B=vIM^xT9Hv2AcZ4vZ5ZV(WFXb{bu`k5? zGS0RcUqS_igkqM0su{}BM|LE-6s8NRh#E&p{rwr4q@C`J1(Qny0f;qX~1Yx15cPUDX|nmC&{7WE5kUeK2`&hsLaP=KEfQ%jQIO?irrS;Si}h}4xWbYC z2RL%$_xQ@GcfG+J+>(%SQM~|^@Cb+mL$JS`88)Sfi z6S3GCI58h^hix(7;C^7>qBC*dy8{=zKI_#^sFwA(_Tw!CN)EV^~nNw^s7M~7LL7r4h_mRpb7r5Ls1LspPHW;d2P!3 zRM|24z=Q5Fwn{=y|#=%OVxy9A$x^TUj2) zGM|Yl&U8~@9?B?uhq`@;`6yK=5*efJ=9r}_EK({g^XTM^wCg#fw>%ONCP8ta+lq)p zj;f3brTsa+kOkFMlu7zlNC3LFXF==xAx1#8eWdEbUeqP@@Vmp9ZYi4;#Vo@UAULp>Biox7nRq1-ha7Mxt$G?Za0i^ezJZb^SQf=M@8lOX@>K+_=V*+ z3EG;UqxA>FJAA8Z$f_3KNpN6xuNl&tLbD27cd6`k)+H-79H~ zdncRa<|C@pR=3DB7+s*+sn@LHdFGdQ+W2Arw?j{)2@{zF=^YqZ dm8>xK@Vt-8>k+AayB7*De)17qNBjmdUSC@}q3y*$)LJ~=H zQqY(dEM}CvCXz|-Gm#$9sdwhZp7amNu=4}ok|8ruk)=vBSygJ&Eh-7QPORzb3K4AK z(KQMnF_k1{lBP8Fz@K((0O(Fvq>sBJyK-gWpD-Cf_e=1VpcbMvKwGq+haHp7yx;D2rHZ~vgG;7|r6P<{XYe*C{ zRyDoDM2Q;YZdT3=%jD6HVQ)r5-}FV>R2<)l2BhiLDl3GV^BK%ds6k~S&pv?ZzXLU? zH1JXsV1kK2wN<$ZWu_o$Dm5Qc({0P_v;`BLd*h_lJEGaF+n*CgL1B)8>GBpYzjJJ>by=gLlc7mvP=A|TB3|N0$9Z?cH4;%2}7KYqw4-g;IBKi!Xg n?0hJvqD-qta^hHW#5m(+ZAX zl?GvukX{8gAvS^Om8eBAg^XIv{OsLcI~P7}H)Y=!j~9zaPn4@{*(2ztTPr|~11e}N zR)et{?8erj8}*>d4peI_7DopMe0EVfRHM~i27x@GAq=Ugu58g~M#C=a@bfmC{S(iH zozgH~hT8Ky^O=ezO8L2>UNCB;{8*_^W2r+?V1PY#fL+y~vt&Q>NAEGbeAA$YKw5LT zBXiT^&d_hn-lpOR*OxD!Ek8Q6F5>bPy7gfCC5+YjVFZokI#Ly=iZpt*yt$$!x%X7r z*jw#w_|MH~>E5@~eq$5*f(eDYN02d*$Uia_JUsH(Hj}@z>sWVAUd~`ucC|T$i#TcA ZzZqkj-61KTJ>S~(f(P~R10IXJ$zK%L!dUBb5Z%2GgyXQZu`za6NU+ivV@M>i5ekXT<&w$5PAy{|A+Rmh?^jvrAjPkWud3_(qXtn`jq;N09ni>qjH||*hO#d*Nxw6 z*4VZ*t>J&K$T5Dt7F88@d%epmP*{i@VInlbN@bv@N>nJbS+M{MqL7f63gh;8D?O4# z<9T)6C^|At0NVmg0JKxCG6XOoz{^TxJ0+A@VIi@Y&QL3dhBoa1X1K&*DKRraS>ev> z2U8*G7JlLWCVAGVw8dnAda*34M6RZb3kw;Fg{4qau+-X1_P3Xi(QBY%=(t0F-D<7s zi)>KpV}d4gTyNv~4)-?AjnzhxYg%$HinQ#?iJjc8?`Pb8b*S7lZ@2dE=p8U!|M<{3 GasL3tI+H2@ literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0019_scraplink.cpython-310.pyc b/myapp/migrations/__pycache__/0019_scraplink.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ae4dfb672d9f291296c001c60e55065b596c0fe GIT binary patch literal 733 zcmYjPOK;Oa5Z+xouI(g<11bmLij)IYxdEzBp-~YM&4E4+R;1N7GqIfbh1UUvD_rv* z;E4D~d+mw8fCOcB9n`M1qxn3K{pQ=PhQpZA`g!#ry%3CDS#W##1P*EI$7Fy3&so6} zUWi0+_J)A~?<)fj`NI3+B_8;vY}ETjxojj%Tx4mZ+N>(I35p6Z*E1Wsy&?jKwDp7x zvV;Rm1n`t69{P)(JphBn4*2x-Ab_2XKNk>U@Gbn#$crc%Q7qo@xkx?eZv@rGFd!mB z6P^5LKy-S=TGh3=zrX+VnItmUqSUiS)d+c3E=_c5fpbL$XU9go9glo7P^-3*vj$a* zVET2F6{=awC9X}RvB^}PeMU3*h|OiCQI@JeXTFeM8|iT!92qp z^kmdGp>)MknpjGbYn3DU11UeORBn?k0<5tFEN2<&hHi|R{*j}0V)bo2`)BYvOJ5P` zW82z<=kMQj-f&DKoMi=eFs^FcUe6EKJfuozeqS8Dn4Z&Q+S%zC^|Gz%DXeD8C(h)k zmJUh_rGrk}>CJ^tN#*CAyjF|7dfnK!6wubYWI`r9|Jv^feow^w4i|s?zu~pZnULra kEL53RdvNK7baT1j4bRSdM7>OS(8=|Z+xGUHyJFY-2W&CXWdHyG literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0020_rename_scraplink_linkscrap.cpython-310.pyc b/myapp/migrations/__pycache__/0020_rename_scraplink_linkscrap.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f51e6c909de66ef692d454cb220ef3dafc78bae0 GIT binary patch literal 549 zcmY*XJx{|h5Vf78q@@KWCMLEFRDlhI5E2L$+JOooMUkw~J4J2tMcfK?hLs<}U-HVt zUtpk|U8~va;;sy`WN6y%%5u4$XxTK{H34j65Sk5EP*)0PB&Km;< z`B=O9g(3}lhysQm(8Eb9kb+Lx9} zsasO!CCoA;-j?!tmSm>gD8LE}z+yN;RSWWD5{M zps-dJ<7-rtX<5ZE8%~ZaWSC5>ltxM`t*dx_ZE+Z$gtE5Vt!+x<)mrOT^V*>;8?@9O zfzO2FE?iG=!QCH!VXOVX(M=d9MOt>@$$GH)^=X%Emj-D6e0dQU^eZrBo~bSNonI7f BlC}T< literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0021_hashresult.cpython-310.pyc b/myapp/migrations/__pycache__/0021_hashresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cf5d0a1165b3fe7c012265fcc3c1463cdfda1d6 GIT binary patch literal 786 zcmYjPO>Yx15VgIVba#`qJs`vZshp5d$$nw)Rt*v- zxaPZ8yCG^#At1Px*vZPjQwoL?d22MrEMOP0R}u} z86WXXj09&d83^#cFz}GiywBdq1OF}Sw=T(-^@WYHB-W}*irmeIrYY~ow5)~VgVe4-a6 z{Uy&;TI2r%(nwZ|5-)d1hCV0h)P+njkE$?c;vjkHxhyAV%qzfvgjie-H>l6uh zrTkE<)U`tlu*4iFV}eH0aGC84UC9T{D74p{bYCR#b82S432lRuqcu zS1>9{ydLNerne}7Gr!&qpNvnaapUZG56!$P$}!ZF`6FjiRC7mVL#Z*MZU*Ce_W3 by33nVSLgvnv%%AqaL;&?pvkl;?s|U#)wARQ literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0022_sitemapurl.cpython-310.pyc b/myapp/migrations/__pycache__/0022_sitemapurl.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b81bf6484b98327bf0bd225461a965f1330abd7c GIT binary patch literal 740 zcmYjPO>fjN5Vf6bnq+qi2hpgknMwp`k^o2cxy1{20bWX46E6 z|5*^FL9tSGojlmt*?l3el)h?EcX?~#ldQ!;)n~^ajL6{hz=-$LiEl=#Yb!Z#P_+nV zST|Xrnw4DQ%0wEQOy$`ZG^0=0TvQrmsR}e+*W?p!g09T2J2dfawp1-e`+{ZlSt8eO+Vkt?qE=Tf5QeJl|x0fvftg!?v=NamT=Elr$-*G&&DmR{u zjNWGH8)AQ8OPi27>%H-mdO6Js>|tEhcsr!;ta(hC&iwwk|8jOlEox_HQ`F10s%Oy6 zm(QKaQ7s*m7D@-5y0g2n&q(K8se5fnmhF1g*k3B3t+&X8OnCl{KM?$p*yNjB{PF*W rH}1|6$sfT&m1(sN7p_a!m^-{9+Ivr^mI+_=dcEehynW}P*z*1XdrQ&u literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0023_linkcheckresult.cpython-310.pyc b/myapp/migrations/__pycache__/0023_linkcheckresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4c67a50d1b06e3a06a254eec4a75e56508ca1aa GIT binary patch literal 760 zcmYjPO>fjN5Vf7`Hp%X`91!9F5+|fRP*vrI5Gw4d2&wI%v=WL|vfRw z1D>;j$Gi}+;OsdA0p3Rj9`dF4!HYfcU$SxUC)KjCFj0{%8r7y%sZGDA0CSz#rRyUk zut!tBqJS*sz+wS>!DA2oWzQaf{pAMu^!1<*8|VI9K!E+v!52nZ_&aJ3`^uU-w9|!O zv&o~`DK)8GoJ~<@ZB@^pOR@(poD8oY2nW`OU=hL1UWxXnR z%74(Kf2pq?#J?b7tm#=zy6K``cXidP*IiB~0i$vE$L;vDVC;Jbt`3*LF0J|w8DPLO zmh+J3A{3lGXCT1&#K1wmbUr$v1MW*U9sHzNHWenwlUS=JDT~?+^Aa$tqweVH@CoeF zs$Y{q7II*r03P$uL3cUm3gB?L0WQq}3}NHkT?p`S_{ICm$n*bu0mbF`K$( ztlFlOkw(=Zm{FyZTgw}uF^Ge-T4c1 C#n-|B literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.cpython-310.pyc b/myapp/migrations/__pycache__/0025_scrapedlink_delete_linkcheckresult_delete_linkresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3502c857dd609642697731bbf8cbb7f08e4bd582 GIT binary patch literal 910 zcmYjPOK;Oa5Z+xosUJyODB@fsgp>mn;&DL;6%rL8wLSE4u_CRunW^i&qpuO}oBF1{m;^ zWjx}Uhy-V^7zl7aGjNbkolj2WfP2UWopZX&20{l}5?888ioDj{tN={wi8;Eyd;;6F z>yiwzhy#lR@R&yqy3>wHfZgc|xb$_P3oA?aRDee@4}1ugoKT3}ul_eiUXS7d-Rzrq z?853&5K9Pau)gHhyJ5W8iF$C8O5M=@-v1h@;7+zsWf`qKc<}JCOp|<8VLeY99Ue|9 zRU+(CNQ(rHcC>gs8o0Wr=1n0d6{-e7hh>#ys#?eyF0@}`m8dlNfV%e+APbHIF(U|k7f(c#cO zZ_o6vq8VYj_cDoJ(8G63dhHL-RMooP@xgBE^+%-0QIcT`!x5&~pykj(QR3xTd}q}r zFfIArxBW6oN-CRD z+jdTjMr}{8hug?jxv0#zcWKvm$#_gS?uFYC{FYed0bk|fkNem41*fQEtoO_Qu}_oW l!&K#Qu>~hqH7k@oyn0~k-63Y}J!|!U&P_6tbzR(c{s9Ep3-SN} literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0026_alllinkscrap_delete_scrapedlink.cpython-310.pyc b/myapp/migrations/__pycache__/0026_alllinkscrap_delete_scrapedlink.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6d77fcb32b2ecd7b34122d51e9e7927c9f1beda GIT binary patch literal 855 zcmYjPO=}cE5bf@n-OSF;#t7m`#gniHLl6uoB8gcdLXv|?F2h38nW~Jl+w+n6P}Zwn z_lNj@JoVL+M^A#FvAQ=Q>7k2yHCv8&BF!sZO+sh}gL%VrG1{iS7 zavt+s#DcT83r0-BcnEih)`l4zUh^Sxy?mjnDt@uG_3XK9l3G;=IxFUqXkv@f`pE}O<~25*Zf}QI z5fkldeL$y~#QLmk zP!=jjnPL={c&YNhLIZkyO{8{)qAAEyBO A)Bpeg literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0027_crawledlink_delete_alllinkscrap.cpython-310.pyc b/myapp/migrations/__pycache__/0027_crawledlink_delete_alllinkscrap.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64ca9f177d98d9f65791a805735bf7aa32144cd2 GIT binary patch literal 783 zcmYjPO>Yx15VgHdy4fVa0dW8h91v0tR22s*A%t2Q6(O}f(Dt&5WI37XY7=jE@g|^f zg=_u+2RQPVeBr=}Ux0)JVeAk!V|g^sU-RaT%WgMeWZzd0vd@CCA0BL*Byd2penbu! zaKj3o@?*!&WIWfZkGQ5He66m+KrZRjj{ zCej4DMCXQUoo;v#sYbETRh2&6+k5gge-S0`)(eqiUMi%u9!L=)!7uqh=1Q)JVqs_I+KcMTpLpv;MR8w7`i-(%RxiwDu z$BBy!>&>ei4b*Ap&={ZS+_UL%dy^D7>$P31!hNM&q7=zEH%M_uskd`&{0kldRyYNm zj&iImb&`4Rp53X}-9~<;^D@s4iTAP3=i z2A5P?9sHn=^<-971DKB{kApL)CjlxCRe(Y3!Sy#7km~y+TM*TYun~Q`5xdpG`hVA? zS>GoYGZD#^YzTf^Bs}5bkNhiR!R0Fc6;7T}M_Mq})2!TuVJJUT95%0OSV#BhMHfF` P3;BZkBtF|MaVPo*BV6I7 literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0028_delete_crawledlink.cpython-310.pyc b/myapp/migrations/__pycache__/0028_delete_crawledlink.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd605e4a7dc2f29b1df19b2e05f5941b2c08adfb GIT binary patch literal 536 zcmYjOJx{|h5Vf78q-hHqGa!}>R22&dAylcAV4z(POBBg6u@$9pK8RbP&am=B_)A`y z_zNuM>`=8Q-P650`|h4y4F&-MBi?EHfD!sOWZzsMV{ml_z!Aq16*$5e-6Kx8^MSY{ z@PfQM5#jC=3cVjVheE7_B1;>#%&Jl)Cbe%4kTJMA0T3v{9Km&*;>Z#1!ZVFO4ePWm zb$7Py6%y?gYgX6#d^EbeqDjNvq~J0ubIOGjOF@~GhAJr4x;JSLJVFMRa!Xc-d3d0G zN=-}DKYVoh|3pIyOxA03R zH}SI)jj|X|h02#z9rIO^Us#ZW<(5)Isijs_ynC}4&84^2V9w%J|d30 vaXo_FjlZ$AdFbdaU$8Q*hWy2DZu7ex+vo_cYyY;De+R#hl=<#HId=X4;$n`F literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0029_delete_hashresult.cpython-310.pyc b/myapp/migrations/__pycache__/0029_delete_hashresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c2f55548d225bdb909436ebc6bdcde18abbd0fb GIT binary patch literal 521 zcmYjOJx{|h5Vi9GX=oW?Mcpz`RZLJJREbKkv;&AGim*a_O4EE2CqkWJ<%jT>yfU%y z16a!0ZPlK1PxtQZ^SyJ~>$wE&H}A(IO31e&`(_~-ql-QQC!A&^r#_|Rj&OsUAB3Ag z7sk8k8{B#%p8bR8h)1QHCvhD%Nm+`b@4JVV;~GOQ|jIvieHG7cFuz@j>Q%YbJ|k^1g^DCQ3!+N{AbtRl=|<{e6hF%>c< zUB>c~x0#B&jJ>vDwyAVER8Vjzq69>3;BfM2qFy$X3O1U)NZrG_hQH_AQSc<7 z78-*Ih_orIfVWY4t|5ak)s!j9G}SVK-If9rbhQ;UM-8>sFsPQb+SdWPI7V=YVOlH8 tHmJ37R=PIxOxfX!u!ze6f6;^M{BFc`q^?WndaeEjzncj4zg^?R{0G;riAw+g literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0030_gitscanresult.cpython-310.pyc b/myapp/migrations/__pycache__/0030_gitscanresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d5995b6912a27fad49f4f792986cc12208ecbd5 GIT binary patch literal 780 zcmYjPO=}cE5bf@n-OSAHiU$dv6g&ufFf4jfM4|}^iiwa9kYS7k4FrmL%7RdqcYC5+a2`yl%&82jnS%@q>aq-`FO0S3Ha zB~N)NQo-3S0|CJo1_APU@Ht2W2oKq~_ltblSlFb@Gp*XZu8i%MHDF<8?&#)+>Rc81C$z&4s84ExvQj15NMlpWr7rBCOCUkD z$|iqOF@LEN6>H-V~@7o=Qihr@r;m>z6T|OrA_+mbb1Q zU4J&3m39xWPutuj6EP8lmtjxvJ0jr;zs1F$@NabKz4mD=G0at!)f;f)tM-NZ!)vu2 Vx=+z;^t|ie3+@uQOt-~)@DH9J;p_ka literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0031_sensitivedatafinding_delete_gitscanresult.cpython-310.pyc b/myapp/migrations/__pycache__/0031_sensitivedatafinding_delete_gitscanresult.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c69f0a458e187569a19ac2d97d60ca1d9ec9f841 GIT binary patch literal 1004 zcmY*YOK%e~5MFyX>1LBnODPq1Bt#CNB5nwwLZen7TBJTC6h*S!c(QS_FYHa#aD{6w z`~o=gm&}n+Z^UQi?z8M#B9C^4tv>zlteb4)4!OayQ*v73Nq7a@S zsh5!+$!L!fZ_g7{_+LEX0~!0D{hlv^Bd=4tKwqyzO_a$*@k$oCHubC!km`Xo-CQjM z+qm^t6yWuU@Oo5`g!Fs}#x)xN>f;p=;8zoMu`&;aRD@9f7Jm0oYoN6uBGH@^L@hjz z+_C{ti1uSOS_$W@0Rzxv>5w1<*B{GA^|1j0`h?bt*FhVx#Jkv zw*#SY=seSUEt6Ns&8`h-!jr>y3$3v;;%ceBJ$iqzP-Em5j%5Z*%Q2i+3$@vW6e@5x zo2V#ZIekAo^$6oQ@%L=!dH)3I)=u`jpeI#P_QiBCdF(_AeBvOp5D7-;+TOpO=ROX= zQ>L#vjy&?=qT>v!!W?c7$CGlV>{F`ac26nvs2^MgHA*&UMB2n|Do}T0x41#T4XUw>aX`ity7t_@EO~ziQJY7bb0t%1C`>dotO8yf_!Ziq3Lao!eBmV$j>FT3#euw2)#7k9Y9pFx!Q J3QgzG{R1X8nuq`Z literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0033_scrapedresource.cpython-310.pyc b/myapp/migrations/__pycache__/0033_scrapedresource.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d14252b7401ad476000edeba29830c661e3d22e5 GIT binary patch literal 727 zcmYjPO=}cE5bf!i-OS8x(1Qf@sB zjtsIa0G4qGiXaOynh#t79L_f&qHh30*tm*j9AX@PkAE=olC@WakX~`Rm%xZfjBRqf zu1-`2)l#-?_IP)9@0lPX*r7038`Y^x1lh@%szKF-y>~X%vPC#W)AV|ZmMi#pWck~} zNo2>e?;0`HC_4l@YPG7QUWx@SZDLR>S*kB+$Cs!t8iS&i720%_NA$Y1V||m=Az~Hz zh~Z3O3Fc&y+F1BYLfBLYQmikL{IL+9ds(_*hX7lw0qdzkqiJZ&jt)GfV<)i=-JkJm zRlFjyM=rIE&rd(BytHZYW+XqEen_F-{K*fV=jYUd@isq1v*?;Ohkm+v>P?Aq;h}I) zc<43FZ-<ij%fO{~b?)=6@IRwD&$0jj literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0034_rename_scrapedresource_linkresource_and_more.cpython-310.pyc b/myapp/migrations/__pycache__/0034_rename_scrapedresource_linkresource_and_more.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3de2a38586100cad95809e47f994b7a380063881 GIT binary patch literal 722 zcmZ8f&1&2*5Y~^q>vbG@XvhPUQt+W6keo^hftL2t!3-l0Zn~@whO9dK#-)Kf3^U2-rZp>(XJ$_Mr6O8?EWP1ffPHCHG6o3J5 z*qUdYv-b=H$S({e@}>AJGXcRROT(X3$5L+NbzSM=y6#$2y43cX6FH@APADMDI52AG z70)CF%g|j6!L1-XgAisghv?RwIJSV;u}Wrh*df8hF3u*URM>F6Df&L!J3Kr(Ql`{J zkD$?XgDx?9ayce09uhYBP`9gzQFqiepxR=MHfr(4qbzBt=HC^`gw&uL8%->gG;jyl z_#Qo@xwMf0En$>mJ=P;D3mp(LDtUOhYDo?$E z`Qz*5WaY8aUi*JX)wVaPXo1Gjc+hXOBz@LI!_>P;kM6KSAKWgno}1hoWD; nq=rV;JYr8as!dUwK|j{8v)u`lldDEiAf literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/0035_link_resource_delete_linkresource.cpython-310.pyc b/myapp/migrations/__pycache__/0035_link_resource_delete_linkresource.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..857a66d95f94035becc0993bb0b0cde01c4ab1f4 GIT binary patch literal 833 zcmY*XO>Yx15VgIVba%5UIUr7O;ZP|Dsv=-t!7zO8rv-@z}$@6qpKq% zuuaRnCW9>Dz!CvG<%x&>q|+wA?qm&onjPrE+QL5-5McLH@R^Yp(rE}0^cMV7q#ncz zLH8o)!}@}!BI&_3qBOAK!37s0)+y$yu9Lf4TlelujioA3nz2?jf<{v{dWA9TZ+=d2qrt<7P+W0N% zlgglMlUlFQxeYGTWIs6djZ@#$JDFpd&d!Le?;^XW8RlS;xFv9rf5`QK+IBdMZ6Mu? zQrbuoRcLY~KbG=MqjFauA;20-z;c|S(Ihvsy&cE*pcO}Z?N0nGOP^9Ddu=`&93Sm3 zy>RDD>80D-#T;koF4?H6aV7E>rf<>{&ipEO9*vHvZsY7|7tM55)gx%e(>u=OsHP6e z7E-+goi3xxZ!;o=9ylpTrj;6a&t^T>?N9B}GA)IG3C}q6W0q@zB|0EV(HzY7j5u(+0`ec5i@PJfwG}B1!Hw@LefJQ^;Ok;_1De%dcx=|e-86sg0bHY+&&?J9lG5X31GlW zR`HBiA`_e)Fc1)YWe^~r248|Kfbbm~_LdaOhQcOQk!xj&rtWONY5>b_>|D1`Okjs@ zHz9#6A$>jQ!`ekS5fG6rf*6tuPH5m!dWF`p|1JK`$i6{Z z;&mFiUbRqdn{7RL^7NT3i+UzCcFkOmQBuih&>OF9c5qOb zJ!RBeR5L3IIN7)2aBmpeRLxBz#~PJEu!B|?mC_42!-b7I)P*XG&uG(6s85>?Wvwbg ztuh96?a>lw218DBQ|Ge8IyYxFo)jfYiaJ|flGjF5ApJY9?Ao}g4c3M_2t8MSQeX+) z@i4WK^n_B{L`s_coH(RSrTjQor3-clu*Dj%9v9eYT0XObU0?i>Ta^x+C4E!muc@tl zM{VQXGo@E*dPvE0yh8B_o|}~;X z>_tiQ^iVoT{S)+?8Qnai5$))?%nJjw02i^{F0^~2eY)KP5)l(Ycp3Htzb7{M22bb{ vf5U&#rH?zNJ;g9pb>3{lsqfl1>YX>$uCzzQXQP*^`Mu&Uh0C=m?g#$?I8O0a literal 0 HcmV?d00001 diff --git a/myapp/migrations/__pycache__/__init__.cpython-310.pyc b/myapp/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..448a1b84f662b4001a88f8f8cd995b17e893bc76 GIT binary patch literal 173 zcmd1j<>g`kf`gqB=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o11t*(xTqIJKx4 zOvbpR7H5~_7sRBLCTHt{iJa8LY%n(-#El1Yb1M@I3Sx3I(~A;IGV}9_W8&j8^D;}~ a', + 'access_key_id': r'access-key-id\s*=\s*<([a-zA-Z0-9_-]+)>', + 'password': r'password\s*[:=]?\s*([A-Za-z0-9!@#$%^&*(),.?":{}|<>_\-+=~;`/\\[\]<>]*?)', + 'token': r'"token"\s*:\s*"([A-Za-z0-9-_]+)"', + 'password': r'"password"\s*:\s*["\']?([^\s]+)["\']?', + 'pwd': r'"pwd"\s*:\s*["\']?([^\s]+)["\']?', + 'pword': r'"pword"\s*:\s*["\']?([^\s]+)["\']?', + 'mail_host': r'MAIL_HOST\s*=\s*["\']?([^\s]+)["\']?', + 'mail_username': r'MAIL_USERNAME\s*=\s*["\']?([^\s]+)["\']?', + 'mail_password': r'MAIL_PASSWORD\s*=\s*["\']?([^\s]+)["\']?', + + 'pusher_app_id': r'PUSHER_APP_ID\s*=\s*["\']?([^\s]+)["\']?', + 'pusher_app_key': r'PUSHER_APP_KEY\s*=\s*["\']?([^\s]+)["\']?', + 'pusher_app_secret': r'PUSHER_APP_SECRET\s*=\s*["\']?([^\s]+)["\']?', + + 'mix_pusher_app_key': r'MIX_PUSHER_APP_KEY\s*=\s*["\']?([^\s]+)["\']?', + + + 'database_host': r'"DATABASE_HOST"\s*:\s*"([A-Za-z0-9.-]+)"', + 'database_user': r'"DATABASE_USER"\s*:\s*"([A-Za-z0-9_]+)"', + 'database_password': r'"DATABASE_PASSWORD"\s*:\s*"([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)"', + 'database_name': r'"DATABASE_NAME"\s*:\s*"([A-Za-z0-9_]+)"', + 'database_host': r'"DB_HOST"\s*:\s*"([A-Za-z0-9.-]+)"', + 'database_user': r'"DB_USER"\s*:\s*"([A-Za-z0-9_]+)"', + 'database_password': r'"DB_PASSWORD"\s*:\s*"([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)"', + 'database_name': r'"DB_NAME"\s*:\s*"([A-Za-z0-9_]+)"', + 'mysql_db_port': r'DATABASE_PORT\s*=\s*(\d{4,5})', + 'mysql_db_port': r'DB_PORT\s*=\s*(\d{4,5})', + 'mysql_connection_string': r'mysql://([a-zA-Z0-9_-]+):([a-zA-Z0-9!@#$%^&*()_+={}:;,.?<>~-]+)@([a-zA-Z0-9.-]+):(\d{4,5})/([a-zA-Z0-9_-]+)', + 'mysql_access_key': r'mysql_access_key\s*=\s*["\']?([a-zA-Z0-9_-]+)["\']?', + 'mysql_secret_key': r'mysql_secret_key\s*=\s*["\']?([a-zA-Z0-9!@#$%^&*()_+={}:;,.?<>~-]+)["\']?', + + + 'oauth_token': r'"OAUTH_TOKEN"\s*:\s*"([A-Za-z0-9-_]{30,100})"', + 'username': r'"username"\s*:\s*"([A-Za-z0-9_]+)"', + 'api_secret': r"api_secret\s*=\s*'([A-Za-z0-9_!@#$%^&*()\-+=<>]+)'", + 'owner_id': r'"owner_id"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'repo_access_token': r'"repo_access_token"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'project_access_token': r'"project_access_token"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'workspace_access_token': r'"workspace_access_token"\s*:\s*"[a-zA-Z0-9_\.\-]*"', + 'bitbucket_repo_access': r'bitbucket\.com/credential/[a-zA-Z0-9_\.\-]*', + 'bitbucket_project': r'bitbucket\.com/project/\{[a-f0-9\-]{36}\}', + 'bitbucket_workspace': r'bitbucket\.com/workspace/\{[a-f0-9\-]{36}\}', + + + 'email': r'\s*([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,})\s*', + 'password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'api_key': r'\s*([A-Za-z0-9-_]{32,64})\s*', + 'access_token': r'\s*([A-Za-z0-9-_]{40})\s*', + 'secret_key': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'ssh_key': r'\s*([A-Za-z0-9+/=]{100,})\s*', + 'api_secret': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'oauth_token': r'\s*([A-Za-z0-9-_]{30,100})\s*', + 'db_password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'jwt_token': r'\s*([A-Za-z0-9-_]{30,500})\s*', + 'private_key': r'\s*([A-Za-z0-9+/=]{200,})\s*', + 'public_key': r'\s*([A-Za-z0-9+/=]{200,})\s*', + 'credit_card': r'\s*(\d{16})\s*', + 'ssn': r'\s*(\d{3}-\d{2}-\d{4})\s*', + 'phone_number': r'\s*(\+?\d{1,2}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4})\s*', + 'bank_account_number': r'\s*(\d{9,18})\s*', + 'card_number': r'\s*(\d{13,19})\s*', + 'license_key': r'\s*([A-Za-z0-9-]+)\s*', + 'user_token': r'\s*([A-Za-z0-9-_]{20,50})\s*', + 'session_id': r'\s*([A-Za-z0-9]{16,64})\s*', + 'api_url': r'\s*(https?://[A-Za-z0-9.-]+(?:\.[A-Za-z]{2,6})?[^"\s]*)\s*', + 'email_address': r'\s*([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,})\s*', + 'security_code': r'\s*(\d{3,4})\s*', + 'auth_token': r'\s*([A-Za-z0-9-_]{40,})\s*', + 'customer_id': r'\s*([A-Za-z0-9]{8,32})\s*', + 'credit_card_expiry': r'\s*(\d{2}/\d{2})\s*', + 'auth_code': r'\s*([A-Za-z0-9]{6,10})\s*', + 'otp_code': r'\s*(\d{6})\s*', + 'email_password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'user_secret': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'private_key_data': r'\s*([A-Za-z0-9+/=]{100,})\s*', + 'public_key_data': r'\s*([A-Za-z0-9+/=]{100,})\s*', + 'server_password': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'login_token': r'\s*([A-Za-z0-9-_]{30,100})\s*', + 'api_auth_key': r'\s*([A-Za-z0-9!@#$%^&*()_+={}\[\]:;,.<>?/~`|\\-]+)\s*', + 'database_url': r'\s*(https?://[A-Za-z0-9.-]+(?:\.[A-Za-z]{2,6})?[^"\s]*)\s*', + 'firebase_key': r'\s*([A-Za-z0-9-_]{40,})\s*', + 'paypal_client_secret': r'\s*([A-Za-z0-9-_]{40,})\s*', + 'google_client_id': r'\s*([A-Za-z0-9-.]{25,})\s*', + 'google_client_secret': r'\s*([A-Za-z0-9-_]{30,})\s*', + 'stripe_api_key': r'\s*([A-Za-z0-9]{24,45})\s*', + 'aws_access_key': r'\s*([A-Za-z0-9]{20})\s*', + 'aws_secret_key': r'\s*([A-Za-z0-9+/=]{40})\s*', + 'discord_token': r'\s*([A-Za-z0-9-_]{24,36})\s*', + 'linkedin_api_key': r'\s*([A-Za-z0-9-_]{30,50})\s*', + 'zoom_api_key': r'\s*([A-Za-z0-9]{32})\s*', + 'paypal_api_key': r'\s*([A-Za-z0-9]{24,45})\s*', + 'azure_subscription_key': r'\s*([A-Za-z0-9]{32})\s*', + 'gitlab_token': r'\s*([A-Za-z0-9]{20,40})\s*', + 'salesforce_api_key': r'\s*([A-Za-z0-9]{32})\s*', + 'telegram_bot_token': r'\s*([A-Za-z0-9]{45})\s*', + 'bitcoin_private_key': r'\s*([A-Za-z0-9]{51})\s*', + 'bitbucket_api_key': r'\s*([A-Za-z0-9-_]{36})\s*', + 'webhook_secret': r'\s*([A-Za-z0-9]{32})\s*', + 'vpn_key': r'\s*([A-Za-z0-9-_]{64})\s*', + 'github_personal_access_token': r'\s*([A-Za-z0-9]{40})\s*', + + + 'asana_access_token': r'Authorization:\s*Bearer\s+([a-zA-Z0-9-_]{32,64})', + 'applicationinsights_api_key': r'x-api-key:\s*([a-zA-Z0-9-_]{32})', + 'bazaarvoice_passkey': r'conversationspasskey=([a-zA-Z0-9]{32})', + 'bitly_access_token': r'access_token=([a-zA-Z0-9]{32})', + 'branch_io_key': r'v1/app/([a-zA-Z0-9]{16})\?branch_secret=', + 'branch_io_secret': r'branch_secret=([a-zA-Z0-9]{32})', + 'buildkite_access_token': r'https://api\.buildkite\.com/v2/access-token', + 'contentful_space_id': r'https://cdn\.contentful\.com/spaces/([a-zA-Z0-9]{36})/entries', + 'contentful_access_token': r'access_token=([a-zA-Z0-9]{32,64})', + 'circleci_api_token': r'circle-token=([a-zA-Z0-9]{32})', + 'cypress_record_key': r'"recordKey":"([a-zA-Z0-9]{32})"', + 'cypress_project_id': r'"projectId":"([a-zA-Z0-9]{32})"', + 'flowdock_api_token': r'"flowdock_api_token"\s*:\s*"([a-f0-9]{32})"', + 'ethereum_private_key': r'ETHEREUM_PRIVATE_KEY\s*[:=]?\s*([a-f0-9]{64})', + + + 'MailChimp API Key': r"(?i)[0-9a-f]{32}-us[0-9]{1,2}", + 'DataDog API Key': r"(?i)datadog_api_key[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + 'Heroku API Key': r"(?i)heroku_api_key[:=]\s*['\"]?([a-zA-Z0-9]{32})['\"]?", + 'Dropbox API Key': r"(?i)dropbox_api_key[:=]\s*['\"]?([a-zA-Z0-9]{15})['\"]?", + 'discord_bot_token_pattern' : r'[A-Za-z]{24}\.[A-Za-z]{6}\.[A-Za-z0-9_-]{27}', + 'dropbox_access_token_pattern' : r'sl\.[a-zA-Z0-9_-]{15,}', + + + 'CircleCI Token': r"(?i)circleci_token[:=]\s*['\"]?([a-zA-Z0-9]{20,40})['\"]?", + 'Travis CI Token': r"(?i)travis_token[:=]\s*['\"]?([a-zA-Z0-9]{40})['\"]?", + 'GitLab Personal Access Token': r"(?i)glpat-[a-zA-Z0-9-_]{20,40}", + + + 'rsa_private_key' : r'-----BEGIN RSA PRIVATE KEY-----', + 'ssh_dsa_private_key' : r'-----BEGIN DSA PRIVATE KEY-----', + 'ssh_dc_private_key' : r'-----BEGIN EC PRIVATE KEY-----', + 'pgp_private_block' : r'-----BEGIN PGP PRIVATE KEY BLOCK-----', + 'Diffie-Hellman Parameters': r'-----BEGIN DH PARAMETERS-----', + 'PEM Certificate': r'-----BEGIN CERTIFICATE-----', + + #'json_web_token' : r'ey[A-Za-z0-9-_=]+\.[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*$', + 'slack_token' : r"\"api_token\":\"(xox[a-zA-Z]-[a-zA-Z0-9-]+)\"", + 'slack_webhook_pattern' : r'https://hooks.slack.com/services/[A-Za-z0-9]+/[A-Za-z0-9]+/[A-Za-z0-9]+', + 'slack_webhook_url': r'https:\/\/hooks\.slack\.com\/services\/([A-Z0-9]+\/[A-Z0-9]+\/[A-Z0-9]+)', + 'SSH_privKey' : r"([-]+BEGIN [^\s]+ PRIVATE KEY[-]+[\s]*[^-]*[-]+END [^\s]+ PRIVATE KEY[-]+)", + + #'Heroku API KEY' : r'\b(?:(?:heroku_)?[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\b', + #'Heroku API KEY' : r'(?i)^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$', + #'heroku_api_key_pattern' : r'(?i)heroku_[0-9a-fA-F]{32}', + + #'possible_Creds' : r"(?i)(" \ + # r"password\s*[`=:\"]+\s*[^\s]+|" \ + # r"password is\s*[`=:\"]*\s*[^\s]+|" \ + # r"pwd\s*[`=:\"]*\s*[^\s]+|" \ + # r"passwd\s*[`=:\"]+\s*[^\s]+)", + #'password_pattern' : r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$', + + # encryption + #'Base64': r'^[A-Za-z0-9+/]+={0,2}$', + + # Variations of "key" in the context of secret keys or tokens + 'URL API Key': r"https?://[^\s]+[?&](api[-_]?key|key|token|access[-_]?token)=\"[^\"]+\"", + # Passwords or other sensitive information in environment variables + 'Env_Var_Creds': r"(?i)(env\.(password|passwd|pwd|key|secret)\s*[:=]\s*[^\s]+)", + # Email + Password combinations (often seen in user data dumps) + # 'Email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}(?=\s|$)', + 'Email_Password': r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}:[^\s]+", + + # Custom patterns: e.g., secret keys + #'Custom_Secret': r"(?i)(secret[-_]?(key)?|access[-_]?(key)?|secret\s*[:=]\s*[^\s]+)", + # Common password patterns + + #'API_Key': r'(?i)(api_key|apikey|key|token|auth_token|access_token)[\s:=\'"]+\w{16,64}', + 'Bearer_Token': r'\bBearer\s+[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\b', + + # Common password hints or formats + 'Username_Password': r'\b(username|user|uname|login)[\s:=\'"]+[^\s]+[\s,;]+(pass|password|pwd|passwd)[\s:=\'"]+[^\s]+\b', + + # JWT Pattern (Common in CTFs for encoded data or tokens) + 'JWT': r'eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+', + + # cradit card + 'Credit Card': r'^(?:4[0-9]{12}(?:[0-9]{3})?)$', + + + 'phone_number' : r'^\+\d{1,3}\s?\d{4,14}$', # Matches international and US formats + #'ipv4_address' : r'\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\b', # Matches IPv4 addresses + 'http_true_client_ip' : r'http_true_client_ip:\s*(\b(?:\d{1,3}\.){3}\d{1,3}\b)', # Custom header pattern for True-Client-IP + 'http_x_arr_log_id' : r'http_x_arr_log_id:\s*[a-zA-Z0-9-]+', # Custom header pattern for X-ARR-LOG-ID + + + 'sha512_pattern' : r'\b[a-fA-F0-9]{128}\b', + 'sha512_base64_pattern' : r'\b[A-Za-z0-9+/]{86}==\b', + 'sha512_hex_pattern' : r'\b[a-fA-F0-9]{128}\b', + 'sha512_combined_pattern' : r'\b([a-fA-F0-9]{128}|[A-Za-z0-9+/]{86}==)\b', + + + #'Hex_16': r'\b[0-9a-fA-F]{16}\b', + #'Hex_24': r'\b[0-9a-fA-F]{24}\b', + #'Hex_32': r'\b[0-9a-fA-F]{32}\b', + #'Hex_40': r'\b[0-9a-fA-F]{40}\b', + #'Hex_Encoded': r'\b[0-9a-fA-F]{32,}\b', + #'Simple_Passphrase': r'\b(pass|password|pwd|passwd)[\s:=\'"]*\w+\b', + #'sensitive_terms_pattern' : r"(?i)\b(api|access|auth|client|secret|key)[-_ ]?(token|id|key|secret|code)?\b", + #'Hex_Encoded': r'\b[0-9a-fA-F]{32,}\b', + #'API_Key': r"(?i)(api[-_]?key\s*[:=]\s*[^\s]+)", + + #'MD5': r'\b[a-fA-F0-9]{32}\b', + #'Bcrypt': r'\$2[aby]?\$\d{2}\$[./A-Za-z0-9]{53}', + #'SHA-1': r'\b[a-fA-F0-9]{40}\b', + #'Bcrypt': r'\$2[aby]?\$\d{2}\$[./A-Za-z0-9]{53}', +} + + +def find_secrets(text): + """Scans a given text for secret patterns and returns a dictionary of findings.""" + findings = {} + for name, regex in _regex.items(): + matches = re.findall(regex, text) + if matches: + findings[name] = matches + return findings + diff --git a/myapp/sitemap_scan.py b/myapp/sitemap_scan.py new file mode 100644 index 0000000..beb8a39 --- /dev/null +++ b/myapp/sitemap_scan.py @@ -0,0 +1,19 @@ +# sitemap_scan.py +from usp.tree import sitemap_tree_for_homepage + +def fetch_sitemap_urls(base_url): + """ + Fetches all URLs from the sitemap of the given base URL. + """ + sitemap_urls = [] + + try: + # Fetch the sitemap tree from the base URL + tree = sitemap_tree_for_homepage(base_url) + for page in tree.all_pages(): + url = page.url + sitemap_urls.append(url) + except Exception as e: + print(f"Error fetching sitemap for {base_url}: {e}") + + return sitemap_urls diff --git a/myapp/subdom.py b/myapp/subdom.py new file mode 100644 index 0000000..d9eb529 --- /dev/null +++ b/myapp/subdom.py @@ -0,0 +1,33 @@ +import requests +import sublist3r + +def gather_subdomains(domain): + # Gather subdomains using Sublist3r + subdomains = sublist3r.main(domain, 40, None, ports=None, silent=True, verbose=False, enable_bruteforce=False, engines=None) + + available_subdomains = [] + + # Check each subdomain for availability + for subdomain in subdomains: + url_http = f"http://{subdomain}" + url_https = f"https://{subdomain}" + + try: + # Try HTTPS first + response = requests.get(url_https, timeout=5) + protocol = 'https' + status_code = response.status_code + except requests.RequestException: + try: + # Fallback to HTTP if HTTPS fails + response = requests.get(url_http, timeout=5) + protocol = 'http' + status_code = response.status_code + except requests.RequestException: + # If both HTTP and HTTPS fail, skip the subdomain + continue + + # Append as a tuple (subdomain, protocol, status_code) + available_subdomains.append((subdomain, protocol, status_code)) + + return available_subdomains diff --git a/myapp/templates/clear_data.html b/myapp/templates/clear_data.html new file mode 100644 index 0000000..c64075d --- /dev/null +++ b/myapp/templates/clear_data.html @@ -0,0 +1,31 @@ + +{% extends "index.html" %} + +{% block content %} +
+
+ {% csrf_token %} + +
+
+ + {% if data_cleared %} + + + + + {% endif %} +{% endblock %} diff --git a/myapp/templates/directory_enumeration.html b/myapp/templates/directory_enumeration.html new file mode 100644 index 0000000..b5cbef0 --- /dev/null +++ b/myapp/templates/directory_enumeration.html @@ -0,0 +1,19 @@ +{% extends 'index.html' %} + +{% block content %} +

Directory Enumeration

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if enumerated_directories %} +

Enumerated Directories

+ + {% endif %} +{% endblock %} diff --git a/myapp/templates/findbase64_mul.html b/myapp/templates/findbase64_mul.html new file mode 100644 index 0000000..68d146e --- /dev/null +++ b/myapp/templates/findbase64_mul.html @@ -0,0 +1,38 @@ +{% extends 'index.html' %} + +{% block content %} +
+

Find any sensitive base64 encoded values

+
+ +
+ {% csrf_token %} + + +
+ + {% if result %} +

Scan Results:

+ + + + + + {% for domain, encoded_decoded in result.items %} + + + + + {% for encoded, decoded in encoded_decoded %} + + + + + {% endfor %} + + {% endfor %} +
EncodedDecoded
+ {{ domain }} +
{{ encoded }}{{ decoded }}
+ {% endif %} +{% endblock %} diff --git a/myapp/templates/google_search.html b/myapp/templates/google_search.html new file mode 100644 index 0000000..ff63b63 --- /dev/null +++ b/myapp/templates/google_search.html @@ -0,0 +1,249 @@ +{% extends 'index.html' %} + +{% block content %} +
+ +
+

Google Search Links

+
+ {% csrf_token %} +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ + {% if google_links %} + + {% endif %} +
+ + +
+
+
site:
+
filetype:env
+
"DB_PASSWORD"
+
"mysql dump" filetype:sql
+
filetype:log inurl:log
+
filetype:bak inurl:"backup"
+
filetype:xml inurl:web.xml
+
filetype:json "apikey"
+
inurl:admin filetype:txt
+
intext:"s3.amazonaws.com" filetype:xml
+
intitle:"Index of" "passwords"
+
"Authorization: Bearer" filetype:txt OR filetype:env
+
filetype:sql "insert into" intext:password
+
"confidential" filetype:pdf
+
intext:"password" AND intext:"email" filetype:xls
+
inurl:"phpinfo.php"
+
filetype:cfg "server.cfg"
+
"MongoDB server information" filetype:json
+
intitle:"Index of" "credentials.json"
+
"AWS_SECRET_ACCESS_KEY" filetype:log OR filetype:json
+
inurl:wp-config.php
+
filetype:json "client_secret"
+
inurl:"/ftpconfig" filetype:json
+
intitle:"Index of" "id_rsa"
+
filetype:txt "private_key"
+
intext:"ftp password" filetype:txt
+
intext:"DB_USERNAME" filetype:env
+
filetype:yaml intext:"password"
+
intitle:"Index of" "shadow"
+
filetype:env "SECRET_KEY"
+
inurl:".git" "index of"
+
inurl:"backup" filetype:zip
+
inurl:credentials filetype:xls
+
inurl:"/config.inc.php"
+
"AWS_SECRET_ACCESS_KEY" filetype:json
+
intext:"OAuth" AND intext:"access_token" filetype:json
+
filetype:ini "user=*" "password=*"
+
intitle:"Index of" "secrets.txt"
+
filetype:log inurl:log4j
+
intext:"ssh-rsa" filetype:key
+
intext:"PGP PRIVATE KEY BLOCK" filetype:asc
+
intext:"auth_token" filetype:yaml
+
filetype:conf "apache.conf"
+
intext:"accessKeyId" filetype:json
+
filetype:bak "password"
+
intext:"BEGIN RSA PRIVATE KEY" filetype:pem
+
filetype:php inurl:"config"
+
filetype:sh "password"
+
intitle:"Index of" "credentials.json"
+
filetype:txt inurl:admin
+
intext:"X-Amz-Security-Token" filetype:log
+
intext:"access_key" AND intext:"secret_key" filetype:json
+
inurl:"password.txt"
+
inurl:".npmrc" filetype:rc
+
inurl:"/.ssh/id_rsa"
+
intext:"secret" AND intext:"key" filetype:yaml
+
filetype:yaml "password"
+
filetype:inc intext:"db_password"
+
inurl:"config.js"
+
filetype:dat "password"
+
inurl:".bash_history"
+
inurl:"/phpinfo.php"
+
filetype:sql "password"
+
intext:"API_KEY" filetype:py
+
intitle:"Index of" "mysql-credentials"
+
inurl:"config.json" "password"
+
filetype:bak "password"
+
inurl:"/id_dsa"
+
inurl:"/.npmrc" "authToken"
+
intitle:"Index of" "database.sql"
+
inurl:"/sftp-config.json"
+
filetype:log "password"
+
inurl:"/wp-admin/install.php"
+
inurl:"/passwd"
+
intitle:"Index of" "private.pem"
+
inurl:".keychain"
+
inurl:"/pgp_keys.asc"
+
inurl:"/.dockercfg"
+
intitle:"Index of" "database.db"
+
filetype:conf "db_password"
+
inurl:"/.terraform/"
+
intext:"private_key" filetype:pem
+
intitle:"Index of" "credentials"
+
inurl:"/.gitlab-ci.yml"
+
intext:"app_secret" filetype:json
+
intitle:"Index of" "config.yaml"
+
filetype:ini "password"
+
inurl:"/docker-compose.yml"
+
inurl:"/.travis.yml"
+
filetype:txt "password"
+
intext:"aws_secret_access_key"
+
inurl:"/secrets.xml"
+
filetype:yaml "access_key"
+
inurl:"/server.key"
+
filetype:log intext:"error"
+
inurl:"/settings.py"
+
inurl:"/database.yml"
+
inurl:"/.netrc"
+
intitle:"Index of" "env"
+
intext:"s3cmd" filetype:conf
+
intitle:"Index of" "ftpconfig"
+
filetype:conf "shadow"
+
inurl:".env.example" "DB_PASSWORD"
+
inurl:"/debug.log"
+
filetype:cfg "passwd"
+
inurl:"/.git/config" "repositoryformatversion"
+
filetype:sql "INSERT INTO" "VALUES"
+
intext:"Authorization: Bearer" filetype:json
+
intitle:"Index of" "apache/logs"
+
inurl:"/docker-compose.yml" "secrets"
+
filetype:ini "smtp_password"
+
inurl:"/.aws/credentials"
+
filetype:env "MAIL_HOST"
+
inurl:"/key.pem"
+
inurl:"/access_tokens"
+
intext:"ftp_user" filetype:xml
+
filetype:yaml "secret_key"
+
inurl:"/phpMyAdmin/scripts/setup.php"
+
filetype:json "access_key"
+
intitle:"Index of" "backup.tar.gz"
+
inurl:"/.ssh/id_rsa.pub"
+
filetype:ps1 "SecurePassword"
+
inurl:"/error_log"
+
filetype:log "token"
+
intitle:"Index of" "mongodb.conf"
+
inurl:"/.composer/auth.json"
+
filetype:bak "db_password"
+
intitle:"Index of" "auth.log"
+
intext:"Authorization Basic" filetype:htpasswd
+
inurl:"/conf.d"
+
inurl:"/id_rsa"
+
filetype:properties "username" "password"
+
inurl:"/vpn.key"
+
filetype:backup "db_user"
+
inurl:"/composer.lock"
+
intitle:"Index of" ".ssh/authorized_keys"
+
inurl:"/vault-token"
+
filetype:psql "password"
+
intitle:"Index of" "access.log"
+
intext:"AWS_SECRET_ACCESS_KEY"
+
intitle:index of .env
+
intitle: index of /Invoices*
+
intitle: index of backup.php
+
intitle: index of backup.xml
+
intitle:index of SCADA
+
intitle: index of payment
+
intitle:index of private/log
+
intitle: Index of inurl:fileadmin
+
intitle:index.of (inurl:admin | intitle:admin)
+
intitle:index of contacts.vcf
+
inurl:filemanager/upload/asp/ index of
+
intitle:index of /configs
+
intext:CAD Media Log
+
intitle:index of /.vscode
+
intitle:index of intext:client.key.pem
+
inurl:wp-content/uploads/ intitle:logs
+
inurl:/wp-content/uploads/wp-file-manager-pro/fm_backup
+
-----BEGIN PGP PRIVATE KEY BLOCK----- ext:pem | ext:key | ext:txt -git
+
-----BEGIN EC PRIVATE KEY----- | -----BEGIN EC PARAMETERS----- ext:pem | ext:key | ext:txt
+
inurl:tcpconfig.html
+
inurl:/certs/server.key
+
inurl:print.htm intext:Domain Name: + Open
+
inurl:/jsps/testoperation.jsp Test Operation
+
intitle:index of *Maildir/new
+
-- Dumped from database version + -- Dumped by pg_dump version ext:txt | ext:sql | ext:env | ext:log
+
/etc/config + index of / /
+
/etc/certs + index of / */*
+
intitle:index of dump.sql
+
intitle:index of inurl:admin/download
+
intitle:index of *.cert.pem | *.key.pem
+
ssh_host_dsa_key.pub + ssh_host_key + ssh_config = index of /
+
index of inurl:database ext:sql | xls | xml | json | csv
+
intitle:index of WebServers.xml
+
-- Dumping data for table `admin` | -- INSERT INTO `admin` VALUES ext:sql | ext:txt | ext:log | ext:env
+
intitle:index of .git/hooks/
+
inurl: /.git
+
inurl:8080 + intext:httpfileserver 2.3
+
inurl:node_modules/mqtt/test/helpers/
+
intitle: Index of inurl:admin/uploads
+
intitle:index of server.crt | server.csr
+
intitle:index of /CFIDE/ intext:administrator
+
index of mysql.sh
+
intitle:index of slapd.conf
+
GitLab ssh.log ext:log
+
ext:reg [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys]
+ + +
+
+
+ + + +{% endblock %} diff --git a/myapp/templates/index.html b/myapp/templates/index.html new file mode 100644 index 0000000..11f6bcb --- /dev/null +++ b/myapp/templates/index.html @@ -0,0 +1,161 @@ + + + + + + CTF-Duck + + + + + + + + diff --git a/myapp/templates/leak_checker.html b/myapp/templates/leak_checker.html new file mode 100644 index 0000000..66fcc0f --- /dev/null +++ b/myapp/templates/leak_checker.html @@ -0,0 +1,19 @@ +{% extends 'base_generic.html' %} + +{% block content %} +

GitHub Repository Leak Checker

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if leaks %} +

Found Leaks:

+
    + {% for leak in leaks %} +
  • {{ leak.leak_type }}: {{ leak.leak_value }}
  • + {% endfor %} +
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/myapp/templates/scan_git_repo.html b/myapp/templates/scan_git_repo.html new file mode 100644 index 0000000..7f3a978 --- /dev/null +++ b/myapp/templates/scan_git_repo.html @@ -0,0 +1,51 @@ +{% extends 'index.html' %} + +{% block content %} +
+

Scan GitHub Repository for Sensitive Data

+ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if findings %} +

Scan Results

+ + {% if findings.0.message or findings.0.error %} +

{{ findings.0.message }} {{ findings.0.error }}

+ {% else %} + + + + + + + + + + + + + {% for finding in findings %} + + + + + + + + + {% endfor %} + +
File PathSensitive StringsCommit IDAuthorDateCommit Message
{{ finding.file }} + {% for string in finding.strings_found %} +

{{ string }}

+ {% endfor %} +
{{ finding.commit }}{{ finding.commit_author }}{{ finding.date }}{{ finding.message }}
+ {% endif %} + {% endif %} +
+{% endblock %} + diff --git a/myapp/templates/scan_links.html b/myapp/templates/scan_links.html new file mode 100644 index 0000000..2e3df7f --- /dev/null +++ b/myapp/templates/scan_links.html @@ -0,0 +1,24 @@ +{% extends 'index.html' %} + +{% block content %} +

URL Resource Scanner

+ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ +

Scan Results

+ {% if results %} +
    + {% for result in results %} +
  • {{ result.resource }}
  • + {% endfor %} +
+ {% else %} +

No results found.

+ {% endif %} + + +{% endblock %} diff --git a/myapp/templates/scangit_repo.html b/myapp/templates/scangit_repo.html new file mode 100644 index 0000000..367a9a1 --- /dev/null +++ b/myapp/templates/scangit_repo.html @@ -0,0 +1,37 @@ +{% extends 'index.html' %} + +{% block content %} +

Scan Git Repository for Sensitive Data

+ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if findings %} +

Findings

+ + + + + + + + + + + {% for finding in findings %} + + + + + + + {% endfor %} + +
Pattern NameFile PathLine NumberContent
{{ finding.pattern_name }}{{ finding.file_path }}{{ finding.line_num }}{{ finding.content }}
+ {% else %} +

No findings yet.

+ {% endif %} +{% endblock %} diff --git a/myapp/templates/scrap_mul_links.html b/myapp/templates/scrap_mul_links.html new file mode 100644 index 0000000..58c9188 --- /dev/null +++ b/myapp/templates/scrap_mul_links.html @@ -0,0 +1,26 @@ +{% extends 'index.html' %} + +{% block content %} +
+

Link Scraper

+ + + +
+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if scraped_links %} +

Scraped Links

+ + {% endif %} +{% endblock %} diff --git a/myapp/templates/scrape_links.html b/myapp/templates/scrape_links.html new file mode 100644 index 0000000..8ab78f9 --- /dev/null +++ b/myapp/templates/scrape_links.html @@ -0,0 +1,26 @@ +{% extends 'index.html' %} + +{% block content %} + +
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if scraped_links %} +

Scraped Links

+ + {% endif %} +{% endblock %} diff --git a/myapp/templates/search_results.html b/myapp/templates/search_results.html new file mode 100644 index 0000000..8670f1b --- /dev/null +++ b/myapp/templates/search_results.html @@ -0,0 +1,127 @@ + +{% extends "index.html" %} + +{% block content %} +

Search Across Multiple Tables

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if results %} +
+

Search Results

+ +
+ +
+

Google Links

+ + + + + + + + {% for result in results.google_links %} + + + + {% empty %} + + + + {% endfor %} + +
Link
{{ result.link }}
No results found in Google Links.
+ +

Directory Enumerations

+ + + + + + + + {% for result in results.directory_enumerations %} + + + + {% empty %} + + + + {% endfor %} + +
Directory
{{ result.directory }}
No results found in Directory Enumeration.
+ +

Link Scrap

+ + + + + + + + {% for result in results.linkscraps %} + + + + {% empty %} + + + + {% endfor %} + +
Link
{{ result.link }}
No results found in Link Scrap.
+ +

Sitemap URLs

+ + + + + + + + {% for result in results.sitemap_urls %} + + + + {% empty %} + + + + {% endfor %} + +
URL
{{ result.url }}
No results found in Sitemap URLs.
+
+ {% endif %} + + + +{% endblock %} diff --git a/myapp/templates/secret.html b/myapp/templates/secret.html new file mode 100644 index 0000000..833c10f --- /dev/null +++ b/myapp/templates/secret.html @@ -0,0 +1,47 @@ +{% extends 'index.html' %} + +{% block content %} +

Secret Scanner

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if scan_results %} +

Scan Results

+ + + + + + + + + + {% for result in scan_results %} + {% if result.secrets %} + {% for secret_type, secrets in result.secrets.items %} + + + + + + {% endfor %} + {% else %} + + + + + {% endif %} + {% endfor %} + +
URLSecret TypeSecrets
{{ result.url }}{{ secret_type }} +
    + {% for secret in secrets %} +
  • {{ secret }}
  • + {% endfor %} +
+
{{ result.url }}No secrets found.
+ {% endif %} +{% endblock %} diff --git a/myapp/templates/show_tables.html b/myapp/templates/show_tables.html new file mode 100644 index 0000000..9be9112 --- /dev/null +++ b/myapp/templates/show_tables.html @@ -0,0 +1,126 @@ +{% extends 'index.html' %} + +{% block content %} + +

Tables in Database

+
    + {% for table in table_names %} +
  • + {{ table }} +
  • + {% empty %} +
  • No tables found in the database.
  • + {% endfor %} +
+ + {% if selected_table %} +

Data from Table: {{ selected_table }}

+ + +
+ + + + +
+ + {% if table_data %} + + + + {% for column in columns %} + + {% endfor %} + + + + {% for row in table_data %} + + {% for item in row %} + + {% endfor %} + + {% endfor %} + +
+ {{ column }} + +
{{ item }}
+ {% else %} +

No data found in this table.

+ {% endif %} + {% endif %} + + + +{% endblock %} diff --git a/myapp/templates/sitemap_scan.html b/myapp/templates/sitemap_scan.html new file mode 100644 index 0000000..4329950 --- /dev/null +++ b/myapp/templates/sitemap_scan.html @@ -0,0 +1,20 @@ +{% extends 'index.html' %} + +{% block content %} +

Sitemap URL Scanner

+ +
+ {% csrf_token %} + {{ form.as_p }} + +
+ + {% if sitemap_urls %} +

Fetched Sitemap URLs

+
    + {% for url in sitemap_urls %} +
  • {{ url }}
  • + {% endfor %} +
+ {% endif %} +{% endblock %} diff --git a/myapp/templates/subdomain.html b/myapp/templates/subdomain.html new file mode 100644 index 0000000..e32806c --- /dev/null +++ b/myapp/templates/subdomain.html @@ -0,0 +1,21 @@ +{% extends 'index.html' %} + +{% block content %} +

Subdomain Scanner

+
+ {% csrf_token %} + {{ form1.as_p }} + +
+ + {% if subdomain_list %} +

Available Subdomains for {{ form1.cleaned_data.domain }}

+ + {% endif %} +{% endblock %} diff --git a/myapp/tests.py b/myapp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/myapp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/myapp/trigger.py b/myapp/trigger.py new file mode 100644 index 0000000..8c0ff13 --- /dev/null +++ b/myapp/trigger.py @@ -0,0 +1,33 @@ +# trigger.py +from django.db.models import Q +from myapp.models import GoogleLink, DirectoryEnumeration, Linkscrap, SitemapURL + +def trigger_search(keywords): + keywords = [keyword.strip() for keyword in keywords.split(',')] + + google_links_q = Q() + for keyword in keywords: + google_links_q |= Q(query__icontains=keyword) | Q(link__icontains=keyword) + google_links_results = GoogleLink.objects.filter(google_links_q) + + directory_enum_q = Q() + for keyword in keywords: + directory_enum_q |= Q(domain__icontains=keyword) | Q(directory__icontains=keyword) + directory_enum_results = DirectoryEnumeration.objects.filter(directory_enum_q) + + linkscrap_q = Q() + for keyword in keywords: + linkscrap_q |= Q(link__icontains=keyword) + linkscrap_results = Linkscrap.objects.filter(linkscrap_q) + + sitemap_url_q = Q() + for keyword in keywords: + sitemap_url_q |= Q(url__icontains=keyword) + sitemap_url_results = SitemapURL.objects.filter(sitemap_url_q) + + return { + 'google_links': google_links_results, + 'directory_enumerations': directory_enum_results, + 'linkscraps': linkscrap_results, + 'sitemap_urls': sitemap_url_results, + } diff --git a/myapp/urls.py b/myapp/urls.py new file mode 100644 index 0000000..79837a3 --- /dev/null +++ b/myapp/urls.py @@ -0,0 +1,20 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.index, name='home'), + path('show-tables/', views.show_tables, name='show_tables'), + path('google_search/', views.google_search, name='google_search'), + path('subdomain/', views.subdomain, name='subdomain'), + path('base64_multiple/', views.base64_multiple, name='base64_multiple'), + path('scrape_links/', views.scrape_links, name='scrape_links'), + path('directory_enumeration_view/', views.directory_enumeration_view, name='directory_enumeration_view'), + path('scan_github_repository/', views.scan_github_repository, name='scan_github_repository'), + path('scan_secrets/', views.scan_secrets, name='scan_secrets'), + path('scrape_linksM/', views.scrape_linksM, name='scrape_linksM'), + path('sitemap_scan_view/', views.sitemap_scan_view, name='sitemap_scan_view'), + path('search_multiple_tables/', views.search_multiple_tables, name='search_multiple_tables'), + path('clear_data_view/', views.clear_data_view, name='clear_data_view'), + path('scan_links/', views.scan_links, name='scan_links'), + path('scan_git_repo/', views.scan_git_repo, name='scan_git_repo'), +] \ No newline at end of file diff --git a/myapp/views.py b/myapp/views.py new file mode 100644 index 0000000..b8e4d51 --- /dev/null +++ b/myapp/views.py @@ -0,0 +1,417 @@ +from django.shortcuts import render +from django.http import HttpResponse +from django.template import loader +from .glsearch import find_google_link +from .subdom import gather_subdomains +from .base64find import find_and_decode_base64_in_source +from .direnum import web_directory_enumeration +from .secret import find_secrets +from .linkscrapping import find_all_links +from .sitemap_scan import fetch_sitemap_urls +from .trigger import trigger_search +from .cleardata import clear_data +from .linkscraping import recursive_crawl +from .git_secret import clone_and_scan_repo +from .forms import ScanForm, MultiInputSearchForm, DomainInputForm, GitHubScanForm, SecretScanForm,LinkScrapingForm,LinkScrapingFormM,SitemapScanForm,KeywordSearchForm,URLScanForm,GitRepoForm +from .models import GoogleLink, Subdomain,DirectoryEnumeration,GitHubScan, SecretScan, Linkscrap,SitemapURL,Link_Resource,GitDataLeak +from django.db import connection +import subprocess +import json +import requests + +# Create your views here. +def index(request): + template = loader.get_template('index.html') + return HttpResponse(template.render()) + + +def google_search(request): + result = None + google_links = [] + if request.method == 'POST': + form = MultiInputSearchForm(request.POST) + if form.is_valid(): + # Get the input data from the form and concatenate them to form the search query + input1 = form.cleaned_data['input1'] + input2 = form.cleaned_data['input2'] + input3 = form.cleaned_data['input3'] + input4 = form.cleaned_data['input4'] + input5 = form.cleaned_data['input5'] + site_qry = f"{input1} {input2} {input3} {input4} {input5}".strip() + + # Get the list of Google links + google_links = find_google_link(site_qry) + + # Store the links in the database + for link in google_links: + if not GoogleLink.objects.filter(link=link).exists(): + GoogleLink.objects.create(query=site_qry, link=link) + + # Retrieve the links from the database + result = GoogleLink.objects.filter(query=site_qry) + else: + form = MultiInputSearchForm() + + context = { + 'form': form, + 'google_links': result or google_links, + } + return render(request, 'google_search.html', context) + + +# ---------------------------------------------------------- +# this section for showing data base +def show_tables(request): + with connection.cursor() as cursor: + # Execute a raw SQL query to get the table names + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + tables = cursor.fetchall() # Fetch all results + + # Extract table names from the fetched data + table_names = [table[0] for table in tables] + + selected_table = request.GET.get('table') + search_query = request.GET.get('search') # Get search query from the input + table_data = None + columns = [] + + if selected_table: + with connection.cursor() as cursor: + # If a search query exists, modify the SQL to filter results + if search_query: + cursor.execute(f"SELECT * FROM {selected_table} WHERE {get_filter_condition(selected_table, search_query)};") + else: + cursor.execute(f"SELECT * FROM {selected_table};") # Fetch all rows if no filter + + table_data = cursor.fetchall() + columns = [col[0] for col in cursor.description] # Get column names + + context = { + 'table_names': table_names, + 'table_data': table_data, + 'columns': columns, + 'selected_table': selected_table, + 'search_query': search_query, + } + return render(request, 'show_tables.html', context) + + +def get_filter_condition(table_name, query): + # Define which column(s) to filter for each table (based on your table schema) + # Adjust the WHERE clause depending on the structure of your table + # For simplicity, we'll search across all columns + + # Dynamic filtering based on table and query. Adjust based on specific table structures. + return f" OR ".join([f"{col} LIKE '%{query}%'" for col in get_column_names(table_name)]) + + +def get_column_names(table_name): + # A helper function to get column names dynamically from the selected table + with connection.cursor() as cursor: + cursor.execute(f"PRAGMA table_info({table_name});") + columns = [col[1] for col in cursor.fetchall()] # Column names are in the second field of each row + return columns + +# ---------------------------------------------------------- + +# ---------------------------------------------------------------- +# this is for Subdomains +def subdomain(request): + available_subdomains = None + subdomain_list = [] + + if request.method == 'POST': + form1 = ScanForm(request.POST) + + if form1.is_valid(): + domain = form1.cleaned_data['domain'] + subdomain_list = gather_subdomains(domain) # Get available subdomains + + # Store subdomains in the database and avoid duplicates using get_or_create + for subs in subdomain_list: + if not Subdomain.objects.filter(subdomains=subs[0]): + Subdomain.objects.get_or_create(domain_name=domain, subdomains=subs[0]) + + subdomain_list = Subdomain.objects.filter(domain_name=domain) + + else: + form1 = ScanForm() + + context = { + 'form1': form1, + 'subdomain_list':subdomain_list, + } + + return render(request, 'subdomain.html', context) +# ---------------------------------------------------------- + +# ---------------------------------------------------------------- +def base64_multiple(request): + result = {} + if request.method == 'POST': + if 'domain_text' in request.POST: + # Read textarea input and split by lines (assuming each line is a domain) + domains = request.POST['domain_text'].splitlines() + + for domain in domains: + # Call your custom function to process each domain + encoded_decoded_pairs = find_and_decode_base64_in_source(domain) + result[domain] = encoded_decoded_pairs + + return render(request, 'findbase64_mul.html', {'result': result}) + +# ------------------------------------------------------------------------ +# ------------------------------------------------------------------------ +def scrape_links(request): + form = LinkScrapingForm(request.POST or None) + scraped_links = [] + + if request.method == 'POST' and form.is_valid(): + base_url = form.cleaned_data['base_url'] + visited_links = set() + + find_all_links(base_url, visited_links, depth=2) + + scraped_links = Linkscrap.objects.filter(link__startswith=base_url) + + context = { + 'form': form, + 'scraped_links': scraped_links, + } + return render(request, 'scrape_links.html', context) + +# ------------------------------------------------------------------------ +# ------------------------------------------------------------------------ +def directory_enumeration_view(request): + enumerated_directories = [] + + if request.method == 'POST': + form = DomainInputForm(request.POST) + + if form.is_valid(): + url = form.cleaned_data['domain'] + wordlist_path = "C:\\Users\\User\\Desktop\\duck-duck-leak\\duck_duck_leak\\myapp\\payloads\\common.txt" + # Call the directory enumeration function + enumerated_directories = web_directory_enumeration(url, wordlist_path, max_workers=20) + + # Store the found directories in the database + for directory in enumerated_directories: + if not DirectoryEnumeration.objects.filter(directory=directory).exists(): + DirectoryEnumeration.objects.create(domain=url, directory=directory) + + # Retrieve the stored directories from the database + enumerated_directories = DirectoryEnumeration.objects.filter(domain=url) + else: + form = DomainInputForm() + + context = { + 'form': form, + 'enumerated_directories': enumerated_directories, + } + + return render(request, 'directory_enumeration.html', context) +# ------------------------------------------------------------------------ +# ------------------------------------------------------------------------ + +def scan_github_repository(request): + scan_results = None + if request.method == 'POST': + form = GitHubScanForm(request.POST) + if form.is_valid(): + repository_url = form.cleaned_data['repository_url'] + + # Run truffleHog command + command = f"trufflehog git --json {repository_url}" + try: + # Execute the command + result = subprocess.run(command, shell=True, capture_output=True, text=True, check=True) + + # Parse the JSON output + scan_results = json.loads(result.stdout) + + # Save the results to the database + GitHubScan.objects.create(repository_url=repository_url, scan_results=scan_results) + except subprocess.CalledProcessError as e: + print(f"Error occurred while running truffleHog: {e}") + scan_results = {"error": str(e)} + else: + form = GitHubScanForm() + + context = { + 'form': form, + 'scan_results': scan_results, + } + return render(request, 'gitscan.html', context) +# ------------------------------------------------------------------------ +# ------------------------------------------------------------------------ + +def scan_secrets(request): + scan_results = [] + + if request.method == 'POST': + form = SecretScanForm(request.POST) + if form.is_valid(): + urls = form.cleaned_data['urls'].splitlines() + + for url in urls: + try: + response = requests.get(url) + if response.status_code == 200: + # Scan the page content for secrets + secrets = find_secrets(response.text) + for secret_type, secret_values in secrets.items(): + for value in secret_values: + if not SecretScan.objects.filter(secret_value=value).exists(): + # Save the result to the database + SecretScan.objects.create( + url=url, + secret_type=secret_type, + secret_value=value + ) + scan_results.append({'url': url, 'secrets': secrets}) + else: + scan_results.append({'url': url, 'error': 'Failed to retrieve content'}) + except requests.exceptions.RequestException as e: + scan_results.append({'url': url, 'error': str(e)}) + else: + form = SecretScanForm() + + return render(request, 'secret.html', {'form': form, 'scan_results': scan_results}) + +# ---------------------------------------------------------------- +# scrapping the multiple links +#----------------------------------------------------------------- + + +def scrape_linksM(request): + form = LinkScrapingFormM(request.POST or None) + scraped_links = [] + + if request.method == 'POST' and form.is_valid(): + base_urls = form.cleaned_data['base_urls'].splitlines() # Split lines for multiple URLs + visited_links = set() + + for base_url in base_urls: + if base_url.strip(): # Ignore empty lines + find_all_links(base_url.strip(), visited_links, depth=2) + + # Query the database for links matching any base URL entered + scraped_links = Linkscrap.objects.filter(link__in=visited_links) + + context = { + 'form': form, + 'scraped_links': scraped_links, + } + return render(request, 'scrap_mul_links.html', context) + +# ---------------------------------------------------------------- +#----------------------------------------------------------------- + +def sitemap_scan_view(request): + form = SitemapScanForm(request.POST or None) + sitemap_urls = [] + + if request.method == 'POST' and form.is_valid(): + base_url = form.cleaned_data['base_url'] + + # Fetch sitemap URLs from the base URL + fetched_urls = fetch_sitemap_urls(base_url) + + # Loop through each fetched URL and store it if it's not already in the database + for url in fetched_urls: + if not SitemapURL.objects.filter(url=url).exists(): + SitemapURL.objects.create(url=url) + sitemap_urls.append(url) # Add to list to display on the page + + context = { + 'form': form, + 'sitemap_urls': sitemap_urls, # Display both new and existing URLs + } + return render(request, 'sitemap_scan.html', context) +# ---------------------------------------------------------------- +#----------------------------------------------------------------- +def search_multiple_tables(request): + form = KeywordSearchForm(request.POST or None) + results = {} + + if request.method == 'POST' and form.is_valid(): + # Get keywords from the form and pass to trigger_search + keywords = form.cleaned_data['keywords'] + results = trigger_search(keywords) # Perform the search and get results + + context = { + 'form': form, + 'results': results, + } + return render(request, 'search_results.html', context) + +# ---------------------------------------------------------------- +#----------------------------------------------------------------- + +def clear_data_view(request): + if request.method == "POST": + clear_data() + return render(request, "clear_data.html", {"data_cleared": True}) + return render(request, "clear_data.html", {"data_cleared": False}) +# ------------------------------------------------------------------------ +# ------------------------------------------------------------------------ + +def scan_links(request): + results = [] + + if request.method == 'POST': + form = URLScanForm(request.POST) + if form.is_valid(): + # Get URLs from the form input, split by lines + urls = form.cleaned_data['urls'].splitlines() + + # Loop through each URL and crawl + for url in urls: + visited = set() + resources_found = [] + + # Call the recursive_crawl function + recursive_crawl(url, visited, resources_found) + + # Save resources found to the results list + for resource in resources_found: + results.append({ + 'url': url, + 'resource': resource + }) + # Save to the database + Link_Resource.objects.create(url=url, resource=resource) + + # Display "No resources found" if the list is empty + if not results: + results = [{"url": url, "resource": "No resources found"}] + + else: + form = URLScanForm() + + # Pass form and results to the template + return render(request, 'scan_links.html', {'form': form, 'results': results}) + +# ------------------------------------------------------------------------ +# ------------------------------------------------------------------------ + +def scan_git_repo(request): + form = GitRepoForm() + findings = [] + + if request.method == 'POST': + form = GitRepoForm(request.POST) + if form.is_valid(): + repo_url = form.cleaned_data['repo_url'] + findings = clone_and_scan_repo(repo_url) + + # Store findings in the database + for finding in findings: + GitDataLeak.objects.create( + pattern_name=finding['pattern_name'], + file_path=finding['file_path'], + line_num=finding['line_num'], + content=finding['content'], + ) + + return render(request, 'scangit_repo.html', {'form': form, 'findings': findings}) \ No newline at end of file