Repository: pablosnt/rekono (language: python)

Issue:
Upgrade Rekono version to 1.6.0



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/desktop-applications.yml b/.github/workflows/desktop-ui.yml
similarity index 64%
rename from .github/workflows/desktop-applications.yml
rename to .github/workflows/desktop-ui.yml
index 148a916a3..c4c953925 100644
--- a/.github/workflows/desktop-applications.yml
+++ b/.github/workflows/desktop-ui.yml
@@ -1,19 +1,17 @@
-name: Desktop applications
+name: Desktop UI
 on:
   workflow_dispatch:
     inputs:
       backend:
-        description: 'Backend URL to connect Desktop app'
+        description: 'Backend URL to connect Desktop UI'
         required: true
         default: 'https://127.0.0.1'
   pull_request:
     paths:
       - 'rekono/frontend/**'
-  release:
-    types: [published]
 
 jobs:
-  desktop:
+  desktop-ui:
     strategy:
       fail-fast: false
       matrix:
@@ -25,6 +23,8 @@ jobs:
           - os: windows-latest
             extension: exe
     runs-on: ${{ matrix.os }}
+    env:
+      DEB_FILENAME: RekonoUI
     steps:
       - name: Checkout
         uses: actions/checkout@v3
@@ -56,27 +56,23 @@ jobs:
         working-directory: rekono/frontend
         run: npm install .
       
-      - name: Generate Desktop app
+      - name: Generate Desktop UI
         working-directory: rekono/frontend
         run: npm run electron:build
       
-      - name: Upload Desktop app as GitHub artifact
+      - name: Change DEB filename
+        if: matrix.os != 'windows-latest'
+        working-directory: rekono/frontend/dist_electron
+        run: mv *.${{ matrix.extension }} $DEB_FILENAME.${{ matrix.extension }}
+      
+      - name: Change DEB filename
+        if: matrix.os == 'windows-latest'
+        working-directory: rekono/frontend/dist_electron
+        run: ren *.${{ matrix.extension }} %DEB_FILENAME%.${{ matrix.extension }}
+      
+      - name: Upload Desktop UI as GitHub artifact
         uses: actions/upload-artifact@v3
         with:
