Skip to content

Commit dfdaa34

Browse files
Merge pull request #33 from LimberDuck/develop
v0.9.0
2 parents 562fd28 + bf354d4 commit dfdaa34

14 files changed

Lines changed: 315 additions & 24 deletions

File tree

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,5 @@ build/
77
dist
88
test_files
99
_build
10-
.vscode
11-
_build
1210
*.egg-info
1311
.DS_Store

.vscode/settings.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"virtualenvPath": "/Users/$USER/.virtualenvs/nfa-dev/bin",
3+
"restructuredtext.confPath": "",
4+
"cSpell.words": [
5+
"addaction",
6+
"centralwidget",
7+
"horstretch",
8+
"hsizetype",
9+
"pointsize",
10+
"sizepolicy",
11+
"verstretch",
12+
"vsizetype"
13+
],
14+
}

.vscode/tasks.json

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"version": "2.0.0",
3+
"tasks": [
4+
{
5+
"label": "Black Check",
6+
"type": "shell",
7+
"command": "${config:virtualenvPath}/black . --check"
8+
},
9+
{
10+
"label": "Black Fix",
11+
"type": "shell",
12+
"command": "${config:virtualenvPath}/black ."
13+
},
14+
{
15+
"label": "Install Dependencies",
16+
"type": "shell",
17+
"command": "${config:virtualenvPath}/pip install -r requirements.txt"
18+
},
19+
{
20+
"label": "Start Application",
21+
"type": "shell",
22+
"options": {
23+
"env": {
24+
"MODULE_NAME": "nessus_file_analyzer"
25+
}
26+
},
27+
"command": "${config:virtualenvPath}/python -m $MODULE_NAME"
28+
},
29+
{
30+
"label": "Build Application",
31+
"type": "shell",
32+
"command": "${config:virtualenvPath}/python setup.py sdist bdist_wheel"
33+
},
34+
{
35+
"label": "Start sphinx-autobuild",
36+
"type": "shell",
37+
"options": {
38+
"env": {
39+
"PROJECT_PORT": "8070"
40+
}
41+
},
42+
"command": "${config:virtualenvPath}/sphinx-autobuild ${workspaceFolder}/docs ${workspaceFolder}/docs/_build/html -a --port $PROJECT_PORT"
43+
},
44+
{
45+
"label": "Convert UI to Py",
46+
"type": "shell",
47+
"options": {
48+
"env": {
49+
"MODULE_NAME": "nessus_file_analyzer"
50+
}
51+
},
52+
"command": "${config:virtualenvPath}/pyuic5 -x designer/mainwindow.ui -o $MODULE_NAME/ui/mainwindow.py"
53+
},
54+
{
55+
"label": "Upgrade pip",
56+
"type": "shell",
57+
"command": "${config:virtualenvPath}/pip install --upgrade pip"
58+
},
59+
]
60+
}

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,24 @@ This document records all notable changes to [nessus file analyzer (NFA) by Limb
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.9.0] - 2025-09-01
9+
10+
### Added
11+
12+
- New options:
13+
- `Help > Check for Update` - will return confirmation if you are using the latest version of NFA.
14+
- `Help > Documentation` - will open NFR documentation at LimberDuck.org.
15+
- `Help > GitHub` - will open NFR GitHub page.
16+
- `Help > Releases` - will open NFR GitHub Releases page.
17+
18+
- Requirements update
19+
- from:
20+
- nessus-file-reader>=0.6.0
21+
- to:
22+
- nessus-file-reader>=0.7.0
23+
- new:
24+
- packaging>=25.0
25+
- requests>=2.32.5
826

927
## [0.8.0] - 2025-06-29
1028

@@ -166,6 +184,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
166184

167185
- Initial release
168186

