Skip to content

Commit 4b20efa

Browse files
committed
fix: Solve problem with Maven packages due to ':' in SMT vars
1 parent 1fa79e2 commit 4b20efa

File tree

6 files changed

+17
-17
lines changed

6 files changed

+17
-17
lines changed

app/apis/managers/cargo_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from app.utils.others import looks_like_repo, normalize_repo_url, order_versions
1111

1212

13-
async def get_cargo_url_vendor(response: dict[str, Any]) -> tuple[str, str]:
13+
async def get_cargo_url_vendor(response: dict[str, Any]) -> tuple[str, str]:
1414
raw_url = response.get("crate", {}).get("repository")
1515
norm_url = await normalize_repo_url(raw_url)
1616
if norm_url and await looks_like_repo(norm_url):

app/apis/managers/maven_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from asyncio import TimeoutError, sleep
2+
from datetime import datetime
23
from typing import Any
34
from xml.etree.ElementTree import ParseError, fromstring
45

@@ -8,7 +9,6 @@
89
from app.http_session import get_session
910
from app.logger import logger
1011
from app.utils.others import looks_like_repo, normalize_repo_url, order_versions
11-
from datetime import datetime
1212

1313

1414
async def get_maven_url_vendor(group_id: str, artifact_id: str, version: str) -> tuple[str, str]:
@@ -158,8 +158,8 @@ async def get_maven_package(group_id: str, artifact_id: str, version_name: str)
158158
dep_group_id = dep.find("mvn:groupId", namespace).text
159159
dep_artifact_id = dep.find("mvn:artifactId", namespace).text
160160
dep_version = dep.find("mvn:version", namespace)
161-
dep_version_text = dep_version.text if dep_version is not None else "latest"
162-
if not any(char in dep_version_text for char in ["[", "]", "(", ")"]):
161+
dep_version_text = dep_version.text if dep_version is not None else "any"
162+
if dep_version_text != "any" and not any(char in dep_version_text for char in ["[", "]", "(", ")"]):
163163
dep_version_text = "[" + dep_version_text + "]"
164164
requirement[f"{dep_group_id}:{dep_artifact_id}"] = dep_version_text
165165
except ParseError:

app/apis/managers/nuget_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ async def get_nuget_versions(package_name: str) -> tuple[list[dict[str, Any]], l
5555
raw_url = catalog_entry.get("repositoryUrl")
5656
norm_url = await normalize_repo_url(raw_url)
5757
if norm_url and await looks_like_repo(norm_url):
58-
repository_url = norm_url
58+
repository_url = norm_url
5959
vendor = norm_url.split("/")[-2]
6060
raw_versions.append({
6161
"name": name,

app/utils/others/normalize_repo_url.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ async def normalize_repo_url(url: str | None) -> str | None:
3232
if git_match:
3333
host = parsed.netloc.lower()
3434
if any(platform in host for platform in ['github.com', 'gitlab.com', 'bitbucket.org']):
35-
clean = git_match.group(1)
35+
clean = git_match.group(1)
3636
return clean

app/utils/repo_analyzer/requirement_files/pom_xml_analyzer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ async def analyze_pom_xml(
2929
if version_text.startswith("${") and version_text.endswith("}"):
3030
property_key = version_text[2:-1]
3131
version_text = properties.get(property_key, "any")
32-
if not any(char in version_text for char in ["[", "]", "(", ")"]):
32+
if version_text != "any" and not any(char in version_text for char in ["[", "]", "(", ")"]):
3333
version_text = f"[{version_text}]"
3434
requirement_files[requirement_file_name]["requirement"][f"{group_id_text}:{artifact_id_text}"] = version_text
3535
except Exception:

app/utils/smt/model/smt_model.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ async def transform(self) -> str:
4040
str_sum = await self.sum()
4141
self.ctc_domain += f"(= {file_risk_name} {str_sum})"
4242
for indirect_var in self.indirect_vars:
43-
self.var_domain.add(f"(declare-const {indirect_var} Int)")
44-
self.var_domain.add(f"(declare-const impact_{indirect_var} Real)")
43+
self.var_domain.add(f"(declare-const |{indirect_var}| Int)")
44+
self.var_domain.add(f"(declare-const |impact_{indirect_var}| Real)")
4545
model_text = f"{' '.join(self.var_domain)} (assert (and {self.ctc_domain}))"
4646
self.domain = parse_smt2_string(model_text)
4747
self.func_obj = Real(file_risk_name)
@@ -52,10 +52,10 @@ async def transform_direct_package(self, require: dict[str, Any]) -> None:
5252
filtered_versions = await filter_versions(self.node_type, self.source_data["have"][require["package"]], require["constraints"])
5353
versions_impacts: dict[int, int] = {version.get("serial_number"): version[self.aggregator] for version in filtered_versions}
5454
versions_names = list(versions_impacts.keys())
55-
self.directs.append(require["package"])
56-
var_impact = f"impact_{require['package']}"
55+
self.directs.append(f"|{require["package"]}|")
56+
var_impact = f"|impact_{require['package']}|"
5757
self.impacts.add(var_impact)
58-
self.var_domain.add(f"(declare-const {require['package']} Int)")
58+
self.var_domain.add(f"(declare-const |{require['package']}| Int)")
5959
self.var_domain.add(f"(declare-const {var_impact} Real)")
6060
await self.build_direct_contraint(
6161
require["package"], versions_names
@@ -85,7 +85,7 @@ async def transform_versions(self, versions: dict[int, int], var: str, require:
8585
):
8686
_default = {}
8787
if require:
88-
self.impacts.add(f"impact_{require['package']}")
88+
self.impacts.add(f"|impact_{require['package']}|")
8989
self.indirect_vars.add(var)
9090
self.indirect_vars.add(require["parent_version_name"])
9191
_default = {.0: {-1}}
@@ -119,13 +119,13 @@ async def build_indirect_constraints(self) -> None:
119119
self.ctc_domain += f"(=> {await self.group_versions(parent, list(parent_versions), True)} {versions}) "
120120
for child, _ in self.parents.items():
121121
for parent, parent_versions in _.items():
122-
self.ctc_domain += f"(=> (not {await self.group_versions(parent, list(parent_versions), True)}) (= {child} -1)) "
122+
self.ctc_domain += f"(=> (not {await self.group_versions(parent, list(parent_versions), True)}) (= |{child}| -1)) "
123123

124124

125125
async def build_impact_constraints(self) -> None:
126126
for var, _ in self.ctcs.items():
127127
for impact, versions in _.items():
128-
self.ctc_domain += f"(=> {await self.group_versions(var, list(versions), True)} (= impact_{var} {impact})) "
128+
self.ctc_domain += f"(=> {await self.group_versions(var, list(versions), True)} (= |impact_{var}| {impact})) "
129129

130130

131131
async def group_versions(
@@ -143,9 +143,9 @@ async def group_versions(
143143
if versions[i] == versions[i - 1] + step:
144144
current_group.append(versions[i])
145145
else:
146-
constraints.append(await self.create_constraint_for_group(var, current_group, ascending))
146+
constraints.append(await self.create_constraint_for_group(f"|{var}|", current_group, ascending))
147147
current_group = [versions[i]]
148-
constraints.append(await self.create_constraint_for_group(var, current_group, ascending))
148+
constraints.append(await self.create_constraint_for_group(f"|{var}|", current_group, ascending))
149149
return constraints[0] if len(constraints) == 1 else f"(or {' '.join(constraints)})"
150150

151151

0 commit comments

Comments
 (0)