-          name: rekono_${{ matrix.os }}
-          path: rekono/frontend/dist_electron/*.${{ matrix.extension }}
+          name: ${{ env.DEB_FILENAME }}_${{ matrix.os }}
+          path: rekono/frontend/dist_electron/${{ env.DEB_FILENAME }}.${{ matrix.extension }}
           if-no-files-found: warn
-      
-      - name: Upload Desktop app to GitHub release
-        if: github.event_name == 'release' && matrix.os != 'windows-latest'
-        working-directory: rekono/frontend/dist_electron
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: gh release upload --repo pablosnt/rekono ${{ github.event.release.name }} *.${{ matrix.extension }}
-
-      - name: Upload Desktop app to GitHub release
-        if: github.event_name == 'release' && matrix.os == 'windows-latest'
-        working-directory: rekono/frontend/dist_electron
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: gh release upload --repo pablosnt/rekono ${{ github.event.release.name }} "Rekono Setup ${{ github.event.release.name }}.${{ matrix.extension }}"
diff --git a/.github/workflows/desktop.yml b/.github/workflows/desktop.yml
new file mode 100644
index 000000000..82c64bb3c
--- /dev/null
+++ b/.github/workflows/desktop.yml
@@ -0,0 +1,42 @@
+name: Desktop app
+on:
+  release:
+    types: [published]
+
+jobs:
+  docker-image:
+    name: Docker Image
+    runs-on: ubuntu-latest
+    environment: docker-hub
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+      
+      - uses: actions/setup-node@v3
+        with:
+          node-version: 16
+      
+      - name: Install dependencies
+        working-directory: rekono/frontend
+        run: npm install .
+
+      - name: Configure Rekono backend
+        working-directory: rekono/frontend
+        run: echo "VUE_APP_DESKTOP_BACKEND_URL=http://127.0.0.1:8000" > .env.production
+      
+      - name: Generate Desktop UI
+        working-directory: rekono/frontend
+        run: npm run electron:build
+      
+      - name: Build Docker image
+        run: docker build --build-arg REKONO_VERSION=${{ github.event.release.name }} --file docker/debian/Dockerfile --tag ${{ secrets.DOCKER_USER }}/rekono:${{ github.event.release.name }} .
+
+      - name: Publish Docker image in Docker Hub
+        run: |
+          docker tag ${{ secrets.DOCKER_USER }}/rekono:${{ github.event.release.name }} ${{ secrets.DOCKER_USER }}/rekono:latest
+          docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_TOKEN }}
+          docker push ${{ secrets.DOCKER_USER }}/rekono:${{ github.event.release.name }}
+          docker push ${{ secrets.DOCKER_USER }}/rekono:latest
+          docker logout
diff --git a/.github/workflows/security-containers.yml b/.github/workflows/security-containers.yml
new file mode 100644
index 000000000..096fe11b9
--- /dev/null
+++ b/.github/workflows/security-containers.yml
@@ -0,0 +1,86 @@
+name: Containers
+on:
+  workflow_dispatch:
+  pull_request:
+    paths:
+      - 'docker/**'
+      - 'docker-compose.yml'
+
+jobs:
+  docker-compose:
+    name: Docker Compose
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+      
+      - name: Build Docker images
+        run: docker-compose build
+      
+      - name: Scan Nginx image with Trivy
+        continue-on-error: true
+        uses: aquasecurity/trivy-action@master
+        with:
+          image-ref: rekono-nginx
+          format: table
+          exit-code: 1
+      
+      - name: Scan Kali image with Trivy
+        continue-on-error: true
+        uses: aquasecurity/trivy-action@master
+        with:
+          image-ref: rekono-kali
+          format: table
+          exit-code: 1
+      
+      - name: Scan Backend image with Trivy
+        continue-on-error: true
+        uses: aquasecurity/trivy-action@master
+        with:
+          image-ref: rekono-backend
+          format: table
+          exit-code: 1
+      
+      - name: Scan Frontend image with Trivy
+        continue-on-error: true
+        uses: aquasecurity/trivy-action@master
+        with:
+          image-ref: rekono-frontend
+          format: table
+          exit-code: 1
+
+  debian-image:
+    name: Debian Image
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+      
+      - uses: actions/setup-node@v3
+        with:
+          node-version: 16
+      
+      - name: Install dependencies
+        working-directory: rekono/frontend
+        run: npm install .
+    
+      - name: Generate Desktop app
+        working-directory: rekono/frontend
+        run: npm run electron:build
+
+      - name: Build Docker image
+        run: docker build --build-arg REKONO_VERSION=dev --file docker/debian/Dockerfile --tag rekono-debian .
+
+      - name: Scan Debian image with Trivy
+        continue-on-error: true
+        uses: aquasecurity/trivy-action@master
+        with:
+          image-ref: rekono-debian
+          format: table
+          exit-code: 1
+
+      
diff --git a/.github/workflows/security-secrets.yml b/.github/workflows/security-secrets.yml
index 4345acae1..806c0ca0e 100644
--- a/.github/workflows/security-secrets.yml
+++ b/.github/workflows/security-secrets.yml
@@ -1,4 +1,4 @@
-name: Secrets scanning
+name: Secrets
 on:
   workflow_dispatch:
   pull_request:
diff --git a/.gitignore b/.gitignore
index 47b2f09e0..94bdadf61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -151,4 +151,9 @@ yarn-error.log*
 
 # Docker TLS configuration
 *.key
-*.crt
\ No newline at end of file
+*.crt
+
+# Debian package
+*.desktop
+rekono-kbx
+*.kaboxer.yaml
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6c45c80db..90fb29427 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,26 @@ All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [1.6.0] - 2023-05-07
+
+### Added
+
+- Link to Rekono Bot in profile page when it is configured (https://github.com/pablosnt/rekono/issues/198)
+- New standalone desktop app that can be installed using a DEB package (https://github.com/pablosnt/rekono/issues/203)
+
+### Fixed
+
+- Allow some special characters in authentication username values (https://github.com/pablosnt/rekono/issues/192)
+- Allow some special characters in authentication credential values (https://github.com/pablosnt/rekono/issues/194)
+- Fix warnings showed when access API documentation (https://github.com/pablosnt/rekono/issues/201)
+- Increase Redis queues timeout to prevent failures in large tasks (https://github.com/pablosnt/rekono/issues/206)
+
+### Security
+
+- Remove `X-XSS-Protection` header as it could introduce other vulnerabilities (https://github.com/pablosnt/rekono/issues/195)
+- Upgrade `Django` version to `3.2.19` (https://github.com/pablosnt/rekono/issues/209)
+
+
 ## [1.5.1] - 2023-03-10
 
 ### Fixed
diff --git a/README.md b/README.md
index eb484191b..6dc04bfd3 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,31 @@
 <p align="center">
-  <a href="https://github.com/pablosnt/rekono/actions/workflows/unit-testing.yml" alt="Unit testing">
+  <a href="https://github.com/pablosnt/rekono/actions/workflows/unit-testing.yml" alt="Unit testing" target="_blank">
     <img src="https://github.com/pablosnt/rekono/actions/workflows/unit-testing.yml/badge.svg"/>
   </a>
-  <a href="https://github.com/pablosnt/rekono/actions/workflows/desktop-applications.yml" alt="Desktop applications">
+  <a href="https://github.com/pablosnt/rekono/actions/workflows/desktop-applications.yml" alt="Desktop applications" target="_blank">
     <img src="https://github.com/pablosnt/rekono/actions/workflows/desktop-applications.yml/badge.svg"/>
   </a>
-  <a href="https://github.com/pablosnt/rekono/actions/workflows/security-sast.yml" alt="SAST">
+  <a href="https://github.com/pablosnt/rekono/actions/workflows/security-sast.yml" alt="SAST" target="_blank">
     <img src="https://github.com/pablosnt/rekono/actions/workflows/security-sast.yml/badge.svg"/>
   </a>
-  <a href="https://snyk.io/test/github/pablosnt/rekono" alt="SCA">
+  <a href="https://snyk.io/test/github/pablosnt/rekono" alt="SCA" target="_blank">
     <img src="https://badgen.net/snyk/pablosnt/rekono?label=SCA&labelColor=black&icon=https://snyk.io/wp-content/uploads/patch-white.svg">
   </a>
-  <a href="https://github.com/pablosnt/rekono/actions/workflows/security-secrets.yml" alt="Secrets scanning">
+  <a href="https://github.com/pablosnt/rekono/actions/workflows/security-secrets.yml" alt="Secrets scanning" target="_blank">
     <img src="https://github.com/pablosnt/rekono/actions/workflows/security-secrets.yml/badge.svg"/>
   </a>
-  <a href="https://github.com/pablosnt/rekono/actions/workflows/code-style.yml" alt="Code style">
+  <a href="https://github.com/pablosnt/rekono/actions/workflows/code-style.yml" alt="Code style" target="_blank">
     <img src="https://github.com/pablosnt/rekono/actions/workflows/code-style.yml/badge.svg"/>
   </a>
-  <a href="https://discord.gg/Zyduu5C7M3">
+  <a href="https://discord.gg/Zyduu5C7M3" target="_blank">
     <img src="https://img.shields.io/badge/Discord-Join-black?style=social&logo=discord"/>
   </a>
+  <a href="https://ko-fi.com/pablosnt" target="_blank">
+    <img src="https://ko-fi.com/img/githubbutton_sm.svg" width="160"/>
+  </a>
+  <a href="https://www.buymeacoffee.com/pablosnt" target="_blank">
+    <img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="75"/>
+  </a>
 </p>
 
 # <p align="center"><img src="rekono/frontend/public/static/logo-black.png" width="500"/></p>
@@ -48,9 +54,11 @@ Why not automate this process and focus on find vulnerabilities using your skill
 
 ## Quick Start
 
+### Docker
+
 Execute the following commands in the root directory of the project:
 
-```
+```bash
 docker-compose build
 docker-compose up -d --scale executions-worker=5
 ```
@@ -61,6 +69,20 @@ Go to https://127.0.0.1/
 
 > The number of workers can be changed using `--scale` option. The number of `executions-worker` determines the number of tools that could be executed at the same time.
 
+
+### Rekono Desktop
+
+Rekono Desktop is a standalone app with all features, that can be installed and executed locally. It's the best and easiest option for personal and local usage. Execue the following command to install it:
+
+```bash
+wget https://github.com/pablosnt/rekono/releases/download/1.6.0/rekono-desktop_1.6.0_amd64.deb && dpkg -i rekono-desktop_1.6.0_amd64.deb || apt -f install -y
+```
+
+> Default credentials are `rekono:rekono`. For security reasons, **password should be changed** the first time you access the account
+
+> :warning: Rekono Desktop only has been tested in Kali Linux and Parrot OS
+
+
 Check [**full documentation**](https://github.com/pablosnt/rekono/wiki) for more installation and configuration options, user guides, integrations, Rekono Desktop, Rekono Bot and Rekono CLI details.
 
 
@@ -92,7 +114,9 @@ Rekono supports the execution of this hacking tools:
 Thanks to all the contributors of these amazing tools!
 
 
-## Support
+## Reach Us
+
+You can get support, ask questions, solve doubts or solve problems using:
 
 <p>
   <a href="https://github.com/pablosnt/rekono/issues/new?labels=help+wanted%2C+question&template=support.md" alt="GitHub Issue">
@@ -106,6 +130,18 @@ Thanks to all the contributors of these amazing tools!
   </a>
 </p>
 
+Rekono is an open source project that we really love to maintain and it's absolutely our pleasure, but we would like to offer the possibility of supporting Rekono's development via donations. At the moment, the project only needs its maintainer's time to stay up to date with new features and fix bugs. However, in the future, it could need more expensive resources like hosting, new web pages for documentation, the inclusion of premium hacking tools, etc. With the help received from our supporters, Rekono will be able to grow fastly and have the resources that it deserves. Of course, you can use the donations just to appreciate our work. Thank you for your help!
+
+<p>
+  <a href="https://ko-fi.com/pablosnt" target="_blank">
+    <img src="https://storage.ko-fi.com/cdn/brandasset/kofi_s_tag_white.png" width="130"/>
+  </a>
+  <a href="https://www.buymeacoffee.com/pablosnt" target="_blank">
+    <img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=pablosnt&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff"/>
+  </a>
+</p>
+
+> The main differences between them are that BuyMeACoffe charges fees over each donation while Ko-fi doesn't and Ko-fi supports PayPal payments while BuyMeACoffe doesn't
 
 ## License
 
diff --git a/docker-compose.yml b/docker-compose.yml
index a1021736f..c5c00981e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -34,7 +34,7 @@ services:
     networks:
       - internal
 
-  initialize:
+  initializer:
     restart: 'no'
     image: rekono-kali:latest
     command: sh -c "python manage.py migrate && python manage.py createsuperuser --no-input"
@@ -67,7 +67,7 @@ services:
     networks:
       - internal
     depends_on:
-      - initialize
+      - initializer
       - redis
     environment:
       - RKN_DB_HOST=postgres
@@ -75,13 +75,12 @@ services:
       - RKN_DB_PASSWORD=postgres
       - RKN_RQ_HOST=redis
       - REKONO_HOME=/rekono
-      - OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
 
   executions-worker:
     restart: always
     build:
       context: .
-      dockerfile: docker/kali/Dockerfile
+      dockerfile: docker/Dockerfile.kali
     image: rekono-kali:latest
     command: python manage.py rqworker executions-queue
     hostname: executions-worker
@@ -94,7 +93,7 @@ services:
     cap_add:
       - NET_ADMIN
     depends_on:
-      - initialize
+      - initializer
       - redis
     environment:
       - RKN_DB_HOST=postgres
@@ -102,7 +101,6 @@ services:
       - RKN_DB_PASSWORD=postgres
       - RKN_RQ_HOST=redis
       - REKONO_HOME=/rekono
-      - OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
 
   findings-worker:
     restart: always
@@ -116,7 +114,7 @@ services:
       - internal
       - external
     depends_on:
-      - initialize
+      - initializer
       - redis
     environment:
       - RKN_DB_HOST=postgres
@@ -124,7 +122,6 @@ services:
       - RKN_DB_PASSWORD=postgres
       - RKN_RQ_HOST=redis
       - REKONO_HOME=/rekono
-      - OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
     
   emails-worker:
     restart: always
@@ -138,7 +135,7 @@ services:
       - internal
       - external
     depends_on:
-      - initialize
+      - initializer
       - redis
     environment:
       - RKN_DB_HOST=postgres
@@ -146,7 +143,6 @@ services:
       - RKN_DB_PASSWORD=postgres
       - RKN_RQ_HOST=redis
       - REKONO_HOME=/rekono
-      - OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
 
   telegram-bot:
     restart: always
@@ -161,7 +157,7 @@ services:
       - internal
       - external
     depends_on:
-      - initialize
+      - initializer
       - redis
     environment:
       - RKN_DB_HOST=postgres
@@ -174,7 +170,7 @@ services:
     restart: always
     build:
       context: .
-      dockerfile: docker/rekono/Dockerfile.backend
+      dockerfile: docker/Dockerfile.backend
     image: rekono-backend:latest
     command: python manage.py runserver 0.0.0.0:8000
     hostname: backend
@@ -193,7 +189,7 @@ services:
       - internal
       - external
     depends_on:
-      - initialize
+      - initializer
       - redis
     environment:
       - RKN_DB_HOST=postgres
@@ -208,9 +204,8 @@ services:
     restart: always
     build:
       context: .
-      dockerfile: docker/rekono/Dockerfile.frontend
+      dockerfile: docker/Dockerfile.frontend
     image: rekono-frontend:latest
-    command: sh -c "serve -s dist"
     hostname: frontend
     container_name: frontend
     healthcheck:
@@ -223,8 +218,6 @@ services:
       - 3000
     networks:
       - internal
-    environment:
-      - NODE_OPTIONS=--openssl-legacy-provider
 
   nginx:
     restart: always
diff --git a/docker/rekono/Dockerfile.backend b/docker/Dockerfile.backend
similarity index 76%
rename from docker/rekono/Dockerfile.backend
rename to docker/Dockerfile.backend
index 9501f5194..0e262b71b 100644
--- a/docker/rekono/Dockerfile.backend
+++ b/docker/Dockerfile.backend
@@ -1,25 +1,32 @@
 FROM python:3.9.10-alpine
 
+# Environment
+ENV PYTHONDONTWRITEBYTECODE 1
+ENV PYTHONUNBUFFERED 1
+ENV OBJC_DISABLE_INITIALIZE_FORK_SAFETY YES
+ENV REKONO_HOME /rekono
+
+# Install requirements
+RUN apk update && apk add curl postgresql-dev gcc python3-dev musl-dev libmagic --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
+
+# Home
 RUN mkdir /rekono
 COPY config.yaml /rekono
 
+# Source code
 RUN mkdir /code
 COPY rekono/ /code
 COPY requirements.txt /code
 
-ENV PYTHONDONTWRITEBYTECODE 1
-ENV PYTHONUNBUFFERED 1
-
-RUN apk update && apk add curl postgresql-dev gcc python3-dev musl-dev libmagic --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
-
+# Install backend dependencies
 RUN pip install --upgrade pip
 RUN pip install -r /code/requirements.txt
 
+# System user
 RUN adduser --disabled-password rekono
 RUN chown -R rekono:rekono /code
 RUN chown -R rekono:rekono /rekono
 
+# Final system configuration
 USER rekono
 WORKDIR /code
-
-ENV REKONO_HOME /rekono
diff --git a/docker/rekono/Dockerfile.frontend b/docker/Dockerfile.frontend
similarity index 62%
rename from docker/rekono/Dockerfile.frontend
rename to docker/Dockerfile.frontend
index df7a3f186..9bae91ab4 100644
--- a/docker/rekono/Dockerfile.frontend
+++ b/docker/Dockerfile.frontend
@@ -1,19 +1,27 @@
 FROM node:19.6.1-alpine
 
-RUN mkdir /code
-COPY /rekono/frontend /code
+# Environment
+ENV NODE_OPTIONS --openssl-legacy-provider
 
+# Install requirements
 RUN apk update && apk add curl
+RUN npm install -g serve
 
-ENV NODE_OPTIONS --openssl-legacy-provider
+# Source code
+RUN mkdir /code
+COPY /rekono/frontend /code
 
+# Install frontend dependencies
 WORKDIR /code
-RUN npm install -g serve
+RUN npm install
+RUN npx browserslist@latest --update-db
+RUN npm run build
 
+# System user
 RUN adduser --disabled-password rekono
 RUN chown -R rekono /code
-USER rekono
 
-RUN npm install
-RUN npx browserslist@latest --update-db
-RUN npm run build
\ No newline at end of file
+# Final system configuration
+USER rekono
+EXPOSE 3000
+ENTRYPOINT ["serve", "-s", "dist"]
diff --git a/docker/kali/Dockerfile b/docker/Dockerfile.kali
similarity index 87%
rename from docker/kali/Dockerfile
rename to docker/Dockerfile.kali
index 1edcc958d..8ac43244e 100644
--- a/docker/kali/Dockerfile
+++ b/docker/Dockerfile.kali
@@ -1,21 +1,28 @@
 FROM kalilinux/kali-last-release
 
+# Environment
+ENV PYTHONDONTWRITEBYTECODE 1
+ENV PYTHONUNBUFFERED 1
+ENV OBJC_DISABLE_INITIALIZE_FORK_SAFETY YES
+
+# Install requirements
+RUN apt update -y && apt upgrade -y && apt dist-upgrade -y && apt install python3-pip libpq-dev python3-dev libmagic1 libcap2-bin -y
+RUN ln -s /usr/bin/python3 /usr/bin/python
+
+# Home
 RUN mkdir /rekono
 COPY config.yaml /rekono
 
+# Source code
 RUN mkdir /code
 COPY rekono/ /code
 COPY requirements.txt /code
 
-ENV PYTHONDONTWRITEBYTECODE 1
-ENV PYTHONUNBUFFERED 1
-
-RUN apt update -y && apt upgrade -y && apt dist-upgrade -y && apt install python3-pip libpq-dev python3-dev libmagic1 libcap2-bin -y
-RUN ln -s /usr/bin/python3 /usr/bin/python
-
+# Install backend dependencies
 RUN pip install --upgrade pip
 RUN pip install -r /code/requirements.txt
 
+# Tools
 RUN apt install nmap dirsearch theharvester nikto sslscan sslyze cmseek zaproxy exploitdb metasploit-framework emailharvester joomscan gitleaks smbmap nuclei gobuster -y
 RUN setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip $(which nmap)
 RUN git clone https://github.com/fullhunt/log4j-scan /opt/log4j-scan
@@ -25,8 +32,10 @@ RUN pip install -r /opt/log4j-scan/requirements.txt
 RUN pip install -r /opt/spring4shell-scan/requirements.txt
 RUN pip install emailfinder ssh-audit
 
+# Wordlists
 RUN apt install seclists dirb -y
 
+# System user
 RUN adduser --disabled-password rekono
 RUN chown -R rekono:rekono /code
 RUN chown -R rekono:rekono /rekono
@@ -35,5 +44,6 @@ RUN chown -R rekono:rekono /opt/
 RUN chown -R rekono:rekono /usr/share/seclists/
 RUN chown -R rekono:rekono /usr/share/dirb/wordlists/
 
+# Final system configuration
 USER rekono
 WORKDIR /code
\ No newline at end of file
diff --git a/docker/debian/Dockerfile b/docker/debian/Dockerfile
new file mode 100644
index 000000000..a7ee926c4
--- /dev/null
+++ b/docker/debian/Dockerfile
@@ -0,0 +1,99 @@
+FROM kalilinux/kali-last-release:latest
+
+# Environment
+ENV PYTHONDONTWRITEBYTECODE 1
+ENV PYTHONUNBUFFERED 1
+ENV OBJC_DISABLE_INITIALIZE_FORK_SAFETY YES
+ENV XDG_CONFIG_HOME /home/rekono/.config
+ENV DISPLAY :0.0
+ENV RKN_DB_HOST 127.0.0.1
+ENV RKN_DB_PORT 5432
+ENV RKN_DB_NAME rekono
+ENV RKN_DB_USER rekono
+ENV RKN_RQ_HOST 127.0.0.1
+ENV RKN_RQ_PORT 6379
+ENV REKONO_HOME /rekono
+ENV PGDATA /rekono/data
+ENV DJANGO_SUPERUSER_EMAIL rekono@rekono.com
+ENV DJANGO_SUPERUSER_USERNAME rekono
+ENV DJANGO_SUPERUSER_PASSWORD rekono
+ENV EXECUTION_WORKERS 5
+ARG REKONO_VERSION
+
+# Install requirements
+RUN apt update -y && \
+    apt install python3-pip libpq-dev python3-dev libmagic1 libcap2-bin redis-server firefox-esr sudo libgbm-dev libasound2 postgresql -y && \
+    ln -s /usr/bin/python3 /usr/bin/python && \
+    mkdir -p $REKONO_HOME $PGDATA /code /config /kaboxer && \
+    chown -R postgres:postgres /config && \
+    echo $RANDOM | sha256sum | head -c 50 > /config/rkn_db_password.txt && \
+    echo $REKONO_VERSION > /kaboxer/version && \
+    echo 1 > /kaboxer/packaging-revision
+
+# Install Rekono
+COPY rekono/ /code
+COPY requirements.txt /code
+COPY config.yaml /code
+COPY docker/debian/entrypoint.sh /entrypoint.sh
+COPY docker/debian/set_permissions.sh /set_permissions.sh
+RUN pip install -r /code/requirements.txt && \
+    dpkg -i /code/frontend/dist_electron/rekono_*.deb || apt -f install -y && \
+    rm -R /code/frontend/ && \
+    rm -R /code/testing/
+
+# Tools
+RUN apt install nmap dirsearch theharvester nikto sslscan sslyze cmseek zaproxy exploitdb metasploit-framework emailharvester joomscan gitleaks smbmap nuclei gobuster -y && \
+    apt install seclists dirb -y && \
+    apt autoremove -y && \
+    apt autoclean -y && \
+    apt clean -y && \
+    rm -rf /var/lib/apt/lists/* && \
+    setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip $(which nmap) && \
+    git clone https://github.com/fullhunt/log4j-scan /opt/log4j-scan && \
+    git clone https://github.com/fullhunt/spring4shell-scan.git /opt/spring4shell-scan && \
+    git clone https://github.com/internetwache/GitTools.git /opt/GitTools && \
+    pip install -r /opt/log4j-scan/requirements.txt && \
+    pip install -r /opt/spring4shell-scan/requirements.txt && \
+    pip install emailfinder ssh-audit
+
+# Initialize database
+USER postgres
+RUN export RKN_DB_PASSWORD=$(cat /config/rkn_db_password.txt) && \
+    /etc/init.d/postgresql start && \
+    echo $(psql -c "show data_directory;" | grep postgresql) > /config/default_pgdata.txt && \
+    echo $(psql -c "show config_file;" | grep postgresql) > /config/postgresql_config.txt && \
+    psql -c "CREATE USER ${RKN_DB_USER} WITH ENCRYPTED PASSWORD '${RKN_DB_PASSWORD}';" && \
+    psql -c "CREATE DATABASE ${RKN_DB_NAME};" && \
+    psql -c "GRANT ALL PRIVILEGES ON DATABASE ${RKN_DB_NAME} TO ${RKN_DB_USER};" && \
+    psql ${RKN_DB_NAME} -c "GRANT ALL ON SCHEMA public TO ${RKN_DB_USER};" && \
+    psql ${RKN_DB_NAME} -c "GRANT ALL ON ALL TABLES IN SCHEMA public to ${RKN_DB_USER};" && \
+    psql ${RKN_DB_NAME} -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to ${RKN_DB_USER};" && \
+    psql ${RKN_DB_NAME} -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to ${RKN_DB_USER};"
+USER root
+RUN export RKN_DB_PASSWORD=$(cat /config/rkn_db_password.txt) && \
+    sudo /etc/init.d/postgresql start && \
+    python /code/manage.py migrate && \
+    python /code/manage.py createsuperuser --no-input
+
+# System user
+RUN adduser --disabled-password rekono && \
+    usermod -a -G postgres rekono && \
+    usermod -a -G postgres root && \
+    touch $XDG_CONFIG_HOME && \
+    chown rekono:rekono $XDG_CONFIG_HOME && \
+    chown rekono:rekono /entrypoint.sh && \
+    chmod 700 /entrypoint.sh && \
+    chown rekono:rekono /set_permissions.sh && \
+    chmod 700 /set_permissions.sh && \
+    /set_permissions.sh && \
+    chown -R rekono:rekono /code && \
+    chown -R rekono:rekono /config && \
+    chown -R rekono:rekono /opt && \
+    echo "rekono ALL=(ALL) NOPASSWD:SETENV:/etc/init.d/postgresql,/var/run/postgresql,/etc/init.d/redis-server,/set_permissions.sh" >> /etc/sudoers && \
+    export DEFAULT_PGDATA=$(cat /config/default_pgdata.txt) && \
+    chown -R rekono:rekono $DEFAULT_PGDATA && \
+    sed -i 's:'"$DEFAULT_PGDATA"':'"$PGDATA"':' $(cat /config/postgresql_config.txt) && \
+    rm /config/postgresql_config.txt
+
+USER rekono
+WORKDIR /code
diff --git a/docker/debian/entrypoint.sh b/docker/debian/entrypoint.sh
new file mode 100644
index 000000000..cab453a38
--- /dev/null
+++ b/docker/debian/entrypoint.sh
@@ -0,0 +1,43 @@
+#! /bin/sh
+
+export RKN_DB_PASSWORD=$(cat /config/rkn_db_password.txt)
+
+# Initialize configuration file
+if [ ! -f $REKONO_HOME/config.yaml ]
+then
+    cp /code/config.yaml $REKONO_HOME/config.yaml
+fi
+
+# Set PostgreSQL data directory
+if [ ! -d $PGDATA ]
+then
+    cp -r $(cat /config/default_pgdata.txt) $PGDATA
+fi
+
+# Set proper permissions to resources
+sudo REKONO_HOME=$REKONO_HOME PGDATA=$PGDATA /set_permissions.sh
+
+# Start services
+sudo /etc/init.d/postgresql start
+sudo /etc/init.d/redis-server start
+
+# Migrate database
+python /code/manage.py migrate
+
+# Run backend
+python /code/manage.py runserver 0.0.0.0:8000 &
+
+# Run RQ workers
+python /code/manage.py rqworker tasks-queue &
+for worker in $(seq 1 $EXECUTION_WORKERS)
+do
+    python /code/manage.py rqworker executions-queue &
+done
+python /code/manage.py rqworker findings-queue &
+python /code/manage.py rqworker emails-queue &
+
+# Run Telegram bot
+python /code/manage.py telegram_bot &
+
+# Run Desktop app
+/usr/bin/rekono --no-sandbox
\ No newline at end of file
diff --git a/docker/debian/set_permissions.sh b/docker/debian/set_permissions.sh
new file mode 100644
index 000000000..8ccbae420
--- /dev/null
+++ b/docker/debian/set_permissions.sh
@@ -0,0 +1,9 @@
+#! /bin/sh
+
+# Set permissions to home directory
+chown -R rekono:rekono $REKONO_HOME
+chmod -R 755 $REKONO_HOME
+
+# Set permissions to data directory
+chown -R postgres:postgres $PGDATA
+chmod -R 750 $PGDATA
diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile
index a065d43fd..aa09e7faf 100644
--- a/docker/nginx/Dockerfile
+++ b/docker/nginx/Dockerfile
@@ -1,13 +1,15 @@
 FROM nginx:1.22-alpine
 
+# Install requirements
 RUN apk update && apk add openssl
 
+# Configure Nginx
 COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
 COPY docker/nginx/entrypoint.sh /entrypoint.sh
-
 RUN mkdir /etc/nginx/tls
 RUN touch /var/run/nginx.pid
 
+# System user
 RUN chown nginx:nginx /var/run/nginx.pid
 RUN chown -R nginx:nginx /var/cache/nginx
 RUN chown -R nginx:nginx /var/log/nginx
@@ -15,7 +17,8 @@ RUN chown -R nginx:nginx /etc/nginx/conf.d
 RUN chown -R nginx:nginx /etc/nginx/tls
 RUN chown nginx:nginx /entrypoint.sh
 RUN chmod +x /entrypoint.sh
-USER nginx
 
+# Final system configuration
+USER nginx
 EXPOSE 80 443
 ENTRYPOINT ["/entrypoint.sh"]
diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf
index b5f9dbaf7..a402dc1d9 100644
--- a/docker/nginx/nginx.conf
+++ b/docker/nginx/nginx.conf
@@ -55,7 +55,6 @@ http {
             proxy_pass_header Server;
             proxy_pass_header X-Content-Type-Options;
             proxy_pass_header X-Frame-Options;
-            proxy_pass_header X-XSS-Protection;
 
             proxy_pass http://backend;
         }
@@ -70,7 +69,6 @@ http {
             add_header Referrer-Policy no-Referrer;
             add_header X-Content-Type-Options nosniff;
             add_header X-Frame-Options DENY;
-            add_header X-XSS-Protection "1; mode=block";
 
             proxy_pass http://frontend;
         }
diff --git a/rekono/frontend/package-lock.json b/rekono/frontend/package-lock.json
index 0d8d62297..fdaf5120f 100644
--- a/rekono/frontend/package-lock.json
+++ b/rekono/frontend/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "rekono",
-  "version": "1.5.1",
+  "version": "1.6.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "rekono",
-      "version": "1.5.1",
+      "version": "1.6.0",
       "hasInstallScript": true,
       "dependencies": {
         "axios": "^0.27.2",
diff --git a/rekono/frontend/package.json b/rekono/frontend/package.json
index 3443d579e..530772bed 100644
--- a/rekono/frontend/package.json
+++ b/rekono/frontend/package.json
@@ -1,6 +1,6 @@
 {
   "name": "rekono",
-  "version": "1.5.1",
+  "version": "1.6.0",
   "description": "Rekono is an automation platform that combines different hacking tools to complete pentesting processes",
   "author": "Pablo Santiago López <rekono.project@gmail.com>",
   "homepage": "https://github.com/pablosnt/rekono",
diff --git a/rekono/frontend/src/backend/RekonoApi.vue b/rekono/frontend/src/backend/RekonoApi.vue
index 461100e01..312545003 100644
--- a/rekono/frontend/src/backend/RekonoApi.vue
+++ b/rekono/frontend/src/backend/RekonoApi.vue
@@ -79,12 +79,12 @@ export default {
       timeUnits: ['Weeks', 'Days', 'Hours', 'Minutes'],
       authenticationTypes: ['None', 'Basic', 'Bearer', 'Cookie', 'Digest', 'JWT', 'NTLM'],
       wordlistTypes: ['Endpoint', 'Subdomain'],
-      nameRegex: /^[\wÀ-ÿ\s.\-[\]()]{0,100}$/,
+      nameRegex: /^[\wÀ-ÿ\s.\-[\]()@]{0,120}$/,
       textRegex: /^[\wÀ-ÿ\s.:,+\-'"?¿¡!#%$€[\]()]{0,300}$/,
       cveRegex: /^CVE-\d{4}-\d{1,7}$/,
       defectDojoKeyRegex: /^[\da-z]{40}$/,
       telegramTokenRegex: /^\d{10}:[\w-]{35}$/,
-      credentialRegex: /^[\w./\-=+,:<>¿?¡!#&$()[\]{}*]{1,500}$/,
+      credentialRegex: /^[\w./\-=+,:<>¿?¡!#&$()@%[\]{}*]{1,500}$/,
       telegramBotName: null,
       defectDojoUrl: null,
       defectDojoEnabled: null,
diff --git a/rekono/frontend/src/background.js b/rekono/frontend/src/background.js
index 65f6add0d..289e4e8e3 100644
--- a/rekono/frontend/src/background.js
+++ b/rekono/frontend/src/background.js
@@ -15,8 +15,10 @@ async function createWindow() {
   const win = new BrowserWindow({
     width: 1250,
     height: 1000,
+    autoHideMenuBar: true,
     webPreferences: {
-      
+      devTools: isDevelopment,
+
       // Use pluginOptions.nodeIntegration, leave this alone
       // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
       nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
diff --git a/rekono/frontend/src/views/Profile.vue b/rekono/frontend/src/views/Profile.vue
index 8ebf5587d..a7805db79 100644
--- a/rekono/frontend/src/views/Profile.vue
+++ b/rekono/frontend/src/views/Profile.vue
@@ -29,9 +29,9 @@
         <b-col cols="4">
           <div class="mb-3" v-if="telegramBotName">
             <h4 v-if="telegramConfigured">
-              <b-badge variant="outline">
-                <b-icon variant="success" icon="patch-check-fill"/>
-                {{ telegramBotName }} is linked!
+              <b-badge :href="telegramBotLink" target="blank" variant="outline">
+                <b-icon variant="primary" icon="patch-check-fill"/>
+                @{{ telegramBotName }} is linked!
               </b-badge>
             </h4>
             <b-card align="center" v-if="!telegramConfigured">
diff --git a/rekono/frontend/vue.config.js b/rekono/frontend/vue.config.js
index 707788692..56f1c3c46 100644
--- a/rekono/frontend/vue.config.js
+++ b/rekono/frontend/vue.config.js
@@ -5,7 +5,6 @@ const headers = {
   'X-Content-Type-Options': 'nosniff',
   'X-Frame-Options': 'DENY',
   'X-Powered-By': '',
-  'X-XSS-Protection': '1; mode=block'
 }
   
 
@@ -34,7 +33,7 @@ module.exports = {
         icon: 'public/favicon',
         linux: {
           target: 'deb',
-          icon: 'public/favicon'
+          icon: 'public/favicon.icns'
         }
       }
     }
diff --git a/rekono/projects/views.py b/rekono/projects/views.py
index 28c131e4a..95a6c8653 100644
--- a/rekono/projects/views.py
+++ b/rekono/projects/views.py
@@ -1,6 +1,11 @@
 from api.views import CreateWithUserViewSet, GetViewSet
 from defectdojo.exceptions import DefectDojoException
 from drf_spectacular.utils import extend_schema
+from projects.filters import ProjectFilter
+from projects.models import Project
+from projects.serializers import (DefectDojoIntegrationSerializer,
+                                  DefectDojoSyncSerializer,
+                                  ProjectMemberSerializer, ProjectSerializer)
 from rest_framework import status
 from rest_framework.decorators import action
 from rest_framework.generics import get_object_or_404
@@ -9,12 +14,6 @@
 from rest_framework.viewsets import ModelViewSet
 from users.models import User
 
-from projects.filters import ProjectFilter
-from projects.models import Project
-from projects.serializers import (DefectDojoIntegrationSerializer,
-                                  DefectDojoSyncSerializer,
-                                  ProjectMemberSerializer, ProjectSerializer)
-
 # Create your views here.
 
 
@@ -71,7 +70,7 @@ def delete_project_member(self, request: Request, member_id: str, pk: str) -> Re
             return Response(status=status.HTTP_204_NO_CONTENT)
         return Response(status=status.HTTP_400_BAD_REQUEST)
 
-    @extend_schema(request=DefectDojoIntegrationSerializer, responses={200: Project})
+    @extend_schema(request=DefectDojoIntegrationSerializer, responses={200: ProjectSerializer})
     @action(detail=True, methods=['PUT'], url_path='defect-dojo', url_name='defect-dojo')
     def defect_dojo_integration(self, request: Request, pk: str) -> Response:
         '''Configure Defect-Dojo integration for the project.
@@ -93,7 +92,7 @@ def defect_dojo_integration(self, request: Request, pk: str) -> Response:
                 return Response(ex.args[0], status=status.HTTP_400_BAD_REQUEST)     # Error in Defect-Dojo requests
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 
-    @extend_schema(request=DefectDojoSyncSerializer, responses={200: Project})
+    @extend_schema(request=DefectDojoSyncSerializer, responses={200: ProjectSerializer})
     @action(detail=True, methods=['PUT'], url_path='defect-dojo/sync', url_name='defect-dojo-sync')
     def defect_dojo_synchronization(self, request: Request, pk: str) -> Response:
         '''Enable or disable Defect-Dojo synchronization for the project.
diff --git a/rekono/rekono/settings.py b/rekono/rekono/settings.py
index aed47b16b..2b3567972 100644
--- a/rekono/rekono/settings.py
+++ b/rekono/rekono/settings.py
@@ -15,8 +15,10 @@
 from pathlib import Path
 from typing import Any, Dict
 
-from findings.enums import Severity
+from authentications.enums import AuthenticationType
+from findings.enums import PathType, Severity
 from input_types.enums import InputTypeNames
+from resources.enums import WordlistType
 from targets.enums import TargetType
 from tasks.enums import Status, TimeUnit
 from tools.enums import IntensityRank
@@ -38,7 +40,7 @@
 
 # Rekono description
 DESCRIPTION = 'Rekono is an automation platform that combines different hacking tools to complete pentesting processes'
-VERSION = '1.5.1'                                                               # Rekono version
+VERSION = '1.6.0'                                                               # Rekono version
 TESTING = 'test' in sys.argv                                                    # Tests execution
 
 ################################################################################
@@ -307,6 +309,9 @@
         'IntensityEnum': IntensityRank.choices,
         'InputTypeNamesEnum': InputTypeNames.choices,
         'TargetTypeEnum': TargetType.choices,
+        'AuthenticationTypeEnum': AuthenticationType.choices,
+        'PathTypeEnum': PathType.choices,
+        'WordlistTypeEnum': WordlistType.choices,
     },
     'SCHEMA_PATH_PREFIX_INSERT': os.getenv(RKN_ROOT_PATH, CONFIG.ROOT_PATH),
 }
@@ -347,25 +352,25 @@
         'HOST': os.getenv(RKN_RQ_HOST, CONFIG.RQ_HOST),
         'PORT': os.getenv(RKN_RQ_PORT, CONFIG.RQ_PORT),
         'DB': 0,
-        'DEFAULT_TIMEOUT': 60                                                   # 1 minute
+        'DEFAULT_TIMEOUT': 3600                                                 # 1 hour
     },
     'executions-queue': {
         'HOST': os.getenv(RKN_RQ_HOST, CONFIG.RQ_HOST),
         'PORT': os.getenv(RKN_RQ_PORT, CONFIG.RQ_PORT),
         'DB': 0,
-        'DEFAULT_TIMEOUT': 7200                                                 # 2 hours
+        'DEFAULT_TIMEOUT': 28800                                                # 8 hours
     },
     'findings-queue': {
         'HOST': os.getenv(RKN_RQ_HOST, CONFIG.RQ_HOST),
         'PORT': os.getenv(RKN_RQ_PORT, CONFIG.RQ_PORT),
         'DB': 0,
-        'DEFAULT_TIMEOUT': 1200                                                 # 20 minutes
+        'DEFAULT_TIMEOUT': 10800                                                # 3 hours
     },
     'emails-queue': {
         'HOST': os.getenv(RKN_RQ_HOST, CONFIG.RQ_HOST),
         'PORT': os.getenv(RKN_RQ_PORT, CONFIG.RQ_PORT),
         'DB': 0,
-        'DEFAULT_TIMEOUT': 300                                                  # 5 minutes
+        'DEFAULT_TIMEOUT': 3600                                                 # 1 hour
     }
 }
 
diff --git a/rekono/resources/apps.py b/rekono/resources/apps.py
index 8035b3c19..3c098f365 100644
--- a/rekono/resources/apps.py
+++ b/rekono/resources/apps.py
@@ -35,7 +35,7 @@ def update_default_wordlists_size(self, **kwargs: Any) -> None:
         '''Update default wordlists size.'''
         from resources.models import Wordlist
         for wordlist in Wordlist.objects.all().filter(size=None):               # For each default wordlist
-            if os.path.isfile(wordlist.path):                                   # If wordlist path exist
+            if os.path.isfile(wordlist.path) and os.access(wordlist.path, os.R_OK):     # If wordlist path exist
                 with open(wordlist.path, 'rb+') as wordlist_file:               # Open uploaded file
                     wordlist.size = len(wordlist_file.readlines())              # Count entries from uploaded file
                     wordlist.save(update_fields=['size'])
diff --git a/rekono/security/input_validation.py b/rekono/security/input_validation.py
index 206bd60fb..418e26926 100644
--- a/rekono/security/input_validation.py
+++ b/rekono/security/input_validation.py
@@ -7,13 +7,13 @@
 logger = logging.getLogger()                                                    # Rekono logger
 
 IP_RANGE_REGEX = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}-\d{1,3}'                  # Regex for IP ranges like 10.10.10.1-20
-NAME_REGEX = r'[\wÀ-ÿ\s\.\-\[\]()]{0,100}'                                      # Regex for names validation
+NAME_REGEX = r'[\wÀ-ÿ\s\.\-\[\]()@]{0,120}'                                     # Regex for names validation
 TEXT_REGEX = r'[\wÀ-ÿ\s\.:,+\-\'"?¿¡!#%$€\[\]()]{0,300}'                        # Regex for text validation
 PATH_REGEX = r'[\w\./#?&%$\\]{0,500}'                                           # Regex for path validation
 CVE_REGEX = r'CVE-\d{4}-\d{1,7}'                                                # Regex for CVE validation
 DD_KEY_REGEX = r'[\da-z]{40}'                                                   # Regex for Defect-Dojo key validation
 TELEGRAM_TOKEN_REGEX = r'\d{10}:[\w\-]{35}'                                     # Regex for Telegram token validation
-CREDENTIAL_REGEX = r'[\w\./\-=\+,:<>¿?¡!#&$()\[\]\{\}\*]{1,500}'                # Regex for credentials validation
+CREDENTIAL_REGEX = r'[\w\./\-=\+,:<>¿?¡!#&$()@%\[\]\{\}\*]{1,500}'                # Regex for credentials validation
 
 
 def validate_text_value(value: str, regex: str) -> None:
diff --git a/rekono/security/middleware.py b/rekono/security/middleware.py
index 9b1a43987..9324001b0 100644
--- a/rekono/security/middleware.py
+++ b/rekono/security/middleware.py
@@ -16,7 +16,6 @@
     'Referrer-Policy': 'no-referrer',
     'X-Content-Type-Options': 'nosniff',
     'X-Frame-Options': 'DENY',
-    'X-XSS-Protection': '1; mode=block',
     'Access-Control-Allow-Origin': 'app://.',
     'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
     'Access-Control-Allow-Headers': 'content-type, authorization',
diff --git a/requirements.txt b/requirements.txt
index 10b54b067..128337326 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,6 @@
 coverage==6.3.1
 defusedxml==0.7.1
-Django==3.2.18
+Django==3.2.19
 djangorestframework==3.12.4
 djangorestframework-simplejwt==5.2.2
 django-filter==21.1
@@ -15,5 +15,6 @@ python-libnmap==0.7.3
 python-telegram-bot==13.7
 pyyaml==6.0.0
 requests==2.28.1
+rq==1.13.0
 setuptools==65.6.3
 stringcase==1.2.0


Test patch:
diff --git a/.github/workflows/unit-testing.yml b/.github/workflows/unit-testing.yml
index f8d9b9cb8..c24435c0f 100644
--- a/.github/workflows/unit-testing.yml
+++ b/.github/workflows/unit-testing.yml
@@ -1,4 +1,4 @@
-name: Unit testing
+name: Unit tests
 on:
   workflow_dispatch:
   pull_request:
@@ -11,8 +11,8 @@ env:
   REQUIRED_COVERAGE: 95
 
 jobs:
-  unit-testing:
-    name: Unit testing
+  unit-tests:
+    name: Unit tests
     runs-on: ubuntu-latest
     steps:
       - name: Checkout