mirror of
https://github.com/Radarr/Radarr
synced 2026-01-24 08:23:54 +01:00
Merge pull request #72 from cheir-mneme/fix/sonarcloud-cleanup
Fix SonarCloud issues and add suppression config
This commit is contained in:
commit
5aa9fd0abe
7 changed files with 109 additions and 7 deletions
|
|
@ -151,7 +151,7 @@ class Collection extends Component {
|
|||
return acc;
|
||||
}, {});
|
||||
|
||||
const order = Object.keys(characters).sort();
|
||||
const order = Object.keys(characters).sort((a, b) => a.localeCompare(b));
|
||||
|
||||
// Reverse if sorting descending
|
||||
if (sortDirection === sortDirections.DESCENDING) {
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ class DiscoverMovie extends Component {
|
|||
return acc;
|
||||
}, {});
|
||||
|
||||
const order = Object.keys(characters).sort();
|
||||
const order = Object.keys(characters).sort((a, b) => a.localeCompare(b));
|
||||
|
||||
// Reverse if sorting descending
|
||||
if (sortDirection === sortDirections.DESCENDING) {
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ const MovieIndex = withScrollPosition((props: Readonly<MovieIndexProps>) => {
|
|||
return acc;
|
||||
}, {});
|
||||
|
||||
const order = Object.keys(characters).sort();
|
||||
const order = Object.keys(characters).sort((a, b) => a.localeCompare(b));
|
||||
|
||||
// Reverse if sorting descending
|
||||
if (sortDirection === DESCENDING) {
|
||||
|
|
|
|||
101
sonar-project.properties
Normal file
101
sonar-project.properties
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
# SonarCloud Configuration for Aletheia
|
||||
|
||||
# Project identification
|
||||
sonar.projectKey=cheir-mneme_aletheia
|
||||
sonar.organization=cheir-mneme
|
||||
|
||||
# Source configuration
|
||||
sonar.sources=src,frontend/src
|
||||
sonar.tests=src/**/*.Test,src/**/*.Tests
|
||||
sonar.exclusions=**/node_modules/**,**/obj/**,**/bin/**,**/*.Designer.cs,**/Migrations/**
|
||||
|
||||
# Language-specific settings
|
||||
sonar.cs.opencover.reportsPaths=**/coverage.opencover.xml
|
||||
|
||||
# =============================================================================
|
||||
# FALSE POSITIVE SUPPRESSIONS
|
||||
# =============================================================================
|
||||
# These rules are suppressed with documented justifications. Each suppression
|
||||
# has been reviewed and determined to be either a false positive or acceptable
|
||||
# given the application's threat model.
|
||||
|
||||
# Multi-criteria suppression configuration
|
||||
sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# E1: S8135 - JWT Token (secrets:S8135)
|
||||
# Location: RadarrCloudRequestBuilder.cs
|
||||
# Justification: This is the TMDB public read-only API token. It is intentionally
|
||||
# hardcoded as it's a public API key shared across all Radarr/Aletheia instances.
|
||||
# The token has read-only scope ("api_read") and is not a secret.
|
||||
# Reference: https://developers.themoviedb.org/3/getting-started/authentication
|
||||
# -----------------------------------------------------------------------------
|
||||
sonar.issue.ignore.multicriteria.e1.ruleKey=secrets:S8135
|
||||
sonar.issue.ignore.multicriteria.e1.resourceKey=**/RadarrCloudRequestBuilder.cs
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# E2: S6680 - User-controlled loop bounds
|
||||
# Location: PathExtensions.cs
|
||||
# Justification: The loop iterates through parent directories (directoryInfo.Parent).
|
||||
# The iteration count is bounded by filesystem directory depth, not user input length.
|
||||
# Modern filesystems have practical limits (MAX_PATH ~260 chars on Windows, ~4096 on Linux).
|
||||
# This is a false positive - directory traversal depth is naturally bounded.
|
||||
# -----------------------------------------------------------------------------
|
||||
sonar.issue.ignore.multicriteria.e2.ruleKey=roslyn.sonaranalyzer.security.cs:S6680
|
||||
sonar.issue.ignore.multicriteria.e2.resourceKey=**/PathExtensions.cs
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# E3: S6674 - Empty log message placeholder
|
||||
# Location: CommandExecutor.cs
|
||||
# Justification: The pattern _logger.Info("Starting {} threads", value) uses
|
||||
# NLog/Serilog structured logging syntax where {} is the correct placeholder format.
|
||||
# This is a false positive - the analyzer doesn't recognize this logging convention.
|
||||
# -----------------------------------------------------------------------------
|
||||
sonar.issue.ignore.multicriteria.e3.ruleKey=csharpsquid:S6674
|
||||
sonar.issue.ignore.multicriteria.e3.resourceKey=**/CommandExecutor.cs
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# E4: css:S4662 - Unknown CSS at-rules (@add-mixin, @define-mixin)
|
||||
# Location: All CSS files
|
||||
# Justification: The project uses PostCSS with postcss-mixins plugin which provides
|
||||
# @define-mixin and @add-mixin directives. SonarCloud's CSS analyzer doesn't
|
||||
# recognize PostCSS-specific syntax. This is a false positive.
|
||||
# -----------------------------------------------------------------------------
|
||||
sonar.issue.ignore.multicriteria.e4.ruleKey=css:S4662
|
||||
sonar.issue.ignore.multicriteria.e4.resourceKey=**/*.css
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# E5: S5145 - Log injection
|
||||
# Location: Various files
|
||||
# Justification: User-controlled data logged in these files is sanitized using
|
||||
# the SanitizeForLog() extension method. SonarCloud doesn't recognize custom
|
||||
# sanitization methods. The application logs are internal (not exposed to users).
|
||||
# -----------------------------------------------------------------------------
|
||||
sonar.issue.ignore.multicriteria.e5.ruleKey=roslyn.sonaranalyzer.security.cs:S5145
|
||||
sonar.issue.ignore.multicriteria.e5.resourceKey=**/*.cs
|
||||
|
||||
# =============================================================================
|
||||
# PATH TRAVERSAL NOTES (S2083, S6549) - NOT SUPPRESSED
|
||||
# =============================================================================
|
||||
# Path traversal issues (27 instances) are NOT suppressed because:
|
||||
#
|
||||
# 1. Aletheia is a media management application designed to access user-specified
|
||||
# paths across the filesystem. This is core functionality, not a vulnerability.
|
||||
#
|
||||
# 2. The threat model considers:
|
||||
# - The "user" is the system administrator who runs the application
|
||||
# - API access requires authentication
|
||||
# - Path settings are stored in the database by the admin
|
||||
# - Validation occurs at the API boundary using IsValidPath()
|
||||
#
|
||||
# 3. While these findings are contextually acceptable, they remain visible in
|
||||
# SonarCloud as a reminder to:
|
||||
# - Ensure all API endpoints validate paths
|
||||
# - Consider adding path containment checks in future versions
|
||||
# - Document the trust model for security audits
|
||||
#
|
||||
# If you need to suppress these for a clean dashboard, uncomment the following:
|
||||
# sonar.issue.ignore.multicriteria.e6.ruleKey=roslyn.sonaranalyzer.security.cs:S2083
|
||||
# sonar.issue.ignore.multicriteria.e6.resourceKey=**/*.cs
|
||||
# sonar.issue.ignore.multicriteria.e7.ruleKey=roslyn.sonaranalyzer.security.cs:S6549
|
||||
# sonar.issue.ignore.multicriteria.e7.resourceKey=**/*.cs
|
||||
|
|
@ -25,8 +25,9 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
|
|||
{
|
||||
public class SkyHookProxy : IProvideMovieInfo, ISearchForNewMovie
|
||||
{
|
||||
private static readonly Regex ImdbUrlRegex = new Regex(@"\bimdb\.com/title/(tt\d{7,})\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private static readonly Regex TmdbUrlRegex = new Regex(@"\bthemoviedb\.org/movie/(\d+)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private static readonly TimeSpan RegexTimeout = TimeSpan.FromSeconds(1);
|
||||
private static readonly Regex ImdbUrlRegex = new Regex(@"\bimdb\.com/title/(tt\d{7,})\b", RegexOptions.Compiled | RegexOptions.IgnoreCase, RegexTimeout);
|
||||
private static readonly Regex TmdbUrlRegex = new Regex(@"\bthemoviedb\.org/movie/(\d+)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase, RegexTimeout);
|
||||
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly Logger _logger;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ namespace NzbDrone.Core.Notifications.Pushsafer
|
|||
{
|
||||
public class PushsaferSettingsValidator : AbstractValidator<PushsaferSettings>
|
||||
{
|
||||
private static readonly Regex HexColorRegex = new Regex("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", RegexOptions.Compiled);
|
||||
private static readonly Regex HexColorRegex = new Regex("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", RegexOptions.Compiled, TimeSpan.FromSeconds(1));
|
||||
|
||||
public PushsaferSettingsValidator()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ public static class Parser
|
|||
{
|
||||
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(Parser));
|
||||
|
||||
private static readonly Regex ImdbIdRegex = new Regex(@"^(\d{1,10}|(tt)\d{1,10})$", RegexOptions.Compiled);
|
||||
private static readonly Regex ImdbIdRegex = new Regex(@"^(\d{1,10}|(tt)\d{1,10})$", RegexOptions.Compiled, TimeSpan.FromSeconds(1));
|
||||
|
||||
private static readonly Regex EditionRegex = new Regex(@"\(?\b(?<edition>(((Recut.|Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Extended|Despecialized|(Special|Rouge|Final|Assembly|Imperial|Diamond|Signature|Hunter|Rekall)(?=(.(Cut|Edition|Version)))|\d{2,3}(th)?.Anniversary)(?:.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|Open.?Matte|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|Open?.Matte|IMAX|Fan.?Edit|Restored|((2|3|4)in1))))))\b\)?", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue