mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00
parent
b9461225ca
commit
e4f8ba000e
2 changed files with 25 additions and 2 deletions
|
@ -149,6 +149,19 @@ class AddonMeta:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def package_name_valid(name: str) -> bool:
|
||||||
|
# embedded /?
|
||||||
|
base = os.path.basename(name)
|
||||||
|
if base != name:
|
||||||
|
return False
|
||||||
|
# tries to escape to parent?
|
||||||
|
root = os.getcwd()
|
||||||
|
subfolder = os.path.abspath(os.path.join(root, name))
|
||||||
|
if root.startswith(subfolder):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
# fixme: this class should not have any GUI code in it
|
# fixme: this class should not have any GUI code in it
|
||||||
class AddonManager:
|
class AddonManager:
|
||||||
|
|
||||||
|
@ -202,7 +215,7 @@ class AddonManager:
|
||||||
|
|
||||||
def addonsFolder(self, dir: Optional[str] = None) -> str:
|
def addonsFolder(self, dir: Optional[str] = None) -> str:
|
||||||
root = self.mw.pm.addonFolder()
|
root = self.mw.pm.addonFolder()
|
||||||
if not dir:
|
if dir is None:
|
||||||
return root
|
return root
|
||||||
return os.path.join(root, dir)
|
return os.path.join(root, dir)
|
||||||
|
|
||||||
|
@ -381,6 +394,8 @@ class AddonManager:
|
||||||
if not manifest:
|
if not manifest:
|
||||||
return InstallError(errmsg="manifest")
|
return InstallError(errmsg="manifest")
|
||||||
package = manifest["package"]
|
package = manifest["package"]
|
||||||
|
if not package_name_valid(package):
|
||||||
|
return InstallError(errmsg="invalid package")
|
||||||
conflicts = manifest.get("conflicts", [])
|
conflicts = manifest.get("conflicts", [])
|
||||||
found_conflicts = self._disableConflicting(package, conflicts)
|
found_conflicts = self._disableConflicting(package, conflicts)
|
||||||
meta = self.addonMeta(package)
|
meta = self.addonMeta(package)
|
||||||
|
|
|
@ -7,7 +7,7 @@ from zipfile import ZipFile
|
||||||
|
|
||||||
from mock import MagicMock
|
from mock import MagicMock
|
||||||
|
|
||||||
from aqt.addons import AddonManager, extract_update_info
|
from aqt.addons import AddonManager, extract_update_info, package_name_valid
|
||||||
|
|
||||||
|
|
||||||
def test_readMinimalManifest():
|
def test_readMinimalManifest():
|
||||||
|
@ -94,3 +94,11 @@ def test_update_info():
|
||||||
r = extract_update_info(20, 1, json_info)
|
r = extract_update_info(20, 1, json_info)
|
||||||
assert r.current_branch_max_point_ver == -25
|
assert r.current_branch_max_point_ver == -25
|
||||||
assert r.suitable_branch_last_modified == 333
|
assert r.suitable_branch_last_modified == 333
|
||||||
|
|
||||||
|
|
||||||
|
def test_package_name_validation():
|
||||||
|
assert not package_name_valid("")
|
||||||
|
assert not package_name_valid("/")
|
||||||
|
assert not package_name_valid("a/b")
|
||||||
|
assert not package_name_valid("..")
|
||||||
|
assert package_name_valid("ab")
|
||||||
|
|
Loading…
Reference in a new issue