Skip to content

Commit e2d349d

Browse files
committed
feat(labrinth/delphi): support new Delphi report severity field
1 parent 085b18c commit e2d349d

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

apps/labrinth/migrations/20250810155316_delphi-reports.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
CREATE TYPE delphi_report_severity AS ENUM ('low', 'medium', 'high', 'severe');
2+
13
CREATE TYPE delphi_report_issue_status AS ENUM ('pending', 'approved', 'rejected');
24

35
CREATE TYPE delphi_report_issue_type AS ENUM (
@@ -32,6 +34,7 @@ CREATE TABLE delphi_reports (
3234
delphi_version INTEGER NOT NULL,
3335
artifact_url VARCHAR(2048) NOT NULL,
3436
created TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL,
37+
severity DELPHI_REPORT_SEVERITY NOT NULL,
3538
UNIQUE (file_id, delphi_version)
3639
);
3740
CREATE INDEX delphi_version ON delphi_reports (delphi_version);

apps/labrinth/src/database/models/delphi_report_item.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub struct DBDelphiReport {
2525
pub delphi_version: i32,
2626
pub artifact_url: String,
2727
pub created: DateTime<Utc>,
28+
pub severity: DelphiReportSeverity,
2829
}
2930

3031
impl DBDelphiReport {
@@ -34,21 +35,35 @@ impl DBDelphiReport {
3435
) -> Result<DelphiReportId, DatabaseError> {
3536
Ok(DelphiReportId(sqlx::query_scalar!(
3637
"
37-
INSERT INTO delphi_reports (file_id, delphi_version, artifact_url)
38-
VALUES ($1, $2, $3)
38+
INSERT INTO delphi_reports (file_id, delphi_version, artifact_url, severity)
39+
VALUES ($1, $2, $3, $4)
3940
ON CONFLICT (file_id, delphi_version) DO UPDATE SET
40-
delphi_version = $2, artifact_url = $3, created = CURRENT_TIMESTAMP
41+
delphi_version = $2, artifact_url = $3, created = CURRENT_TIMESTAMP, severity = $4
4142
RETURNING id
4243
",
4344
self.file_id as Option<DBFileId>,
4445
self.delphi_version,
4546
self.artifact_url,
47+
self.severity as DelphiReportSeverity,
4648
)
4749
.fetch_one(&mut **transaction)
4850
.await?))
4951
}
5052
}
5153

54+
/// A severity level for a Delphi report.
55+
#[derive(
56+
Deserialize, Serialize, Debug, Clone, Copy, PartialEq, Eq, Hash, sqlx::Type,
57+
)]
58+
#[serde(rename_all = "UPPERCASE")]
59+
#[sqlx(type_name = "delphi_report_severity", rename_all = "snake_case")]
60+
pub enum DelphiReportSeverity {
61+
Low,
62+
Medium,
63+
High,
64+
Severe,
65+
}
66+
5267
/// An issue found in a Delphi report. Every issue belongs to a report,
5368
/// and a report can have zero, one, or more issues attached to it.
5469
#[derive(Deserialize, Serialize)]
@@ -64,8 +79,7 @@ pub struct DBDelphiReportIssue {
6479
Deserialize, Serialize, Debug, Clone, Copy, PartialEq, Eq, Hash, sqlx::Type,
6580
)]
6681
#[serde(rename_all = "snake_case")]
67-
#[sqlx(type_name = "delphi_report_issue_status")]
68-
#[sqlx(rename_all = "snake_case")]
82+
#[sqlx(type_name = "delphi_report_issue_status", rename_all = "snake_case")]
6983
pub enum DelphiReportIssueStatus {
7084
/// The issue is pending review by the moderation team.
7185
Pending,
@@ -91,6 +105,8 @@ pub enum DelphiReportListOrder {
91105
CreatedAsc,
92106
CreatedDesc,
93107
PendingStatusFirst,
108+
SeverityAsc,
109+
SeverityDesc,
94110
}
95111

96112
impl Display for DelphiReportListOrder {
@@ -146,9 +162,9 @@ impl DBDelphiReportIssue {
146162
SELECT
147163
delphi_report_issues.id AS "id", report_id,
148164
issue_type AS "issue_type: DelphiReportIssueType",
149-
delphi_report_issues.status as "status: DelphiReportIssueStatus",
165+
delphi_report_issues.status AS "status: DelphiReportIssueStatus",
150166
151-
file_id, delphi_version, artifact_url, created,
167+
file_id, delphi_version, artifact_url, created, severity AS "severity: DelphiReportSeverity",
152168
json_array(SELECT to_jsonb(delphi_report_issue_java_classes)
153169
FROM delphi_report_issue_java_classes
154170
WHERE issue_id = delphi_report_issues.id
@@ -165,7 +181,9 @@ impl DBDelphiReportIssue {
165181
ORDER BY
166182
CASE WHEN $3 = 'created_asc' THEN delphi_reports.created ELSE TO_TIMESTAMP(0) END ASC,
167183
CASE WHEN $3 = 'created_desc' THEN delphi_reports.created ELSE TO_TIMESTAMP(0) END DESC,
168-
CASE WHEN $3 = 'pending_status_first' THEN delphi_report_issues.status ELSE 'pending'::delphi_report_issue_status END ASC
184+
CASE WHEN $3 = 'pending_status_first' THEN delphi_report_issues.status ELSE 'pending'::delphi_report_issue_status END ASC,
185+
CASE WHEN $3 = 'severity_asc' THEN delphi_reports.severity ELSE 'low'::delphi_report_severity END ASC,
186+
CASE WHEN $3 = 'severity_desc' THEN delphi_reports.severity ELSE 'low'::delphi_report_severity END DESC
169187
OFFSET $5
170188
LIMIT $4
171189
"#,
@@ -188,6 +206,7 @@ impl DBDelphiReportIssue {
188206
delphi_version: row.delphi_version,
189207
artifact_url: row.artifact_url,
190208
created: row.created,
209+
severity: row.severity,
191210
},
192211
java_classes: row
193212
.classes
@@ -207,8 +226,7 @@ impl DBDelphiReportIssue {
207226
Deserialize, Serialize, Debug, Clone, Copy, PartialEq, Eq, Hash, sqlx::Type,
208227
)]
209228
#[serde(rename_all = "snake_case")]
210-
#[sqlx(type_name = "delphi_report_issue_type")]
211-
#[sqlx(rename_all = "snake_case")]
229+
#[sqlx(type_name = "delphi_report_issue_type", rename_all = "snake_case")]
212230
pub enum DelphiReportIssueType {
213231
ReflectionIndirection,
214232
XorObfuscation,

apps/labrinth/src/routes/internal/delphi.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ use crate::{
1616
DBDelphiReport, DBDelphiReportIssue,
1717
DBDelphiReportIssueJavaClass, DecompiledJavaClassSource,
1818
DelphiReportIssueStatus, DelphiReportIssueType,
19-
DelphiReportListOrder, InternalJavaClassName,
19+
DelphiReportListOrder, DelphiReportSeverity,
20+
InternalJavaClassName,
2021
},
2122
},
2223
redis::RedisPool,
@@ -55,6 +56,7 @@ struct DelphiReport {
5556
DelphiReportIssueType,
5657
HashMap<InternalJavaClassName, Option<DecompiledJavaClassSource>>,
5758
>,
59+
pub severity: DelphiReportSeverity,
5860
}
5961

6062
impl DelphiReport {
@@ -117,6 +119,7 @@ async fn ingest_report(
117119
delphi_version: report.delphi_version,
118120
artifact_url: report.url.clone(),
119121
created: DateTime::<Utc>::MIN_UTC, // This will be set by the database
122+
severity: report.severity,
120123
}
121124
.upsert(&mut transaction)
122125
.await?;

0 commit comments

Comments
 (0)