From b301b159da25b16fa84824f88f216b6fd060f079 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Sat, 31 Jul 2021 13:13:04 +0100 Subject: [PATCH] Fix a bug --- Makefile | 6 +++++- crates/librqbit/src/torrent_manager.rs | 12 +++++------- crates/librqbit_core/src/torrent_metainfo.rs | 14 ++------------ crates/rqbit/src/main.rs | 12 ++++++++++++ 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 6fb7214..d217c04 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,19 @@ all: sign-release sign-debug +@PHONY: sign-debug sign-debug: codesign -f --entitlements resources/debugging.entitlements -s - target/debug/rqbit +@PHONY: sign-release sign-release: codesign -f --entitlements resources/debugging.entitlements -s - target/release/rqbit +@PHONY: build-release build-release: cargo build --release +@PHONY: install install: build-release $(MAKE) build-release $(MAKE) sign-release - cp target/release/rqbit "$(HOME)/bin/" \ No newline at end of file + install target/release/rqbit "$(HOME)/bin/" \ No newline at end of file diff --git a/crates/librqbit/src/torrent_manager.rs b/crates/librqbit/src/torrent_manager.rs index fa5126c..3f5396a 100644 --- a/crates/librqbit/src/torrent_manager.rs +++ b/crates/librqbit/src/torrent_manager.rs @@ -19,6 +19,7 @@ use parking_lot::Mutex; use reqwest::Url; use sha1w::Sha1; use size_format::SizeFormatterBinary as SF; +use warp::path::full; use crate::{ chunk_tracker::ChunkTracker, @@ -167,13 +168,10 @@ impl TorrentManager { for (path_bits, _) in info.iter_filenames_and_lengths()? { let mut full_path = out.as_ref().to_owned(); - for bit in path_bits.iter_components() { - full_path.push( - bit.as_ref() - .map(|b| std::str::from_utf8(b.as_ref())) - .unwrap_or(Ok("output"))?, - ); - } + let relative_path = path_bits + .to_pathbuf() + .context("error converting file to path")?; + full_path.push(relative_path); std::fs::create_dir_all(full_path.parent().unwrap())?; let file = if options.overwrite { diff --git a/crates/librqbit_core/src/torrent_metainfo.rs b/crates/librqbit_core/src/torrent_metainfo.rs index af6cb41..0b65a3e 100644 --- a/crates/librqbit_core/src/torrent_metainfo.rs +++ b/crates/librqbit_core/src/torrent_metainfo.rs @@ -132,7 +132,7 @@ impl<'a, ByteBuf> FileIteratorName<'a, ByteBuf> { }; let bit = std::str::from_utf8(part.as_ref()) .context("cannot decode filename bit as UTF-8")?; - if bit.contains("..") { + if bit == ".." { anyhow::bail!("path traversal detected, \"..\" in filename bit {:?}", bit); } if bit.contains(std::path::MAIN_SEPARATOR) { @@ -192,17 +192,7 @@ impl> TorrentMetaV1Info { Ok(single_it.chain(multi_it).flatten()) } pub fn iter_file_lengths(&self) -> anyhow::Result + '_> { - self.is_single_file()?; - let it = std::iter::once(self.length) - .chain( - self.files - .as_deref() - .unwrap_or_default() - .iter() - .map(|f| Some(f.length)), - ) - .flatten(); - Ok(it) + Ok(self.iter_filenames_and_lengths()?.map(|(_, l)| l)) } } diff --git a/crates/rqbit/src/main.rs b/crates/rqbit/src/main.rs index e19dd3b..396220b 100644 --- a/crates/rqbit/src/main.rs +++ b/crates/rqbit/src/main.rs @@ -321,6 +321,18 @@ async fn main_torrent_info( }; if opts.list { + for (idx, (filename, len)) in info.iter_filenames_and_lengths()?.enumerate() { + let included = match &only_files { + Some(files) => files.contains(&idx), + None => true, + }; + info!( + "File {}, size {}{}", + filename.to_string()?, + SF::new(len), + if included { "" } else { "will skip" } + ) + } info!("--list was passed, nothing to do, exiting."); return Ok(()); }