diff options
Diffstat (limited to 'cli/npm/resolvers/global.rs')
-rw-r--r-- | cli/npm/resolvers/global.rs | 64 |
1 files changed, 17 insertions, 47 deletions
diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs index 259d9b9a0..94b963898 100644 --- a/cli/npm/resolvers/global.rs +++ b/cli/npm/resolvers/global.rs @@ -1,7 +1,9 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. -use std::io::ErrorKind; +//! Code for global npm cache resolution. + use std::path::Path; +use std::path::PathBuf; use std::sync::Arc; use deno_ast::ModuleSpecifier; @@ -17,9 +19,10 @@ use crate::npm::NpmPackageId; use crate::npm::NpmPackageReq; use crate::npm::NpmRegistryApi; +use super::common::ensure_registry_read_permission; use super::common::InnerNpmPackageResolver; -use super::common::LocalNpmPackageInfo; +/// Resolves packages from the global npm cache. #[derive(Debug, Clone)] pub struct GlobalNpmPackageResolver { cache: NpmCache, @@ -39,45 +42,42 @@ impl GlobalNpmPackageResolver { } } - fn local_package_info(&self, id: &NpmPackageId) -> LocalNpmPackageInfo { - LocalNpmPackageInfo { - folder_path: self.cache.package_folder(id, &self.registry_url), - id: id.clone(), - } + fn package_folder(&self, id: &NpmPackageId) -> PathBuf { + self.cache.package_folder(id, &self.registry_url) } } impl InnerNpmPackageResolver for GlobalNpmPackageResolver { - fn resolve_package_from_deno_module( + fn resolve_package_folder_from_deno_module( &self, pkg_req: &NpmPackageReq, - ) -> Result<LocalNpmPackageInfo, AnyError> { + ) -> Result<PathBuf, AnyError> { let pkg = self.resolution.resolve_package_from_deno_module(pkg_req)?; - Ok(self.local_package_info(&pkg.id)) + Ok(self.package_folder(&pkg.id)) } - fn resolve_package_from_package( + fn resolve_package_folder_from_package( &self, name: &str, referrer: &ModuleSpecifier, - ) -> Result<LocalNpmPackageInfo, AnyError> { + ) -> Result<PathBuf, AnyError> { let referrer_pkg_id = self .cache .resolve_package_id_from_specifier(referrer, &self.registry_url)?; let pkg = self .resolution .resolve_package_from_package(name, &referrer_pkg_id)?; - Ok(self.local_package_info(&pkg.id)) + Ok(self.package_folder(&pkg.id)) } - fn resolve_package_from_specifier( + fn resolve_package_folder_from_specifier( &self, specifier: &ModuleSpecifier, - ) -> Result<LocalNpmPackageInfo, AnyError> { + ) -> Result<PathBuf, AnyError> { let pkg_id = self .cache .resolve_package_id_from_specifier(specifier, &self.registry_url)?; - Ok(self.local_package_info(&pkg_id)) + Ok(self.package_folder(&pkg_id)) } fn has_packages(&self) -> bool { @@ -103,36 +103,6 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver { fn ensure_read_permission(&self, path: &Path) -> Result<(), AnyError> { let registry_path = self.cache.registry_folder(&self.registry_url); - ensure_read_permission(®istry_path, path) + ensure_registry_read_permission(®istry_path, path) } } - -fn ensure_read_permission( - registry_path: &Path, - path: &Path, -) -> Result<(), AnyError> { - // allow reading if it's in the deno_dir node modules - if path.starts_with(®istry_path) - && path - .components() - .all(|c| !matches!(c, std::path::Component::ParentDir)) - { - // todo(dsherret): cache this? - if let Ok(registry_path) = std::fs::canonicalize(registry_path) { - match std::fs::canonicalize(path) { - Ok(path) if path.starts_with(registry_path) => { - return Ok(()); - } - Err(e) if e.kind() == ErrorKind::NotFound => { - return Ok(()); - } - _ => {} // ignore - } - } - } - - Err(deno_core::error::custom_error( - "PermissionDenied", - format!("Reading {} is not allowed", path.display()), - )) -} |