diff --git a/.env b/.env index fca522eee..f5d282d0c 100644 --- a/.env +++ b/.env @@ -28,3 +28,10 @@ POSTGRES_HOST=db # MAX_CONCURRENCY=80 MIN_CONCURRENCY=10 + +# +# Rengine web interface super user (for non-interactive install) +# +DJANGO_SUPERUSER_USERNAME=rengine +DJANGO_SUPERUSER_EMAIL=rengine@example.com +DJANGO_SUPERUSER_PASSWORD=Sm7IJG.IfHAFw9snSKv diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index b1c75fe0b..eb9feec1d 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -2,12 +2,19 @@ name: 🌄 Build Docker image for pull request on: pull_request: - branches: [ master, stable, dev ] + branches: + - master + - release/* jobs: build: name: Build Docker image runs-on: ubuntu-latest + strategy: + matrix: + platform: + - linux/amd64 + - linux/arm64 steps: - name: Checkout the git repo uses: actions/checkout@v4 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 439af90e8..fd438d55d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,6 +10,11 @@ jobs: build: name: Build Docker image runs-on: ubuntu-latest + strategy: + matrix: + platform: + - linux/amd64 + - linux/arm64 steps: - name: Checkout the git repo uses: actions/checkout@v4 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index cc50ad1f6..bd8a831d2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -24,12 +24,12 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 00cf16f06..297b91930 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -8,6 +8,7 @@ Thanks to these individuals for making reNgine awesome by fixing bugs, resolving * [Suprita-25](https://github.com/Suprita-25) * [TheBinitGhimire](https://github.com/TheBinitGhimire) * [Vinay Leo](https://github.com/vinaynm) +* [Erdem Ozgen](https://github.com/ErdemOzgen) *If you have created a Pull request, feel free to add your name here, because we know you are awesome and deserve thanks from the community!* diff --git a/Makefile b/Makefile index f1b8d1d1d..37ce9ad0d 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,4 @@ +include .env .DEFAULT_GOAL:=help # Credits: https://github.com/sherifabdlnaby/elastdocker/ @@ -6,55 +7,65 @@ COMPOSE_PREFIX_CMD := COMPOSE_DOCKER_CLI_BUILD=1 COMPOSE_ALL_FILES := -f docker-compose.yml -SERVICES := db web proxy redis celery celery-beat +SERVICES := db web proxy redis celery celery-beat ollama # -------------------------- .PHONY: setup certs up build username pull down stop restart rm logs certs: ## Generate certificates. - @${COMPOSE_PREFIX_CMD} docker-compose -f docker-compose.setup.yml run --rm certs + @${COMPOSE_PREFIX_CMD} docker compose -f docker-compose.setup.yml run --rm certs setup: ## Generate certificates. @make certs up: ## Build and start all services. - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} up -d --build ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} up -d --build ${SERVICES} build: ## Build all services. - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} build ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} build ${SERVICES} username: ## Generate Username (Use only after make up). - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} exec web python3 manage.py createsuperuser +ifeq ($(isNonInteractive), true) + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} exec web python3 manage.py createsuperuser --username ${DJANGO_SUPERUSER_USERNAME} --email ${DJANGO_SUPERUSER_EMAIL} --noinput +else + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} exec web python3 manage.py createsuperuser +endif + +changepassword: ## Change password for user + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} exec web python3 manage.py changepassword + +migrate: ## Apply migrations + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} exec web python3 manage.py migrate pull: ## Pull Docker images. docker login docker.pkg.github.com - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} pull + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} pull down: ## Down all services. - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} down + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} down stop: ## Stop all services. - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} stop ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} stop ${SERVICES} restart: ## Restart all services. - ${COMPOSE_PREFIX_CMD} docker-compose ${COMPOSE_ALL_FILES} restart ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose ${COMPOSE_ALL_FILES} restart ${SERVICES} rm: ## Remove all services containers. - ${COMPOSE_PREFIX_CMD} docker-compose $(COMPOSE_ALL_FILES) rm -f ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose $(COMPOSE_ALL_FILES) rm -f ${SERVICES} test: - ${COMPOSE_PREFIX_CMD} docker-compose $(COMPOSE_ALL_FILES) exec celery python3 -m unittest tests/test_scan.py + ${COMPOSE_PREFIX_CMD} docker compose $(COMPOSE_ALL_FILES) exec celery python3 -m unittest tests/test_scan.py logs: ## Tail all logs with -n 1000. - ${COMPOSE_PREFIX_CMD} docker-compose $(COMPOSE_ALL_FILES) logs --follow --tail=1000 ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose $(COMPOSE_ALL_FILES) logs --follow --tail=1000 ${SERVICES} images: ## Show all Docker images. - ${COMPOSE_PREFIX_CMD} docker-compose $(COMPOSE_ALL_FILES) images ${SERVICES} + ${COMPOSE_PREFIX_CMD} docker compose $(COMPOSE_ALL_FILES) images ${SERVICES} prune: ## Remove containers and delete volume data. @make stop && make rm && docker volume prune -f help: ## Show this help. - @echo "Make application docker images and manage containers using docker-compose files." + @echo "Make application Docker images and manage containers using Docker Compose files." @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m (default: help)\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-12s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST) diff --git a/README.md b/README.md index 5cb963784..067ac34b8 100644 --- a/README.md +++ b/README.md @@ -27,23 +27,20 @@ Open Source Security Index - Fastest Growing Open Source Security Projects

+

reNgine 2.1.0 is released!

+

Unleash the power of LLM toolkit! Now you can use local LLM models to generate attack surface and vulnerability reports!, Checkout the release-notes!

+

reNgine 2.0-jasper
Redefining the future of reconnaissance!

What is reNgine?

reNgine is your go-to web application reconnaissance suite that's designed to simplify and streamline the reconnaissance process for security professionals, penetration testers, and bug bounty hunters. With its highly configurable engines, data correlation capabilities, continuous monitoring, database-backed reconnaissance data, and an intuitive user interface, reNgine redefines how you gather critical information about your target web applications. -Traditional reconnaissance tools often fall short in terms of configurability and efficiency. reNgine addresses these shortcomings and emerges as a excellent alternative to existing commercial tools. +Traditional reconnaissance tools often fall short in terms of configurability and efficiency. reNgine addresses these shortcomings and emerges as an excellent alternative to existing commercial tools. reNgine was created to address the limitations of traditional reconnaissance tools and provide a better alternative, even surpassing some commercial offerings. Whether you're a bug bounty hunter, a penetration tester, or a corporate security team, reNgine is your go-to solution for automating and enhancing your information-gathering efforts.

