diff --git a/CHANGELOG.md b/CHANGELOG.md
index be4779ad77..8d46ea2a0e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,12 @@ 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).
+## 8.7.1
+
+### Fixed
+
+* Service: Removed deprecated Azure retention policy setting that was causing scaleset deployment errors [#3452](https://github.com/microsoft/onefuzz/pull/3452)
+
## 8.7.0
### Added
diff --git a/CURRENT_VERSION b/CURRENT_VERSION
index c0bcaebe8f..efeecbe2c5 100644
--- a/CURRENT_VERSION
+++ b/CURRENT_VERSION
@@ -1 +1 @@
-8.7.0
\ No newline at end of file
+8.7.1
\ No newline at end of file
diff --git a/README.md b/README.md
index 010148dd3a..486dae6c15 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,20 @@
#
+# IMPORTANT NOTICE
+
+**_Since September 2020 when OneFuzz was first open sourced, we’ve been on a journey to create a best-in-class orchestrator for running fuzzers, driving security and quality into our products._**
+
+
+**_Initially launched by a small group in MSR, OneFuzz has now become a significant internal platform within Microsoft. As such, we are regretfully archiving the project to focus our attention on becoming a more deeply integrated service within the company. Unfortunately, we aren’t a large enough team to live in both the open-source world and the internal Microsoft world with its own unique set of requirements._**
+
+**_Our current plan is to archive the project in the next few months. That means we’ll still be making updates for a little while. Of course, even after it’s archived, you’ll still be able to fork it and make the changes you need. Once we’ve decided on a specific date for archiving, we’ll update this readme._**
+
+**_Thanks for taking the journey with us._**
+
+**_The OneFuzz team._**
+
+---
+
[](https://github.com/microsoft/onefuzz/actions/workflows/ci.yml?query=branch%3Amain)
## A self-hosted Fuzzing-As-A-Service platform
diff --git a/contrib/onefuzz-job-azure-devops-pipeline/ado-work-items.json b/contrib/onefuzz-job-azure-devops-pipeline/ado-work-items.json
index eb89fc019d..034d97cf15 100644
--- a/contrib/onefuzz-job-azure-devops-pipeline/ado-work-items.json
+++ b/contrib/onefuzz-job-azure-devops-pipeline/ado-work-items.json
@@ -13,6 +13,10 @@
"System.AreaPath": "OneFuzz-Ado-Integration",
"System.Title": "{{report.task_id}}"
},
+ "ado_duplicate_fields": {
+ "System.Reason": "My custom value that means a work item is a duplicate",
+ "Custom.Work.Item.Field": "My custom value that means a work item is a duplicate"
+ },
"on_duplicate": {
"increment": [],
"comment": "DUP {{report.input_sha256}}
Repro Command:
{{ repro_cmd }}
",
diff --git a/docs/notifications/ado.md b/docs/notifications/ado.md
index 131986afba..09dd5b9072 100644
--- a/docs/notifications/ado.md
+++ b/docs/notifications/ado.md
@@ -51,6 +51,13 @@ clickable, make it a link.
"System.Title": "{{ report.crash_site }} - {{ report.executable }}",
"Microsoft.VSTS.TCM.ReproSteps": "This is my call stack: {{ for item in report.call_stack }} - {{ item }}
{{ end }}
"
},
+ "ado_duplicate_fields": {
+ "System.Reason": "My custom value that means a work item is a duplicate",
+ "Custom.Work.Item.Field": "My custom value that means a work item is a duplicate"
+ // note: the fields and values below are checked by default and don't need to be specified
+ // "System.Reason": "Duplicate"
+ // "Microsoft.VSTS.Common.ResolvedReason": "Duplicate"
+ },
"comment": "This is my comment. {{ report.input_sha256 }} {{ input_url }}
{{ repro_cmd }}
",
"unique_fields": ["System.Title", "System.AreaPath"],
"on_duplicate": {
diff --git a/src/ApiService/ApiService/OneFuzzTypes/Model.cs b/src/ApiService/ApiService/OneFuzzTypes/Model.cs
index b839f52ddc..424669899a 100644
--- a/src/ApiService/ApiService/OneFuzzTypes/Model.cs
+++ b/src/ApiService/ApiService/OneFuzzTypes/Model.cs
@@ -689,6 +689,7 @@ public record AdoTemplate(
List UniqueFields,
Dictionary AdoFields,
ADODuplicateTemplate OnDuplicate,
+ Dictionary? AdoDuplicateFields = null,
string? Comment = null
) : NotificationTemplate {
public async Task Validate() {
@@ -704,8 +705,9 @@ public record RenderedAdoTemplate(
List UniqueFields,
Dictionary AdoFields,
ADODuplicateTemplate OnDuplicate,
+ Dictionary? AdoDuplicateFields = null,
string? Comment = null
- ) : AdoTemplate(BaseUrl, AuthToken, Project, Type, UniqueFields, AdoFields, OnDuplicate, Comment);
+ ) : AdoTemplate(BaseUrl, AuthToken, Project, Type, UniqueFields, AdoFields, OnDuplicate, AdoDuplicateFields, Comment);
public record TeamsTemplate(SecretData Url) : NotificationTemplate {
public Task Validate() {
diff --git a/src/ApiService/ApiService/onefuzzlib/notifications/Ado.cs b/src/ApiService/ApiService/onefuzzlib/notifications/Ado.cs
index e05bb9bc24..3780bc1b2b 100644
--- a/src/ApiService/ApiService/onefuzzlib/notifications/Ado.cs
+++ b/src/ApiService/ApiService/onefuzzlib/notifications/Ado.cs
@@ -291,6 +291,7 @@ public static RenderedAdoTemplate RenderAdoTemplate(ILogger logTracer, Renderer
original.UniqueFields,
adoFields,
onDuplicate,
+ original.AdoDuplicateFields,
original.Comment != null ? Render(renderer, original.Comment, instanceUrl, logTracer) : null
);
}
@@ -535,7 +536,7 @@ public async Async.Task Process(IList<(string, string)> notificationInfo) {
_logTracer.AddTags(new List<(string, string)> { ("MatchingWorkItemIds", $"{workItem.Id}") });
_logTracer.LogInformation("Found matching work item");
}
- if (IsADODuplicateWorkItem(workItem)) {
+ if (IsADODuplicateWorkItem(workItem, _config.AdoDuplicateFields)) {
continue;
}
@@ -575,13 +576,17 @@ public async Async.Task Process(IList<(string, string)> notificationInfo) {
}
}
- private static bool IsADODuplicateWorkItem(WorkItem wi) {
+ private static bool IsADODuplicateWorkItem(WorkItem wi, Dictionary? duplicateFields) {
// A work item could have System.State == Resolve && System.Reason == Duplicate
// OR it could have System.State == Closed && System.Reason == Duplicate
// I haven't found any other combinations where System.Reason could be duplicate but just to be safe
// we're explicitly _not_ checking the state of the work item to determine if it's duplicate
return wi.Fields.ContainsKey("System.Reason") && string.Equals(wi.Fields["System.Reason"].ToString(), "Duplicate", StringComparison.OrdinalIgnoreCase)
|| wi.Fields.ContainsKey("Microsoft.VSTS.Common.ResolvedReason") && string.Equals(wi.Fields["Microsoft.VSTS.Common.ResolvedReason"].ToString(), "Duplicate", StringComparison.OrdinalIgnoreCase)
+ || duplicateFields?.Any(fieldPair => {
+ var (field, value) = fieldPair;
+ return wi.Fields.ContainsKey(field) && string.Equals(wi.Fields[field].ToString(), value, StringComparison.OrdinalIgnoreCase);
+ }) == true
// Alternatively, the work item can also specify a 'relation' to another work item.
// This is typically used to create parent/child relationships between work items but can also
// Be used to mark duplicates so we should check this as well.
diff --git a/src/ApiService/IntegrationTests/JinjaToScribanMigrationTests.cs b/src/ApiService/IntegrationTests/JinjaToScribanMigrationTests.cs
index 0ae3b11cb5..4033a05369 100644
--- a/src/ApiService/IntegrationTests/JinjaToScribanMigrationTests.cs
+++ b/src/ApiService/IntegrationTests/JinjaToScribanMigrationTests.cs
@@ -111,6 +111,7 @@ public async Async.Task OptionalFieldsAreSupported() {
},
"{{ if org }} blah {{ end }}"
),
+ null,
"{{ if org }} blah {{ end }}"
);
@@ -137,6 +138,7 @@ public async Async.Task All_ADO_Fields_Are_Migrated() {
},
"{% if org %} comment {% endif %}"
),
+ null,
"{% if org %} comment {% endif %}"
);
diff --git a/src/ApiService/Tests/OrmModelsTest.cs b/src/ApiService/Tests/OrmModelsTest.cs
index 1aa7d2d163..956d0c30c5 100644
--- a/src/ApiService/Tests/OrmModelsTest.cs
+++ b/src/ApiService/Tests/OrmModelsTest.cs
@@ -232,6 +232,7 @@ from authToken in Arb.Generate>()
from str in Arb.Generate()
from fields in Arb.Generate>()
from adoFields in Arb.Generate>()
+ from adoDuplicateFields in Arb.Generate>()
from dupeTemplate in Arb.Generate()
select new AdoTemplate(
baseUrl,
@@ -241,6 +242,7 @@ from dupeTemplate in Arb.Generate()
fields,
adoFields,
dupeTemplate,
+ adoDuplicateFields,
str.Get));
public static Arbitrary ArbTeamsTemplate()
diff --git a/src/agent/Cargo.lock b/src/agent/Cargo.lock
index 254684be97..d6dcae620c 100644
--- a/src/agent/Cargo.lock
+++ b/src/agent/Cargo.lock
@@ -200,9 +200,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "azure_core"
-version = "0.13.0"
+version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b0f0eea648347e40f5f7f7e6bfea4553bcefad0fbf52044ea339e5ce3aba61"
+checksum = "2331555a3618a32516c6172a63e9fec4af0edb43c6fcfeb5303a0716fc34498b"
dependencies = [
"async-trait",
"base64 0.21.2",
@@ -214,7 +214,7 @@ dependencies = [
"log",
"paste",
"pin-project",
- "quick-xml 0.29.0",
+ "quick-xml",
"rand 0.8.5",
"reqwest",
"rustc_version",
@@ -227,9 +227,9 @@ dependencies = [
[[package]]
name = "azure_storage"
-version = "0.13.0"
+version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32d9cfa13ed9acb51cd663e04f343bd550a92b455add96c90de387a9a6bc4dbc"
+checksum = "16565073e533053f4e29e6b139de2af758e984108a1cddbb1a432387e7f4474d"
dependencies = [
"RustyXML",
"async-trait",
@@ -250,9 +250,9 @@ dependencies = [
[[package]]
name = "azure_storage_blobs"
-version = "0.13.1"
+version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57cb0fe58af32a3fb49e560613cb1e4937f9f13161a2c1caf1bba0224435f2af"
+checksum = "0900e63940d1ba51039efda3d8cf658157a1c75449081a6e18069d2588809329"
dependencies = [
"RustyXML",
"azure_core",
@@ -510,7 +510,7 @@ name = "cobertura"
version = "0.1.0"
dependencies = [
"anyhow",
- "quick-xml 0.30.0",
+ "quick-xml",
]
[[package]]
@@ -572,7 +572,7 @@ dependencies = [
"iced-x86",
"insta",
"log",
- "nix",
+ "nix 0.27.1",
"pete",
"pretty_assertions",
"procfs",
@@ -719,7 +719,7 @@ version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e"
dependencies = [
- "nix",
+ "nix 0.26.4",
"windows-sys 0.48.0",
]
@@ -883,9 +883,9 @@ dependencies = [
[[package]]
name = "elsa"
-version = "1.8.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e0aca8dce8856e420195bd13b6a64de3334235ccc9214e824b86b12bf26283"
+checksum = "714f766f3556b44e7e4776ad133fcc3445a489517c25c704ace411bb14790194"
dependencies = [
"stable_deref_trait",
]
@@ -1998,16 +1998,26 @@ checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
[[package]]
name = "nix"
-version = "0.26.2"
+version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
+checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
dependencies = [
"bitflags 1.3.2",
"cfg-if 1.0.0",
"libc",
"memoffset 0.7.1",
"pin-utils",
- "static_assertions",
+]
+
+[[package]]
+name = "nix"
+version = "0.27.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+dependencies = [
+ "bitflags 2.3.3",
+ "cfg-if 1.0.0",
+ "libc",
]
[[package]]
@@ -2035,18 +2045,19 @@ dependencies = [
[[package]]
name = "notify"
-version = "6.0.1"
+version = "6.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5738a2795d57ea20abec2d6d76c6081186709c0024187cd5977265eda6598b51"
+checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.3.3",
"filetime",
"inotify",
"kqueue",
"libc",
+ "log",
"mio 0.8.8",
"walkdir",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -2121,7 +2132,7 @@ dependencies = [
"input-tester",
"lazy_static",
"log",
- "nix",
+ "nix 0.27.1",
"notify",
"onefuzz-result",
"onefuzz-telemetry",
@@ -2171,7 +2182,7 @@ dependencies = [
"futures",
"ipc-channel",
"log",
- "nix",
+ "nix 0.27.1",
"onefuzz",
"onefuzz-telemetry",
"reqwest",
@@ -2193,7 +2204,7 @@ dependencies = [
"coverage",
"debuggable-module",
"pretty_assertions",
- "quick-xml 0.30.0",
+ "quick-xml",
"serde",
"serde_json",
]
@@ -2442,7 +2453,7 @@ checksum = "229eb6b3cb0d3d075727c614687ab08384cac3b75fa100e1e08b30d7bee39d00"
dependencies = [
"libc",
"memoffset 0.8.0",
- "nix",
+ "nix 0.26.4",
"thiserror",
]
@@ -2587,16 +2598,6 @@ dependencies = [
"snafu",
]
-[[package]]
-name = "quick-xml"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51"
-dependencies = [
- "memchr",
- "serde",
-]
-
[[package]]
name = "quick-xml"
version = "0.30.0"
@@ -3258,12 +3259,6 @@ dependencies = [
"sha2",
]
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-
[[package]]
name = "storage-queue"
version = "0.1.0"
@@ -3278,7 +3273,7 @@ dependencies = [
"flume",
"num_cpus",
"queue-file",
- "quick-xml 0.30.0",
+ "quick-xml",
"regex",
"reqwest",
"reqwest-retry",
@@ -3468,9 +3463,9 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.7.1"
+version = "3.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651"
+checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
dependencies = [
"cfg-if 1.0.0",
"fastrand 2.0.0",
@@ -3555,9 +3550,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.30.0"
+version = "1.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d3ce25f50619af8b0aec2eb23deebe84249e19e2ddd393a6e16e3300a6dadfd"
+checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
dependencies = [
"backtrace",
"bytes",
diff --git a/src/agent/coverage/Cargo.toml b/src/agent/coverage/Cargo.toml
index 29e67523d9..cff869f7d5 100644
--- a/src/agent/coverage/Cargo.toml
+++ b/src/agent/coverage/Cargo.toml
@@ -25,7 +25,7 @@ thiserror = "1.0"
debugger = { path = "../debugger" }
[target.'cfg(target_os = "linux")'.dependencies]
-nix = "0.26"
+nix = "0.27"
pete = "0.10"
# For procfs, opt out of the `chrono` freature; it pulls in an old version
# of `time`. We do not use the methods that the `chrono` feature enables.
@@ -38,5 +38,5 @@ pretty_assertions = "1.4.0"
insta = { version = "1.31.0", features = ["glob"] }
coverage = { path = "../coverage" }
cc = "1.0"
-tempfile = "3.7.0"
+tempfile = "3.8.0"
dunce = "1.0"
diff --git a/src/agent/debuggable-module/Cargo.toml b/src/agent/debuggable-module/Cargo.toml
index 1cd11dfd30..ee464961f7 100644
--- a/src/agent/debuggable-module/Cargo.toml
+++ b/src/agent/debuggable-module/Cargo.toml
@@ -6,7 +6,7 @@ license = "MIT"
[dependencies]
anyhow = "1.0"
-elsa = "1.8.1"
+elsa = "1.9.0"
gimli = "0.27.2"
goblin = "0.6"
iced-x86 = "1.20"
diff --git a/src/agent/onefuzz-agent/Cargo.toml b/src/agent/onefuzz-agent/Cargo.toml
index 5ce8669766..41965c6605 100644
--- a/src/agent/onefuzz-agent/Cargo.toml
+++ b/src/agent/onefuzz-agent/Cargo.toml
@@ -22,7 +22,7 @@ reqwest = { version = "0.11", features = [
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
storage-queue = { path = "../storage-queue" }
-tokio = { version = "1.29", features = ["full"] }
+tokio = { version = "1.32", features = ["full"] }
url = { version = "2.4", features = ["serde"] }
uuid = { version = "1.4", features = ["serde", "v4"] }
clap = { version = "4", features = ["derive", "cargo"] }
@@ -31,19 +31,19 @@ onefuzz-telemetry = { path = "../onefuzz-telemetry" }
backtrace = "0.3"
ipc-channel = { git = "https://github.com/servo/ipc-channel", rev = "7f432aa" }
dynamic-library = { path = "../dynamic-library" }
-azure_core = { version = "0.13", default-features = false, features = [
+azure_core = { version = "0.14", default-features = false, features = [
"enable_reqwest",
] }
-azure_storage = { version = "0.13", default-features = false, features = [
+azure_storage = { version = "0.14", default-features = false, features = [
"enable_reqwest",
] }
-azure_storage_blobs = { version = "0.13", default-features = false, features = [
+azure_storage_blobs = { version = "0.14", default-features = false, features = [
"enable_reqwest",
] }
[target.'cfg(target_family = "unix")'.dependencies]
-nix = "0.26"
+nix = "0.27"
[target.'cfg(target_family = "windows")'.dependencies]
windows = "0.48"
diff --git a/src/agent/onefuzz-task/Cargo.toml b/src/agent/onefuzz-task/Cargo.toml
index 4e0bd381b0..def8d8eab2 100644
--- a/src/agent/onefuzz-task/Cargo.toml
+++ b/src/agent/onefuzz-task/Cargo.toml
@@ -46,9 +46,9 @@ strum = "0.25"
strum_macros = "0.25"
stacktrace-parser = { path = "../stacktrace-parser" }
storage-queue = { path = "../storage-queue" }
-tempfile = "3.7.0"
+tempfile = "3.8.0"
thiserror = "1.0"
-tokio = { version = "1.29", features = ["full"] }
+tokio = { version = "1.32", features = ["full"] }
tokio-util = { version = "0.7", features = ["full"] }
tokio-stream = "0.1"
tui = { package = "ratatui", version = "0.22.0", default-features = false, features = [
@@ -62,13 +62,13 @@ chrono = { version = "0.4", default-features = false, features = [
] }
ipc-channel = { git = "https://github.com/servo/ipc-channel", rev = "7f432aa" }
-azure_core = { version = "0.13", default-features = false, features = [
+azure_core = { version = "0.14", default-features = false, features = [
"enable_reqwest",
] }
-azure_storage = { version = "0.13", default-features = false, features = [
+azure_storage = { version = "0.14", default-features = false, features = [
"enable_reqwest",
] }
-azure_storage_blobs = { version = "0.13", default-features = false, features = [
+azure_storage_blobs = { version = "0.14", default-features = false, features = [
"enable_reqwest",
] }
diff --git a/src/agent/onefuzz-telemetry/Cargo.toml b/src/agent/onefuzz-telemetry/Cargo.toml
index 23574a013f..8f91478b1f 100644
--- a/src/agent/onefuzz-telemetry/Cargo.toml
+++ b/src/agent/onefuzz-telemetry/Cargo.toml
@@ -15,5 +15,5 @@ chrono = { version = "0.4", default-features = false, features = [
lazy_static = "1.4"
log = "0.4"
serde = { version = "1.0", features = ["derive"] }
-tokio = { version = "1.29", features = ["full"] }
+tokio = { version = "1.32", features = ["full"] }
uuid = { version = "1.4", features = ["serde", "v4"] }
diff --git a/src/agent/onefuzz/Cargo.toml b/src/agent/onefuzz/Cargo.toml
index 1f3c27985c..ba972afeef 100644
--- a/src/agent/onefuzz/Cargo.toml
+++ b/src/agent/onefuzz/Cargo.toml
@@ -18,7 +18,7 @@ futures-util = "0.3"
hex = "0.4"
lazy_static = "1.4"
log = "0.4"
-notify = { version = "6.0.1", default-features = false }
+notify = { version = "6.1.1", default-features = false }
regex = "1.9.1"
reqwest = { version = "0.11", features = [
"json",
@@ -31,7 +31,7 @@ serde = "1.0"
serde_json = "1.0"
rand = "0.8"
serde_derive = "1.0"
-tokio = { version = "1.29", features = ["full"] }
+tokio = { version = "1.32", features = ["full"] }
tokio-stream = { version = "0.1", features = ["fs", "time", "tokio-util"] }
tokio-util = { version = "0.7", features = ["full"] }
uuid = { version = "1.4", features = ["serde", "v4"] }
@@ -40,7 +40,7 @@ url-escape = "0.1.0"
storage-queue = { path = "../storage-queue" }
strum = "0.25"
strum_macros = "0.25"
-tempfile = "3.7.0"
+tempfile = "3.8.0"
process_control = "4.0"
reqwest-retry = { path = "../reqwest-retry" }
onefuzz-telemetry = { path = "../onefuzz-telemetry" }
@@ -59,7 +59,7 @@ windows = { version = "0.48", features = [
[target.'cfg(target_family = "unix")'.dependencies]
cpp_demangle = "0.4"
-nix = "0.26"
+nix = { version = "0.27", features = ["signal"] }
[target.'cfg(target_os = "linux")'.dependencies]
pete = "0.10"
diff --git a/src/agent/reqwest-retry/Cargo.toml b/src/agent/reqwest-retry/Cargo.toml
index d7d12ff4e8..5ddfbbe419 100644
--- a/src/agent/reqwest-retry/Cargo.toml
+++ b/src/agent/reqwest-retry/Cargo.toml
@@ -19,5 +19,5 @@ reqwest = { version = "0.11", features = [
thiserror = "1.0"
[dev-dependencies]
-tokio = { version = "1.29", features = ["macros"] }
+tokio = { version = "1.32", features = ["macros"] }
wiremock = "0.5"
diff --git a/src/agent/storage-queue/Cargo.toml b/src/agent/storage-queue/Cargo.toml
index d5c1c09d08..381a761c74 100644
--- a/src/agent/storage-queue/Cargo.toml
+++ b/src/agent/storage-queue/Cargo.toml
@@ -26,6 +26,6 @@ serde = { version = "1.0", features = ["derive"] }
serde_derive = "1.0"
serde_json = "1.0"
bincode = "1.3"
-tokio = { version = "1.29", features = ["full"] }
+tokio = { version = "1.32", features = ["full"] }
queue-file = "1.4"
uuid = { version = "1.4", features = ["serde", "v4"] }
diff --git a/src/agent/win-util/Cargo.toml b/src/agent/win-util/Cargo.toml
index 1edaa3fc58..2c4f1065bf 100644
--- a/src/agent/win-util/Cargo.toml
+++ b/src/agent/win-util/Cargo.toml
@@ -33,4 +33,4 @@ features = [
]
[dev-dependencies]
-tempfile = "3.7.0"
+tempfile = "3.8.0"
diff --git a/src/ci/set-versions.sh b/src/ci/set-versions.sh
index 34c30ea37c..174b77f8ea 100755
--- a/src/ci/set-versions.sh
+++ b/src/ci/set-versions.sh
@@ -14,4 +14,4 @@ SET_VERSIONS="src/pytypes/onefuzztypes/__version__.py src/cli/onefuzz/__version_
SET_REQS="src/cli/requirements.txt"
sed -i "s/0.0.0/${VERSION}/" ${SET_VERSIONS}
-sed -i "s/onefuzztypes==0.0.0/onefuzztypes==${VERSION}/" ${SET_REQS}
+sed -i "s/onefuzztypes~=0.0.0/onefuzztypes==${VERSION}/" ${SET_REQS}
diff --git a/src/ci/unset-versions.sh b/src/ci/unset-versions.sh
index 95cbfac3d5..9312e6b4d8 100755
--- a/src/ci/unset-versions.sh
+++ b/src/ci/unset-versions.sh
@@ -12,4 +12,4 @@ SET_VERSIONS="src/pytypes/onefuzztypes/__version__.py src/cli/onefuzz/__version_
SET_REQS="src/cli/requirements.txt"
sed -i 's/__version__ = .*/__version__ = "0.0.0"/' ${SET_VERSIONS}
-sed -i "s/onefuzztypes==.*/onefuzztypes==0.0.0/" ${SET_REQS}
+sed -i "s/onefuzztypes==.*/onefuzztypes~=0.0.0/" ${SET_REQS}
diff --git a/src/cli/requirements.txt b/src/cli/requirements.txt
index d9977fe03e..475f86acc4 100644
--- a/src/cli/requirements.txt
+++ b/src/cli/requirements.txt
@@ -21,4 +21,4 @@ opentelemetry-instrumentation-requests==0.37b0
# install rsa version >=4.7 to fix CVE-2020-25658
rsa>=4.7
# onefuzztypes version is set during build
-onefuzztypes==0.0.0
+onefuzztypes~=0.0.0
diff --git a/src/proxy-manager/Cargo.lock b/src/proxy-manager/Cargo.lock
index ca4813995e..4eae33643a 100644
--- a/src/proxy-manager/Cargo.lock
+++ b/src/proxy-manager/Cargo.lock
@@ -1474,9 +1474,9 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.7.1"
+version = "3.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651"
+checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
dependencies = [
"cfg-if",
"fastrand",
@@ -1531,9 +1531,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.30.0"
+version = "1.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d3ce25f50619af8b0aec2eb23deebe84249e19e2ddd393a6e16e3300a6dadfd"
+checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
dependencies = [
"backtrace",
"bytes",
diff --git a/src/proxy-manager/Cargo.toml b/src/proxy-manager/Cargo.toml
index c783e8d3aa..b2258e994b 100644
--- a/src/proxy-manager/Cargo.toml
+++ b/src/proxy-manager/Cargo.toml
@@ -20,7 +20,7 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
storage-queue = { path = "../agent/storage-queue" }
thiserror = "1.0"
-tokio = { version = "1.29", features = [
+tokio = { version = "1.32", features = [
"macros",
"rt-multi-thread",
"fs",
@@ -31,4 +31,4 @@ reqwest-retry = { path = "../agent/reqwest-retry" }
onefuzz-telemetry = { path = "../agent/onefuzz-telemetry" }
uuid = { version = "1.4", features = ["serde"] }
log = "0.4"
-tempfile = "3.7.0"
+tempfile = "3.8.0"
diff --git a/src/pytypes/onefuzztypes/models.py b/src/pytypes/onefuzztypes/models.py
index a5f8139e97..c888621600 100644
--- a/src/pytypes/onefuzztypes/models.py
+++ b/src/pytypes/onefuzztypes/models.py
@@ -273,6 +273,7 @@ class ADOTemplate(BaseModel):
unique_fields: List[str]
comment: Optional[str]
ado_fields: Dict[str, str]
+ ado_duplicate_fields: Optional[Dict[str, str]]
on_duplicate: ADODuplicateTemplate
# validator needed to convert auth_token to SecretData