187+
[0.9.0]: https://github.com/LimberDuck/nessus-file-analyzer/compare/v0.8.0...v0.9.0
169188
[0.8.0]: https://github.com/LimberDuck/nessus-file-analyzer/compare/v0.7.3...v0.8.0
170189
[0.7.3]: https://github.com/LimberDuck/nessus-file-analyzer/compare/v0.7.2...v0.7.3
171190
[0.7.2]: https://github.com/LimberDuck/nessus-file-analyzer/compare/v0.7.1...v0.7.2

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ vulnerabilities and/or noncompliance.
1414
It's free and open source tool, which has been created to automate our work,
1515
decrease our workload and focus on data analysis.
1616

17+
[![pepy - Downloads](https://img.shields.io/pepy/dt/nessus-file-analyzer?logo=PyPI)](https://pepy.tech/projects/nessus-file-analyzer) [![PyPI Downloads](https://static.pepy.tech/badge/nessus-file-analyzer/month)](https://pepy.tech/projects/nessus-file-analyzer)
1718
[![Latest Release version](https://img.shields.io/github/v/release/LimberDuck/nessus-file-analyzer?label=Latest%20release)](https://github.com/LimberDuck/nessus-file-analyzer/releases)
18-
[![GitHub Release Date](https://img.shields.io/github/release-date/limberduck/nessus-file-analyzer?label=released&logo=GitHub)](https://github.com/LimberDuck/nessus-file-analyzer/releases)
19-
[![PyPI - Downloads](https://img.shields.io/pypi/dm/nessus-file-analyzer?logo=PyPI)](https://pypistats.org/packages/nessus-file-analyzer)
20-
19+
[![GitHub Release Date](https://img.shields.io/github/release-date/limberduck/nessus-file-analyzer?label=released&logo=GitHub)](https://github.com/LimberDuck/nessus-file-analyzer/releases)
2120
[![License](https://img.shields.io/github/license/LimberDuck/nessus-file-analyzer.svg)](https://github.com/LimberDuck/nessus-file-analyzer/blob/master/LICENSE)
2221
[![Repo size](https://img.shields.io/github/repo-size/LimberDuck/nessus-file-analyzer.svg)](https://github.com/LimberDuck/nessus-file-analyzer)
2322
[![Code size](https://img.shields.io/github/languages/code-size/LimberDuck/nessus-file-analyzer.svg)](https://github.com/LimberDuck/nessus-file-analyzer)
2423
[![Supported platform](https://img.shields.io/badge/platform-windows%20%7C%20macos%20%7C%20linux-lightgrey.svg)](https://github.com/LimberDuck/nessus-file-analyzer)
25-
[![Documentation Status](https://readthedocs.org/projects/nessus-file-analyzer/badge/?version=latest)](https://nessus-file-analyzer.readthedocs.io/en/latest/?badge=latest)
24+
<!-- [![PyPI - Downloads](https://img.shields.io/pypi/dm/nessus-file-analyzer?logo=PyPI)](https://pypistats.org/packages/nessus-file-analyzer) -->
25+
<!-- [![Documentation Status](https://readthedocs.org/projects/nessus-file-analyzer/badge/?version=latest)](https://nessus-file-analyzer.readthedocs.io/en/latest/?badge=latest) -->
2626

2727
> [!NOTE]
2828
> **Visit [LimberDuck.org][LimberDuck] to find out more!**

designer/mainwindow.ui

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@
626626
<bool>true</bool>
627627
</property>
628628
<property name="textInteractionFlags">
629-
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
629+
<set>Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse</set>
630630
</property>
631631
</widget>
632632
</item>
@@ -648,7 +648,7 @@
648648
<x>0</x>
649649
<y>0</y>
650650
<width>750</width>
651-
<height>22</height>
651+
<height>37</height>
652652
</rect>
653653
</property>
654654
<widget class="QMenu" name="menuFile">
@@ -675,6 +675,10 @@
675675
<string>Help</string>
676676
</property>
677677
<addaction name="actionAbout"/>
678+
<addaction name="actionCheck_for_Update"/>
679+
<addaction name="actionDocumentation"/>
680+
<addaction name="actionGitHub"/>
681+
<addaction name="actionReleases"/>
678682
</widget>
679683
<addaction name="menuFile"/>
680684
<addaction name="menuAction"/>
@@ -721,6 +725,26 @@
721725
<string>About</string>
722726
</property>
723727
</action>
728+
<action name="actionCheck_for_Update">
729+
<property name="text">
730+
<string>Check for Update</string>
731+
</property>
732+
</action>
733+
<action name="actionDocumentation">
734+
<property name="text">
735+
<string>Documentation</string>
736+
</property>
737+
</action>
738+
<action name="actionGitHub">
739+
<property name="text">
740+
<string>GitHub</string>
741+
</property>
742+
</action>
743+
<action name="actionReleases">
744+
<property name="text">
745+
<string>Releases</string>
746+
</property>
747+
</action>
724748
</widget>
725749
<tabstops>
726750
<tabstop>textEdit_progress</tabstop>

nessus_file_analyzer/__about__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
"effortless analysis."
4646
)
4747
__uri__ = "https://limberduck.org"
48-
__version__ = "0.8.0"
49-
__release_date__ = "2025.06.29"
48+
__version__ = "0.9.0"
49+
__release_date__ = "2025.09.01"
5050
__author__ = "Damian Krawczyk"
5151
__email__ = "damian.krawczyk@limberduck.org"
5252
__license_name__ = "GNU GPLv3"

nessus_file_analyzer/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.8.0"
1+
__version__ = "0.9.0"

nessus_file_analyzer/app.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
import urllib.parse
3838
import fnmatch
3939
import zipfile
40+
from nessus_file_analyzer.dialogs import about
41+
from nessus_file_analyzer.dialogs import update_check
42+
from nessus_file_analyzer.dialogs import url_open
4043

4144

4245
class MainWindow(QMainWindow, nfa.Ui_MainWindow):
@@ -127,6 +130,10 @@ def __init__(self, parent=None):
127130
)
128131
self.actionOpen_target_directory.triggered.connect(self.open_target_directory)
129132
self.actionAbout.triggered.connect(self.open_dialog_about)
133+
self.actionCheck_for_Update.triggered.connect(self.open_dialog_update_check)
134+
self.actionDocumentation.triggered.connect(self.open_url_documentation)
135+
self.actionGitHub.triggered.connect(self.open_url_github)
136+
self.actionReleases.triggered.connect(self.open_url_github_releases)
130137

131138
self.checkBox_report_scan.stateChanged.connect(self.report_scan_changed)
132139
self.checkBox_debug_data_scan.stateChanged.connect(
@@ -727,12 +734,38 @@ def line_edit_suffix_custom_value_changed(self):
727734
self.__target_file_name_prefix + suffix + ".xlsx"
728735
)
729736

730-
@staticmethod
731-
def open_dialog_about():
737+
def open_dialog_about(self):
732738
"""
733739
Function opens About dialog.
734740
"""
735-
nfa.About()
741+
self.dialog_about = about.About()
742+
743+
def open_dialog_update_check(self):
744+
"""
745+
Function opens Update check dialog.
746+
"""
747+
self.dialog_update_check = update_check.UpdateCheck()
748+
749+
def open_url_documentation(self):
750+
"""
751+
Function opens Url with documentation.
752+
"""
753+
PACKAGE_NAME = nfa.__about__.__package_name__
754+
url_open.open_website(f"https://limberduck.org/en/latest/tools/{PACKAGE_NAME}/")
755+
756+
def open_url_github(self):
757+
"""
758+
Function opens Url with GitHub.
759+
"""
760+
PACKAGE_NAME = nfa.__about__.__package_name__
761+
url_open.open_website(f"https://github.com/LimberDuck/{PACKAGE_NAME}")
762+
763+
def open_url_github_releases(self):
764+
"""
765+
Function opens Url with GitHub Releases.
766+
"""
767+
PACKAGE_NAME = nfa.__about__.__package_name__
768+
url_open.open_website(f"https://github.com/LimberDuck/{PACKAGE_NAME}/releases")
736769

737770
def parsing_thread_start(self):
738771
"""
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
nessus file analyzer (NFA) by LimberDuck (pronounced *ˈlɪm.bɚ dʌk*) is a GUI
4+
tool which enables you to parse multiple nessus files containing the results
5+
of scans performed by using Nessus by (C) Tenable, Inc. and exports parsed
6+
data to a Microsoft Excel Workbook for effortless analysis.
7+
Copyright (C) 2019 Damian Krawczyk
8+
9+
This program is free software: you can redistribute it and/or modify
10+
it under the terms of the GNU General Public License as published by
11+
the Free Software Foundation, either version 3 of the License, or
12+
(at your option) any later version.
13+
14+
This program is distributed in the hope that it will be useful,
15+
but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+
GNU General Public License for more details.
18+
19+
You should have received a copy of the GNU General Public License
20+
along with this program. If not, see <https://www.gnu.org/licenses/>.
21+
"""
22+
23+
import requests
24+
from packaging import version
25+
26+
from PyQt5.QtCore import Qt
27+
from PyQt5.QtWidgets import QMessageBox
28+
29+
from nessus_file_analyzer import __about__
30+
31+
PACKAGE_NAME = __about__.__package_name__
32+
33+
34+
class UpdateCheck(QMessageBox):
35+
def __init__(self, parent=None):
36+
super(UpdateCheck, self).__init__(parent)
37+
38+
self.appName = __about__.__title__
39+
self.current_version = __about__.__version__
40+
self.release_date = __about__.__release_date__
41+
42+
self.setWindowTitle(self.tr(f"Update Check - {self.appName}"))
43+
self.setTextFormat(Qt.RichText)
44+
self.setStandardButtons(QMessageBox.Ok)
45+
46+
latest_version, message = self.check_for_update()
47+
48+
self.setText(message)
49+
self.exec_()
50+
51+
def check_for_update(self):
52+
try:
53+
response = requests.get(
54+
f"https://pypi.org/pypi/{PACKAGE_NAME}/json", timeout=1.5
55+
)
56+
response.raise_for_status()
57+
latest = response.json()["info"]["version"]
58+
read_more = (
59+
f"Read more:<br>"
60+
f"<a href='https://limberduck.org/en/latest/tools/{PACKAGE_NAME}'>Documentation</a><br>"
61+
f"<a href='https://github.com/LimberDuck/{PACKAGE_NAME}'>GitHub</a><br>"
62+
f"<a href='https://github.com/LimberDuck/{PACKAGE_NAME}/releases'>Releases</a>"
63+
)
64+
if version.parse(latest) > version.parse(self.current_version):
65+
message = (
66+
f"<b> A new version of {self.appName} is available!</b><br><br>"
67+
f"Latest: <b>{latest}</b><br>"
68+
f"You have: <b>{self.current_version}</b><br><br>"
69+
f"Update with:<br>"
70+
f"<code>pip install -U {PACKAGE_NAME}</code><br><br>"
71+
f"{read_more}"
72+
)
73+
elif version.parse(latest) == version.parse(self.current_version):
74+
message = (
75+
f"You are using the latest version of {self.appName}: <b>{self.current_version}</b><br><br>"
76+
f"{read_more}"
77+
)
78+
79+
else:
80+
message = (
81+
f"You are using a <b>pre-release</b> version of {self.appName}: {self.current_version}<br><br>"
82+
f"Latest released version: {latest}<br><br>"
83+
f"{read_more}"
84+
)
85+
return latest, message
86+
87+
except requests.exceptions.ConnectionError as e:
88+
return (
89+
None,
90+
f"Could not check for updates: <br><br><i>Connection error</i><br><br>{e}",
91+
)
92+
except Exception as e:
93+
return None, f"Could not check for updates:<br><br>{e}"

0 commit comments

Comments
 (0)