From e2deecf4c455d3a94e5783666f9a3ad4006ec4b7 Mon Sep 17 00:00:00 2001 From: Tobiasz Tomczyk Date: Tue, 3 Feb 2026 18:34:45 +0100 Subject: [PATCH] Update master to .NET 10 --- .github/workflows/dottest_min_sa.yml | 60 ++++++++++++++++++ .github/workflows/dottest_sa.yml | 51 +++++++++++++++ .github/workflows/dottest_tia.yml | 62 +++++++++++++++++++ .github/workflows/dottest_ut.yml | 52 ++++++++++++++++ .gitignore | 3 +- .../BlogEntryRepositoryTests.cs | 55 ++++++++++++++++ .../BlogRepositoryTests/ContextSetup.cs | 48 ++++++++++++++ .../CategoryRepositoryTests.cs | 42 +++++++++++++ .../CategoryRepositoryTests/ContextSetup.cs | 54 ++++++++++++++++ WebGoat.NET.Tests/DbSetTestUtil.cs | 26 ++++++++ WebGoat.NET.Tests/Usings.cs | 1 + WebGoat.NET.Tests/WebGoat.NET.Tests.csproj | 37 +++++++++++ WebGoat.NET.slnx | 1 + WebGoat.NET/Data/BlogEntryRepository.cs | 15 ++++- WebGoat.NET/Data/NorthwindContext.cs | 12 +++- WebGoat.NET/Logger/DummyLogger.String.cs | 11 ++++ WebGoat.NET/Logger/DummyLogger.cs | 12 ++++ changelog.md | 8 +++ readme.md | 10 +-- 19 files changed, 550 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/dottest_min_sa.yml create mode 100644 .github/workflows/dottest_sa.yml create mode 100644 .github/workflows/dottest_tia.yml create mode 100644 .github/workflows/dottest_ut.yml create mode 100644 WebGoat.NET.Tests/BlogRepositoryTests/BlogEntryRepositoryTests.cs create mode 100644 WebGoat.NET.Tests/BlogRepositoryTests/ContextSetup.cs create mode 100644 WebGoat.NET.Tests/CategoryRepositoryTests/CategoryRepositoryTests.cs create mode 100644 WebGoat.NET.Tests/CategoryRepositoryTests/ContextSetup.cs create mode 100644 WebGoat.NET.Tests/DbSetTestUtil.cs create mode 100644 WebGoat.NET.Tests/Usings.cs create mode 100644 WebGoat.NET.Tests/WebGoat.NET.Tests.csproj create mode 100644 WebGoat.NET/Logger/DummyLogger.String.cs create mode 100644 WebGoat.NET/Logger/DummyLogger.cs diff --git a/.github/workflows/dottest_min_sa.yml b/.github/workflows/dottest_min_sa.yml new file mode 100644 index 00000000..284ccedc --- /dev/null +++ b/.github/workflows/dottest_min_sa.yml @@ -0,0 +1,60 @@ +# This is a basic workflow to help you get started with Actions + +name: dotTEST minimal Static Analysis + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + dotTEST-static-analysis: + # The type of runner that the job will run on + runs-on: self-hosted + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + # Depth set to 0 for highest performance + - name: Checkout sources + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Run dotTEST min. SA + id: dottest_min_sa + # You may pin to the exact commit or the version. + # uses: tobyash86/run-dottest-analyzer-proto@1bc4be095189f455793afdb10b47127e06ae25ff + uses: parasoft/run-dottest-analyzer@2.0.0 + with: + # Path to working directory. + installDir: c:\Program Files\Parasoft\dotTEST\2022.2 + testConfig: OWASP Top 10-2021 + property: 'scope.scontrol.files.filter.mode=branch; + scope.scontrol.ref.branch=origin/main; + scope.scontrol=true; + scontrol.rep1.type=git; + scontrol.rep1.git.url=${{ github.server_url }}/${{ github.repository }}; + scontrol.rep1.git.workspace=${{ github.workspace }}; + scontrol.git.exec=C:\Program Files\Git\bin\git.exe' + + # --------------------------------------------------------------- + # Upload the findings into the GitHub code scanning alert section + - name: Upload static results to GitHub + uses: github/codeql-action/upload-sarif@v1 + with: + sarif_file: ${{ steps.dottest_min_sa.outputs.report }} + + # --------------------------------------------------------------- + # Archive the findings reports as job artifact + - name: Upload static analysis artifacts + uses: actions/upload-artifact@v3 + with: + name: Diff SA Report files + path: ${{ steps.dottest_min_sa.outputs.reportDir }}/*.* diff --git a/.github/workflows/dottest_sa.yml b/.github/workflows/dottest_sa.yml new file mode 100644 index 00000000..bd4582dd --- /dev/null +++ b/.github/workflows/dottest_sa.yml @@ -0,0 +1,51 @@ +# This is a basic workflow to help you get started with Actions + +name: dotTEST Static Analysis + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + push: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + dotTEST-static-analysis: + # The type of runner that the job will run on + runs-on: self-hosted + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + # Depth set to 0 for highest performance + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Run dotTEST static analysis + id: dottest_sa + # You may pin to the exact commit or the version. + # uses: tobyash86/run-dottest-analyzer-proto@1bc4be095189f455793afdb10b47127e06ae25ff + uses: parasoft/run-dottest-analyzer@2.0.0 + with: + # Path to working directory. + installDir: c:\Program Files\Parasoft\dotTEST\2022.2 + testConfig: Flow Analysis + + # --------------------------------------------------------------- + # Upload the findings into the GitHub code scanning alert section + - name: Upload static results to GitHub + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: ${{ steps.dottest_sa.outputs.report }} + + # --------------------------------------------------------------- + # Archive the findings reports as job artifact + - name: Upload static analysis artifacts + uses: actions/upload-artifact@v3 + with: + name: Report files + path: ${{ steps.dottest_sa.outputs.reportDir }}/*.* diff --git a/.github/workflows/dottest_tia.yml b/.github/workflows/dottest_tia.yml new file mode 100644 index 00000000..63250705 --- /dev/null +++ b/.github/workflows/dottest_tia.yml @@ -0,0 +1,62 @@ +# This is a basic workflow to help you get started with Actions + +name: dotTEST TIA + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + dotTEST-TIA: + # The type of runner that the job will run on + runs-on: self-hosted + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + # Depth set to 0 for highest performance + - name: Checkout sources + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # Download last artifacts and unzip them + - uses: blablacar/action-download-last-artifact@master + with: + name: Test Report files + path: baseline_reports + + - name: Run dotTEST TIA + id: dottest_ut + # You may pin to the exact commit or the version. + # uses: tobyash86/run-dottest-analyzer-proto@1bc4be095189f455793afdb10b47127e06ae25ff + uses: parasoft/run-dottest-analyzer@2.0.0 + with: + # Path to working directory. + installDir: c:\Program Files\Parasoft\dotTEST\2022.2 + testConfig: Run VSTest Tests with Coverage + referenceReportFile: c:\actions-runner\_work\WebGoat.NET\WebGoat.NET\baseline_reports\report.xml + referenceCoverageFile: c:\actions-runner\_work\WebGoat.NET\WebGoat.NET\baseline_reports\coverage.xml + + # --------------------------------------------------------------- + # Upload the findings into the GitHub code scanning alert section + - name: Upload TIA results to GitHub + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: ${{ steps.dottest_ut.outputs.report }} + + # --------------------------------------------------------------- + # Archive the findings reports as job artifact + - name: Upload execution artifacts + uses: actions/upload-artifact@v3 + with: + name: TIA Report files + path: ${{ steps.dottest_ut.outputs.reportDir }}/*.* + diff --git a/.github/workflows/dottest_ut.yml b/.github/workflows/dottest_ut.yml new file mode 100644 index 00000000..f4081186 --- /dev/null +++ b/.github/workflows/dottest_ut.yml @@ -0,0 +1,52 @@ +# This is a basic workflow to help you get started with Actions + +name: dotTEST Unit Tests + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + push: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + dotTEST-UT-execution: + # The type of runner that the job will run on + runs-on: self-hosted + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + # Depth set to 0 for highest performance + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Run dotTEST unit tests + id: dottest_ut + # You may pin to the exact commit or the version. + # uses: tobyash86/run-dottest-analyzer-proto@1bc4be095189f455793afdb10b47127e06ae25ff + uses: parasoft/run-dottest-analyzer@master + with: + # Path to working directory. + installDir: c:\Program Files\Parasoft\dotTEST\2022.2 + testConfig: Run VSTest Tests with Coverage + + # --------------------------------------------------------------- + # Upload the findings into the GitHub code scanning alert section + - name: Upload UT results to GitHub + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: ${{ steps.dottest_ut.outputs.report }} + + # --------------------------------------------------------------- + # Archive the findings reports as job artifact + - name: Upload execution artifacts + uses: actions/upload-artifact@v3 + with: + name: Test Report files + path: ${{ steps.dottest_ut.outputs.reportDir }}/*.* + diff --git a/.gitignore b/.gitignore index f17dd718..1b6aeaaf 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ [Rr]elease/ x64/ app/ -packages \ No newline at end of file +packages +coverage diff --git a/WebGoat.NET.Tests/BlogRepositoryTests/BlogEntryRepositoryTests.cs b/WebGoat.NET.Tests/BlogRepositoryTests/BlogEntryRepositoryTests.cs new file mode 100644 index 00000000..9ba8c803 --- /dev/null +++ b/WebGoat.NET.Tests/BlogRepositoryTests/BlogEntryRepositoryTests.cs @@ -0,0 +1,55 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; +using Microsoft.EntityFrameworkCore.Metadata; +using Moq; +using System.Data.Entity.Core.Objects.DataClasses; +using System.Data.Entity.Infrastructure; +using WebGoatCore.Data; +using WebGoatCore.Models; +using static System.Runtime.InteropServices.JavaScript.JSType; +using NUnit.Framework; + +namespace WebGoat.NET.Tests.BlogRepositoryTests; + +[TestFixture] +public class Tests +{ + Mock _context; + + [SetUp] + public void Setup() + { + _context = ContextSetup.CreateContext(); + } + + [Test] + public void GetBlogEntryTest() + { + var blogEntryRepo = new BlogEntryRepository(_context.Object); + + var entry = blogEntryRepo.GetBlogEntry(1); + + Assert.That(entry.Author, Is.EqualTo("admin")); + } + + [Test] + public void TestEntryCreation() + { + var blogEntryRepo = new BlogEntryRepository(_context.Object); + + var entry = blogEntryRepo.CreateBlogEntry("NEW ENTRY", "NEW ENTRY CONTENT", "me"); + + Assert.That(entry.Author, Is.EqualTo("me")); + } + + [Test] + public void GetTopEntriesTest() + { + var blogEntryRepo = new BlogEntryRepository(_context.Object); + + var entries = blogEntryRepo.GetTopBlogEntries(); + + Assert.That(entries.Count, Is.EqualTo(1)); + } +} \ No newline at end of file diff --git a/WebGoat.NET.Tests/BlogRepositoryTests/ContextSetup.cs b/WebGoat.NET.Tests/BlogRepositoryTests/ContextSetup.cs new file mode 100644 index 00000000..e542a408 --- /dev/null +++ b/WebGoat.NET.Tests/BlogRepositoryTests/ContextSetup.cs @@ -0,0 +1,48 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; +using Microsoft.EntityFrameworkCore.Metadata; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WebGoatCore.Data; +using WebGoatCore.Models; + +namespace WebGoat.NET.Tests.BlogRepositoryTests +{ + internal static class ContextSetup + { + internal static Mock CreateContext() + { + // create test DB + var initialBlogEntries = new List { + new BlogEntry() { Author = "admin", Contents = "Test Content", Id = 1, PostedDate = DateTime.Now, Responses = new List(), Title = "Test Title" } + }.AsQueryable(); + + Func> mockEntityEntry = (BlogEntry data) => + { + var internalEntityEntry = new InternalEntityEntry( + new Mock().Object, + new RuntimeEntityType(nameof(BlogEntry), typeof(BlogEntry), false, null, null, null, ChangeTrackingStrategy.Snapshot, null, false, null), + data); + + var entityEntry = new EntityEntry(internalEntityEntry); + return entityEntry; + }; + + var mockSet = DbSetTestUtil.CreateDbSetMock(initialBlogEntries); + + mockSet.Setup(m => m.Add(It.IsAny())).Returns(mockEntityEntry); + + var context = new Mock(); + context.SetupGet(c => c.BlogEntries).Returns(mockSet.Object); + + return context; + } + + + } +} diff --git a/WebGoat.NET.Tests/CategoryRepositoryTests/CategoryRepositoryTests.cs b/WebGoat.NET.Tests/CategoryRepositoryTests/CategoryRepositoryTests.cs new file mode 100644 index 00000000..b3d09516 --- /dev/null +++ b/WebGoat.NET.Tests/CategoryRepositoryTests/CategoryRepositoryTests.cs @@ -0,0 +1,42 @@ +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WebGoatCore.Data; + +namespace WebGoat.NET.Tests.CategoryRepositoryTests +{ + [TestFixture] + public class CategoryRepositoryTests + { + Mock _context; + + [SetUp] + public void Setup() + { + _context = ContextSetup.CreateContext(); + } + + [Test] + public void GetAllCategoriesTest() + { + CategoryRepository repo = new CategoryRepository(_context.Object); + var cats = repo.GetAllCategories(); + + Assert.That(cats.Count(), Is.EqualTo(3)); + } + + [TestCase(1, "Basic")] + [TestCase(2, "Drink")] + [TestCase(3, "Sandwich")] + public void GetCategoryTest(int id, string expName) + { + CategoryRepository repo = new CategoryRepository(_context.Object); + var cat = repo.GetById(id); + + Assert.That(cat.CategoryName, Is.EqualTo(expName)); + } + } +} diff --git a/WebGoat.NET.Tests/CategoryRepositoryTests/ContextSetup.cs b/WebGoat.NET.Tests/CategoryRepositoryTests/ContextSetup.cs new file mode 100644 index 00000000..cb3c13a4 --- /dev/null +++ b/WebGoat.NET.Tests/CategoryRepositoryTests/ContextSetup.cs @@ -0,0 +1,54 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; +using Microsoft.EntityFrameworkCore.Metadata; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WebGoatCore.Data; +using WebGoatCore.Models; + +namespace WebGoat.NET.Tests.CategoryRepositoryTests +{ + internal static class ContextSetup + { + internal static Mock CreateContext() + { + // create test DB + var initialCategories = new List { + new Category() { CategoryId = 1, CategoryName = "Basic", Description = "Basic Category", + Products = Array.Empty() }, + new Category() { CategoryId = 2, CategoryName = "Drink", Description = "Drinks Category", + Products = Array.Empty() }, + new Category() { CategoryId = 3, CategoryName = "Sandwich", Description = "Sandwiches Category", + Products = Array.Empty() }, + }.AsQueryable(); + + Func> mockEntityEntry = (Category data) => + { + var internalEntityEntry = new InternalEntityEntry( + new Mock().Object, + new RuntimeEntityType(nameof(BlogEntry), typeof(BlogEntry), false, null, null, null, ChangeTrackingStrategy.Snapshot, null, false, null), + data); + + var entityEntry = new EntityEntry(internalEntityEntry); + return entityEntry; + }; + + var mockSet = DbSetTestUtil.CreateDbSetMock(initialCategories); + + mockSet.Setup(x => x.Find(It.IsAny())) + .Returns((object[] x) => initialCategories.First(c => c.CategoryId == (int)x[0])); + + var context = new Mock(); + context.SetupGet(c => c.Categories).Returns(mockSet.Object); + + return context; + } + + + } +} diff --git a/WebGoat.NET.Tests/DbSetTestUtil.cs b/WebGoat.NET.Tests/DbSetTestUtil.cs new file mode 100644 index 00000000..b6cb6e70 --- /dev/null +++ b/WebGoat.NET.Tests/DbSetTestUtil.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebGoat.NET.Tests +{ + internal static class DbSetTestUtil + { + internal static Mock> CreateDbSetMock(IEnumerable elements) where T : class + { + var elementsAsQueryable = elements.AsQueryable(); + var dbSetMock = new Mock>(); + + dbSetMock.As>().Setup(m => m.Provider).Returns(elementsAsQueryable.Provider); + dbSetMock.As>().Setup(m => m.Expression).Returns(elementsAsQueryable.Expression); + dbSetMock.As>().Setup(m => m.ElementType).Returns(elementsAsQueryable.ElementType); + dbSetMock.As>().Setup(m => m.GetEnumerator()).Returns(elementsAsQueryable.GetEnumerator()); + + return dbSetMock; + } + } +} diff --git a/WebGoat.NET.Tests/Usings.cs b/WebGoat.NET.Tests/Usings.cs new file mode 100644 index 00000000..cefced49 --- /dev/null +++ b/WebGoat.NET.Tests/Usings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file diff --git a/WebGoat.NET.Tests/WebGoat.NET.Tests.csproj b/WebGoat.NET.Tests/WebGoat.NET.Tests.csproj new file mode 100644 index 00000000..749152f7 --- /dev/null +++ b/WebGoat.NET.Tests/WebGoat.NET.Tests.csproj @@ -0,0 +1,37 @@ + + + + net10.0 + enable + enable + + false + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + diff --git a/WebGoat.NET.slnx b/WebGoat.NET.slnx index bf7cfc57..ad43785a 100644 --- a/WebGoat.NET.slnx +++ b/WebGoat.NET.slnx @@ -1,3 +1,4 @@ + diff --git a/WebGoat.NET/Data/BlogEntryRepository.cs b/WebGoat.NET/Data/BlogEntryRepository.cs index e2439e41..3523485d 100644 --- a/WebGoat.NET/Data/BlogEntryRepository.cs +++ b/WebGoat.NET/Data/BlogEntryRepository.cs @@ -1,5 +1,5 @@ using WebGoatCore.Models; -using Microsoft.EntityFrameworkCore; +using WebGoat.NET.Logger; using System; using System.Collections.Generic; using System.Linq; @@ -17,6 +17,7 @@ public BlogEntryRepository(NorthwindContext context) public BlogEntry CreateBlogEntry(string title, string contents, string username) { + DummyLogger.Log($"Adding blog entry - title: {title} | user: {username}"); var entry = new BlogEntry { Title = title, @@ -27,6 +28,7 @@ public BlogEntry CreateBlogEntry(string title, string contents, string username) entry = _context.BlogEntries.Add(entry).Entity; _context.SaveChanges(); + DummyLogger.Log("Entry added"); return entry; } @@ -46,7 +48,18 @@ public List GetTopBlogEntries(int numberOfEntries, int startPosition) .OrderByDescending(b => b.PostedDate) .Skip(startPosition) .Take(numberOfEntries); + + blogEntries = check(numberOfEntries, startPosition, blogEntries); + return blogEntries.ToList(); } + + private IQueryable check(int numberOfEntries, int startPosition, IQueryable blogEntries) + { + if(numberOfEntries > startPosition) + return blogEntries; + + return null; + } } } diff --git a/WebGoat.NET/Data/NorthwindContext.cs b/WebGoat.NET/Data/NorthwindContext.cs index 1039f068..62940715 100644 --- a/WebGoat.NET/Data/NorthwindContext.cs +++ b/WebGoat.NET/Data/NorthwindContext.cs @@ -38,9 +38,15 @@ public NorthwindContext(DbContextOptions options) { } - public DbSet BlogEntries { get; set; } - public DbSet BlogResponses { get; set; } - public DbSet Categories { get; set; } +#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. + public NorthwindContext() +#pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable. + { + } + + public virtual DbSet BlogEntries { get; set; } + public virtual DbSet BlogResponses { get; set; } + public virtual DbSet Categories { get; set; } public DbSet Customers { get; set; } public DbSet Orders { get; set; } public DbSet OrderDetails { get; set; } diff --git a/WebGoat.NET/Logger/DummyLogger.String.cs b/WebGoat.NET/Logger/DummyLogger.String.cs new file mode 100644 index 00000000..eefe7f5e --- /dev/null +++ b/WebGoat.NET/Logger/DummyLogger.String.cs @@ -0,0 +1,11 @@ +using System; + +namespace WebGoat.NET.Logger +{ + public static partial class DummyLogger + { + private static void LogString(string message) + { + } + } +} \ No newline at end of file diff --git a/WebGoat.NET/Logger/DummyLogger.cs b/WebGoat.NET/Logger/DummyLogger.cs new file mode 100644 index 00000000..70f08572 --- /dev/null +++ b/WebGoat.NET/Logger/DummyLogger.cs @@ -0,0 +1,12 @@ +using System; + +namespace WebGoat.NET.Logger +{ + public static partial class DummyLogger + { + public static void Log(object message) + { + LogString(message as string); + } + } +} diff --git a/changelog.md b/changelog.md index 22546511..3174df27 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## Version 0.5 +### Added +- Added .NET 10 SDK as a minimum requirement to run WebGoat locally. + +## Version 0.4 +### Added +- Added .NET 9 SDK as a minimum requirement to run WebGoat locally. + ## Version 0.3 ### Added - Added .NET 8 SDK as a minimum requirement to run WebGoat locally. diff --git a/readme.md b/readme.md index 74c699c7..d78fd0e5 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ This example shows the following dotTEST capabilities: ## Table of Contents - [dotTEST capabilities](#dotTEST-capabilities) -- [About WebGoat.NET project](#WebGoatNET-version-03) +- [About WebGoat.NET project](#WebGoatNET-version-05) ## dotTEST Capabilities @@ -41,13 +41,13 @@ python DottestAutoFix.py ^ See [**LINK**](https://docs.parasoft.com/display/DOTTEST20252/Fixing+Violations+Using+AI+Autofix) for details regarding Autofix configuration and usage. -## WebGoat.NET version 0.3 +# WebGoat.NET version 0.5 -### Build Status +## Build Status -![build .NET 8](https://github.com/tobyash86/WebGoat.NET/workflows/build%20.NET%208/badge.svg) +![build .NET 10](https://github.com/tobyash86/WebGoat.NET/workflows/build%20.NET%2010/badge.svg) -### The Next-Generation WebGoat Example Project Demonstrating OWASP Top 10 Vulnerabilities +## The next generation of the WebGoat example project to demonstrate OWASP TOP 10 vulnerabilities This is a re-implementation of the original [WebGoat project for .NET](https://github.com/rappayne/WebGoat.NET).