-reNgine 2.0-jasper is out now, you can [watch reNgine 2.0-jasper release trailer here!](https://youtu.be/VwkOWqiWW5g) - -reNgine 2.0-Jasper would not have been possible without [@ocervell](https://github.com/ocervell) valuable contributions. [@ocervell](https://github.com/ocervell) did majority of the refactoring if not all and also added a ton of features. Together, we wish to shape the future of web application reconnaissance, and it's developers like [@ocervell](https://github.com/ocervell) and a [ton of other developers and hackers from our community](https://github.com/yogeshojha/rengine/graphs/contributors) who inspire and drive us forward. - -Thank you, [@ocervell](https://github.com/ocervell), for your outstanding work and unwavering commitment to reNgine. - -Checkout our contributers here: [Contributers](https://github.com/yogeshojha/rengine/graphs/contributors) +[Watch reNgine 2.0-jasper release trailer here!](https://youtu.be/VwkOWqiWW5g) ![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) @@ -75,7 +72,7 @@ You can find detailed documentation at [https://rengine.wiki](https://rengine.wi reNgine is not an ordinary reconnaissance suite; it's a game-changer! We've turbocharged the traditional workflow with groundbreaking features that is sure to ease your reconnaissance game. reNgine redefines the art of reconnaissance with highly configurable scan engines, recon data correlation, continuous monitoring, GPT powered Vulnerability Report, Project Management and role based access control etc. -🦾   reNgine has advanced reconnaissance capabilities, harnessing a range of open-source tools to deliver a comprehensive web application reconnaissance experience. With it's intuitive User Interface, it excels in subdomain discovery, pinpointing IP addresses and open ports, collecting endpoints, conducting directory and file fuzzing, capturing screenshots, and performing vulnerability scans. To summarize, it does end-to-end reconnaissance. With WHOIS identification and WAF detection, it offers deep insights into target domains. Additionally, reNgine also identifies misconfigured S3 buckets and find interesting subdomains and URLS, based on specific keywords to helps you identify your next target, making it an go to tool for efficient reconnaissance. +🦾   reNgine has advanced reconnaissance capabilities, harnessing a range of open-source tools to deliver a comprehensive web application reconnaissance experience. With its intuitive User Interface, it excels in subdomain discovery, pinpointing IP addresses and open ports, collecting endpoints, conducting directory and file fuzzing, capturing screenshots, and performing vulnerability scans. To summarize, it does end-to-end reconnaissance. With WHOIS identification and WAF detection, it offers deep insights into target domains. Additionally, reNgine also identifies misconfigured S3 buckets and find interesting subdomains and URLS, based on specific keywords to helps you identify your next target, making it a go-to tool for efficient reconnaissance. 🗃️    Say goodbye to recon data chaos! reNgine seamlessly integrates with a database, providing you with unmatched data correlation and organization. Forgot the hassle of grepping through json, txt or csv files. Plus, our custom query language lets you filter reconnaissance data effortlessly using natural language like operators such as filtering all alive subdomains with `http_status=200` and also filter all subdomains that are alive and has admin in name `http_status=200&name=admin` @@ -85,17 +82,17 @@ reNgine is not an ordinary reconnaissance suite; it's a game-changer! We've turb 📃   PDF Reports: In addition to its robust reconnaissance capabilities, reNgine goes the extra mile by simplifying the report generation process, recognizing the crucial role that PDF reports play in the realm of end-to-end reconnaissance. Users can effortlessly generate and customize PDF reports to suit their exact needs. Whether it's a Full Scan Report, Vulnerability Report, or a concise reconnaissance report, reNgine provides the flexibility to choose the report type that best communicates your findings. Moreover, the level of customization is unparalleled, allowing users to select report colors, fine-tune executive summaries, and even add personalized touches like company names and footers. With GPT integration, your reports aren't just a report, with remediation steps, and impacts, you get 360-degree view of the vulnerabilities you've uncovered. -🔖    Say Hello to Projects! reNgine 2.0 introduces a powerful addition that enables you to efficiently organize your web application reconnaissance efforts. With this feature, you can create distinct project spaces, each tailored to a specific purpose, such as personal bug bounty hunting, client engagements, or any other specialized recon task. Each projects will have separate dashboard and all the scan results will be separated from each projects, while scan engines and configuration will be shared across all the projects. +🔖    Say Hello to Projects! reNgine 2.0 introduces a powerful addition that enables you to efficiently organize your web application reconnaissance efforts. With this feature, you can create distinct project spaces, each tailored to a specific purpose, such as personal bug bounty hunting, client engagements, or any other specialized recon task. Each projects will have separate dashboard and all the scan results will be separated from each project, while scan engines and configuration will be shared across all the projects. -⚙️    Roles and Permissions! Begining reNgine 2.0, we've taken your web application reconnaissance to a whole new level of control and security. Now, you can assign distinct roles to your team members—Sys Admin, Penetration Tester, and Auditor—each with precisely defined permissions to tailor their access and actions within the reNgine ecosystem. +⚙️    Roles and Permissions! In reNgine 2.0, we've taken your web application reconnaissance to a whole new level of control and security. Now, you can assign distinct roles to your team members—Sys Admin, Penetration Tester, and Auditor—each with precisely defined permissions to tailor their access and actions within the reNgine ecosystem. - - 🔐 Sys Admin: Sys Admin is a super user that has permission to modify system and scan related configurations, scan engines, create new users, add new tools etc. Super user can initiate scans and subscans effortlessly. + - 🔐 Sys Admin: Sys Admin is a superuser that has permission to modify system and scan related configurations, scan engines, create new users, add new tools etc. Superuser can initiate scans and subscans effortlessly. - 🔍 Penetration Tester: Penetration Tester will be allowed to modify and initiate scans and subscans, add or update targets, etc. A penetration tester will not be allowed to modify system configurations. - 📊 Auditor: Auditor can only view and download the report. An auditor can not change any system or scan related configurations nor can initiate any scans or subscans. 🚀   GPT Vulnerability Report Generation: Get ready for the future of penetration testing reports with reNgine's groundbreaking feature: "GPT-Powered Report Generation"! With the power of OpenAI's GPT, reNgine now provides you with detailed vulnerability descriptions, remediation strategies, and impact assessments that read like they were written by a human security expert! **But that's not all!** Our GPT-driven reports go the extra mile by scouring the web for related news articles, blogs, and references, so you have a 360-degree view of the vulnerabilities you've uncovered. With reNgine 2.0 revolutionize your penetration testing game and impress your clients with reports that are not just informative but engaging and comprehensive with detailed analysis on impact assessment and remediation strategies. -🥷   GPT-Powered Attack Surface Generation: With reNgine 2.0, reNgine seamlessly integrates with GPT to identify the attacks that you can likely perform on a subdomain. By making use of reconnaissance data such as page title, open ports, subdomain name etc, reNgine can advice you the attacks you could perform on a target. reNgine will also provide you the rationale on why the specific attack is likely to be successful. +🥷   GPT-Powered Attack Surface Generation: With reNgine 2.0, reNgine seamlessly integrates with GPT to identify the attacks that you can likely perform on a subdomain. By making use of reconnaissance data such as page title, open ports, subdomain name etc. reNgine can advise you the attacks you could perform on a target. reNgine will also provide you the rationale on why the specific attack is likely to be successful. 🧭  Continuous monitoring: Continuous monitoring is at the core of reNgine's mission, and it's robust continuous monitoring feature ensures that their targets are under constant scrutiny. With the flexibility to schedule scans at regular intervals, penetration testers can effortlessly stay informed about their targets. What sets reNgine apart is its seamless integration with popular notification channels such as Discord, Slack, and Telegram, delivering real-time alerts for newly discovered subdomains, vulnerabilities, or any changes in reconnaissance data. @@ -150,13 +147,14 @@ reNgine is not an ordinary reconnaissance suite; it's a game-changer! We've turb * Identify Interesting Subdomains * Custom GF patterns and custom Nuclei Templates * Edit tool-related configuration files (Nuclei, Subfinder, Naabu, amass) -* Add external tools from Github/Go +* Add external tools from GitHub/Go * Interoperable with other tools, Import/Export Subdomains/Endpoints * Import Targets via IP and/or CIDRs * Report Generation * Toolbox: Comes bundled with most commonly used tools during penetration testing such as whois lookup, CMS detector, CVE lookup, etc. * Identification of related domains and related TLDs for targets * Find actionable insights such as Most Common Vulnerability, Most Common CVE ID, Most Vulnerable Target/Subdomain, etc. +* You can now use local LLMs for Attack surface identification and vulnerability description (NEW: reNgine 2.1.0) ![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) @@ -318,12 +316,27 @@ screenshot: { git clone https://github.com/yogeshojha/rengine && cd rengine ``` -1. Edit the dotenv file, **please make sure to change the password for postgresql `POSTGRES_PASSWORD`!** +1. Edit the `.env` file, **please make sure to change the password for postgresql `POSTGRES_PASSWORD`!** ```bash nano .env ``` +1. **Optional, only for non-interactive install**: In the `.env` file, **please make sure to change the super admin values!** + + ```bash + DJANGO_SUPERUSER_USERNAME=yourUsername + DJANGO_SUPERUSER_EMAIL=YourMail@example.com + DJANGO_SUPERUSER_PASSWORD=yourStrongPassword + ``` + If you need to carry out a non-interactive installation, you can setup the login, email and password of the web interface admin directly from the .env file (instead of manually setting them from prompts during the installation process). This option can be interesting for automated installation (via ansible, vagrant, etc.). + + `DJANGO_SUPERUSER_USERNAME`: web interface admin username (used to login to the web interface). + + `DJANGO_SUPERUSER_EMAIL`: web interface admin email. + + `DJANGO_SUPERUSER_PASSWORD`: web interface admin password (used to login to the web interface). + 1. In the dotenv file, you may also modify the Scaling Configurations ```bash @@ -331,11 +344,20 @@ screenshot: { MIN_CONCURRENCY=10 ``` - MAX_CONCURRENCY: This parameter specifies the maximum number of reNgine's concurrent Celery worker processes that can be spawned. In this case, it's set to 80, meaning that the application can utilize up to 80 concurrent worker processes to execute tasks concurrently. This is useful for handling a high volume of scans or when you want to scale up processing power during periods of high demand. If you have more CPU cores, you will need to increase this for maximised performance. + `MAX_CONCURRENCY`: This parameter specifies the maximum number of reNgine's concurrent Celery worker processes that can be spawned. In this case, it's set to 80, meaning that the application can utilize up to 80 concurrent worker processes to execute tasks concurrently. This is useful for handling a high volume of scans or when you want to scale up processing power during periods of high demand. If you have more CPU cores, you will need to increase this for maximised performance. + + `MIN_CONCURRENCY`: On the other hand, MIN_CONCURRENCY specifies the minimum number of concurrent worker processes that should be maintained, even during periods of lower demand. In this example, it's set to 10, which means that even when there are fewer tasks to process, at least 10 worker processes will be kept running. This helps ensure that the application can respond promptly to incoming tasks without the overhead of repeatedly starting and stopping worker processes. + + These settings allow for dynamic scaling of Celery workers, ensuring that the application efficiently manages its workload by adjusting the number of concurrent workers based on the workload's size and complexity. - MIN_CONCURRENCY: On the other hand, MIN_CONCURRENCY specifies the minimum number of concurrent worker processes that should be maintained, even during periods of lower demand. In this example, it's set to 10, which means that even when there are fewer tasks to process, at least 10 worker processes will be kept running. This helps ensure that the application can respond promptly to incoming tasks without the overhead of repeatedly starting and stopping worker processes. + Here is the ideal value for `MIN_CONCURRENCY` and `MAX_CONCURRENCY` depending on the number of RAM your machine has: - These settings allow for dynamic scaling of Celery workers, ensuring that the application efficiently manages its workload by adjusting the number of concurrent workers based on the workload's size and complexity + * 4GB: `MAX_CONCURRENCY=10` + * 8GB: `MAX_CONCURRENCY=30` + * 16GB: `MAX_CONCURRENCY=50` + + This is just an ideal value which developers have tested and tried out and works! But feel free to play around with the values. + Maximum number of scans is determined by various factors, your network bandwidth, RAM, number of CPUs available. etc 1. Run the installation script, Please keep an eye for any prompt, you will also be asked for username and password for reNgine. @@ -343,6 +365,12 @@ screenshot: { sudo ./install.sh ``` + Or for a non-interactive installation, use `-n` argument (make sure you've modified the `.env` file before launching the installation). + + ```bash + sudo ./install.sh -n + ``` + If `install.sh` does not have install permission, please change it, `chmod +x install.sh` **reNgine can now be accessed from or if you're on the VPS ** @@ -358,12 +386,12 @@ Installation instructions can be found at [https://reNgine.wiki/install/detailed 1. Updating is as simple as running the following command: ```bash - cd rengine && sudo ./update.sh + cd rengine && sudo ./update.sh ``` If `update.sh` does not have execution permissions, please change it, `sudo chmod +x update.sh` - - **NOTE:** if you're updating from 1.3.6 and you're getting a 'password authentication failed' error, consider uninstalling 1.3.6 first, then install 2.x.x as you'd normally do. + + **NOTE:** if you're updating from 1.3.6, and you're getting a 'password authentication failed' error, consider uninstalling 1.3.6 first, then install 2.x.x as you'd normally do. ### Changelog @@ -405,7 +433,7 @@ Installation instructions can be found at [https://reNgine.wiki/install/detailed ### Contributing -Contributions are what make the open-source community such an amazing place to learn, inspire and create. Every contributions you make is **greatly appreciated**. Your contributions can be as simple as fixing the indentation or UI, or as complex as adding new modules and features. +Contributions are what make the open-source community such an amazing place to learn, inspire and create. Every contribution you make is **greatly appreciated**. Your contributions can be as simple as fixing the indentation or UI, or as complex as adding new modules and features. See the [Contributing Guide](.github/CONTRIBUTING.md) to get started. @@ -413,67 +441,80 @@ You can also [join our Discord channel #development](https://discord.gg/JuhHdHTt ![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) -### First-time Open Source contributors +### Submitting issues -Please note that reNgine is beginner friendly. If you have never done open-source before, we encourage you to do so. **We will be happy and proud of your first PR ever.** +You can submit issues related to this project, but you should do it in a way that helps developers to resolve it as quickly as possible. -You can start by resolving any [open issues](https://github.com/yogeshojha/rengine/issues). +For that, you need to add as much valuable information as possible. -![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) +You can have this valuable information by following these steps: -### reNgine Support +- Go to the root of the git cloned project +- Edit `web/entrypoint.sh` and add `export DEBUG=1` at the top +This should give you this result -Please do not use GitHub for support requests. Instead, [join our Discord channel #support](https://discord.gg/azv6fzhNCE). + ```python + #!/bin/bash -![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) + export DEBUG=1 -### Support and Sponsoring + python3 manage.py migrate + python3 manage.py runserver 0.0.0.0:8000 -Over the past few years, I have been working hard on reNgine to add new features with the sole aim of making it the de facto standard for reconnaissance. I spend most of my free time and weekends working on reNgine. I do this in addition to my day job. I am happy to have received such overwhelming support from the community. But to keep this project alive, I am looking for financial support. + exec "$@" + ``` +- Restart the web container: `docker-compose restart web` +- To deactivate, set **DEBUG** to **0** and restart the web container again -| Paypal | Bitcoin | Ethereum | -| :-------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | -|[https://www.paypal.com/paypalme/yogeshojha11](https://www.paypal.com/paypalme/yogeshojha11) | `35AiKyNswNZ4TZUSdriHopSCjNMPi63BCX` | `0xe7A337Da6ff98A28513C26A7Fec8C9b42A63d346` +Then, with **DEBUG** set to **1**, in the `make logs` output you could see the full stack trace to debug reNgine. -OR +Example with the tool arsenal version check API bug. -* Add a [GitHub Star](https://github.com/yogeshojha/rengine) to the project. -* Tweet about this project, or maybe blogs? -* Maybe nominate me for [GitHub Stars?](https://stars.github.com/nominate/) -* Join DigitalOcean using my [referral link](https://m.do.co/c/e353502d19fc) your profit is **$100** and I get $25 DO credit. This will help me test reNgine on VPS before I release any major features. +``` +web_1 | File "/usr/local/lib/python3.10/dist-packages/celery/app/task.py", line 411, in __call__ +web_1 | return self.run(*args, **kwargs) +web_1 | TypeError: run_command() got an unexpected keyword argument 'echo' +``` +Now you know the real error is `TypeError: run_command() got an unexpected keyword argument 'echo'` -It takes a considerable amount of time to add new features and make sure everything works. Donating is your way of saying: **reNgine is awesome**. +And you can post the full stack trace to your newly created issue to help developers to track the root cause of the bug and correct the bug easily -Any support is greatly appreciated! Thank you! +**Activating debug like this also give you the full stack trace in the browser** instead of an error 500 without any details. +So don't forget to open the developer console and check for any XHR request with error 500. +If there's any, check the response of this request to get your detailed error. + + + +Happy issuing ;) ![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) -### reNgine Bug Bounty Program +### First-time Open Source contributors -[![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev/bounties/disclose/?target=https%3A%2F%2Fgithub.com%2Fyogeshojha%2Frengine) +Please note that reNgine is beginner-friendly. If you have never done open-source before, we encourage you to do so. **We will be happy and proud of your first PR ever.** -Security researchers, welcome aboard! I'm excited to announce the reNgine bug bounty programme in collaboration with [huntr.dev](https://huntr.dev), which means that you will be rewarded for any vulnerabilities you find in reNgine. +You can start by resolving any [open issues](https://github.com/yogeshojha/rengine/issues). -Thank you for your interest in reporting reNgine vulnerabilities! If you are aware of any potential security vulnerabilities in reNgine, we encourage you to report them immediately via [huntr.dev](https://huntr.dev/bounties/disclose/?target=https%3A%2F%2Fgithub.com%2Fyogeshojha%2Frengine). +![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) + +### reNgine Support -**Please do not disclose vulnerabilities via Github issues/blogs/tweets after/before reporting to huntr.dev as this is explicitly against the disclosure policy of huntr.dev and reNgine and will not be considered for monetary rewards.** +Please do not use GitHub for support requests. Instead, [join our Discord channel #support](https://discord.gg/azv6fzhNCE). -Please note that the reNgine maintainer does not set the bounty amount. -The bounty reward is determined by an industry-first equation developed by huntr.dev to understand the popularity, impact and value of repositories to the open-source community. +![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) -**What do I expect from security researchers?** +### Support and Sponsoring -* Patience: Please note that I am currently the only maintainer in reNgine and it will take some time to validate your report. I ask for your patience during this process. -* Respect for privacy and security reports: Please do not publicly disclose any vulnerabilities (including GitHub issues) before or after reporting them on huntr.dev! This is against the disclosure policy and will not be rewarded. -* Respect the rules +Over the past few years, I have been working hard on reNgine to add new features with the sole aim of making it the de facto standard for reconnaissance. I spend most of my free time and weekends working on reNgine. I do this in addition to my day job. I am happy to have received such overwhelming support from the community. To keep this project alive, you may -**What do you get in return?** +* Add a [GitHub Star](https://github.com/yogeshojha/rengine) to the project. +* Tweet about this project, or maybe blogs? +* Maybe nominate me for [GitHub Stars?](https://stars.github.com/nominate/) +* Join DigitalOcean using my [referral link](https://m.do.co/c/e353502d19fc) your profit is **$100** and I get $25 DO credit. This will help me test reNgine on VPS before I release any major features. -* Thanks from the maintainer -* Monetary rewards -* CVE ID(s) +It takes a considerable amount of time to add new features and make sure everything works. Donating is your way of saying: **reNgine is awesome**. -Please find the [FAQ](https://www.huntr.dev/faq) and [Responsible disclosure policy](https://www.huntr.dev/policy/) from huntr.dev. +Any support is greatly appreciated! Thank you! ![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/aqua.png) diff --git a/certs/entrypoint.sh b/certs/entrypoint.sh index fded161ba..6d699b8d6 100755 --- a/certs/entrypoint.sh +++ b/certs/entrypoint.sh @@ -19,16 +19,21 @@ cert() { -out ${FILENAME}.csr \ -subj "/C=${COUNTRY_CODE}/ST=${STATE}/L=${CITY}/O=${COMPANY}/CN=${COMMON_NAME}" + # Creating SAN extension which is needed by modern browsers + echo "subjectAltName=DNS:${COMMON_NAME}" > client-ext.cnf + # Create a new certificate using our own CA openssl x509 -req -sha256 -passin pass:${AUTHORITY_PASSWORD} -days 3650 \ -in ${FILENAME}.csr -CA ca.crt -CAkey ca.key \ - -out ${FILENAME}.crt + -out ${FILENAME}.crt \ + -extfile client-ext.cnf # Rename files and remove useless ones mv ${FILENAME}.crt ${FILENAME}.pem cp ca.crt ${FILENAME}_chain.pem mv ${FILENAME}.key ${FILENAME}_rsa.key rm ${FILENAME}.csr + rm client-ext.cnf } # Create /certs folder if it does not exist diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ffd733e31..840236685 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: db: restart: always @@ -98,7 +96,7 @@ services: - POSTGRES_HOST=${POSTGRES_HOST} # THIS IS A MUST FOR CHECKING UPDATE, EVERYTIME A COMMIT IS MERGED INTO # MASTER, UPDATE THIS!!! MAJOR.MINOR.PATCH https://semver.org/ - - RENGINE_CURRENT_VERSION='2.0.6' + - RENGINE_CURRENT_VERSION='2.1.0' volumes: - ./web:/usr/src/app - github_repos:/usr/src/github @@ -115,6 +113,17 @@ services: - celery-beat networks: - rengine_network + ollama: + image: ollama/ollama + container_name: ollama + volumes: + - ollama_data:/root/.ollama + # ports: + # - "11434:11434" + networks: + - rengine_network + restart: always + # command: ["ollama", "run", "llama2-uncensored"] networks: rengine_network: @@ -126,3 +135,4 @@ volumes: github_repos: wordlist: scan_results: + ollama_data: diff --git a/docker-compose.setup.yml b/docker-compose.setup.yml index 6046b1136..bdc8ba5dd 100644 --- a/docker-compose.setup.yml +++ b/docker-compose.setup.yml @@ -1,4 +1,3 @@ -version: '3.8' services: certs: build: ./certs diff --git a/docker-compose.yml b/docker-compose.yml index bd623618c..b6c4a07f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: db: restart: always @@ -9,12 +7,15 @@ services: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_PORT=${POSTGRES_PORT} + ports: + - "127.0.0.1:5432:5432" volumes: - postgres_data:/var/lib/postgresql/data/ networks: - rengine_network redis: + restart: always image: "redis:alpine" hostname: redis networks: @@ -94,9 +95,10 @@ services: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_PORT=${POSTGRES_PORT} - POSTGRES_HOST=${POSTGRES_HOST} + - DJANGO_SUPERUSER_PASSWORD=${DJANGO_SUPERUSER_PASSWORD} # THIS IS A MUST FOR CHECKING UPDATE, EVERYTIME A COMMIT IS MERGED INTO # MASTER, UPDATE THIS!!! MAJOR.MINOR.PATCH https://semver.org/ - - RENGINE_CURRENT_VERSION='2.0.6' + - RENGINE_CURRENT_VERSION='2.1.0' volumes: - ./web:/usr/src/app - github_repos:/usr/src/github @@ -107,7 +109,7 @@ services: - tool_config:/root/.config - static_volume:/usr/src/app/staticfiles/ ports: - - "8000:8000" + - "127.0.0.1:8000:8000" depends_on: - db - celery @@ -140,7 +142,15 @@ services: - scan_results:/usr/src/scan_results networks: - rengine_network - + ollama: + image: ollama/ollama + container_name: ollama + volumes: + - ollama_data:/root/.ollama + ports: + - "11434:11434" + networks: + - rengine_network networks: rengine_network: @@ -154,6 +164,7 @@ volumes: wordlist: scan_results: static_volume: + ollama_data: secrets: proxy.ca: diff --git a/install.sh b/install.sh index 1e2ae5bd4..0f27a4b3c 100755 --- a/install.sh +++ b/install.sh @@ -1,5 +1,15 @@ #!/bin/bash +usageFunction() +{ + echo " " + tput setaf 2; + echo "Usage: $0 (-n) (-h)" + echo -e "\t-n Non-interactive installation (Optional)" + echo -e "\t-h Show usage" + exit 1 +} + tput setaf 2; cat web/art/reNgine.txt @@ -7,21 +17,29 @@ tput setaf 1; echo "Before running this script, please make sure Docker is runni tput setaf 2; echo "Changing the postgres username & password from .env is highly recommended." tput setaf 4; -read -p "Are you sure, you made changes to .env file (y/n)? " answer -case ${answer:0:1} in - y|Y|yes|YES|Yes ) - echo "Continiuing Installation!" - ;; - * ) - if [ -x "$(command -v nano)" ]; then - tput setaf 2; echo "nano already installed, skipping." - else - sudo apt update && sudo apt install nano -y - tput setaf 2; echo "nano installed!!!" - fi - nano .env - ;; -esac + +isNonInteractive=false +while getopts nh opt; do + case $opt in + n) isNonInteractive=true ;; + h) usageFunction ;; + ?) usageFunction ;; + esac +done + +if [ $isNonInteractive = false ]; then + read -p "Are you sure, you made changes to .env file (y/n)? " answer + case ${answer:0:1} in + y|Y|yes|YES|Yes ) + echo "Continiuing Installation!" + ;; + * ) + nano .env + ;; + esac +else + echo "Non-interactive installation parameter set. Installation begins." +fi echo " " tput setaf 3; @@ -32,7 +50,7 @@ echo "#########################################################################" echo " " tput setaf 4; -echo "Installing reNgine and it's dependencies" +echo "Installing reNgine and its dependencies" echo " " if [ "$EUID" -ne 0 ] @@ -66,20 +84,22 @@ else tput setaf 2; echo "Docker installed!!!" fi + echo " " tput setaf 4; echo "#########################################################################" -echo "Installing docker compose" +echo "Installing Docker Compose" echo "#########################################################################" if [ -x "$(command -v docker compose)" ]; then - tput setaf 2; echo "docker compose already installed, skipping." + tput setaf 2; echo "Docker Compose already installed, skipping." else - curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose - tput setaf 2; echo "docker compose installed!!!" + tput setaf 2; echo "Docker Compose installed!!!" fi + echo " " tput setaf 4; echo "#########################################################################" @@ -106,6 +126,8 @@ else exit 1 fi + + echo " " tput setaf 4; echo "#########################################################################" @@ -121,9 +143,11 @@ if [ "${failed}" -eq 0 ]; then echo "#########################################################################" echo "Creating an account" echo "#########################################################################" - make username + make username isNonInteractive=$isNonInteractive + make migrate tput setaf 2 && printf "\n%s\n" "Thank you for installing reNgine, happy recon!!" + echo "In case you have unapplied migrations (see above in red), run 'make migrate'" else tput setaf 1 && printf "\n%s\n" "reNgine installation failed!!" fi diff --git a/make.bat b/make.bat index 0a99cb6cb..6b052927d 100644 --- a/make.bat +++ b/make.bat @@ -6,30 +6,32 @@ set COMPOSE_ALL_FILES = -f docker-compose.yml set SERVICES = db web proxy redis celery celery-beat :: Generate certificates. -if "%1" == "certs" docker-compose -f docker-compose.setup.yml run --rm certs +if "%1" == "certs" docker compose -f docker-compose.setup.yml run --rm certs :: Generate certificates. -if "%1" == "setup" docker-compose -f docker-compose.setup.yml run --rm certs +if "%1" == "setup" docker compose -f docker-compose.setup.yml run --rm certs :: Build and start all services. -if "%1" == "up" docker-compose %COMPOSE_ALL_FILES% up -d --build %SERVICES% +if "%1" == "up" docker compose %COMPOSE_ALL_FILES% up -d --build %SERVICES% :: Build all services. -if "%1" == "build" docker-compose %COMPOSE_ALL_FILES% build %SERVICES% +if "%1" == "build" docker compose %COMPOSE_ALL_FILES% build %SERVICES% :: Generate Username (Use only after make up). if "%1" == "username" docker-compose %COMPOSE_ALL_FILES% exec web python3 manage.py createsuperuser +:: Apply migrations +if "%1" == "migrate" docker-compose %COMPOSE_ALL_FILES% exec web python3 manage.py migrate :: Pull Docker images. if "%1" == "pull" docker login docker.pkg.github.com & docker-compose %COMPOSE_ALL_FILES% pull :: Down all services. -if "%1" == "down" docker-compose %COMPOSE_ALL_FILES% down +if "%1" == "down" docker compose %COMPOSE_ALL_FILES% down :: Stop all services. -if "%1" == "stop" docker-compose %COMPOSE_ALL_FILES% stop %SERVICES% +if "%1" == "stop" docker compose %COMPOSE_ALL_FILES% stop %SERVICES% :: Restart all services. -if "%1" == "restart" docker-compose %COMPOSE_ALL_FILES% restart %SERVICES% +if "%1" == "restart" docker compose %COMPOSE_ALL_FILES% restart %SERVICES% :: Remove all services containers. -if "%1" == "rm" docker-compose %COMPOSE_ALL_FILES% rm -f %SERVICES% +if "%1" == "rm" docker compose %COMPOSE_ALL_FILES% rm -f %SERVICES% :: Tail all logs with -n 1000. -if "%1" == "logs" docker-compose %COMPOSE_ALL_FILES% logs --follow --tail=1000 %SERVICES% +if "%1" == "logs" docker compose %COMPOSE_ALL_FILES% logs --follow --tail=1000 %SERVICES% :: Show all Docker images. -if "%1" == "images" docker-compose %COMPOSE_ALL_FILES% images %SERVICES% +if "%1" == "images" docker compose %COMPOSE_ALL_FILES% images %SERVICES% :: Remove containers and delete volume data. -if "%1" == "prune" docker-compose %COMPOSE_ALL_FILES% stop %SERVICES% & docker-compose %COMPOSE_ALL_FILES% rm -f %SERVICES% & docker volume prune -f +if "%1" == "prune" docker compose %COMPOSE_ALL_FILES% stop %SERVICES% & docker-compose %COMPOSE_ALL_FILES% rm -f %SERVICES% & docker volume prune -f :: Show this help. -if "%1" == "help" @echo Make application docker images and manage containers using docker-compose files only for windows. +if "%1" == "help" @echo Make application Docker images and manage containers using Docker Compose files only for windows. diff --git a/update.sh b/update.sh old mode 100644 new mode 100755 index b29c9e770..6b3adc751 --- a/update.sh +++ b/update.sh @@ -2,6 +2,7 @@ echo "Do you want to apply your local changes after updating? (y/n)" read answer +answer=$(echo $answer | tr '[:upper:]' '[:lower:]') if [[ $answer == "y" ]]; then make down && git stash save && git pull && git stash apply && make build && make up diff --git a/web/Dockerfile b/web/Dockerfile index 72b13433a..b9082d594 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -1,5 +1,14 @@ # Base image -FROM --platform=linux/amd64 ubuntu:22.04 +FROM ubuntu:22.04 + +ARG GECKOVERSION=0.33.0 +ARG GOVERSION=1.21.5 + +RUN ARCH=$(dpkg --print-architecture) \ + && if [ "${ARCH}" ! "arm64" ] || [ "${ARCH}" ! "amd64" ]; then \ + echo "reNgine not supported, encountered unknown architecture: ${TARGETPLATFORM}" \ + && exit 1; \ + fi # Labels and Credits LABEL \ @@ -18,14 +27,13 @@ ENV PATH="${PATH}:${GOROOT}/bin:${GOPATH}/bin" # Install Python RUN apt update -y && \ - apt update -y && \ apt install -y \ python3.10 \ python3-dev \ - python3-pip + python3-pip # Install essential packages -RUN apt install -y --no-install-recommends \ +RUN apt install -y --no-install-recommends \ build-essential \ cmake \ geoip-bin \ @@ -47,17 +55,21 @@ RUN apt install -y --no-install-recommends \ RUN add-apt-repository ppa:mozillateam/ppa -# Download and install go 1.20 -RUN wget https://golang.org/dl/go1.21.4.linux-amd64.tar.gz -RUN tar -xvf go1.21.4.linux-amd64.tar.gz -RUN rm go1.21.4.linux-amd64.tar.gz -RUN mv go /usr/local - -# Download geckodriver -RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux64.tar.gz -RUN tar -xvf geckodriver-v0.32.0-linux64.tar.gz -RUN rm geckodriver-v0.32.0-linux64.tar.gz -RUN mv geckodriver /usr/bin +RUN ARCH=$(dpkg --print-architecture) \ + && wget https://go.dev/dl/go${GOVERSION}.linux-${ARCH}.tar.gz \ + && tar -xvf go${GOVERSION}.linux-${ARCH}.tar.gz -C /usr/local \ + && rm go${GOVERSION}.linux-${ARCH}.tar.gz + +RUN ARCH=$(dpkg --print-architecture) \ + && if [ "${ARCH}" = "arm64" ]; then \ + GECKOPATH="geckodriver-v${GECKOVERSION}-linux-aarch64.tar.gz"; \ + elif [ "${ARCH}" = "amd64" ]; then \ + GECKOPATH="geckodriver-v${GECKOVERSION}-linux64.tar.gz"; \ + fi \ + && wget https://github.com/mozilla/geckodriver/releases/download/v${GECKOVERSION}/${GECKOPATH} \ + && tar -xvf ${GECKOPATH} \ + && rm ${GECKOPATH} \ + && mv geckodriver /usr/bin # Make directory for app WORKDIR /usr/src/app @@ -66,52 +78,43 @@ WORKDIR /usr/src/app ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 -# Download Go packages -RUN go install -v github.com/jaeles-project/gospider@latest -RUN go install -v github.com/tomnomnom/gf@latest -RUN go install -v github.com/tomnomnom/unfurl@latest -RUN go install -v github.com/tomnomnom/waybackurls@latest -RUN go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest -RUN go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest -RUN go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest -RUN go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@latest -RUN go install -v github.com/hakluke/hakrawler@latest -RUN go install -v github.com/lc/gau/v2/cmd/gau@latest -RUN go install -v github.com/owasp-amass/amass/v3/...@latest -RUN go install -v github.com/ffuf/ffuf@latest -RUN go install -v github.com/projectdiscovery/tlsx/cmd/tlsx@latest -RUN go install -v github.com/hahwul/dalfox/v2@latest -RUN go install -v github.com/projectdiscovery/katana/cmd/katana@latest -RUN go install -v github.com/dwisiswant0/crlfuzz/cmd/crlfuzz@latest -RUN go install -v github.com/sa7mon/s3scanner@latest +ENV GO111MODULE=on +RUN printf "\ + github.com/jaeles-project/gospider@latest\n\ + github.com/tomnomnom/gf@latest\n\ + github.com/tomnomnom/unfurl@latest\n\ + github.com/tomnomnom/waybackurls@latest\n\ + github.com/projectdiscovery/httpx/cmd/httpx@latest\n\ + github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest\n\ + github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest\n\ + github.com/projectdiscovery/naabu/v2/cmd/naabu@latest\n\ + github.com/hakluke/hakrawler@latest\n\ + github.com/lc/gau/v2/cmd/gau@latest\n\ + github.com/owasp-amass/amass/v3/...@latest\n\ + github.com/ffuf/ffuf@latest\n\ + github.com/projectdiscovery/tlsx/cmd/tlsx@latest\n\ + github.com/hahwul/dalfox/v2@latest\n\ + github.com/projectdiscovery/katana/cmd/katana@latest\n\ + github.com/dwisiswant0/crlfuzz/cmd/crlfuzz@latest\n\ + github.com/sa7mon/s3scanner@latest\n" | \ + xargs -L1 go install -ldflags="-s -w" -v && \ + rm -rf /go/pkg/* && rm -rf /root/.cache/go-build + # Update Nuclei and Nuclei-Templates -RUN nuclei -update RUN nuclei -update-templates -# Update project discovery tools -RUN httpx -up -RUN naabu -up -RUN subfinder -up -RUN tlsx -up -RUN katana -up - # Copy requirements COPY ./requirements.txt /tmp/requirements.txt RUN pip3 install --upgrade setuptools pip && \ - pip3 install -r /tmp/requirements.txt - + pip3 install -r /tmp/requirements.txt --no-cache-dir # install eyewitness - -RUN python3 -m pip install fuzzywuzzy \ +RUN python3 -m pip install --no-cache-dir fuzzywuzzy \ selenium==4.9.1 \ python-Levenshtein \ pyvirtualdisplay \ netaddr # Copy source code -COPY . /usr/src/app/ - -# httpx seems to have issue, use alias instead!!! -RUN echo 'alias httpx="/go/bin/httpx"' >> ~/.bashrc +COPY . /usr/src/app/ \ No newline at end of file diff --git a/web/api/urls.py b/web/api/urls.py index f3a09b54d..f4ee867e7 100644 --- a/web/api/urls.py +++ b/web/api/urls.py @@ -178,6 +178,10 @@ 'tool/uninstall/', UninstallTool.as_view(), name='uninstall_tool'), + path( + 'tool/ollama/', + OllamaManager.as_view(), + name='ollama_manager'), path( 'rengine/update/', RengineUpdateCheck.as_view(), diff --git a/web/api/views.py b/web/api/views.py index 5aa778692..b04c48145 100644 --- a/web/api/views.py +++ b/web/api/views.py @@ -2,6 +2,7 @@ import re import socket import subprocess +from ipaddress import IPv4Network import requests import validators @@ -33,6 +34,82 @@ logger = logging.getLogger(__name__) +class OllamaManager(APIView): + def get(self, request): + """ + API to download Ollama Models + sends a POST request to download the model + """ + req = self.request + model_name = req.query_params.get('model') + response = { + 'status': False + } + try: + pull_model_api = f'{OLLAMA_INSTANCE}/api/pull' + _response = requests.post( + pull_model_api, + json={ + 'name': model_name, + 'stream': False + } + ).json() + if _response.get('error'): + response['status'] = False + response['error'] = _response.get('error') + else: + response['status'] = True + except Exception as e: + response['error'] = str(e) + return Response(response) + + def delete(self, request): + req = self.request + model_name = req.query_params.get('model') + delete_model_api = f'{OLLAMA_INSTANCE}/api/delete' + response = { + 'status': False + } + try: + _response = requests.delete( + delete_model_api, + json={ + 'name': model_name + } + ).json() + if _response.get('error'): + response['status'] = False + response['error'] = _response.get('error') + else: + response['status'] = True + except Exception as e: + response['error'] = str(e) + return Response(response) + + def put(self, request): + req = self.request + model_name = req.query_params.get('model') + # check if model_name is in DEFAULT_GPT_MODELS + response = { + 'status': False + } + use_ollama = True + if any(model['name'] == model_name for model in DEFAULT_GPT_MODELS): + use_ollama = False + try: + OllamaSettings.objects.update_or_create( + defaults={ + 'selected_model': model_name, + 'use_ollama': use_ollama + }, + id=1 + ) + response['status'] = True + except Exception as e: + response['error'] = str(e) + return Response(response) + + class GPTAttackSuggestion(APIView): def get(self, request): req = self.request @@ -171,7 +248,7 @@ def filter_queryset(self, qs): if _order_direction == 'desc': - order_col = '-{}'.format(order_col) + order_col = f'-{order_col}' qs = self.queryset.filter( Q(name__icontains=search_value) | @@ -547,6 +624,7 @@ def post(self, request): h1_team_handle = data.get('h1_team_handle') description = data.get('description') domain_name = data.get('domain_name') + organization_name = data.get('organization') slug = data.get('slug') # Validate domain name @@ -563,6 +641,20 @@ def post(self, request): if not domain.insert_date: domain.insert_date = timezone.now() domain.save() + + # Create org object in DB + if organization_name: + organization_obj = None + organization_query = Organization.objects.filter(name=organization_name) + if organization_query.exists(): + organization_obj = organization_query[0] + else: + organization_obj = Organization.objects.create( + name=organization_name, + project=project, + insert_date=timezone.now()) + organization_obj.domains.add(domain) + return Response({ 'status': True, 'message': 'Domain successfully added as target !', @@ -712,6 +804,7 @@ def post(self, request): task_ids = scan.celery_ids scan.scan_status = ABORTED_TASK scan.stop_scan_date = timezone.now() + scan.aborted_by = request.user scan.save() create_scan_activity( scan.id, @@ -949,7 +1042,7 @@ def get(self, request): # if tool_github_url has https://github.com/ remove and also remove trailing / tool_github_url = tool.github_url.replace('http://github.com/', '').replace('https://github.com/', '') tool_github_url = remove_lead_and_trail_slash(tool_github_url) - github_api = 'https://api.github.com/repos/{}/releases'.format(tool_github_url) + github_api = f'https://api.github.com/repos/{tool_github_url}/releases' response = requests.get(github_api).json() # check if api rate limit exceeded if 'message' in response and response['message'] == 'RateLimited': @@ -958,7 +1051,7 @@ def get(self, request): return Response({'status': False, 'message': 'Not Found'}) elif not response: return Response({'status': False, 'message': 'Not Found'}) - + # only send latest release response = response[0] @@ -1122,27 +1215,29 @@ def get(self, request): }) try: logger.info(f'Resolving IP address {ip_address} ...') - domain, domains, ips = socket.gethostbyaddr(ip_address) - response = { - 'status': True, - 'ip_address': ip_address, - 'domains': domains or [domain], - 'resolves_to': domain - } - except socket.herror: # ip does not have a PTR record - logger.info(f'No PTR record for {ip_address}') + resolved_ips = [] + for ip in IPv4Network(ip_address, False): + domains = [] + ips = [] + try: + (domain, domains, ips) = socket.gethostbyaddr(str(ip)) + except socket.herror: + logger.info(f'No PTR record for {ip_address}') + domain = str(ip) + if domain not in domains: + domains.append(domain) + resolved_ips.append({'ip': str(ip),'domain': domain, 'domains': domains, 'ips': ips}) response = { 'status': True, - 'ip_address': ip_address, - 'domains': [ip_address], - 'resolves_to': ip_address + 'orig': ip_address, + 'ip_address': resolved_ips, } except Exception as e: logger.exception(e) response = { 'status': False, 'ip_address': ip_address, - 'message': 'Exception {}'.format(e) + 'message': f'Exception {e}' } finally: return Response(response) @@ -1788,7 +1883,7 @@ def filter_queryset(self, qs): order_col = 'content_length' if _order_direction == 'desc': - order_col = '-{}'.format(order_col) + order_col = f'-{order_col}' if search_value: qs = self.queryset.filter( @@ -1844,6 +1939,9 @@ def get_queryset(self): subdomains = Subdomain.objects.filter(target_domain__project__slug=project) + if 'is_important' in req.query_params: + subdomains = subdomains.filter(is_important=True) + if target_id: self.queryset = ( subdomains @@ -1895,7 +1993,7 @@ def filter_queryset(self, qs): elif _order_col == '10': order_col = 'response_time' if _order_direction == 'desc': - order_col = '-{}'.format(order_col) + order_col = f'-{order_col}' # if the search query is separated by = means, it is a specific lookup # divide the search query into two half and lookup if search_value: @@ -2225,7 +2323,7 @@ def filter_queryset(self, qs): elif _order_col == '9': order_col = 'response_time' if _order_direction == 'desc': - order_col = '-{}'.format(order_col) + order_col = f'-{order_col}' # if the search query is separated by = means, it is a specific lookup # divide the search query into two half and lookup if '=' in search_value or '&' in search_value or '|' in search_value or '>' in search_value or '<' in search_value or '!' in search_value: diff --git a/web/art/reNgine.txt b/web/art/reNgine.txt index 99971eea6..3b3a89199 100644 --- a/web/art/reNgine.txt +++ b/web/art/reNgine.txt @@ -3,6 +3,6 @@ _ __ ___| \| | __ _ _ _ __ ___ | '__/ _ \ . ` |/ _` | | '_ \ / _ \ | | | __/ |\ | (_| | | | | | __/ - |_| \___|_| \_|\__, |_|_| |_|\___| v2.0.4-jasper + |_| \___|_| \_|\__, |_|_| |_|\___| v2.1.0 __/ | |___/ diff --git a/web/celery-entrypoint.sh b/web/celery-entrypoint.sh index 3e681abf0..74923206a 100755 --- a/web/celery-entrypoint.sh +++ b/web/celery-entrypoint.sh @@ -159,29 +159,33 @@ echo 'alias httpx="/go/bin/httpx"' >> ~/.bashrc # TEMPORARY FIX, httpcore is causing issues with celery, removing it as temp fix python3 -m pip uninstall -y httpcore +loglevel='info' +if [ "$DEBUG" == "1" ]; then + loglevel='debug' +fi # watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --autoscale=10,0 -l INFO -Q scan_queue & echo "Starting Workers..." echo "Starting Main Scan Worker with Concurrency: $MAX_CONCURRENCY,$MIN_CONCURRENCY" -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --loglevel=info --autoscale=$MAX_CONCURRENCY,$MIN_CONCURRENCY -Q main_scan_queue & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=info -Q initiate_scan_queue -n initiate_scan_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=info -Q subscan_queue -n subscan_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=20 --loglevel=info -Q report_queue -n report_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q send_notif_queue -n send_notif_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q send_scan_notif_queue -n send_scan_notif_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q send_task_notif_queue -n send_task_notif_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=5 --loglevel=info -Q send_file_to_discord_queue -n send_file_to_discord_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=5 --loglevel=info -Q send_hackerone_report_queue -n send_hackerone_report_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q parse_nmap_results_queue -n parse_nmap_results_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=20 --loglevel=info -Q geo_localize_queue -n geo_localize_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q query_whois_queue -n query_whois_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=info -Q remove_duplicate_endpoints_queue -n remove_duplicate_endpoints_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=50 --loglevel=info -Q run_command_queue -n run_command_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q query_reverse_whois_queue -n query_reverse_whois_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q query_ip_history_queue -n query_ip_history_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=info -Q gpt_queue -n gpt_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q dorking_queue -n dorking_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q osint_discovery_queue -n osint_discovery_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q h8mail_queue -n h8mail_worker & -watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=info -Q theHarvester_queue -n theHarvester_worker +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --loglevel=$loglevel --autoscale=$MAX_CONCURRENCY,$MIN_CONCURRENCY -Q main_scan_queue & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=$loglevel -Q initiate_scan_queue -n initiate_scan_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=$loglevel -Q subscan_queue -n subscan_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=20 --loglevel=$loglevel -Q report_queue -n report_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q send_notif_queue -n send_notif_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q send_scan_notif_queue -n send_scan_notif_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q send_task_notif_queue -n send_task_notif_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=5 --loglevel=$loglevel -Q send_file_to_discord_queue -n send_file_to_discord_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=5 --loglevel=$loglevel -Q send_hackerone_report_queue -n send_hackerone_report_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q parse_nmap_results_queue -n parse_nmap_results_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=20 --loglevel=$loglevel -Q geo_localize_queue -n geo_localize_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q query_whois_queue -n query_whois_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=$loglevel -Q remove_duplicate_endpoints_queue -n remove_duplicate_endpoints_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=50 --loglevel=$loglevel -Q run_command_queue -n run_command_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q query_reverse_whois_queue -n query_reverse_whois_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q query_ip_history_queue -n query_ip_history_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=30 --loglevel=$loglevel -Q gpt_queue -n gpt_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q dorking_queue -n dorking_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q osint_discovery_queue -n osint_discovery_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q h8mail_queue -n h8mail_worker & +watchmedo auto-restart --recursive --pattern="*.py" --directory="/usr/src/app/reNgine/" -- celery -A reNgine.tasks worker --pool=gevent --concurrency=10 --loglevel=$loglevel -Q theHarvester_queue -n theHarvester_worker exec "$@" diff --git a/web/dashboard/migrations/0001_initial.py b/web/dashboard/migrations/0001_initial.py index 86394badd..44e9ac9a7 100644 --- a/web/dashboard/migrations/0001_initial.py +++ b/web/dashboard/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.4 on 2022-04-23 17:58 +# Generated by Django 3.2.23 on 2024-06-19 02:43 from django.db import migrations, models @@ -11,11 +11,42 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='NetlasAPIKey', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('key', models.CharField(max_length=500)), + ], + ), + migrations.CreateModel( + name='OllamaSettings', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('selected_model', models.CharField(max_length=500)), + ('use_ollama', models.BooleanField(default=True)), + ], + ), + migrations.CreateModel( + name='OpenAiAPIKey', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('key', models.CharField(max_length=500)), + ], + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=500)), + ('slug', models.SlugField(unique=True)), + ('insert_date', models.DateTimeField()), + ], + ), migrations.CreateModel( name='SearchHistory', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=1000)), + ('query', models.CharField(max_length=1000)), ], ), ] diff --git a/web/dashboard/migrations/0002_rename_name_searchhistory_query.py b/web/dashboard/migrations/0002_rename_name_searchhistory_query.py deleted file mode 100644 index 20fbfd414..000000000 --- a/web/dashboard/migrations/0002_rename_name_searchhistory_query.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-23 18:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0001_initial'), - ] - - operations = [ - migrations.RenameField( - model_name='searchhistory', - old_name='name', - new_name='query', - ), - ] diff --git a/web/dashboard/migrations/0003_projects.py b/web/dashboard/migrations/0003_projects.py deleted file mode 100644 index 2c63d6b51..000000000 --- a/web/dashboard/migrations/0003_projects.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-26 03:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0002_rename_name_searchhistory_query'), - ] - - operations = [ - migrations.CreateModel( - name='Projects', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ('slug', models.SlugField(max_length=200)), - ], - ), - ] diff --git a/web/dashboard/migrations/0004_rename_projects_project.py b/web/dashboard/migrations/0004_rename_projects_project.py deleted file mode 100644 index 050e610db..000000000 --- a/web/dashboard/migrations/0004_rename_projects_project.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-26 03:57 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0003_projects'), - ] - - operations = [ - migrations.RenameModel( - old_name='Projects', - new_name='Project', - ), - ] diff --git a/web/dashboard/migrations/0005_alter_project_slug.py b/web/dashboard/migrations/0005_alter_project_slug.py deleted file mode 100644 index 99b7d68be..000000000 --- a/web/dashboard/migrations/0005_alter_project_slug.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-26 05:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0004_rename_projects_project'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='slug', - field=models.SlugField(unique=True), - ), - ] diff --git a/web/dashboard/migrations/0006_project_insert_date.py b/web/dashboard/migrations/0006_project_insert_date.py deleted file mode 100644 index 6d51f4e22..000000000 --- a/web/dashboard/migrations/0006_project_insert_date.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-06 09:08 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0005_alter_project_slug'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='insert_date', - field=models.DateTimeField(default='2023-06-06'), - preserve_default=False, - ), - ] diff --git a/web/dashboard/migrations/0007_netlasapikey_openaiapikey.py b/web/dashboard/migrations/0007_netlasapikey_openaiapikey.py deleted file mode 100644 index e6d6c596a..000000000 --- a/web/dashboard/migrations/0007_netlasapikey_openaiapikey.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-22 18:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0006_project_insert_date'), - ] - - operations = [ - migrations.CreateModel( - name='NetlasAPIKey', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('key', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='OpenAiAPIKey', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('key', models.CharField(max_length=500)), - ], - ), - ] diff --git a/web/dashboard/migrations/0007_openaikeys.py b/web/dashboard/migrations/0007_openaikeys.py deleted file mode 100644 index 629e5e39c..000000000 --- a/web/dashboard/migrations/0007_openaikeys.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-21 09:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0006_project_insert_date'), - ] - - operations = [ - migrations.CreateModel( - name='OpenAIKeys', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('key', models.CharField(max_length=500)), - ], - ), - ] diff --git a/web/dashboard/migrations/0008_merge_0007_netlasapikey_openaiapikey_0007_openaikeys.py b/web/dashboard/migrations/0008_merge_0007_netlasapikey_openaiapikey_0007_openaikeys.py deleted file mode 100644 index 7554e1592..000000000 --- a/web/dashboard/migrations/0008_merge_0007_netlasapikey_openaiapikey_0007_openaikeys.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-27 10:00 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0007_netlasapikey_openaiapikey'), - ('dashboard', '0007_openaikeys'), - ] - - operations = [ - ] diff --git a/web/dashboard/migrations/0009_delete_openaikeys.py b/web/dashboard/migrations/0009_delete_openaikeys.py deleted file mode 100644 index b206e0121..000000000 --- a/web/dashboard/migrations/0009_delete_openaikeys.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-28 04:22 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0008_merge_0007_netlasapikey_openaiapikey_0007_openaikeys'), - ] - - operations = [ - migrations.DeleteModel( - name='OpenAIKeys', - ), - ] diff --git a/web/dashboard/models.py b/web/dashboard/models.py index 3d6001745..8ed77dd43 100644 --- a/web/dashboard/models.py +++ b/web/dashboard/models.py @@ -24,6 +24,15 @@ class OpenAiAPIKey(models.Model): def __str__(self): return self.key + + +class OllamaSettings(models.Model): + id = models.AutoField(primary_key=True) + selected_model = models.CharField(max_length=500) + use_ollama = models.BooleanField(default=True) + + def __str__(self): + return self.selected_model class NetlasAPIKey(models.Model): diff --git a/web/dashboard/templates/dashboard/admin.html b/web/dashboard/templates/dashboard/admin.html index 31c754a88..a9008afd2 100644 --- a/web/dashboard/templates/dashboard/admin.html +++ b/web/dashboard/templates/dashboard/admin.html @@ -216,7 +216,7 @@

Users

.catch(function() { swal.insertQueueStep({ type: 'error', - title: 'Oops! Unable to updte user!' + title: 'Oops! Unable to update user!' }) }) resolve() @@ -246,6 +246,9 @@

Users

+
{% else %} @@ -38,7 +38,7 @@
-

Netlas keys will be used to get whois information and other OSINT data.

+

Netlas keys will be used to get whois information and other OSINT related data.

{% if netlas_key %} {% else %} diff --git a/web/scanEngine/templates/scanEngine/settings/llm_toolkit.html b/web/scanEngine/templates/scanEngine/settings/llm_toolkit.html new file mode 100644 index 000000000..fa6d304ed --- /dev/null +++ b/web/scanEngine/templates/scanEngine/settings/llm_toolkit.html @@ -0,0 +1,286 @@ +{% extends 'base/base.html' %} +{% load static %} +{% load humanize %} +{% block title %} +LLM Toolkit +{% endblock title %} + +{% block custom_js_css_link %} +{% endblock custom_js_css_link %} + +{% block breadcrumb_title %} + + +{% endblock breadcrumb_title %} + +{% block page_title %} +LLM Toolkit (Beta) +{% endblock page_title %} + +{% block main_content %} +
+
+
+
+ LLM Toolkit includes the ability to download new LLMs, view available models, and delete models no longer needed, and also choose between various models. +
+

reNgine makes use of various LLMs to enhance reporting process. Using various LLM AI Models penetration testers will be able to to generate detailed, insightful penetration testing reports. +
+ If you are using custom LLM models, it is expected that response time are much slower in CPU. We recommend using GPU for better performance. Models such as llama2, or llama3 requires significant computation and GPU are required. Having only CPU will result in slow response time. +
+ OpenAI GPT models do not run locally, hence the requirement of GPU is not necessary. +

+
+
+
+ +
{{installed_models|length}} available Models
+ {% if openai_key_error %} + + {% endif %} +
+ {% for model in installed_models %} +
+
+
+ +

+ {{model.name}} {% if model.selected %}Selected Model{% endif %} +

+

+

+ + + Modified {% if model.modified_at %}{{model.modified_at|naturaltime}} {% else %} NA{% endif %} + +
+ + + {% if model.is_local %} + Locally installed model + {% else %} + Open AI Model + {% endif %} + +
+ + + {{model.details.parameter_size}} Parameters + + + + {{model.details.family}} Family + +

+
+
+
+ {% empty %} + + {% endfor %} +
+
+{% endblock main_content %} + + +{% block page_level_script %} + +{% endblock page_level_script %} diff --git a/web/scanEngine/templates/scanEngine/settings/notification.html b/web/scanEngine/templates/scanEngine/settings/notification.html index 8259884e7..cffc23511 100644 --- a/web/scanEngine/templates/scanEngine/settings/notification.html +++ b/web/scanEngine/templates/scanEngine/settings/notification.html @@ -51,6 +51,29 @@

Send Notifications to:

Slack Webhook API Documentation
+
+ +
+
+
+ +
+ {{form.send_to_lark}} +
+
+
+ {{form.lark_hook_url}} +
+ + + +
+
+
+ +
@@ -183,6 +206,16 @@

Upload S } }); + var lark_checkbox = document.getElementById("lark_checkbox"); + lark_checkbox.addEventListener('change', function() { + if (this.checked) { + document.getElementById("lark_hook_url").readOnly = false; + } + else{ + document.getElementById("lark_hook_url").readOnly = true; + } + }); + var discord_checkbox = document.getElementById("discord_checkbox"); discord_checkbox.addEventListener('change', function() { if (this.checked) { diff --git a/web/scanEngine/urls.py b/web/scanEngine/urls.py index ff7d2812c..89c5084b7 100644 --- a/web/scanEngine/urls.py +++ b/web/scanEngine/urls.py @@ -56,6 +56,10 @@ '/tool_arsenal', views.tool_arsenal_section, name='tool_arsenal'), + path( + '/llm_toolkit', + views.llm_toolkit_section, + name='llm_toolkit'), path( '/rengine_settings', views.rengine_settings, diff --git a/web/scanEngine/views.py b/web/scanEngine/views.py index 0a06cb790..21b9b4baf 100644 --- a/web/scanEngine/views.py +++ b/web/scanEngine/views.py @@ -4,6 +4,7 @@ import shutil import subprocess +from datetime import datetime from django import http from django.contrib import messages from django.shortcuts import get_object_or_404, render @@ -11,7 +12,7 @@ from rolepermissions.decorators import has_permission_decorator from reNgine.common_func import * -from reNgine.tasks import (run_command, send_discord_message, send_slack_message, send_telegram_message) +from reNgine.tasks import (run_command, send_discord_message, send_slack_message,send_lark_message, send_telegram_message) from scanEngine.forms import * from scanEngine.forms import ConfigurationForm from scanEngine.models import * @@ -210,7 +211,7 @@ def tool_specific_settings(request, slug): file = open(file_path, "w") file.write(gf_file.read().decode("utf-8")) file.close() - messages.add_message(request, messages.INFO, 'Pattern {} successfully uploaded'.format(gf_file.name[:4])) + messages.add_message(request, messages.INFO, f'Pattern {gf_file.name[:4]} successfully uploaded') return http.HttpResponseRedirect(reverse('tool_settings', kwargs={'slug': slug})) elif 'nucleiFileUpload' in request.FILES: @@ -224,7 +225,7 @@ def tool_specific_settings(request, slug): file = open(file_path, "w") file.write(nuclei_file.read().decode("utf-8")) file.close() - messages.add_message(request, messages.INFO, 'Nuclei Pattern {} successfully uploaded'.format(nuclei_file.name[:-5])) + messages.add_message(request, messages.INFO, f'Nuclei Pattern {nuclei_file.name[:-5]} successfully uploaded') return http.HttpResponseRedirect(reverse('tool_settings', kwargs={'slug': slug})) elif 'nuclei_config_text_area' in request.POST: @@ -306,6 +307,7 @@ def notification_settings(request, slug): if form.is_valid(): form.save() send_slack_message('*reNgine*\nCongratulations! your notification services are working.') + send_lark_message('*reNgine*\nCongratulations! your notification services are working.') send_telegram_message('*reNgine*\nCongratulations! your notification services are working.') send_discord_message('**reNgine**\nCongratulations! your notification services are working.') messages.add_message( @@ -456,6 +458,41 @@ def tool_arsenal_section(request, slug): return render(request, 'scanEngine/settings/tool_arsenal.html', context) +@has_permission_decorator(PERM_MODIFY_SYSTEM_CONFIGURATIONS, redirect_url=FOUR_OH_FOUR_URL) +def llm_toolkit_section(request, slug): + context = {} + list_all_models_url = f'{OLLAMA_INSTANCE}/api/tags' + response = requests.get(list_all_models_url) + all_models = [] + selected_model = None + all_models = DEFAULT_GPT_MODELS.copy() + if response.status_code == 200: + models = response.json() + ollama_models = models.get('models') + date_format = "%Y-%m-%dT%H:%M:%S" + for model in ollama_models: + all_models.append({**model, + 'modified_at': datetime.strptime(model['modified_at'].split('.')[0], date_format), + 'is_local': True, + }) + # find selected model name from db + selected_model = OllamaSettings.objects.first() + if selected_model: + selected_model = {'selected_model': selected_model.selected_model} + else: + # use gpt3.5-turbo as default + selected_model = {'selected_model': 'gpt-3.5-turbo'} + for model in all_models: + if model['name'] == selected_model['selected_model']: + model['selected'] = True + context['installed_models'] = all_models + # show error message for openai key, if any gpt is selected + openai_key = get_open_ai_key() + if not openai_key and 'gpt' in selected_model['selected_model']: + context['openai_key_error'] = True + return render(request, 'scanEngine/settings/llm_toolkit.html', context) + + @has_permission_decorator(PERM_MODIFY_SYSTEM_CONFIGURATIONS, redirect_url=FOUR_OH_FOUR_URL) def api_vault(request, slug): context = {} diff --git a/web/startScan/migrations/0001_initial.py b/web/startScan/migrations/0001_initial.py index d82a9ef75..a27191207 100644 --- a/web/startScan/migrations/0001_initial.py +++ b/web/startScan/migrations/0001_initial.py @@ -1,230 +1,392 @@ -# Generated by Django 3.2.4 on 2021-12-30 19:39 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('targetApp', '0001_initial'), - ('scanEngine', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Dork', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('type', models.CharField(blank=True, max_length=500, null=True)), - ('description', models.CharField(blank=True, max_length=1500, null=True)), - ('url', models.CharField(blank=True, max_length=1500, null=True)), - ], - ), - migrations.CreateModel( - name='Email', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('address', models.CharField(blank=True, max_length=200, null=True)), - ('password', models.CharField(blank=True, max_length=200, null=True)), - ], - ), - migrations.CreateModel( - name='Employee', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=1000, null=True)), - ('designation', models.CharField(blank=True, max_length=1000, null=True)), - ], - ), - migrations.CreateModel( - name='EndPoint', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('http_url', models.CharField(max_length=5000)), - ('content_length', models.IntegerField(blank=True, default=0, null=True)), - ('page_title', models.CharField(blank=True, max_length=1000, null=True)), - ('http_status', models.IntegerField(blank=True, default=0, null=True)), - ('content_type', models.CharField(blank=True, max_length=100, null=True)), - ('discovered_date', models.DateTimeField(blank=True, null=True)), - ('response_time', models.FloatField(blank=True, null=True)), - ('webserver', models.CharField(blank=True, max_length=1000, null=True)), - ('is_default', models.BooleanField(blank=True, default=False, null=True)), - ('matched_gf_patterns', models.CharField(blank=True, max_length=2000, null=True)), - ], - ), - migrations.CreateModel( - name='IpAddress', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('address', models.CharField(blank=True, max_length=100, null=True)), - ('is_cdn', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='Port', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('number', models.IntegerField(default=0)), - ('service_name', models.CharField(blank=True, max_length=100, null=True)), - ('description', models.CharField(blank=True, max_length=1000, null=True)), - ('is_uncommon', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='ScanHistory', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('start_scan_date', models.DateTimeField()), - ('scan_status', models.IntegerField()), - ('results_dir', models.CharField(blank=True, max_length=100)), - ('celery_id', models.CharField(blank=True, max_length=100)), - ('subdomain_discovery', models.BooleanField(default=False, null=True)), - ('dir_file_fuzz', models.BooleanField(default=False, null=True)), - ('port_scan', models.BooleanField(default=False, null=True)), - ('fetch_url', models.BooleanField(default=False, null=True)), - ('vulnerability_scan', models.BooleanField(default=False, null=True)), - ('osint', models.BooleanField(default=False, null=True)), - ('screenshot', models.BooleanField(default=True, null=True)), - ('stop_scan_date', models.DateTimeField(blank=True, null=True)), - ('used_gf_patterns', models.CharField(blank=True, max_length=500, null=True)), - ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), - ('dorks', models.ManyToManyField(blank=True, related_name='dorks', to='startScan.Dork')), - ('emails', models.ManyToManyField(blank=True, related_name='emails', to='startScan.Email')), - ('employees', models.ManyToManyField(blank=True, related_name='employees', to='startScan.Employee')), - ('scan_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='scanEngine.enginetype')), - ], - ), - migrations.CreateModel( - name='Subdomain', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=1000)), - ('is_imported_subdomain', models.BooleanField(default=False)), - ('is_important', models.BooleanField(blank=True, default=False, null=True)), - ('http_url', models.CharField(blank=True, max_length=1000, null=True)), - ('screenshot_path', models.CharField(blank=True, max_length=1000, null=True)), - ('http_header_path', models.CharField(blank=True, max_length=1000, null=True)), - ('directory_json', models.JSONField(blank=True, null=True)), - ('discovered_date', models.DateTimeField(blank=True, null=True)), - ('cname', models.CharField(blank=True, max_length=1500, null=True)), - ('is_cdn', models.BooleanField(blank=True, default=False, null=True)), - ('http_status', models.IntegerField(default=0)), - ('content_type', models.CharField(blank=True, max_length=100, null=True)), - ('response_time', models.FloatField(blank=True, null=True)), - ('webserver', models.CharField(blank=True, max_length=1000, null=True)), - ('content_length', models.IntegerField(blank=True, default=0, null=True)), - ('page_title', models.CharField(blank=True, max_length=1000, null=True)), - ('ip_addresses', models.ManyToManyField(blank=True, related_name='ip_addresses', to='startScan.IpAddress')), - ('scan_history', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), - ('target_domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), - ], - ), - migrations.CreateModel( - name='Technology', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=100, null=True)), - ], - ), - migrations.CreateModel( - name='Vulnerability', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('template_used', models.CharField(max_length=100)), - ('name', models.CharField(max_length=400)), - ('severity', models.IntegerField()), - ('description', models.CharField(blank=True, max_length=10000, null=True)), - ('extracted_results', models.CharField(blank=True, max_length=3000, null=True)), - ('reference', models.CharField(blank=True, max_length=3000, null=True)), - ('tags', models.CharField(blank=True, max_length=1000, null=True)), - ('http_url', models.CharField(max_length=8000, null=True)), - ('matcher_name', models.CharField(blank=True, max_length=400, null=True)), - ('discovered_date', models.DateTimeField(null=True)), - ('open_status', models.BooleanField(blank=True, default=True, null=True)), - ('hackerone_report_id', models.CharField(blank=True, max_length=50, null=True)), - ('endpoint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.endpoint')), - ('scan_history', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), - ('subdomain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain')), - ('target_domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), - ], - ), - migrations.CreateModel( - name='SubScan', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('start_scan_date', models.DateTimeField()), - ('status', models.IntegerField()), - ('celery_id', models.CharField(blank=True, max_length=100)), - ('dir_file_fuzz', models.BooleanField(default=False, null=True)), - ('port_scan', models.BooleanField(default=False, null=True)), - ('fetch_url', models.BooleanField(default=False, null=True)), - ('vulnerability_scan', models.BooleanField(default=False, null=True)), - ('osint', models.BooleanField(default=False, null=True)), - ('stop_scan_date', models.DateTimeField(blank=True, null=True)), - ('scan_history', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), - ('subdomain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain')), - ], - ), - migrations.AddField( - model_name='subdomain', - name='technologies', - field=models.ManyToManyField(blank=True, related_name='technologies', to='startScan.Technology'), - ), - migrations.CreateModel( - name='ScanActivity', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('title', models.CharField(max_length=1000)), - ('time', models.DateTimeField()), - ('status', models.IntegerField()), - ('scan_of', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), - ], - ), - migrations.CreateModel( - name='MetaFinderDocument', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('doc_name', models.CharField(blank=True, max_length=1000, null=True)), - ('url', models.CharField(blank=True, max_length=5000, null=True)), - ('title', models.CharField(blank=True, max_length=1000, null=True)), - ('author', models.CharField(blank=True, max_length=1000, null=True)), - ('producer', models.CharField(blank=True, max_length=1000, null=True)), - ('creator', models.CharField(blank=True, max_length=1000, null=True)), - ('os', models.CharField(blank=True, max_length=1000, null=True)), - ('http_status', models.IntegerField(blank=True, default=0, null=True)), - ('creation_date', models.CharField(blank=True, max_length=1000, null=True)), - ('modified_date', models.CharField(blank=True, max_length=1000, null=True)), - ('scan_history', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), - ('subdomain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain')), - ('target_domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), - ], - ), - migrations.AddField( - model_name='ipaddress', - name='ports', - field=models.ManyToManyField(related_name='ports', to='startScan.Port'), - ), - migrations.AddField( - model_name='endpoint', - name='scan_history', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), - ), - migrations.AddField( - model_name='endpoint', - name='subdomain', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain'), - ), - migrations.AddField( - model_name='endpoint', - name='target_domain', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain'), - ), - migrations.AddField( - model_name='endpoint', - name='technologies', - field=models.ManyToManyField(related_name='technology', to='startScan.Technology'), - ), - ] +# Generated by Django 3.2.23 on 2024-06-19 02:43 + +from django.conf import settings +import django.contrib.postgres.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('targetApp', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('scanEngine', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CountryISO', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('iso', models.CharField(blank=True, max_length=10)), + ('name', models.CharField(blank=True, max_length=100)), + ], + ), + migrations.CreateModel( + name='CveId', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='CweId', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='DirectoryFile', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('length', models.IntegerField(default=0)), + ('lines', models.IntegerField(default=0)), + ('http_status', models.IntegerField(default=0)), + ('words', models.IntegerField(default=0)), + ('name', models.CharField(blank=True, max_length=500, null=True)), + ('url', models.CharField(blank=True, max_length=5000, null=True)), + ('content_type', models.CharField(blank=True, max_length=100, null=True)), + ], + ), + migrations.CreateModel( + name='DirectoryScan', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('command_line', models.CharField(blank=True, max_length=5000, null=True)), + ('scanned_date', models.DateTimeField(null=True)), + ], + ), + migrations.CreateModel( + name='Dork', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('type', models.CharField(blank=True, max_length=500, null=True)), + ('url', models.CharField(blank=True, max_length=10000, null=True)), + ], + ), + migrations.CreateModel( + name='Email', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('address', models.CharField(blank=True, max_length=200, null=True)), + ('password', models.CharField(blank=True, max_length=200, null=True)), + ], + ), + migrations.CreateModel( + name='Employee', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=1000, null=True)), + ('designation', models.CharField(blank=True, max_length=1000, null=True)), + ], + ), + migrations.CreateModel( + name='EndPoint', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('source', models.CharField(blank=True, max_length=200, null=True)), + ('http_url', models.CharField(max_length=30000)), + ('content_length', models.IntegerField(blank=True, default=0, null=True)), + ('page_title', models.CharField(blank=True, max_length=30000, null=True)), + ('http_status', models.IntegerField(blank=True, default=0, null=True)), + ('content_type', models.CharField(blank=True, max_length=100, null=True)), + ('discovered_date', models.DateTimeField(blank=True, null=True)), + ('response_time', models.FloatField(blank=True, null=True)), + ('webserver', models.CharField(blank=True, max_length=1000, null=True)), + ('is_default', models.BooleanField(blank=True, default=False, null=True)), + ('matched_gf_patterns', models.CharField(blank=True, max_length=10000, null=True)), + ], + ), + migrations.CreateModel( + name='IpAddress', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('address', models.CharField(blank=True, max_length=100, null=True)), + ('is_cdn', models.BooleanField(default=False)), + ('version', models.IntegerField(blank=True, null=True)), + ('is_private', models.BooleanField(default=False)), + ('reverse_pointer', models.CharField(blank=True, max_length=100, null=True)), + ('geo_iso', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.countryiso')), + ], + ), + migrations.CreateModel( + name='Port', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('number', models.IntegerField(default=0)), + ('service_name', models.CharField(blank=True, max_length=100, null=True)), + ('description', models.CharField(blank=True, max_length=1000, null=True)), + ('is_uncommon', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='S3Bucket', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=500, null=True)), + ('region', models.CharField(blank=True, max_length=500, null=True)), + ('provider', models.CharField(blank=True, max_length=100, null=True)), + ('owner_id', models.CharField(blank=True, max_length=250, null=True)), + ('owner_display_name', models.CharField(blank=True, max_length=250, null=True)), + ('perm_auth_users_read', models.IntegerField(default=0)), + ('perm_auth_users_write', models.IntegerField(default=0)), + ('perm_auth_users_read_acl', models.IntegerField(default=0)), + ('perm_auth_users_write_acl', models.IntegerField(default=0)), + ('perm_auth_users_full_control', models.IntegerField(default=0)), + ('perm_all_users_read', models.IntegerField(default=0)), + ('perm_all_users_write', models.IntegerField(default=0)), + ('perm_all_users_read_acl', models.IntegerField(default=0)), + ('perm_all_users_write_acl', models.IntegerField(default=0)), + ('perm_all_users_full_control', models.IntegerField(default=0)), + ('num_objects', models.IntegerField(default=0)), + ('size', models.IntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='ScanHistory', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('start_scan_date', models.DateTimeField()), + ('scan_status', models.IntegerField(choices=[(-1, -1), (0, 0), (1, 1), (2, 2), (3, 3)], default=-1)), + ('results_dir', models.CharField(blank=True, max_length=100)), + ('celery_ids', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, size=None)), + ('tasks', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), null=True, size=None)), + ('stop_scan_date', models.DateTimeField(blank=True, null=True)), + ('used_gf_patterns', models.CharField(blank=True, max_length=500, null=True)), + ('error_message', models.CharField(blank=True, max_length=300, null=True)), + ('aborted_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='aborted_scans', to=settings.AUTH_USER_MODEL)), + ('buckets', models.ManyToManyField(blank=True, related_name='buckets', to='startScan.S3Bucket')), + ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), + ('dorks', models.ManyToManyField(blank=True, related_name='dorks', to='startScan.Dork')), + ('emails', models.ManyToManyField(blank=True, related_name='emails', to='startScan.Email')), + ('employees', models.ManyToManyField(blank=True, related_name='employees', to='startScan.Employee')), + ('initiated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='initiated_scans', to=settings.AUTH_USER_MODEL)), + ('scan_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='scanEngine.enginetype')), + ], + ), + migrations.CreateModel( + name='Subdomain', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=1000)), + ('is_imported_subdomain', models.BooleanField(default=False)), + ('is_important', models.BooleanField(blank=True, default=False, null=True)), + ('http_url', models.CharField(blank=True, max_length=10000, null=True)), + ('screenshot_path', models.CharField(blank=True, max_length=1000, null=True)), + ('http_header_path', models.CharField(blank=True, max_length=1000, null=True)), + ('discovered_date', models.DateTimeField(blank=True, null=True)), + ('cname', models.CharField(blank=True, max_length=5000, null=True)), + ('is_cdn', models.BooleanField(blank=True, default=False, null=True)), + ('cdn_name', models.CharField(blank=True, max_length=200, null=True)), + ('http_status', models.IntegerField(default=0)), + ('content_type', models.CharField(blank=True, max_length=100, null=True)), + ('response_time', models.FloatField(blank=True, null=True)), + ('webserver', models.CharField(blank=True, max_length=1000, null=True)), + ('content_length', models.IntegerField(blank=True, default=0, null=True)), + ('page_title', models.CharField(blank=True, max_length=1000, null=True)), + ('attack_surface', models.TextField(blank=True, null=True)), + ('directories', models.ManyToManyField(blank=True, related_name='directories', to='startScan.DirectoryScan')), + ('ip_addresses', models.ManyToManyField(blank=True, related_name='ip_addresses', to='startScan.IpAddress')), + ('scan_history', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), + ('target_domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), + ], + ), + migrations.CreateModel( + name='SubScan', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('type', models.CharField(blank=True, max_length=100, null=True)), + ('start_scan_date', models.DateTimeField()), + ('status', models.IntegerField()), + ('celery_ids', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, size=None)), + ('stop_scan_date', models.DateTimeField(blank=True, null=True)), + ('error_message', models.CharField(blank=True, max_length=300, null=True)), + ('engine', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='scanEngine.enginetype')), + ('scan_history', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), + ('subdomain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain')), + ('subdomain_subscan_ids', models.ManyToManyField(blank=True, related_name='subdomain_subscan_ids', to='startScan.Subdomain')), + ], + ), + migrations.CreateModel( + name='Technology', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=500, null=True)), + ], + ), + migrations.CreateModel( + name='VulnerabilityReference', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('url', models.CharField(max_length=5000)), + ], + ), + migrations.CreateModel( + name='VulnerabilityTags', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Waf', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=500)), + ('manufacturer', models.CharField(blank=True, max_length=500, null=True)), + ], + ), + migrations.CreateModel( + name='Vulnerability', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('source', models.CharField(blank=True, max_length=200, null=True)), + ('template', models.CharField(blank=True, max_length=100, null=True)), + ('template_url', models.CharField(blank=True, max_length=2500, null=True)), + ('template_id', models.CharField(blank=True, max_length=200, null=True)), + ('matcher_name', models.CharField(blank=True, max_length=500, null=True)), + ('name', models.CharField(max_length=2500)), + ('severity', models.IntegerField()), + ('description', models.TextField(blank=True, null=True)), + ('impact', models.TextField(blank=True, null=True)), + ('remediation', models.TextField(blank=True, null=True)), + ('extracted_results', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5000), blank=True, null=True, size=None)), + ('cvss_metrics', models.CharField(blank=True, max_length=500, null=True)), + ('cvss_score', models.FloatField(blank=True, default=None, null=True)), + ('curl_command', models.CharField(blank=True, max_length=15000, null=True)), + ('type', models.CharField(blank=True, max_length=100, null=True)), + ('http_url', models.CharField(max_length=10000, null=True)), + ('discovered_date', models.DateTimeField(null=True)), + ('open_status', models.BooleanField(blank=True, default=True, null=True)), + ('hackerone_report_id', models.CharField(blank=True, max_length=50, null=True)), + ('request', models.TextField(blank=True, null=True)), + ('response', models.TextField(blank=True, null=True)), + ('is_gpt_used', models.BooleanField(blank=True, default=False, null=True)), + ('cve_ids', models.ManyToManyField(blank=True, related_name='cve_ids', to='startScan.CveId')), + ('cwe_ids', models.ManyToManyField(blank=True, related_name='cwe_ids', to='startScan.CweId')), + ('endpoint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.endpoint')), + ('references', models.ManyToManyField(blank=True, related_name='vuln_reference', to='startScan.VulnerabilityReference')), + ('scan_history', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), + ('subdomain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain')), + ('tags', models.ManyToManyField(blank=True, related_name='vuln_tags', to='startScan.VulnerabilityTags')), + ('target_domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), + ('vuln_subscan_ids', models.ManyToManyField(blank=True, related_name='vuln_subscan_ids', to='startScan.SubScan')), + ], + ), + migrations.AddField( + model_name='subdomain', + name='technologies', + field=models.ManyToManyField(blank=True, related_name='technologies', to='startScan.Technology'), + ), + migrations.AddField( + model_name='subdomain', + name='waf', + field=models.ManyToManyField(blank=True, related_name='waf', to='startScan.Waf'), + ), + migrations.CreateModel( + name='ScanActivity', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('title', models.CharField(max_length=1000)), + ('name', models.CharField(max_length=1000)), + ('time', models.DateTimeField()), + ('status', models.IntegerField()), + ('error_message', models.CharField(blank=True, max_length=300, null=True)), + ('traceback', models.TextField(blank=True, null=True)), + ('celery_id', models.CharField(blank=True, max_length=100, null=True)), + ('scan_of', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), + ], + ), + migrations.CreateModel( + name='MetaFinderDocument', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('doc_name', models.CharField(blank=True, max_length=1000, null=True)), + ('url', models.CharField(blank=True, max_length=10000, null=True)), + ('title', models.CharField(blank=True, max_length=1000, null=True)), + ('author', models.CharField(blank=True, max_length=1000, null=True)), + ('producer', models.CharField(blank=True, max_length=1000, null=True)), + ('creator', models.CharField(blank=True, max_length=1000, null=True)), + ('os', models.CharField(blank=True, max_length=1000, null=True)), + ('http_status', models.IntegerField(blank=True, default=0, null=True)), + ('creation_date', models.CharField(blank=True, max_length=1000, null=True)), + ('modified_date', models.CharField(blank=True, max_length=1000, null=True)), + ('scan_history', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), + ('subdomain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain')), + ('target_domain', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain')), + ], + ), + migrations.AddField( + model_name='ipaddress', + name='ip_subscan_ids', + field=models.ManyToManyField(related_name='ip_subscan_ids', to='startScan.SubScan'), + ), + migrations.AddField( + model_name='ipaddress', + name='ports', + field=models.ManyToManyField(related_name='ports', to='startScan.Port'), + ), + migrations.CreateModel( + name='GPTVulnerabilityReport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('url_path', models.CharField(max_length=2000)), + ('title', models.CharField(max_length=2500)), + ('description', models.TextField(blank=True, null=True)), + ('impact', models.TextField(blank=True, null=True)), + ('remediation', models.TextField(blank=True, null=True)), + ('references', models.ManyToManyField(blank=True, related_name='report_reference', to='startScan.VulnerabilityReference')), + ], + ), + migrations.AddField( + model_name='endpoint', + name='endpoint_subscan_ids', + field=models.ManyToManyField(blank=True, related_name='endpoint_subscan_ids', to='startScan.SubScan'), + ), + migrations.AddField( + model_name='endpoint', + name='scan_history', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), + ), + migrations.AddField( + model_name='endpoint', + name='subdomain', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subdomain'), + ), + migrations.AddField( + model_name='endpoint', + name='target_domain', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domain'), + ), + migrations.AddField( + model_name='endpoint', + name='techs', + field=models.ManyToManyField(blank=True, null=True, related_name='techs', to='startScan.Technology'), + ), + migrations.AddField( + model_name='directoryscan', + name='dir_subscan_ids', + field=models.ManyToManyField(blank=True, related_name='dir_subscan_ids', to='startScan.SubScan'), + ), + migrations.AddField( + model_name='directoryscan', + name='directory_files', + field=models.ManyToManyField(blank=True, related_name='directory_files', to='startScan.DirectoryFile'), + ), + migrations.CreateModel( + name='Command', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('command', models.TextField(blank=True, null=True)), + ('return_code', models.IntegerField(blank=True, null=True)), + ('output', models.TextField(blank=True, null=True)), + ('time', models.DateTimeField()), + ('activity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanactivity')), + ('scan_history', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')), + ], + ), + ] diff --git a/web/startScan/migrations/0002_auto_20220106_0434.py b/web/startScan/migrations/0002_auto_20220106_0434.py deleted file mode 100644 index 65adc0084..000000000 --- a/web/startScan/migrations/0002_auto_20220106_0434.py +++ /dev/null @@ -1,91 +0,0 @@ -# Generated by Django 3.2.4 on 2022-01-06 04:34 - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='VulnerabilityReference', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('url', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='VulnerabilityTags', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.RemoveField( - model_name='vulnerability', - name='matcher_name', - ), - migrations.RemoveField( - model_name='vulnerability', - name='reference', - ), - migrations.AddField( - model_name='vulnerability', - name='cve_ids', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=50), blank=True, null=True, size=None), - ), - migrations.AddField( - model_name='vulnerability', - name='cvss_metrics', - field=models.CharField(max_length=150, null=True), - ), - migrations.AddField( - model_name='vulnerability', - name='cvss_score', - field=models.FloatField(blank=True, default=None, null=True), - ), - migrations.AddField( - model_name='vulnerability', - name='cwe_ids', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=50), blank=True, null=True, size=None), - ), - migrations.AddField( - model_name='vulnerability', - name='references', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=500), blank=True, null=True, size=None), - ), - migrations.AddField( - model_name='vulnerability', - name='template_url', - field=models.CharField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name='vulnerability', - name='type', - field=models.CharField(blank=True, max_length=50, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='extracted_results', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=1000), blank=True, null=True, size=None), - ), - migrations.AlterField( - model_name='vulnerability', - name='http_url', - field=models.CharField(max_length=1000, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='name', - field=models.CharField(max_length=500), - ), - migrations.AlterField( - model_name='vulnerability', - name='tags', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=50), blank=True, null=True, size=None), - ), - ] diff --git a/web/startScan/migrations/0003_auto_20220106_0437.py b/web/startScan/migrations/0003_auto_20220106_0437.py deleted file mode 100644 index de955cb50..000000000 --- a/web/startScan/migrations/0003_auto_20220106_0437.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2022-01-06 04:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0002_auto_20220106_0434'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='template_id', - field=models.CharField(blank=True, max_length=200, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='cvss_metrics', - field=models.CharField(blank=True, max_length=150, null=True), - ), - ] diff --git a/web/startScan/migrations/0004_rename_template_used_vulnerability_template.py b/web/startScan/migrations/0004_rename_template_used_vulnerability_template.py deleted file mode 100644 index 8b318a9e6..000000000 --- a/web/startScan/migrations/0004_rename_template_used_vulnerability_template.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-01-06 04:38 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0003_auto_20220106_0437'), - ] - - operations = [ - migrations.RenameField( - model_name='vulnerability', - old_name='template_used', - new_name='template', - ), - ] diff --git a/web/startScan/migrations/0005_ipaddress_subscan.py b/web/startScan/migrations/0005_ipaddress_subscan.py deleted file mode 100644 index d741e9845..000000000 --- a/web/startScan/migrations/0005_ipaddress_subscan.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2022-02-28 18:24 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0004_rename_template_used_vulnerability_template'), - ] - - operations = [ - migrations.AddField( - model_name='ipaddress', - name='subscan', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.subscan'), - ), - ] diff --git a/web/startScan/migrations/0006_auto_20220228_2000.py b/web/startScan/migrations/0006_auto_20220228_2000.py deleted file mode 100644 index 56b830ae4..000000000 --- a/web/startScan/migrations/0006_auto_20220228_2000.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.4 on 2022-02-28 20:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0005_ipaddress_subscan'), - ] - - operations = [ - migrations.RemoveField( - model_name='ipaddress', - name='subscan', - ), - migrations.AddField( - model_name='ipaddress', - name='subscan_ids', - field=models.ManyToManyField(related_name='subscan_ids', to='startScan.SubScan'), - ), - ] diff --git a/web/startScan/migrations/0007_auto_20220302_0332.py b/web/startScan/migrations/0007_auto_20220302_0332.py deleted file mode 100644 index 29efeac2b..000000000 --- a/web/startScan/migrations/0007_auto_20220302_0332.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-02 03:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0006_auto_20220228_2000'), - ] - - operations = [ - migrations.RemoveField( - model_name='ipaddress', - name='subscan_ids', - ), - migrations.AddField( - model_name='ipaddress', - name='ip_subscan_ids', - field=models.ManyToManyField(related_name='ip_subscan_ids', to='startScan.SubScan'), - ), - migrations.AddField( - model_name='vulnerability', - name='vuln_subscan_ids', - field=models.ManyToManyField(related_name='vuln_subscan_ids', to='startScan.SubScan'), - ), - ] diff --git a/web/startScan/migrations/0008_vulnerability_curl_command.py b/web/startScan/migrations/0008_vulnerability_curl_command.py deleted file mode 100644 index c149328ea..000000000 --- a/web/startScan/migrations/0008_vulnerability_curl_command.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-02 03:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0007_auto_20220302_0332'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='curl_command', - field=models.CharField(blank=True, max_length=1500, null=True), - ), - ] diff --git a/web/startScan/migrations/0009_vulnerability_matcher_name.py b/web/startScan/migrations/0009_vulnerability_matcher_name.py deleted file mode 100644 index 76d24e984..000000000 --- a/web/startScan/migrations/0009_vulnerability_matcher_name.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-02 03:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0008_vulnerability_curl_command'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='matcher_name', - field=models.CharField(blank=True, max_length=500, null=True), - ), - ] diff --git a/web/startScan/migrations/0010_endpoint_endpoint_subscan_ids.py b/web/startScan/migrations/0010_endpoint_endpoint_subscan_ids.py deleted file mode 100644 index 34361dc49..000000000 --- a/web/startScan/migrations/0010_endpoint_endpoint_subscan_ids.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-03 02:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0009_vulnerability_matcher_name'), - ] - - operations = [ - migrations.AddField( - model_name='endpoint', - name='endpoint_subscan_ids', - field=models.ManyToManyField(related_name='endpoint_subscan_ids', to='startScan.SubScan'), - ), - ] diff --git a/web/startScan/migrations/0011_auto_20220308_1711.py b/web/startScan/migrations/0011_auto_20220308_1711.py deleted file mode 100644 index 001fabc48..000000000 --- a/web/startScan/migrations/0011_auto_20220308_1711.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-08 17:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0010_endpoint_endpoint_subscan_ids'), - ] - - operations = [ - migrations.RemoveField( - model_name='subdomain', - name='directory_json', - ), - migrations.CreateModel( - name='Directory', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('json', models.JSONField(blank=True, null=True)), - ('dir_subscan_ids', models.ManyToManyField(related_name='dir_subscan_ids', to='startScan.SubScan')), - ], - ), - migrations.AddField( - model_name='subdomain', - name='directories', - field=models.ManyToManyField(blank=True, related_name='directories', to='startScan.Directory'), - ), - ] diff --git a/web/startScan/migrations/0012_auto_20220310_2214.py b/web/startScan/migrations/0012_auto_20220310_2214.py deleted file mode 100644 index 0a3611a47..000000000 --- a/web/startScan/migrations/0012_auto_20220310_2214.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-10 22:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0011_auto_20220308_1711'), - ] - - operations = [ - migrations.CreateModel( - name='DirectoryFile', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('length', models.IntegerField(default=0)), - ('lines', models.IntegerField(default=0)), - ('http_status', models.IntegerField(default=0)), - ('words', models.IntegerField(default=0)), - ('url', models.CharField(blank=True, max_length=2000, null=True)), - ('content_type', models.CharField(blank=True, max_length=100, null=True)), - ], - ), - migrations.CreateModel( - name='DirectoryScan', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('command_line', models.CharField(blank=True, max_length=1000, null=True)), - ('dir_subscan_ids', models.ManyToManyField(related_name='dir_subscan_ids', to='startScan.SubScan')), - ('directory_files', models.ManyToManyField(related_name='directory_files', to='startScan.DirectoryFile')), - ], - ), - migrations.DeleteModel( - name='Directory', - ), - migrations.AlterField( - model_name='subdomain', - name='directories', - field=models.ManyToManyField(blank=True, related_name='directories', to='startScan.DirectoryFile'), - ), - ] diff --git a/web/startScan/migrations/0013_auto_20220310_2234.py b/web/startScan/migrations/0013_auto_20220310_2234.py deleted file mode 100644 index 056810b5a..000000000 --- a/web/startScan/migrations/0013_auto_20220310_2234.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-10 22:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0012_auto_20220310_2214'), - ] - - operations = [ - migrations.AlterField( - model_name='directoryscan', - name='dir_subscan_ids', - field=models.ManyToManyField(blank=True, related_name='dir_subscan_ids', to='startScan.SubScan'), - ), - migrations.AlterField( - model_name='directoryscan', - name='directory_files', - field=models.ManyToManyField(blank=True, related_name='directory_files', to='startScan.DirectoryFile'), - ), - ] diff --git a/web/startScan/migrations/0014_directoryfile_name.py b/web/startScan/migrations/0014_directoryfile_name.py deleted file mode 100644 index e1d2f74c6..000000000 --- a/web/startScan/migrations/0014_directoryfile_name.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-10 23:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0013_auto_20220310_2234'), - ] - - operations = [ - migrations.AddField( - model_name='directoryfile', - name='name', - field=models.CharField(blank=True, max_length=500, null=True), - ), - ] diff --git a/web/startScan/migrations/0015_alter_subdomain_directories.py b/web/startScan/migrations/0015_alter_subdomain_directories.py deleted file mode 100644 index 6d4c032c3..000000000 --- a/web/startScan/migrations/0015_alter_subdomain_directories.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-10 23:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0014_directoryfile_name'), - ] - - operations = [ - migrations.AlterField( - model_name='subdomain', - name='directories', - field=models.ManyToManyField(blank=True, related_name='directories', to='startScan.DirectoryScan'), - ), - ] diff --git a/web/startScan/migrations/0016_directoryscan_scanned_date.py b/web/startScan/migrations/0016_directoryscan_scanned_date.py deleted file mode 100644 index de787398e..000000000 --- a/web/startScan/migrations/0016_directoryscan_scanned_date.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-03-14 02:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0015_alter_subdomain_directories'), - ] - - operations = [ - migrations.AddField( - model_name='directoryscan', - name='scanned_date', - field=models.DateTimeField(null=True), - ), - ] diff --git a/web/startScan/migrations/0017_auto_20220412_1808.py b/web/startScan/migrations/0017_auto_20220412_1808.py deleted file mode 100644 index 786c846d9..000000000 --- a/web/startScan/migrations/0017_auto_20220412_1808.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-12 18:08 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0016_directoryscan_scanned_date'), - ] - - operations = [ - migrations.AlterField( - model_name='endpoint', - name='endpoint_subscan_ids', - field=models.ManyToManyField(blank=True, related_name='endpoint_subscan_ids', to='startScan.SubScan'), - ), - migrations.AlterField( - model_name='vulnerability', - name='vuln_subscan_ids', - field=models.ManyToManyField(blank=True, related_name='vuln_subscan_ids', to='startScan.SubScan'), - ), - ] diff --git a/web/startScan/migrations/0018_auto_20220414_1814.py b/web/startScan/migrations/0018_auto_20220414_1814.py deleted file mode 100644 index f95789ba3..000000000 --- a/web/startScan/migrations/0018_auto_20220414_1814.py +++ /dev/null @@ -1,63 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-14 18:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0017_auto_20220412_1808'), - ] - - operations = [ - migrations.CreateModel( - name='CveId', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( - name='CweId', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.RemoveField( - model_name='vulnerability', - name='cve_ids', - ), - migrations.RemoveField( - model_name='vulnerability', - name='cwe_ids', - ), - migrations.RemoveField( - model_name='vulnerability', - name='references', - ), - migrations.AddField( - model_name='vulnerability', - name='references', - field=models.ManyToManyField(blank=True, related_name='vuln_reference', to='startScan.VulnerabilityReference'), - ), - migrations.RemoveField( - model_name='vulnerability', - name='tags', - ), - migrations.AddField( - model_name='vulnerability', - name='tags', - field=models.ManyToManyField(blank=True, related_name='vuln_tags', to='startScan.VulnerabilityTags'), - ), - migrations.AddField( - model_name='vulnerability', - name='cve_ids', - field=models.ManyToManyField(blank=True, related_name='cve_ids', to='startScan.CveId'), - ), - migrations.AddField( - model_name='vulnerability', - name='cwe_ids', - field=models.ManyToManyField(blank=True, related_name='cwe_ids', to='startScan.CweId'), - ), - ] diff --git a/web/startScan/migrations/0019_scanactivity_error_message.py b/web/startScan/migrations/0019_scanactivity_error_message.py deleted file mode 100644 index da5445238..000000000 --- a/web/startScan/migrations/0019_scanactivity_error_message.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-14 19:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0018_auto_20220414_1814'), - ] - - operations = [ - migrations.AddField( - model_name='scanactivity', - name='error_message', - field=models.CharField(blank=True, max_length=300, null=True), - ), - ] diff --git a/web/startScan/migrations/0020_subscan_error_message.py b/web/startScan/migrations/0020_subscan_error_message.py deleted file mode 100644 index a85229e03..000000000 --- a/web/startScan/migrations/0020_subscan_error_message.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-14 19:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0019_scanactivity_error_message'), - ] - - operations = [ - migrations.AddField( - model_name='subscan', - name='error_message', - field=models.CharField(blank=True, max_length=300, null=True), - ), - ] diff --git a/web/startScan/migrations/0021_scanhistory_error_message.py b/web/startScan/migrations/0021_scanhistory_error_message.py deleted file mode 100644 index b88263131..000000000 --- a/web/startScan/migrations/0021_scanhistory_error_message.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-14 19:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0020_subscan_error_message'), - ] - - operations = [ - migrations.AddField( - model_name='scanhistory', - name='error_message', - field=models.CharField(blank=True, max_length=300, null=True), - ), - ] diff --git a/web/startScan/migrations/0022_subscan_engine.py b/web/startScan/migrations/0022_subscan_engine.py deleted file mode 100644 index cdfa3aa94..000000000 --- a/web/startScan/migrations/0022_subscan_engine.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-20 03:28 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('scanEngine', '0001_initial'), - ('startScan', '0021_scanhistory_error_message'), - ] - - operations = [ - migrations.AddField( - model_name='subscan', - name='engine', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='scanEngine.enginetype'), - ), - ] diff --git a/web/startScan/migrations/0023_auto_20220430_1933.py b/web/startScan/migrations/0023_auto_20220430_1933.py deleted file mode 100644 index 489a38134..000000000 --- a/web/startScan/migrations/0023_auto_20220430_1933.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-30 19:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0022_subscan_engine'), - ] - - operations = [ - migrations.CreateModel( - name='Waf', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ('manufacturer', models.CharField(blank=True, max_length=100, null=True)), - ], - ), - migrations.AddField( - model_name='subdomain', - name='waf', - field=models.ManyToManyField(blank=True, related_name='waf', to='startScan.Waf'), - ), - ] diff --git a/web/startScan/migrations/0024_auto_20220526_1454.py b/web/startScan/migrations/0024_auto_20220526_1454.py deleted file mode 100644 index 68dcb1c4b..000000000 --- a/web/startScan/migrations/0024_auto_20220526_1454.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 3.2.4 on 2022-05-26 14:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0023_auto_20220430_1933'), - ] - - operations = [ - migrations.AlterField( - model_name='dork', - name='url', - field=models.CharField(blank=True, max_length=10000, null=True), - ), - migrations.AlterField( - model_name='endpoint', - name='http_url', - field=models.CharField(max_length=10000), - ), - migrations.AlterField( - model_name='metafinderdocument', - name='url', - field=models.CharField(blank=True, max_length=10000, null=True), - ), - migrations.AlterField( - model_name='subdomain', - name='cname', - field=models.CharField(blank=True, max_length=5000, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='curl_command', - field=models.CharField(blank=True, max_length=15000, null=True), - ), - ] diff --git a/web/startScan/migrations/0025_auto_20220526_1500.py b/web/startScan/migrations/0025_auto_20220526_1500.py deleted file mode 100644 index 03163df3a..000000000 --- a/web/startScan/migrations/0025_auto_20220526_1500.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 3.2.4 on 2022-05-26 15:00 - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0024_auto_20220526_1454'), - ] - - operations = [ - migrations.AlterField( - model_name='directoryscan', - name='command_line', - field=models.CharField(blank=True, max_length=1500, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='extracted_results', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5000), blank=True, null=True, size=None), - ), - migrations.AlterField( - model_name='vulnerability', - name='http_url', - field=models.CharField(max_length=5000, null=True), - ), - ] diff --git a/web/startScan/migrations/0026_auto_20220526_1506.py b/web/startScan/migrations/0026_auto_20220526_1506.py deleted file mode 100644 index 7800b5699..000000000 --- a/web/startScan/migrations/0026_auto_20220526_1506.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.4 on 2022-05-26 15:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0025_auto_20220526_1500'), - ] - - operations = [ - migrations.AlterField( - model_name='subdomain', - name='http_url', - field=models.CharField(blank=True, max_length=10000, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='template_url', - field=models.CharField(blank=True, max_length=1500, null=True), - ), - migrations.AlterField( - model_name='vulnerabilityreference', - name='url', - field=models.CharField(max_length=5000), - ), - ] diff --git a/web/startScan/migrations/0027_auto_20220709_0610.py b/web/startScan/migrations/0027_auto_20220709_0610.py deleted file mode 100644 index d617b0b78..000000000 --- a/web/startScan/migrations/0027_auto_20220709_0610.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.4 on 2022-07-09 06:10 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0026_auto_20220526_1506'), - ] - - operations = [ - migrations.CreateModel( - name='CountryISO', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=10)), - ], - ), - migrations.AddField( - model_name='ipaddress', - name='geo_iso', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.countryiso'), - ), - ] diff --git a/web/startScan/migrations/0028_auto_20220710_1140.py b/web/startScan/migrations/0028_auto_20220710_1140.py deleted file mode 100644 index 92cd0c209..000000000 --- a/web/startScan/migrations/0028_auto_20220710_1140.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2022-07-10 11:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0027_auto_20220709_0610'), - ] - - operations = [ - migrations.AddField( - model_name='countryiso', - name='iso', - field=models.CharField(blank=True, max_length=10), - ), - migrations.AlterField( - model_name='countryiso', - name='name', - field=models.CharField(blank=True, max_length=100), - ), - ] diff --git a/web/startScan/migrations/0029_scanhistory_waf_detection.py b/web/startScan/migrations/0029_scanhistory_waf_detection.py deleted file mode 100644 index 3fa314e6e..000000000 --- a/web/startScan/migrations/0029_scanhistory_waf_detection.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-07-10 18:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0028_auto_20220710_1140'), - ] - - operations = [ - migrations.AddField( - model_name='scanhistory', - name='waf_detection', - field=models.BooleanField(default=False, null=True), - ), - ] diff --git a/web/startScan/migrations/0030_auto_20220718_1830.py b/web/startScan/migrations/0030_auto_20220718_1830.py deleted file mode 100644 index acbf12ca7..000000000 --- a/web/startScan/migrations/0030_auto_20220718_1830.py +++ /dev/null @@ -1,78 +0,0 @@ -# Generated by Django 3.2.4 on 2022-07-18 18:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0029_scanhistory_waf_detection'), - ] - - operations = [ - migrations.AlterField( - model_name='directoryfile', - name='url', - field=models.CharField(blank=True, max_length=5000, null=True), - ), - migrations.AlterField( - model_name='directoryscan', - name='command_line', - field=models.CharField(blank=True, max_length=5000, null=True), - ), - migrations.AlterField( - model_name='endpoint', - name='matched_gf_patterns', - field=models.CharField(blank=True, max_length=10000, null=True), - ), - migrations.AlterField( - model_name='endpoint', - name='page_title', - field=models.CharField(blank=True, max_length=10000, null=True), - ), - migrations.AlterField( - model_name='technology', - name='name', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='cvss_metrics', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='description', - field=models.CharField(blank=True, max_length=20000, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='http_url', - field=models.CharField(max_length=10000, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='name', - field=models.CharField(max_length=2500), - ), - migrations.AlterField( - model_name='vulnerability', - name='template_url', - field=models.CharField(blank=True, max_length=2500, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='type', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AlterField( - model_name='waf', - name='manufacturer', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='waf', - name='name', - field=models.CharField(max_length=500), - ), - ] diff --git a/web/startScan/migrations/0031_auto_20220910_1950.py b/web/startScan/migrations/0031_auto_20220910_1950.py deleted file mode 100644 index f07d3b8e5..000000000 --- a/web/startScan/migrations/0031_auto_20220910_1950.py +++ /dev/null @@ -1,173 +0,0 @@ -# Generated by Django 3.2.4 on 2022-09-10 18:26 - -import django.contrib.postgres.fields -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0030_auto_20220718_1830'), - ] - - operations = [ - # IpAddress - migrations.AddField( - model_name='ipaddress', - name='is_private', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='ipaddress', - name='reverse_pointer', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='ipaddress', - name='version', - field=models.IntegerField(blank=True, null=True), - ), - - # Subdomain - migrations.AlterField( - model_name='subdomain', - name='scan_history', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), - ), - - # Vulnerability - migrations.AlterField( - model_name='vulnerability', - name='scan_history', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), - ), - - # ScanHistory - migrations.RemoveField( - model_name='scanhistory', - name='dir_file_fuzz', - ), - migrations.RemoveField( - model_name='scanhistory', - name='fetch_url', - ), - migrations.RemoveField( - model_name='scanhistory', - name='osint', - ), - migrations.RemoveField( - model_name='scanhistory', - name='port_scan', - ), - migrations.RemoveField( - model_name='scanhistory', - name='screenshot', - ), - migrations.RemoveField( - model_name='scanhistory', - name='subdomain_discovery', - ), - migrations.RemoveField( - model_name='scanhistory', - name='vulnerability_scan', - ), - migrations.RemoveField( - model_name='scanhistory', - name='waf_detection', - ), - migrations.RemoveField( - model_name='scanhistory', - name='celery_id', - ), - migrations.AddField( - model_name='scanhistory', - name='tasks', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=200), null=True, size=None), - ), - migrations.AddField( - model_name='scanhistory', - name='celery_ids', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, size=None), - ), - migrations.AlterField( - model_name='endpoint', - name='scan_history', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), - ), - migrations.AlterField( - model_name='scanhistory', - name='scan_status', - field=models.IntegerField(choices=[(-1, -1), (0, 0), (1, 1), (2, 2), (3, 3)], default=-1), - ), - - # SubScan - migrations.RemoveField( - model_name='subscan', - name='dir_file_fuzz', - ), - migrations.RemoveField( - model_name='subscan', - name='fetch_url', - ), - migrations.RemoveField( - model_name='subscan', - name='osint', - ), - migrations.RemoveField( - model_name='subscan', - name='port_scan', - ), - migrations.RemoveField( - model_name='subscan', - name='vulnerability_scan', - ), - migrations.RemoveField( - model_name='subscan', - name='celery_id', - ), - migrations.AddField( - model_name='subscan', - name='type', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='subscan', - name='celery_ids', - field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, default=list, size=None), - ), - migrations.AddField( - model_name='subscan', - name='subdomain_subscan_ids', - field=models.ManyToManyField(blank=True, related_name='subdomain_subscan_ids', to='startScan.Subdomain'), - ), - - # ScanActivity - migrations.AddField( - model_name='scanactivity', - name='name', - field=models.CharField(default='', max_length=1000), - preserve_default=False, - ), - migrations.AddField( - model_name='scanactivity', - name='traceback', - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name='scanactivity', - name='celery_id', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AlterField( - model_name='scanactivity', - name='scan_of', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), - ), - - # MetaFinderDocument - migrations.AlterField( - model_name='metafinderdocument', - name='scan_history', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory'), - ), - ] diff --git a/web/startScan/migrations/0032_command.py b/web/startScan/migrations/0032_command.py deleted file mode 100644 index cc798dabe..000000000 --- a/web/startScan/migrations/0032_command.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.4 on 2023-01-04 11:16 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0031_auto_20220910_1950'), - ] - - operations = [ - migrations.CreateModel( - name='Command', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('command', models.TextField(blank=True, null=True)), - ('return_code', models.IntegerField(blank=True, null=True)), - ('output', models.TextField(blank=True, null=True)), - ('time', models.DateTimeField()), - ('activity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanactivity')), - ('scan_history', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.scanhistory')) - ], - ), - ] diff --git a/web/startScan/migrations/0033_subdomain_cdn_name.py b/web/startScan/migrations/0033_subdomain_cdn_name.py deleted file mode 100644 index 3f26dc10a..000000000 --- a/web/startScan/migrations/0033_subdomain_cdn_name.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-21 03:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0032_command'), - ] - - operations = [ - migrations.AddField( - model_name='subdomain', - name='cdn_name', - field=models.CharField(blank=True, max_length=200, null=True), - ), - ] diff --git a/web/startScan/migrations/0034_auto_20230425_1555.py b/web/startScan/migrations/0034_auto_20230425_1555.py deleted file mode 100644 index 483726696..000000000 --- a/web/startScan/migrations/0034_auto_20230425_1555.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-25 15:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0033_subdomain_cdn_name'), - ] - - operations = [ - migrations.AlterField( - model_name='endpoint', - name='http_url', - field=models.CharField(max_length=30000), - ), - migrations.AlterField( - model_name='endpoint', - name='page_title', - field=models.CharField(blank=True, max_length=30000, null=True), - ), - ] diff --git a/web/startScan/migrations/0035_vulnerability_source.py b/web/startScan/migrations/0035_vulnerability_source.py deleted file mode 100644 index 4938240a9..000000000 --- a/web/startScan/migrations/0035_vulnerability_source.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-05-03 04:39 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0034_auto_20230425_1555'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='source', - field=models.CharField(blank=True, max_length=200, null=True), - ), - ] diff --git a/web/startScan/migrations/0036_alter_ipaddress_geo_iso.py b/web/startScan/migrations/0036_alter_ipaddress_geo_iso.py deleted file mode 100644 index 777c19ed3..000000000 --- a/web/startScan/migrations/0036_alter_ipaddress_geo_iso.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-29 12:47 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0035_vulnerability_source'), - ] - - operations = [ - migrations.AlterField( - model_name='ipaddress', - name='geo_iso', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ips_country', to='startScan.countryiso'), - ), - ] diff --git a/web/startScan/migrations/0037_alter_ipaddress_geo_iso.py b/web/startScan/migrations/0037_alter_ipaddress_geo_iso.py deleted file mode 100644 index c1d3d633e..000000000 --- a/web/startScan/migrations/0037_alter_ipaddress_geo_iso.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-29 13:24 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0036_alter_ipaddress_geo_iso'), - ] - - operations = [ - migrations.AlterField( - model_name='ipaddress', - name='geo_iso', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='startScan.countryiso'), - ), - ] diff --git a/web/startScan/migrations/0038_auto_20230717_0427.py b/web/startScan/migrations/0038_auto_20230717_0427.py deleted file mode 100644 index 9bbfcf6a0..000000000 --- a/web/startScan/migrations/0038_auto_20230717_0427.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-17 04:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0037_alter_ipaddress_geo_iso'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='request', - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name='vulnerability', - name='response', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/web/startScan/migrations/0039_auto_20230728_0422.py b/web/startScan/migrations/0039_auto_20230728_0422.py deleted file mode 100644 index 7d187b952..000000000 --- a/web/startScan/migrations/0039_auto_20230728_0422.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-28 04:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0038_auto_20230717_0427'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='impact', - field=models.CharField(blank=True, max_length=20000, null=True), - ), - migrations.AddField( - model_name='vulnerability', - name='remediation', - field=models.CharField(blank=True, max_length=20000, null=True), - ), - ] diff --git a/web/startScan/migrations/0040_auto_20230728_0434.py b/web/startScan/migrations/0040_auto_20230728_0434.py deleted file mode 100644 index 04b9bd9f2..000000000 --- a/web/startScan/migrations/0040_auto_20230728_0434.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-28 04:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0039_auto_20230728_0422'), - ] - - operations = [ - migrations.AlterField( - model_name='vulnerability', - name='description', - field=models.TextField(blank=True, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='impact', - field=models.TextField(blank=True, null=True), - ), - migrations.AlterField( - model_name='vulnerability', - name='remediation', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/web/startScan/migrations/0041_vulnerabilityreference_title.py b/web/startScan/migrations/0041_vulnerabilityreference_title.py deleted file mode 100644 index 2f9361d4a..000000000 --- a/web/startScan/migrations/0041_vulnerabilityreference_title.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-07-28 04:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0040_auto_20230728_0434'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerabilityreference', - name='title', - field=models.CharField(blank=True, max_length=1500, null=True), - ), - ] diff --git a/web/startScan/migrations/0042_remove_vulnerabilityreference_title.py b/web/startScan/migrations/0042_remove_vulnerabilityreference_title.py deleted file mode 100644 index 33d0dd63a..000000000 --- a/web/startScan/migrations/0042_remove_vulnerabilityreference_title.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2023-08-01 04:34 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0041_vulnerabilityreference_title'), - ] - - operations = [ - migrations.RemoveField( - model_name='vulnerabilityreference', - name='title', - ), - ] diff --git a/web/startScan/migrations/0043_vulnerability_is_gpt_used.py b/web/startScan/migrations/0043_vulnerability_is_gpt_used.py deleted file mode 100644 index 3e5becc81..000000000 --- a/web/startScan/migrations/0043_vulnerability_is_gpt_used.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-08-01 05:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0042_remove_vulnerabilityreference_title'), - ] - - operations = [ - migrations.AddField( - model_name='vulnerability', - name='is_gpt_used', - field=models.BooleanField(blank=True, default=False, null=True), - ), - ] diff --git a/web/startScan/migrations/0044_alter_vulnerability_template.py b/web/startScan/migrations/0044_alter_vulnerability_template.py deleted file mode 100644 index d2bb6e733..000000000 --- a/web/startScan/migrations/0044_alter_vulnerability_template.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-08-05 08:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0043_vulnerability_is_gpt_used'), - ] - - operations = [ - migrations.AlterField( - model_name='vulnerability', - name='template', - field=models.CharField(blank=True, max_length=100, null=True), - ), - ] diff --git a/web/startScan/migrations/0045_gptvulnerabilityreport.py b/web/startScan/migrations/0045_gptvulnerabilityreport.py deleted file mode 100644 index 751ef0046..000000000 --- a/web/startScan/migrations/0045_gptvulnerabilityreport.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.4 on 2023-08-05 09:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0044_alter_vulnerability_template'), - ] - - operations = [ - migrations.CreateModel( - name='GPTVulnerabilityReport', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('url_path', models.CharField(max_length=200)), - ('title', models.CharField(max_length=2500)), - ('description', models.TextField(blank=True, null=True)), - ('impact', models.TextField(blank=True, null=True)), - ('remediation', models.TextField(blank=True, null=True)), - ], - ), - ] diff --git a/web/startScan/migrations/0046_gptvulnerabilityreport_references.py b/web/startScan/migrations/0046_gptvulnerabilityreport_references.py deleted file mode 100644 index c57b13e84..000000000 --- a/web/startScan/migrations/0046_gptvulnerabilityreport_references.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-08-05 09:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0045_gptvulnerabilityreport'), - ] - - operations = [ - migrations.AddField( - model_name='gptvulnerabilityreport', - name='references', - field=models.ManyToManyField(blank=True, related_name='report_reference', to='startScan.VulnerabilityReference'), - ), - ] diff --git a/web/startScan/migrations/0047_subdomain_attack_surface.py b/web/startScan/migrations/0047_subdomain_attack_surface.py deleted file mode 100644 index 0d20becfb..000000000 --- a/web/startScan/migrations/0047_subdomain_attack_surface.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-08-28 04:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0046_gptvulnerabilityreport_references'), - ] - - operations = [ - migrations.AddField( - model_name='subdomain', - name='attack_surface', - field=models.TextField(blank=True, null=True), - ), - ] diff --git a/web/startScan/migrations/0048_endpoint_source.py b/web/startScan/migrations/0048_endpoint_source.py deleted file mode 100644 index b3aee143b..000000000 --- a/web/startScan/migrations/0048_endpoint_source.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-02 07:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0047_subdomain_attack_surface'), - ] - - operations = [ - migrations.AddField( - model_name='endpoint', - name='source', - field=models.CharField(blank=True, max_length=200, null=True), - ), - ] diff --git a/web/startScan/migrations/0049_alter_gptvulnerabilityreport_url_path.py b/web/startScan/migrations/0049_alter_gptvulnerabilityreport_url_path.py deleted file mode 100644 index 558084f0d..000000000 --- a/web/startScan/migrations/0049_alter_gptvulnerabilityreport_url_path.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-04 04:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0048_endpoint_source'), - ] - - operations = [ - migrations.AlterField( - model_name='gptvulnerabilityreport', - name='url_path', - field=models.CharField(max_length=2000), - ), - ] diff --git a/web/startScan/migrations/0050_auto_20230908_1006.py b/web/startScan/migrations/0050_auto_20230908_1006.py deleted file mode 100644 index da0b79b37..000000000 --- a/web/startScan/migrations/0050_auto_20230908_1006.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-08 10:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0049_alter_gptvulnerabilityreport_url_path'), - ] - - operations = [ - migrations.CreateModel( - name='S3Bucket', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=500, null=True)), - ('region', models.CharField(blank=True, max_length=500, null=True)), - ('provider', models.CharField(blank=True, max_length=100, null=True)), - ('owner_display_name', models.CharField(blank=True, max_length=250, null=True)), - ('perm_auth_users_read', models.IntegerField()), - ('perm_auth_users_write', models.IntegerField()), - ('perm_auth_users_read_acl', models.IntegerField()), - ('perm_auth_users_write_acl', models.IntegerField()), - ('perm_auth_users_full_control', models.IntegerField()), - ('perm_all_users_read', models.IntegerField()), - ('perm_all_users_write', models.IntegerField()), - ('perm_all_users_read_acl', models.IntegerField()), - ('perm_all_users_full_control', models.IntegerField()), - ], - ), - migrations.AddField( - model_name='scanhistory', - name='buckets', - field=models.ManyToManyField(blank=True, related_name='buckets', to='startScan.S3Bucket'), - ), - ] diff --git a/web/startScan/migrations/0051_auto_20230908_1049.py b/web/startScan/migrations/0051_auto_20230908_1049.py deleted file mode 100644 index 8f781913b..000000000 --- a/web/startScan/migrations/0051_auto_20230908_1049.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-08 10:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0050_auto_20230908_1006'), - ] - - operations = [ - migrations.AlterField( - model_name='s3bucket', - name='perm_all_users_full_control', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_all_users_read', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_all_users_read_acl', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_all_users_write', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_auth_users_full_control', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_auth_users_read', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_auth_users_read_acl', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_auth_users_write', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='s3bucket', - name='perm_auth_users_write_acl', - field=models.IntegerField(default=0), - ), - ] diff --git a/web/startScan/migrations/0052_s3bucket_perm_all_users_write_acl.py b/web/startScan/migrations/0052_s3bucket_perm_all_users_write_acl.py deleted file mode 100644 index 9b3493512..000000000 --- a/web/startScan/migrations/0052_s3bucket_perm_all_users_write_acl.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-08 11:46 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0051_auto_20230908_1049'), - ] - - operations = [ - migrations.AddField( - model_name='s3bucket', - name='perm_all_users_write_acl', - field=models.IntegerField(default=0), - ), - ] diff --git a/web/startScan/migrations/0053_auto_20230908_1156.py b/web/startScan/migrations/0053_auto_20230908_1156.py deleted file mode 100644 index cd4d1a2ca..000000000 --- a/web/startScan/migrations/0053_auto_20230908_1156.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-08 11:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0052_s3bucket_perm_all_users_write_acl'), - ] - - operations = [ - migrations.AddField( - model_name='s3bucket', - name='num_objects', - field=models.IntegerField(default=0), - ), - migrations.AddField( - model_name='s3bucket', - name='owner_id', - field=models.CharField(blank=True, max_length=250, null=True), - ), - migrations.AddField( - model_name='s3bucket', - name='size', - field=models.IntegerField(default=0), - ), - ] diff --git a/web/startScan/migrations/0054_auto_20230910_0533.py b/web/startScan/migrations/0054_auto_20230910_0533.py deleted file mode 100644 index 945c5b829..000000000 --- a/web/startScan/migrations/0054_auto_20230910_0533.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-10 05:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0053_auto_20230908_1156'), - ] - - operations = [ - migrations.RemoveField( - model_name='endpoint', - name='technologies', - ), - migrations.AddField( - model_name='endpoint', - name='techs', - field=models.ManyToManyField(blank=True, null=True, related_name='techs', to='startScan.Technology'), - ), - ] diff --git a/web/startScan/migrations/0055_remove_dork_description.py b/web/startScan/migrations/0055_remove_dork_description.py deleted file mode 100644 index 1cc5e8bd0..000000000 --- a/web/startScan/migrations/0055_remove_dork_description.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2023-09-22 08:57 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('startScan', '0054_auto_20230910_0533'), - ] - - operations = [ - migrations.RemoveField( - model_name='dork', - name='description', - ), - ] diff --git a/web/startScan/models.py b/web/startScan/models.py index e1d9c57d2..0d44638a9 100644 --- a/web/startScan/models.py +++ b/web/startScan/models.py @@ -1,5 +1,6 @@ from urllib.parse import urlparse from django.apps import apps +from django.contrib.auth.models import User from django.contrib.postgres.fields import ArrayField from django.db import models from django.utils import timezone @@ -45,6 +46,9 @@ class ScanHistory(models.Model): employees = models.ManyToManyField('Employee', related_name='employees', blank=True) buckets = models.ManyToManyField('S3Bucket', related_name='buckets', blank=True) dorks = models.ManyToManyField('Dork', related_name='dorks', blank=True) + initiated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='initiated_scans', blank=True, null=True) + aborted_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='aborted_scans') + def __str__(self): return self.domain.name diff --git a/web/startScan/templates/startScan/detail_scan.html b/web/startScan/templates/startScan/detail_scan.html index b24d1bb86..d32a11a06 100644 --- a/web/startScan/templates/startScan/detail_scan.html +++ b/web/startScan/templates/startScan/detail_scan.html @@ -2438,6 +2438,10 @@

Filters

Summary Scan Engine Used Last Scan + Initiated By Status Progress Action @@ -108,6 +109,9 @@

Filters

{{scan_history.start_scan_date|naturaltime}} + + {{scan_history.initiated_by.username}} + {% if scan_history.scan_status == -1 %} Pending @@ -120,6 +124,8 @@

Filters

Successful {% elif scan_history.scan_status == 3 %} Aborted +
+ Aborted by: {{scan_history.aborted_by}} {% else %} Unknown {% endif %} diff --git a/web/startScan/templates/startScan/subdomains.html b/web/startScan/templates/startScan/subdomains.html index 013fec86a..8386e85cb 100644 --- a/web/startScan/templates/startScan/subdomains.html +++ b/web/startScan/templates/startScan/subdomains.html @@ -349,6 +349,10 @@ subdomain_datatables.search($("#subdomains-search").val()).draw() ; }); + $('#load_important_subdomain_table_btn').click(function() { + subdomain_datatables.search('is_important=true').draw(); + }); + $('input[name=sub_http_status_filter_checkbox]').change(function() { if ($(this).is(':checked')) { subdomain_datatables.column(4).visible(true); diff --git a/web/startScan/views.py b/web/startScan/views.py index 32d27547f..22780a3a6 100644 --- a/web/startScan/views.py +++ b/web/startScan/views.py @@ -270,7 +270,11 @@ def start_scan_ui(request, slug, domain_id): engine_id = request.POST['scan_mode'] # Create ScanHistory object - scan_history_id = create_scan_object(domain_id, engine_id) + scan_history_id = create_scan_object( + domain_id, + engine_id, + request.user + ) scan = ScanHistory.objects.get(pk=scan_history_id) # Start the celery task @@ -323,7 +327,11 @@ def start_multiple_scan(request, slug): for domain_id in list_of_domains.split(","): # Start the celery task - scan_history_id = create_scan_object(domain_id, engine_id) + scan_history_id = create_scan_object( + domain_id, + engine_id, + request.user + ) # domain = get_object_or_404(Domain, id=domain_id) kwargs = { @@ -621,7 +629,7 @@ def change_vuln_status(request, id): return HttpResponse('') -def create_scan_object(host_id, engine_id): +def create_scan_object(host_id, engine_id, initiated_by): ''' create task with pending status so that celery task will execute when threads are free @@ -636,6 +644,7 @@ def create_scan_object(host_id, engine_id): scan.domain = domain scan.scan_type = engine scan.start_scan_date = current_scan_time + scan.initiated_by = initiated_by scan.save() # save last scan date for domain model domain.start_scan_date = current_scan_time @@ -684,7 +693,11 @@ def start_organization_scan(request, id, slug): # Start Celery task for each organization's domains for domain in organization.get_domains(): - scan_history_id = create_scan_object(domain.id, engine_id) + scan_history_id = create_scan_object( + domain.id, + engine_id, + request.user + ) scan = ScanHistory.objects.get(pk=scan_history_id) kwargs = { diff --git a/web/static/custom/custom.js b/web/static/custom/custom.js index 1ca19be0e..18cd5aeca 100644 --- a/web/static/custom/custom.js +++ b/web/static/custom/custom.js @@ -1854,12 +1854,17 @@ function show_quick_add_target_modal() {

- +
+
+ + +
+
@@ -1874,11 +1879,12 @@ function add_quick_target() { var domain_name = $('#target_name_modal').val(); var description = $('#target_description_modal').val(); var h1_handle = $('#h1_handle_modal').val(); - add_target(domain_name, h1_handle = h1_handle, description = description); + var organization = $('#target_organization_modal').val(); + add_target(domain_name, h1_handle = h1_handle, description = description, organization = organization); } -function add_target(domain_name, h1_handle = null, description = null) { +function add_target(domain_name, h1_handle = null, description = null, organization = null) { var current_slug = getCurrentProjectSlug(); // this function will add domain_name as target console.log('Adding new target ' + domain_name) @@ -1887,6 +1893,7 @@ function add_target(domain_name, h1_handle = null, description = null) { 'domain_name': domain_name, 'h1_team_handle': h1_handle, 'description': description, + 'organization': organization, 'slug': current_slug }; swal.queue([{ diff --git a/web/targetApp/forms.py b/web/targetApp/forms.py index 0f1b1c257..0d11c2e75 100644 --- a/web/targetApp/forms.py +++ b/web/targetApp/forms.py @@ -33,6 +33,15 @@ class AddTargetForm(forms.Form): "placeholder": "team_handle" } )) + organization_name = forms.CharField( + required=False, + widget=forms.TextInput( + attrs={ + "class": "form-control form-control-lg", + "id": "organizationName", + "placeholder": "Organization Name" + } + )) class AddOrganizationForm(forms.Form): def __init__(self, *args, **kwargs): @@ -77,7 +86,7 @@ def __init__(self, *args, **kwargs): def clean_name(self): data = self.cleaned_data['name'] if Organization.objects.filter(name=data).count() > 0: - raise forms.ValidationError("{} Organization already exists".format(data)) + raise forms.ValidationError(f"{data} Organization already exists") return data diff --git a/web/targetApp/migrations/0001_initial.py b/web/targetApp/migrations/0001_initial.py index 89d7ba3c3..fb74ba395 100644 --- a/web/targetApp/migrations/0001_initial.py +++ b/web/targetApp/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.4 on 2021-12-30 19:39 +# Generated by Django 3.2.23 on 2024-06-19 02:43 from django.db import migrations, models import django.db.models.deletion @@ -9,9 +9,18 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('dashboard', '0001_initial'), ] operations = [ + migrations.CreateModel( + name='DNSRecord', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=500)), + ('type', models.CharField(max_length=50)), + ], + ), migrations.CreateModel( name='Domain', fields=[ @@ -20,53 +29,67 @@ class Migration(migrations.Migration): ('h1_team_handle', models.CharField(blank=True, max_length=100, null=True)), ('ip_address_cidr', models.CharField(blank=True, max_length=100, null=True)), ('description', models.TextField(blank=True, null=True)), - ('insert_date', models.DateTimeField()), + ('insert_date', models.DateTimeField(null=True)), ('start_scan_date', models.DateTimeField(null=True)), + ('request_headers', models.JSONField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='DomainRegistration', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=500, null=True)), + ('organization', models.CharField(blank=True, max_length=500, null=True)), + ('address', models.CharField(blank=True, max_length=500, null=True)), + ('city', models.CharField(blank=True, max_length=100, null=True)), + ('state', models.CharField(blank=True, max_length=100, null=True)), + ('zip_code', models.CharField(blank=True, max_length=100, null=True)), + ('country', models.CharField(blank=True, max_length=100, null=True)), + ('email', models.CharField(blank=True, max_length=500, null=True)), + ('phone', models.CharField(blank=True, max_length=150, null=True)), + ('fax', models.CharField(blank=True, max_length=150, null=True)), + ('id_str', models.CharField(blank=True, max_length=500, null=True)), + ], + ), + migrations.CreateModel( + name='HistoricalIP', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('ip', models.CharField(max_length=150)), + ('location', models.CharField(max_length=500)), + ('owner', models.CharField(max_length=500)), + ('last_seen', models.CharField(max_length=500)), ], ), migrations.CreateModel( - name='NameServerHistory', + name='NameServer', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.CharField(blank=True, max_length=10, null=True)), - ('action', models.CharField(blank=True, max_length=50, null=True)), - ('server', models.CharField(blank=True, max_length=100, null=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=500)), ], ), migrations.CreateModel( - name='NSRecord', + name='Registrar', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.CharField(blank=True, max_length=10, null=True)), - ('hostname', models.CharField(blank=True, max_length=50, null=True)), - ('address', models.CharField(blank=True, max_length=50, null=True)), - ('preference', models.CharField(blank=True, max_length=5, null=True)), - ('ttl', models.CharField(blank=True, max_length=10, null=True)), - ('ns_class', models.CharField(blank=True, max_length=10, null=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=500, null=True)), + ('phone', models.CharField(blank=True, max_length=150, null=True)), + ('email', models.CharField(blank=True, max_length=350, null=True)), + ('url', models.CharField(blank=True, max_length=1000, null=True)), ], ), migrations.CreateModel( - name='RegistrantInfo', + name='RelatedDomain', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=250, null=True)), - ('organization', models.CharField(blank=True, max_length=250, null=True)), - ('email', models.CharField(blank=True, max_length=250, null=True)), - ('address', models.CharField(blank=True, max_length=200, null=True)), - ('city', models.CharField(blank=True, max_length=50, null=True)), - ('state', models.CharField(blank=True, max_length=20, null=True)), - ('country', models.CharField(blank=True, max_length=50, null=True)), - ('country_iso', models.CharField(blank=True, max_length=4, null=True)), - ('phone_number', models.CharField(blank=True, max_length=50, null=True)), - ('fax', models.CharField(blank=True, max_length=50, null=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=250)), ], ), migrations.CreateModel( - name='WhoisDetail', + name='WhoisStatus', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('details', models.TextField(blank=True, null=True)), - ('registrant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.registrantinfo')), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=500)), ], ), migrations.CreateModel( @@ -77,21 +100,30 @@ class Migration(migrations.Migration): ('description', models.TextField(blank=True, null=True)), ('insert_date', models.DateTimeField()), ('domains', models.ManyToManyField(related_name='domains', to='targetApp.Domain')), + ('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='dashboard.project')), ], ), migrations.CreateModel( name='DomainInfo', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date_created', models.CharField(blank=True, max_length=300, null=True)), - ('domain_age', models.CharField(blank=True, max_length=300, null=True)), - ('ip_address', models.CharField(blank=True, max_length=200, null=True)), - ('geolocation', models.CharField(blank=True, max_length=50, null=True)), - ('geolocation_iso', models.CharField(blank=True, max_length=4, null=True)), - ('is_private', models.BooleanField(default=False)), - ('nameserver_history', models.ManyToManyField(to='targetApp.NameServerHistory')), - ('nameserver_record', models.ManyToManyField(to='targetApp.NSRecord')), - ('whois', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.whoisdetail')), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('dnssec', models.BooleanField(default=False)), + ('created', models.DateTimeField(blank=True, null=True)), + ('updated', models.DateTimeField(blank=True, null=True)), + ('expires', models.DateTimeField(blank=True, null=True)), + ('geolocation_iso', models.CharField(blank=True, max_length=10, null=True)), + ('whois_server', models.CharField(blank=True, max_length=150, null=True)), + ('admin', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin', to='targetApp.domainregistration')), + ('dns_records', models.ManyToManyField(blank=True, to='targetApp.DNSRecord')), + ('historical_ips', models.ManyToManyField(blank=True, related_name='similar_domains', to='targetApp.HistoricalIP')), + ('name_servers', models.ManyToManyField(blank=True, to='targetApp.NameServer')), + ('registrant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant', to='targetApp.domainregistration')), + ('registrar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.registrar')), + ('related_domains', models.ManyToManyField(blank=True, related_name='associated_domains', to='targetApp.RelatedDomain')), + ('related_tlds', models.ManyToManyField(blank=True, related_name='related_tlds', to='targetApp.RelatedDomain')), + ('similar_domains', models.ManyToManyField(blank=True, related_name='similar_domains', to='targetApp.RelatedDomain')), + ('status', models.ManyToManyField(blank=True, to='targetApp.WhoisStatus')), + ('tech', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech', to='targetApp.domainregistration')), ], ), migrations.AddField( @@ -99,4 +131,9 @@ class Migration(migrations.Migration): name='domain_info', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domaininfo'), ), + migrations.AddField( + model_name='domain', + name='project', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='dashboard.project'), + ), ] diff --git a/web/targetApp/migrations/0002_auto_20220406_0216.py b/web/targetApp/migrations/0002_auto_20220406_0216.py deleted file mode 100644 index cf7cd6dbf..000000000 --- a/web/targetApp/migrations/0002_auto_20220406_0216.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-06 02:16 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='registrantinfo', - name='email_association_href', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='registrantinfo', - name='organization_association_href', - field=models.CharField(blank=True, max_length=100, null=True), - ), - ] diff --git a/web/targetApp/migrations/0003_auto_20220406_0243.py b/web/targetApp/migrations/0003_auto_20220406_0243.py deleted file mode 100644 index ebd57096d..000000000 --- a/web/targetApp/migrations/0003_auto_20220406_0243.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-06 02:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0002_auto_20220406_0216'), - ] - - operations = [ - migrations.CreateModel( - name='AssociatedDomain', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=250, null=True)), - ('creation_date', models.CharField(blank=True, max_length=20, null=True)), - ('registrar', models.CharField(blank=True, max_length=40, null=True)), - ], - ), - migrations.AddField( - model_name='registrantinfo', - name='associated_domains', - field=models.ManyToManyField(to='targetApp.AssociatedDomain'), - ), - ] diff --git a/web/targetApp/migrations/0004_auto_20220406_0306.py b/web/targetApp/migrations/0004_auto_20220406_0306.py deleted file mode 100644 index 74454f862..000000000 --- a/web/targetApp/migrations/0004_auto_20220406_0306.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-06 03:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0003_auto_20220406_0243'), - ] - - operations = [ - migrations.AddField( - model_name='associateddomain', - name='assocation_by', - field=models.CharField(blank=True, max_length=10, null=True), - ), - migrations.AlterField( - model_name='associateddomain', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - migrations.AlterField( - model_name='domaininfo', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - migrations.AlterField( - model_name='nameserverhistory', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - migrations.AlterField( - model_name='nsrecord', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - migrations.AlterField( - model_name='registrantinfo', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - migrations.AlterField( - model_name='whoisdetail', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - ] diff --git a/web/targetApp/migrations/0005_rename_assocation_by_associateddomain_association_by.py b/web/targetApp/migrations/0005_rename_assocation_by_associateddomain_association_by.py deleted file mode 100644 index 2404a1d26..000000000 --- a/web/targetApp/migrations/0005_rename_assocation_by_associateddomain_association_by.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-06 03:08 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0004_auto_20220406_0306'), - ] - - operations = [ - migrations.RenameField( - model_name='associateddomain', - old_name='assocation_by', - new_name='association_by', - ), - ] diff --git a/web/targetApp/migrations/0006_remove_associateddomain_association_by.py b/web/targetApp/migrations/0006_remove_associateddomain_association_by.py deleted file mode 100644 index 94c63db22..000000000 --- a/web/targetApp/migrations/0006_remove_associateddomain_association_by.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-06 03:42 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0005_rename_assocation_by_associateddomain_association_by'), - ] - - operations = [ - migrations.RemoveField( - model_name='associateddomain', - name='association_by', - ), - ] diff --git a/web/targetApp/migrations/0007_auto_20220406_0344.py b/web/targetApp/migrations/0007_auto_20220406_0344.py deleted file mode 100644 index 42909f000..000000000 --- a/web/targetApp/migrations/0007_auto_20220406_0344.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-06 03:44 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0006_remove_associateddomain_association_by'), - ] - - operations = [ - migrations.RemoveField( - model_name='associateddomain', - name='creation_date', - ), - migrations.RemoveField( - model_name='associateddomain', - name='registrar', - ), - ] diff --git a/web/targetApp/migrations/0008_auto_20220413_0529.py b/web/targetApp/migrations/0008_auto_20220413_0529.py deleted file mode 100644 index a319dbcee..000000000 --- a/web/targetApp/migrations/0008_auto_20220413_0529.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-13 05:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0007_auto_20220406_0344'), - ] - - operations = [ - migrations.CreateModel( - name='RelatedTLD', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=250, null=True)), - ], - ), - migrations.AlterField( - model_name='registrantinfo', - name='associated_domains', - field=models.ManyToManyField(blank=True, to='targetApp.AssociatedDomain'), - ), - migrations.AddField( - model_name='registrantinfo', - name='related_tld', - field=models.ManyToManyField(blank=True, to='targetApp.RelatedTLD'), - ), - ] diff --git a/web/targetApp/migrations/0009_rename_related_tld_registrantinfo_related_tlds.py b/web/targetApp/migrations/0009_rename_related_tld_registrantinfo_related_tlds.py deleted file mode 100644 index 71d859fa5..000000000 --- a/web/targetApp/migrations/0009_rename_related_tld_registrantinfo_related_tlds.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-13 05:37 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0008_auto_20220413_0529'), - ] - - operations = [ - migrations.RenameField( - model_name='registrantinfo', - old_name='related_tld', - new_name='related_tlds', - ), - ] diff --git a/web/targetApp/migrations/0010_auto_20220413_1728.py b/web/targetApp/migrations/0010_auto_20220413_1728.py deleted file mode 100644 index 6d29b2e66..000000000 --- a/web/targetApp/migrations/0010_auto_20220413_1728.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 3.2.4 on 2022-04-13 17:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0009_rename_related_tld_registrantinfo_related_tlds'), - ] - - operations = [ - migrations.RemoveField( - model_name='registrantinfo', - name='associated_domains', - ), - migrations.RemoveField( - model_name='registrantinfo', - name='email_association_href', - ), - migrations.RemoveField( - model_name='registrantinfo', - name='organization_association_href', - ), - migrations.RemoveField( - model_name='registrantinfo', - name='related_tlds', - ), - migrations.AddField( - model_name='domaininfo', - name='associated_domains', - field=models.ManyToManyField(blank=True, to='targetApp.AssociatedDomain'), - ), - migrations.AddField( - model_name='domaininfo', - name='email_association_href', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='domaininfo', - name='organization_association_href', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AddField( - model_name='domaininfo', - name='related_tlds', - field=models.ManyToManyField(blank=True, to='targetApp.RelatedTLD'), - ), - ] diff --git a/web/targetApp/migrations/0011_domaininfo_date_expiration.py b/web/targetApp/migrations/0011_domaininfo_date_expiration.py deleted file mode 100644 index ed5d72293..000000000 --- a/web/targetApp/migrations/0011_domaininfo_date_expiration.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-13 13:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0010_auto_20220413_1728'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='date_expiration', - field=models.CharField(blank=True, max_length=300, null=True), - ), - ] diff --git a/web/targetApp/migrations/0012_auto_20220614_1738.py b/web/targetApp/migrations/0012_auto_20220614_1738.py deleted file mode 100644 index 54fdb63e5..000000000 --- a/web/targetApp/migrations/0012_auto_20220614_1738.py +++ /dev/null @@ -1,209 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-14 17:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0011_domaininfo_date_expiration'), - ] - - operations = [ - migrations.CreateModel( - name='DomainAddress', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='DomainCity', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( - name='DomainCountry', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=20)), - ], - ), - migrations.CreateModel( - name='DomainEmail', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='DomainFax', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( - name='DomainPhone', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( - name='DomainRegisterName', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='DomainRegisterOrganization', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='DomainState', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=50)), - ], - ), - migrations.CreateModel( - name='DomainZipCode', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=20)), - ], - ), - migrations.CreateModel( - name='NameServers', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=500, null=True)), - ], - ), - migrations.RemoveField( - model_name='whoisdetail', - name='registrant', - ), - migrations.RemoveField( - model_name='domaininfo', - name='date_created', - ), - migrations.RemoveField( - model_name='domaininfo', - name='date_expiration', - ), - migrations.RemoveField( - model_name='domaininfo', - name='domain_age', - ), - migrations.RemoveField( - model_name='domaininfo', - name='email_association_href', - ), - migrations.RemoveField( - model_name='domaininfo', - name='geolocation', - ), - migrations.RemoveField( - model_name='domaininfo', - name='geolocation_iso', - ), - migrations.RemoveField( - model_name='domaininfo', - name='ip_address', - ), - migrations.RemoveField( - model_name='domaininfo', - name='is_private', - ), - migrations.RemoveField( - model_name='domaininfo', - name='nameserver_history', - ), - migrations.RemoveField( - model_name='domaininfo', - name='nameserver_record', - ), - migrations.RemoveField( - model_name='domaininfo', - name='organization_association_href', - ), - migrations.RemoveField( - model_name='domaininfo', - name='whois', - ), - migrations.AddField( - model_name='domaininfo', - name='raw_text', - field=models.CharField(blank=True, max_length=10000, null=True), - ), - migrations.DeleteModel( - name='NameServerHistory', - ), - migrations.DeleteModel( - name='NSRecord', - ), - migrations.DeleteModel( - name='RegistrantInfo', - ), - migrations.DeleteModel( - name='WhoisDetail', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_address', - field=models.ManyToManyField(blank=True, to='targetApp.DomainAddress'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_city', - field=models.ManyToManyField(blank=True, to='targetApp.DomainCity'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_country', - field=models.ManyToManyField(blank=True, to='targetApp.DomainCountry'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_email', - field=models.ManyToManyField(blank=True, to='targetApp.DomainEmail'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_fax', - field=models.ManyToManyField(blank=True, to='targetApp.DomainFax'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_name', - field=models.ManyToManyField(blank=True, to='targetApp.DomainRegisterName'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_organization', - field=models.ManyToManyField(blank=True, to='targetApp.DomainRegisterOrganization'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_phone', - field=models.ManyToManyField(blank=True, to='targetApp.DomainPhone'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_state', - field=models.ManyToManyField(blank=True, to='targetApp.DomainState'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_zip_code', - field=models.ManyToManyField(blank=True, to='targetApp.DomainZipCode'), - ), - ] diff --git a/web/targetApp/migrations/0013_auto_20220615_0428.py b/web/targetApp/migrations/0013_auto_20220615_0428.py deleted file mode 100644 index ee61f560a..000000000 --- a/web/targetApp/migrations/0013_auto_20220615_0428.py +++ /dev/null @@ -1,175 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-15 04:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0012_auto_20220614_1738'), - ] - - operations = [ - migrations.CreateModel( - name='DomainWhoisStatus', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('status', models.CharField(max_length=500)), - ], - ), - migrations.AddField( - model_name='domaininfo', - name='admin_address', - field=models.ManyToManyField(blank=True, related_name='admin_address', to='targetApp.DomainAddress'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_city', - field=models.ManyToManyField(blank=True, related_name='admin_city', to='targetApp.DomainCity'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_country', - field=models.ManyToManyField(blank=True, related_name='admin_country', to='targetApp.DomainCountry'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_email', - field=models.ManyToManyField(blank=True, related_name='admin_email', to='targetApp.DomainEmail'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_fax', - field=models.ManyToManyField(blank=True, related_name='admin_fax', to='targetApp.DomainFax'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_name', - field=models.ManyToManyField(blank=True, related_name='admin_name', to='targetApp.DomainRegisterName'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_organization', - field=models.ManyToManyField(blank=True, related_name='admin_organization', to='targetApp.DomainRegisterOrganization'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_phone', - field=models.ManyToManyField(blank=True, related_name='admin_phone', to='targetApp.DomainPhone'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_state', - field=models.ManyToManyField(blank=True, related_name='admin_state', to='targetApp.DomainState'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_zip_code', - field=models.ManyToManyField(blank=True, related_name='admin_zip_code', to='targetApp.DomainZipCode'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_address', - field=models.ManyToManyField(blank=True, related_name='tech_address', to='targetApp.DomainAddress'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_city', - field=models.ManyToManyField(blank=True, related_name='tech_city', to='targetApp.DomainCity'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_country', - field=models.ManyToManyField(blank=True, related_name='tech_country', to='targetApp.DomainCountry'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_email', - field=models.ManyToManyField(blank=True, related_name='tech_email', to='targetApp.DomainEmail'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_fax', - field=models.ManyToManyField(blank=True, related_name='tech_fax', to='targetApp.DomainFax'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_name', - field=models.ManyToManyField(blank=True, related_name='tech_name', to='targetApp.DomainRegisterName'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_organization', - field=models.ManyToManyField(blank=True, related_name='tech_organization', to='targetApp.DomainRegisterOrganization'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_phone', - field=models.ManyToManyField(blank=True, related_name='tech_phone', to='targetApp.DomainPhone'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_state', - field=models.ManyToManyField(blank=True, related_name='tech_state', to='targetApp.DomainState'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_zip_code', - field=models.ManyToManyField(blank=True, related_name='tech_zip_code', to='targetApp.DomainZipCode'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_address', - field=models.ManyToManyField(blank=True, related_name='registrant_address', to='targetApp.DomainAddress'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_city', - field=models.ManyToManyField(blank=True, related_name='registrant_city', to='targetApp.DomainCity'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_country', - field=models.ManyToManyField(blank=True, related_name='registrant_country', to='targetApp.DomainCountry'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_email', - field=models.ManyToManyField(blank=True, related_name='registrant_email', to='targetApp.DomainEmail'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_fax', - field=models.ManyToManyField(blank=True, related_name='registrant_fax', to='targetApp.DomainFax'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_name', - field=models.ManyToManyField(blank=True, related_name='registrant_name', to='targetApp.DomainRegisterName'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_organization', - field=models.ManyToManyField(blank=True, related_name='registrant_organization', to='targetApp.DomainRegisterOrganization'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_phone', - field=models.ManyToManyField(blank=True, related_name='registrant_phone', to='targetApp.DomainPhone'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_state', - field=models.ManyToManyField(blank=True, related_name='registrant_state', to='targetApp.DomainState'), - ), - migrations.AlterField( - model_name='domaininfo', - name='registrant_zip_code', - field=models.ManyToManyField(blank=True, related_name='registrant_zip_code', to='targetApp.DomainZipCode'), - ), - migrations.AddField( - model_name='domaininfo', - name='status', - field=models.ManyToManyField(blank=True, to='targetApp.DomainWhoisStatus'), - ), - ] diff --git a/web/targetApp/migrations/0014_auto_20220615_0510.py b/web/targetApp/migrations/0014_auto_20220615_0510.py deleted file mode 100644 index 4e949c9d6..000000000 --- a/web/targetApp/migrations/0014_auto_20220615_0510.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-15 05:10 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0013_auto_20220615_0428'), - ] - - operations = [ - migrations.CreateModel( - name='DomainRegistrar', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ], - ), - migrations.CreateModel( - name='DomainRegistrarID', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ], - ), - migrations.AddField( - model_name='domaininfo', - name='registrar', - field=models.ManyToManyField(blank=True, to='targetApp.DomainRegisterName'), - ), - migrations.AddField( - model_name='domaininfo', - name='admin_id', - field=models.ManyToManyField(blank=True, related_name='admin_id', to='targetApp.DomainRegistrarID'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech_id', - field=models.ManyToManyField(blank=True, related_name='tech_id', to='targetApp.DomainRegistrarID'), - ), - ] diff --git a/web/targetApp/migrations/0015_auto_20220615_0524.py b/web/targetApp/migrations/0015_auto_20220615_0524.py deleted file mode 100644 index 807635a08..000000000 --- a/web/targetApp/migrations/0015_auto_20220615_0524.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-15 05:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0014_auto_20220615_0510'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='dnssec', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AlterField( - model_name='domaininfo', - name='raw_text', - field=models.CharField(blank=True, max_length=15000, null=True), - ), - ] diff --git a/web/targetApp/migrations/0016_alter_domaininfo_registrar.py b/web/targetApp/migrations/0016_alter_domaininfo_registrar.py deleted file mode 100644 index 52c50a88d..000000000 --- a/web/targetApp/migrations/0016_alter_domaininfo_registrar.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-15 05:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0015_auto_20220615_0524'), - ] - - operations = [ - migrations.AlterField( - model_name='domaininfo', - name='registrar', - field=models.ManyToManyField(blank=True, to='targetApp.DomainRegistrar'), - ), - ] diff --git a/web/targetApp/migrations/0017_domaininfo_ip_address.py b/web/targetApp/migrations/0017_domaininfo_ip_address.py deleted file mode 100644 index 11194e959..000000000 --- a/web/targetApp/migrations/0017_domaininfo_ip_address.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-15 05:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0016_alter_domaininfo_registrar'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='ip_address', - field=models.CharField(blank=True, max_length=200, null=True), - ), - ] diff --git a/web/targetApp/migrations/0018_domaininfo_name_servers.py b/web/targetApp/migrations/0018_domaininfo_name_servers.py deleted file mode 100644 index 7f1ef5c7d..000000000 --- a/web/targetApp/migrations/0018_domaininfo_name_servers.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-16 16:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0017_domaininfo_ip_address'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='name_servers', - field=models.ManyToManyField(blank=True, to='targetApp.NameServers'), - ), - ] diff --git a/web/targetApp/migrations/0019_auto_20220616_1637.py b/web/targetApp/migrations/0019_auto_20220616_1637.py deleted file mode 100644 index f4dae2c89..000000000 --- a/web/targetApp/migrations/0019_auto_20220616_1637.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-16 16:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0018_domaininfo_name_servers'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='created', - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='domaininfo', - name='expires', - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='domaininfo', - name='updated', - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/web/targetApp/migrations/0020_auto_20220617_0552.py b/web/targetApp/migrations/0020_auto_20220617_0552.py deleted file mode 100644 index 153a40a87..000000000 --- a/web/targetApp/migrations/0020_auto_20220617_0552.py +++ /dev/null @@ -1,315 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-17 05:52 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0019_auto_20220616_1637'), - ] - - operations = [ - migrations.RemoveField( - model_name='domaininfo', - name='ip_address', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_address', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_address', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_address', to='targetApp.domainaddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_city', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_city', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_city', to='targetApp.domaincity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_country', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_country', to='targetApp.domaincountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_email', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_email', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_email', to='targetApp.domainemail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_fax', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_fax', to='targetApp.domainfax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_id', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_id', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_id', to='targetApp.domainregistrarid'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_name', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_name', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_name', to='targetApp.domainregistername'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_organization', to='targetApp.domainregisterorganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_phone', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_phone', to='targetApp.domainphone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_state', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_state', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_state', to='targetApp.domainstate'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_zip_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_zip_code', to='targetApp.domainzipcode'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_address', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_address', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_address', to='targetApp.domainaddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_city', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_city', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_city', to='targetApp.domaincity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_country', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_country', to='targetApp.domaincountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_email', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_email', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_email', to='targetApp.domainemail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_fax', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_fax', to='targetApp.domainfax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_name', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_name', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_name', to='targetApp.domainregistername'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_organization', to='targetApp.domainregisterorganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_phone', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_phone', to='targetApp.domainphone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_state', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_state', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_state', to='targetApp.domainstate'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_zip_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_zip_code', to='targetApp.domainzipcode'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrar', - ), - migrations.AddField( - model_name='domaininfo', - name='registrar', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domainregistrar'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_address', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_address', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_address', to='targetApp.domainaddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_city', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_city', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_city', to='targetApp.domaincity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_country', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_country', to='targetApp.domaincountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_email', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_email', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_email', to='targetApp.domainemail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_fax', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_fax', to='targetApp.domainfax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_id', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_id', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_id', to='targetApp.domainregistrarid'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_name', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_name', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_name', to='targetApp.domainregistername'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_organization', to='targetApp.domainregisterorganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_phone', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_phone', to='targetApp.domainphone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_state', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_state', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_state', to='targetApp.domainstate'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_zip_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_zip_code', to='targetApp.domainzipcode'), - ), - ] diff --git a/web/targetApp/migrations/0021_domaininfo_ip_address.py b/web/targetApp/migrations/0021_domaininfo_ip_address.py deleted file mode 100644 index 2efe8f134..000000000 --- a/web/targetApp/migrations/0021_domaininfo_ip_address.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-17 05:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0020_auto_20220617_0552'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='ip_address', - field=models.CharField(blank=True, max_length=200, null=True), - ), - ] diff --git a/web/targetApp/migrations/0022_auto_20220617_0554.py b/web/targetApp/migrations/0022_auto_20220617_0554.py deleted file mode 100644 index 35e4809e7..000000000 --- a/web/targetApp/migrations/0022_auto_20220617_0554.py +++ /dev/null @@ -1,310 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-17 05:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0021_domaininfo_ip_address'), - ] - - operations = [ - migrations.RemoveField( - model_name='domaininfo', - name='admin_address', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_address', - field=models.ManyToManyField(blank=True, related_name='admin_address', to='targetApp.DomainAddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_city', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_city', - field=models.ManyToManyField(blank=True, related_name='admin_city', to='targetApp.DomainCity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_country', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_country', - field=models.ManyToManyField(blank=True, related_name='admin_country', to='targetApp.DomainCountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_email', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_email', - field=models.ManyToManyField(blank=True, related_name='admin_email', to='targetApp.DomainEmail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_fax', - field=models.ManyToManyField(blank=True, related_name='admin_fax', to='targetApp.DomainFax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_id', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_id', - field=models.ManyToManyField(blank=True, related_name='admin_id', to='targetApp.DomainRegistrarID'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_name', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_name', - field=models.ManyToManyField(blank=True, related_name='admin_name', to='targetApp.DomainRegisterName'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_organization', - field=models.ManyToManyField(blank=True, related_name='admin_organization', to='targetApp.DomainRegisterOrganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_phone', - field=models.ManyToManyField(blank=True, related_name='admin_phone', to='targetApp.DomainPhone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_state', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_state', - field=models.ManyToManyField(blank=True, related_name='admin_state', to='targetApp.DomainState'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_zip_code', - field=models.ManyToManyField(blank=True, related_name='admin_zip_code', to='targetApp.DomainZipCode'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_address', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_address', - field=models.ManyToManyField(blank=True, related_name='registrant_address', to='targetApp.DomainAddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_city', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_city', - field=models.ManyToManyField(blank=True, related_name='registrant_city', to='targetApp.DomainCity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_country', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_country', - field=models.ManyToManyField(blank=True, related_name='registrant_country', to='targetApp.DomainCountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_email', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_email', - field=models.ManyToManyField(blank=True, related_name='registrant_email', to='targetApp.DomainEmail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_fax', - field=models.ManyToManyField(blank=True, related_name='registrant_fax', to='targetApp.DomainFax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_name', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_name', - field=models.ManyToManyField(blank=True, related_name='registrant_name', to='targetApp.DomainRegisterName'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_organization', - field=models.ManyToManyField(blank=True, related_name='registrant_organization', to='targetApp.DomainRegisterOrganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_phone', - field=models.ManyToManyField(blank=True, related_name='registrant_phone', to='targetApp.DomainPhone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_state', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_state', - field=models.ManyToManyField(blank=True, related_name='registrant_state', to='targetApp.DomainState'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_zip_code', - field=models.ManyToManyField(blank=True, related_name='registrant_zip_code', to='targetApp.DomainZipCode'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrar', - ), - migrations.AddField( - model_name='domaininfo', - name='registrar', - field=models.ManyToManyField(blank=True, to='targetApp.DomainRegistrar'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_address', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_address', - field=models.ManyToManyField(blank=True, related_name='tech_address', to='targetApp.DomainAddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_city', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_city', - field=models.ManyToManyField(blank=True, related_name='tech_city', to='targetApp.DomainCity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_country', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_country', - field=models.ManyToManyField(blank=True, related_name='tech_country', to='targetApp.DomainCountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_email', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_email', - field=models.ManyToManyField(blank=True, related_name='tech_email', to='targetApp.DomainEmail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_fax', - field=models.ManyToManyField(blank=True, related_name='tech_fax', to='targetApp.DomainFax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_id', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_id', - field=models.ManyToManyField(blank=True, related_name='tech_id', to='targetApp.DomainRegistrarID'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_name', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_name', - field=models.ManyToManyField(blank=True, related_name='tech_name', to='targetApp.DomainRegisterName'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_organization', - field=models.ManyToManyField(blank=True, related_name='tech_organization', to='targetApp.DomainRegisterOrganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_phone', - field=models.ManyToManyField(blank=True, related_name='tech_phone', to='targetApp.DomainPhone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_state', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_state', - field=models.ManyToManyField(blank=True, related_name='tech_state', to='targetApp.DomainState'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_zip_code', - field=models.ManyToManyField(blank=True, related_name='tech_zip_code', to='targetApp.DomainZipCode'), - ), - ] diff --git a/web/targetApp/migrations/0023_auto_20220617_0554.py b/web/targetApp/migrations/0023_auto_20220617_0554.py deleted file mode 100644 index c363d0720..000000000 --- a/web/targetApp/migrations/0023_auto_20220617_0554.py +++ /dev/null @@ -1,311 +0,0 @@ -# Generated by Django 3.2.4 on 2022-06-17 05:54 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0022_auto_20220617_0554'), - ] - - operations = [ - migrations.RemoveField( - model_name='domaininfo', - name='admin_address', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_address', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_address', to='targetApp.domainaddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_city', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_city', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_city', to='targetApp.domaincity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_country', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_country', to='targetApp.domaincountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_email', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_email', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_email', to='targetApp.domainemail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_fax', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_fax', to='targetApp.domainfax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_id', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_id', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_id', to='targetApp.domainregistrarid'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_name', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_name', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_name', to='targetApp.domainregistername'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_organization', to='targetApp.domainregisterorganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_phone', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_phone', to='targetApp.domainphone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_state', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_state', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_state', to='targetApp.domainstate'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='admin_zip_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin_zip_code', to='targetApp.domainzipcode'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_address', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_address', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_address', to='targetApp.domainaddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_city', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_city', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_city', to='targetApp.domaincity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_country', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_country', to='targetApp.domaincountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_email', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_email', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_email', to='targetApp.domainemail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_fax', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_fax', to='targetApp.domainfax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_name', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_name', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_name', to='targetApp.domainregistername'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_organization', to='targetApp.domainregisterorganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_phone', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_phone', to='targetApp.domainphone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_state', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_state', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_state', to='targetApp.domainstate'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='registrant_zip_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant_zip_code', to='targetApp.domainzipcode'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrar', - ), - migrations.AddField( - model_name='domaininfo', - name='registrar', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='targetApp.domainregistrar'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_address', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_address', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_address', to='targetApp.domainaddress'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_city', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_city', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_city', to='targetApp.domaincity'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_country', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_country', to='targetApp.domaincountry'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_email', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_email', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_email', to='targetApp.domainemail'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_fax', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_fax', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_fax', to='targetApp.domainfax'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_id', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_id', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_id', to='targetApp.domainregistrarid'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_name', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_name', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_name', to='targetApp.domainregistername'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_organization', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_organization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_organization', to='targetApp.domainregisterorganization'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_phone', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_phone', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_phone', to='targetApp.domainphone'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_state', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_state', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_state', to='targetApp.domainstate'), - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_zip_code', - ), - migrations.AddField( - model_name='domaininfo', - name='tech_zip_code', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech_zip_code', to='targetApp.domainzipcode'), - ), - ] diff --git a/web/targetApp/migrations/0024_alter_domain_insert_date.py b/web/targetApp/migrations/0024_alter_domain_insert_date.py deleted file mode 100644 index 5e3297d3b..000000000 --- a/web/targetApp/migrations/0024_alter_domain_insert_date.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-08-16 11:47 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0023_auto_20220617_0554'), - ] - - operations = [ - migrations.AlterField( - model_name='domain', - name='insert_date', - field=models.DateTimeField(null=True), - ), - ] diff --git a/web/targetApp/migrations/0025_domain_request_headers.py b/web/targetApp/migrations/0025_domain_request_headers.py deleted file mode 100644 index 7f1e5cf59..000000000 --- a/web/targetApp/migrations/0025_domain_request_headers.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2022-09-11 18:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0024_alter_domain_insert_date'), - ] - - operations = [ - migrations.AddField( - model_name='domain', - name='request_headers', - field=models.JSONField(null=True), - ), - ] diff --git a/web/targetApp/migrations/0026_auto_20230411_1817.py b/web/targetApp/migrations/0026_auto_20230411_1817.py deleted file mode 100644 index b8f3313cc..000000000 --- a/web/targetApp/migrations/0026_auto_20230411_1817.py +++ /dev/null @@ -1,246 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-11 18:17 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0025_domain_request_headers'), - ] - - operations = [ - migrations.CreateModel( - name='DomainRegistration', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=100, null=True)), - ('organization', models.CharField(blank=True, max_length=100, null=True)), - ('address', models.CharField(blank=True, max_length=500, null=True)), - ('city', models.CharField(blank=True, max_length=100, null=True)), - ('state', models.CharField(blank=True, max_length=100, null=True)), - ('zip_code', models.CharField(blank=True, max_length=100, null=True)), - ('country', models.CharField(blank=True, max_length=100, null=True)), - ('email', models.CharField(blank=True, max_length=500, null=True)), - ('phone', models.CharField(blank=True, max_length=100, null=True)), - ('fax', models.CharField(blank=True, max_length=100, null=True)), - ], - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_address', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_city', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_country', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_email', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_fax', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_id', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_name', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_organization', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_phone', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_state', - ), - migrations.RemoveField( - model_name='domaininfo', - name='admin_zip_code', - ), - migrations.RemoveField( - model_name='domaininfo', - name='ip_address', - ), - migrations.RemoveField( - model_name='domaininfo', - name='raw_text', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_address', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_city', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_country', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_email', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_fax', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_name', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_organization', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_phone', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_state', - ), - migrations.RemoveField( - model_name='domaininfo', - name='registrant_zip_code', - ), - migrations.RemoveField( - model_name='domaininfo', - name='related_tlds', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_address', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_city', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_country', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_email', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_fax', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_id', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_name', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_organization', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_phone', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_state', - ), - migrations.RemoveField( - model_name='domaininfo', - name='tech_zip_code', - ), - migrations.AddField( - model_name='domainregistrar', - name='email', - field=models.CharField(blank=True, max_length=150, null=True), - ), - migrations.AddField( - model_name='domainregistrar', - name='phone', - field=models.CharField(blank=True, max_length=150, null=True), - ), - migrations.AddField( - model_name='domainregistrar', - name='url', - field=models.CharField(blank=True, max_length=1000, null=True), - ), - migrations.AlterField( - model_name='domaininfo', - name='dnssec', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='domainregistrar', - name='name', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.DeleteModel( - name='DomainAddress', - ), - migrations.DeleteModel( - name='DomainCity', - ), - migrations.DeleteModel( - name='DomainCountry', - ), - migrations.DeleteModel( - name='DomainEmail', - ), - migrations.DeleteModel( - name='DomainFax', - ), - migrations.DeleteModel( - name='DomainPhone', - ), - migrations.DeleteModel( - name='DomainRegisterName', - ), - migrations.DeleteModel( - name='DomainRegisterOrganization', - ), - migrations.DeleteModel( - name='DomainRegistrarID', - ), - migrations.DeleteModel( - name='DomainState', - ), - migrations.DeleteModel( - name='DomainZipCode', - ), - migrations.DeleteModel( - name='RelatedTLD', - ), - migrations.AddField( - model_name='domaininfo', - name='admin', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='admin', to='targetApp.domainregistration'), - ), - migrations.AddField( - model_name='domaininfo', - name='registrant', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registrant', to='targetApp.domainregistration'), - ), - migrations.AddField( - model_name='domaininfo', - name='tech', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tech', to='targetApp.domainregistration'), - ), - ] diff --git a/web/targetApp/migrations/0027_auto_20230412_0348.py b/web/targetApp/migrations/0027_auto_20230412_0348.py deleted file mode 100644 index 6a2b35ff1..000000000 --- a/web/targetApp/migrations/0027_auto_20230412_0348.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 03:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0026_auto_20230411_1817'), - ] - - operations = [ - migrations.AddField( - model_name='domainregistration', - name='id_str', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='domainregistrar', - name='email', - field=models.CharField(blank=True, max_length=350, null=True), - ), - migrations.AlterField( - model_name='domainregistration', - name='fax', - field=models.CharField(blank=True, max_length=150, null=True), - ), - migrations.AlterField( - model_name='domainregistration', - name='name', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='domainregistration', - name='organization', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='domainregistration', - name='phone', - field=models.CharField(blank=True, max_length=150, null=True), - ), - ] diff --git a/web/targetApp/migrations/0028_auto_20230412_0402.py b/web/targetApp/migrations/0028_auto_20230412_0402.py deleted file mode 100644 index dd2a20195..000000000 --- a/web/targetApp/migrations/0028_auto_20230412_0402.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 04:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0027_auto_20230412_0348'), - ] - - operations = [ - migrations.CreateModel( - name='DNSRecords', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=500)), - ('type', models.CharField(max_length=50)), - ], - ), - migrations.RenameField( - model_name='domainwhoisstatus', - old_name='status', - new_name='name', - ), - migrations.AddField( - model_name='domaininfo', - name='dns_records', - field=models.ManyToManyField(blank=True, to='targetApp.DNSRecords'), - ), - ] diff --git a/web/targetApp/migrations/0029_auto_20230412_0408.py b/web/targetApp/migrations/0029_auto_20230412_0408.py deleted file mode 100644 index 8cf82bfe0..000000000 --- a/web/targetApp/migrations/0029_auto_20230412_0408.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 04:08 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0028_auto_20230412_0402'), - ] - - operations = [ - migrations.RenameModel( - old_name='DNSRecords', - new_name='DNSRecord', - ), - migrations.RenameModel( - old_name='NameServers', - new_name='NameServer', - ), - ] diff --git a/web/targetApp/migrations/0030_domaininfo_geolocation_iso.py b/web/targetApp/migrations/0030_domaininfo_geolocation_iso.py deleted file mode 100644 index 4d4133c24..000000000 --- a/web/targetApp/migrations/0030_domaininfo_geolocation_iso.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 05:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0029_auto_20230412_0408'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='geolocation_iso', - field=models.CharField(blank=True, max_length=10, null=True), - ), - ] diff --git a/web/targetApp/migrations/0031_auto_20230412_0549.py b/web/targetApp/migrations/0031_auto_20230412_0549.py deleted file mode 100644 index 6500b6da7..000000000 --- a/web/targetApp/migrations/0031_auto_20230412_0549.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 05:49 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0030_domaininfo_geolocation_iso'), - ] - - operations = [ - migrations.RenameModel( - old_name='DomainRegistrar', - new_name='Registrar', - ), - migrations.RenameModel( - old_name='DomainWhoisStatus', - new_name='WhoisStatus', - ), - ] diff --git a/web/targetApp/migrations/0032_domaininfo_whois_server.py b/web/targetApp/migrations/0032_domaininfo_whois_server.py deleted file mode 100644 index 69f1848b9..000000000 --- a/web/targetApp/migrations/0032_domaininfo_whois_server.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 05:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0031_auto_20230412_0549'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='whois_server', - field=models.CharField(blank=True, max_length=150, null=True), - ), - ] diff --git a/web/targetApp/migrations/0033_alter_nameserver_name.py b/web/targetApp/migrations/0033_alter_nameserver_name.py deleted file mode 100644 index ed01f9050..000000000 --- a/web/targetApp/migrations/0033_alter_nameserver_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 07:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0032_domaininfo_whois_server'), - ] - - operations = [ - migrations.AlterField( - model_name='nameserver', - name='name', - field=models.CharField(default='', max_length=500), - preserve_default=False, - ), - ] diff --git a/web/targetApp/migrations/0034_auto_20230412_2017.py b/web/targetApp/migrations/0034_auto_20230412_2017.py deleted file mode 100644 index 422db18dc..000000000 --- a/web/targetApp/migrations/0034_auto_20230412_2017.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 20:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0033_alter_nameserver_name'), - ] - - operations = [ - migrations.AddField( - model_name='domaininfo', - name='similar_domains', - field=models.ManyToManyField(blank=True, related_name='similar_domains', to='targetApp.AssociatedDomain'), - ), - migrations.AlterField( - model_name='domaininfo', - name='associated_domains', - field=models.ManyToManyField(blank=True, related_name='associated_domains', to='targetApp.AssociatedDomain'), - ), - ] diff --git a/web/targetApp/migrations/0035_auto_20230412_2034.py b/web/targetApp/migrations/0035_auto_20230412_2034.py deleted file mode 100644 index 899766317..000000000 --- a/web/targetApp/migrations/0035_auto_20230412_2034.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-12 20:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0034_auto_20230412_2017'), - ] - - operations = [ - migrations.AddField( - model_name='associateddomain', - name='created_on', - field=models.CharField(default='', max_length=100), - preserve_default=False, - ), - migrations.AlterField( - model_name='associateddomain', - name='name', - field=models.CharField(default='', max_length=250), - preserve_default=False, - ), - ] diff --git a/web/targetApp/migrations/0036_auto_20230414_1418.py b/web/targetApp/migrations/0036_auto_20230414_1418.py deleted file mode 100644 index 31ce5dba8..000000000 --- a/web/targetApp/migrations/0036_auto_20230414_1418.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-14 14:18 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0035_auto_20230412_2034'), - ] - - operations = [ - migrations.CreateModel( - name='HistoricalIP', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('ip', models.CharField(max_length=150)), - ('location', models.CharField(max_length=500)), - ('owner', models.CharField(max_length=500)), - ('last_seen', models.CharField(max_length=500)), - ], - ), - migrations.AddField( - model_name='domaininfo', - name='historical_ips', - field=models.ManyToManyField(blank=True, related_name='similar_domains', to='targetApp.HistoricalIP'), - ), - ] diff --git a/web/targetApp/migrations/0037_auto_20230416_0216.py b/web/targetApp/migrations/0037_auto_20230416_0216.py deleted file mode 100644 index fed68e4c2..000000000 --- a/web/targetApp/migrations/0037_auto_20230416_0216.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-16 02:16 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0036_auto_20230414_1418'), - ] - - operations = [ - migrations.RenameField( - model_name='domaininfo', - old_name='associated_domains', - new_name='related_domains', - ), - migrations.RemoveField( - model_name='associateddomain', - name='created_on', - ), - migrations.AddField( - model_name='domaininfo', - name='related_tlds', - field=models.ManyToManyField(blank=True, related_name='related_tlds', to='targetApp.AssociatedDomain'), - ), - ] diff --git a/web/targetApp/migrations/0038_rename_associateddomain_relateddomain.py b/web/targetApp/migrations/0038_rename_associateddomain_relateddomain.py deleted file mode 100644 index ef33b8882..000000000 --- a/web/targetApp/migrations/0038_rename_associateddomain_relateddomain.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2023-04-16 02:25 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0037_auto_20230416_0216'), - ] - - operations = [ - migrations.RenameModel( - old_name='AssociatedDomain', - new_name='RelatedDomain', - ), - ] diff --git a/web/targetApp/migrations/0039_domain_project.py b/web/targetApp/migrations/0039_domain_project.py deleted file mode 100644 index 4c5a2b895..000000000 --- a/web/targetApp/migrations/0039_domain_project.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-26 05:28 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0005_alter_project_slug'), - ('targetApp', '0038_rename_associateddomain_relateddomain'), - ] - - operations = [ - migrations.AddField( - model_name='domain', - name='project', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='dashboard.project'), - ), - ] diff --git a/web/targetApp/migrations/0040_alter_domain_request_headers.py b/web/targetApp/migrations/0040_alter_domain_request_headers.py deleted file mode 100644 index c245e94fa..000000000 --- a/web/targetApp/migrations/0040_alter_domain_request_headers.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-26 05:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('targetApp', '0039_domain_project'), - ] - - operations = [ - migrations.AlterField( - model_name='domain', - name='request_headers', - field=models.JSONField(blank=True, null=True), - ), - ] diff --git a/web/targetApp/migrations/0041_organization_project.py b/web/targetApp/migrations/0041_organization_project.py deleted file mode 100644 index fbdd8fb22..000000000 --- a/web/targetApp/migrations/0041_organization_project.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2023-06-29 18:05 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('dashboard', '0005_alter_project_slug'), - ('targetApp', '0040_alter_domain_request_headers'), - ] - - operations = [ - migrations.AddField( - model_name='organization', - name='project', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='dashboard.project'), - ), - ] diff --git a/web/targetApp/templates/target/add.html b/web/targetApp/templates/target/add.html index b7c5562f4..cca6d6a50 100644 --- a/web/targetApp/templates/target/add.html +++ b/web/targetApp/templates/target/add.html @@ -155,6 +155,10 @@
+
+ + +
@@ -165,7 +169,7 @@
@@ -182,7 +186,7 @@
@@ -257,18 +261,22 @@
if (json_data['status']) { // #resolved_domains_div $("#all_domains_checkbox").show(); - $('#resolved_domains_div').append(`${json_data['domains'].length} domains associated with IP Address ${ip_address.value}
`); - $('#resolved_domains_div').append(`Please select the domains to import.`); - $('#resolved_domains_div').append(`
`); - for (var domain in json_data['domains']) { - $('#domains_checkbox').append(` -
-
- - -
-
` - ); + if(Array.isArray(json_data['ip_address'])) { + $('#resolved_domains_div').append(`${json_data['ip_address'].length} domains associated with IP Address ${json_data['orig']}
`); + $('#resolved_domains_div').append(`Please select the domains to import.`); + $('#resolved_domains_div').append(`
`); + json_data['ip_address'].forEach((ip_info, index, array) => { + for (var domain in ip_info['domains']) { + $('#domains_checkbox').append(` +
+
+ + +
+
` + ); + } + }) } swal.close(); // resolved_ip_domains if any is checked, then only enable add button diff --git a/web/targetApp/templates/target/summary.html b/web/targetApp/templates/target/summary.html index 53584922a..c30accb84 100644 --- a/web/targetApp/templates/target/summary.html +++ b/web/targetApp/templates/target/summary.html @@ -1215,6 +1215,10 @@

+
+
+ External IP : {{external_ip}} +
+
+

diff --git a/web/templates/base/_items/subdomain_tab_content.html b/web/templates/base/_items/subdomain_tab_content.html index 6b7e5808a..6c6ef6568 100644 --- a/web/templates/base/_items/subdomain_tab_content.html +++ b/web/templates/base/_items/subdomain_tab_content.html @@ -93,6 +93,10 @@
+ + + + diff --git a/web/templates/base/_items/top_bar.html b/web/templates/base/_items/top_bar.html index d061b56d6..39703c354 100644 --- a/web/templates/base/_items/top_bar.html +++ b/web/templates/base/_items/top_bar.html @@ -170,18 +170,18 @@
Welcome {{user.get_username}}!
diff --git a/web/templates/base/_items/top_nav.html b/web/templates/base/_items/top_nav.html index 76b59a53f..9f9c92751 100644 --- a/web/templates/base/_items/top_nav.html +++ b/web/templates/base/_items/top_nav.html @@ -1,6 +1,5 @@ {% load permission_tags %} -