diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-06 21:22:22 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-06 21:33:05 +0900 |
| commit | 8bd02532cd04ee12d7595029c206f3dc5ab9dd96 (patch) | |
| tree | 5f9897bfefcb9a503d92560311c4d95ee620a025 /crates/shirabe/src/util | |
| parent | c0b743c8d75813003756a72d2fdd110de8368b5f (diff) | |
| download | php-shirabe-8bd02532cd04ee12d7595029c206f3dc5ab9dd96.tar.gz php-shirabe-8bd02532cd04ee12d7595029c206f3dc5ab9dd96.tar.zst php-shirabe-8bd02532cd04ee12d7595029c206f3dc5ab9dd96.zip | |
chore(shirabe): remove ports of PHP @deprecated APIs
Composer does not use its own deprecated APIs internally, so drop their
Rust ports: whole deprecated classes, methods, constants, and field.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/util')
| -rw-r--r-- | crates/shirabe/src/util/auth_helper.rs | 47 | ||||
| -rw-r--r-- | crates/shirabe/src/util/git.rs | 3 | ||||
| -rw-r--r-- | crates/shirabe/src/util/metadata_minifier.rs | 1 | ||||
| -rw-r--r-- | crates/shirabe/src/util/mod.rs | 4 | ||||
| -rw-r--r-- | crates/shirabe/src/util/tls_helper.rs | 193 |
5 files changed, 4 insertions, 244 deletions
diff --git a/crates/shirabe/src/util/auth_helper.rs b/crates/shirabe/src/util/auth_helper.rs index 0465b10..61970f2 100644 --- a/crates/shirabe/src/util/auth_helper.rs +++ b/crates/shirabe/src/util/auth_helper.rs @@ -5,9 +5,9 @@ use anyhow::Result; use indexmap::IndexMap; use shirabe_external_packages::composer::pcre::Preg; use shirabe_php_shim::{ - E_USER_DEPRECATED, PHP_URL_HOST, PHP_URL_PATH, PHP_URL_SCHEME, PhpMixed, RuntimeException, - base64_encode, explode, in_array, is_array, is_string, json_decode, parse_url, sprintf, - str_replace, strpos, strtolower, substr, trigger_error, trim, + PHP_URL_HOST, PHP_URL_PATH, PHP_URL_SCHEME, PhpMixed, RuntimeException, base64_encode, explode, + in_array, is_array, is_string, json_decode, parse_url, sprintf, str_replace, strpos, + strtolower, substr, trim, }; use crate::config::Config; @@ -478,47 +478,6 @@ impl AuthHelper { }) } - /// @deprecated use addAuthenticationOptions instead - /// - /// @param string[] $headers - /// - /// @return string[] updated headers array - pub fn add_authentication_header( - &mut self, - headers: Vec<String>, - origin: &str, - url: &str, - ) -> Result<Vec<String>> { - trigger_error( - "AuthHelper::addAuthenticationHeader is deprecated since Composer 2.9 use addAuthenticationOptions instead.", - E_USER_DEPRECATED, - ); - - // PHP: $options = ['http' => ['header' => &$headers]]; - // PHP uses references so subsequent mutations affect $headers - let mut options: IndexMap<String, PhpMixed> = IndexMap::new(); - let mut http: IndexMap<String, Box<PhpMixed>> = IndexMap::new(); - http.insert( - "header".to_string(), - Box::new(PhpMixed::List( - headers - .iter() - .map(|h| Box::new(PhpMixed::String(h.clone()))) - .collect(), - )), - ); - options.insert("http".to_string(), PhpMixed::Array(http)); - - let options = self.add_authentication_options(options, origin, url)?; - - let http = options.get("http").and_then(|v| v.as_array()).unwrap(); - let header = http.get("header").and_then(|v| v.as_list()).unwrap(); - Ok(header - .iter() - .filter_map(|v| v.as_string().map(|s| s.to_string())) - .collect()) - } - /// @param array<string, mixed> $options /// /// @return array<string, mixed> updated options diff --git a/crates/shirabe/src/util/git.rs b/crates/shirabe/src/util/git.rs index b2438c7..7e9619c 100644 --- a/crates/shirabe/src/util/git.rs +++ b/crates/shirabe/src/util/git.rs @@ -135,8 +135,7 @@ impl Git { /// @param callable|array<callable> $commandCallable /// @param mixed $commandOutput the output will be written into this var if passed by ref /// if a callable is passed it will be used as output handler - /// @deprecated Use runCommands with placeholders instead of callbacks for simplicity - pub fn run_command( + fn run_command( &mut self, command_callable: Vec<Box<dyn Fn(&str) -> Vec<String>>>, url: &str, diff --git a/crates/shirabe/src/util/metadata_minifier.rs b/crates/shirabe/src/util/metadata_minifier.rs deleted file mode 100644 index ddad547..0000000 --- a/crates/shirabe/src/util/metadata_minifier.rs +++ /dev/null @@ -1 +0,0 @@ -//! ref: composer/src/Composer/Util/MetadataMinifier.php diff --git a/crates/shirabe/src/util/mod.rs b/crates/shirabe/src/util/mod.rs index 633928b..d34fce5 100644 --- a/crates/shirabe/src/util/mod.rs +++ b/crates/shirabe/src/util/mod.rs @@ -15,7 +15,6 @@ pub mod http; pub mod http_downloader; pub mod ini_helper; pub mod r#loop; -pub mod metadata_minifier; pub mod no_proxy_pattern; pub mod package_info; pub mod package_sorter; @@ -28,7 +27,6 @@ pub mod stream_context_factory; pub mod svn; pub mod sync_helper; pub mod tar; -pub mod tls_helper; pub mod url; pub mod zip; @@ -48,7 +46,6 @@ pub use hg::*; pub use http::*; pub use http_downloader::*; pub use ini_helper::*; -pub use metadata_minifier::*; pub use no_proxy_pattern::*; pub use package_info::*; pub use package_sorter::*; @@ -61,6 +58,5 @@ pub use stream_context_factory::*; pub use svn::*; pub use sync_helper::*; pub use tar::*; -pub use tls_helper::*; pub use url::*; pub use zip::*; diff --git a/crates/shirabe/src/util/tls_helper.rs b/crates/shirabe/src/util/tls_helper.rs deleted file mode 100644 index 0c20dd4..0000000 --- a/crates/shirabe/src/util/tls_helper.rs +++ /dev/null @@ -1,193 +0,0 @@ -//! ref: composer/src/Composer/Util/TlsHelper.php - -use shirabe_external_packages::composer::ca_bundle::CaBundle; -use shirabe_external_packages::composer::pcre::Preg; -use shirabe_php_shim::{ - PhpMixed, RuntimeException, base64_decode, openssl_get_publickey, openssl_pkey_get_details, - openssl_x509_parse, preg_quote, substr_count, -}; - -/// @deprecated Use composer/ca-bundle and composer/composer 2.2 if you still need PHP 5 compatibility -pub struct TlsHelper; - -impl TlsHelper { - pub fn check_certificate_host( - certificate: &PhpMixed, - hostname: &str, - cn: &mut Option<String>, - ) -> bool { - let names = match Self::get_certificate_names(certificate) { - Some(n) => n, - None => return false, - }; - - let mut combined_names = names.san.clone(); - combined_names.push(names.cn.clone()); - let hostname = hostname.to_lowercase(); - - for cert_name in &combined_names { - if let Some(matcher) = Self::cert_name_matcher(cert_name) { - if matcher(&hostname) { - *cn = Some(names.cn.clone()); - return true; - } - } - } - - false - } - - pub fn get_certificate_names(certificate: &PhpMixed) -> Option<CertificateNames> { - let info = match certificate { - PhpMixed::Array(arr) => arr.clone(), - _ => { - if CaBundle::is_openssl_parse_safe() { - if let PhpMixed::String(cert_str) = certificate { - openssl_x509_parse(cert_str, false)? - } else { - return None; - } - } else { - return None; - } - } - }; - - let common_name = info - .get("subject") - .and_then(|v| v.as_array()) - .and_then(|subj| subj.get("commonName")) - .and_then(|cn| cn.as_string()) - .map(|s| s.to_lowercase())?; - - let mut subject_alt_names = vec![]; - if let Some(san_value) = info - .get("extensions") - .and_then(|v| v.as_array()) - .and_then(|ext| ext.get("subjectAltName")) - .and_then(|v| v.as_string()) - { - let parts = Preg::split(r"{\s*,\s*}", san_value).unwrap_or_default(); - for name in parts { - if name.starts_with("DNS:") { - let dns = name[4..].trim_start().to_lowercase(); - subject_alt_names.push(dns); - } - } - } - - Some(CertificateNames { - cn: common_name, - san: subject_alt_names, - }) - } - - /// Get the certificate pin. - /// - /// By Kevin McArthur of StormTide Digital Studios Inc. - /// @KevinSMcArthur / https://github.com/StormTide - /// - /// See https://tools.ietf.org/html/draft-ietf-websec-key-pinning-02 - /// - /// This method was adapted from Sslurp. - /// https://github.com/EvanDotPro/Sslurp - /// - /// (c) Evan Coury <me@evancoury.com> - /// - /// For the full copyright and license information, please see below: - /// - /// Copyright (c) 2013, Evan Coury - /// All rights reserved. - /// - /// Redistribution and use in source and binary forms, with or without modification, - /// are permitted provided that the following conditions are met: - /// - /// * Redistributions of source code must retain the above copyright notice, - /// this list of conditions and the following disclaimer. - /// - /// * Redistributions in binary form must reproduce the above copyright notice, - /// this list of conditions and the following disclaimer in the documentation - /// and/or other materials provided with the distribution. - /// - /// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - /// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - /// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - /// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - /// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - /// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - /// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - /// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - /// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - /// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - pub fn get_certificate_fingerprint(certificate: &str) -> anyhow::Result<String> { - let pubkey = openssl_get_publickey(certificate).ok_or_else(|| RuntimeException { - message: "Failed to retrieve the public key from certificate".to_string(), - code: 0, - })?; - let pubkeydetails = openssl_pkey_get_details(pubkey).ok_or_else(|| RuntimeException { - message: "Failed to retrieve public key details".to_string(), - code: 0, - })?; - let pubkeypem = pubkeydetails - .get("key") - .and_then(|v| v.as_string()) - .unwrap_or("") - .to_string(); - - let start = "-----BEGIN PUBLIC KEY-----"; - let end = "-----END PUBLIC KEY-----"; - let start_pos = pubkeypem.find(start).unwrap_or(0) + start.len(); - let end_pos = pubkeypem.rfind(end).unwrap_or(pubkeypem.len()); - let pemtrim = &pubkeypem[start_pos..end_pos]; - - let der = base64_decode(pemtrim).unwrap_or_default(); - - Ok(shirabe_php_shim::hash( - "sha1", - &String::from_utf8_lossy(&der), - )) - } - - pub fn is_openssl_parse_safe() -> bool { - CaBundle::is_openssl_parse_safe() - } - - fn cert_name_matcher(cert_name: &str) -> Option<Box<dyn Fn(&str) -> bool>> { - let wildcards = substr_count(cert_name, "*"); - - if wildcards == 0 { - let name = cert_name.to_string(); - return Some(Box::new(move |hostname: &str| hostname == name)); - } - - if wildcards == 1 { - let components: Vec<&str> = cert_name.split('.').collect(); - - if components.len() < 3 { - return None; - } - - let first_component = components[0]; - - if !first_component.ends_with('*') { - return None; - } - - let mut wildcard_regex = preg_quote(cert_name, None); - wildcard_regex = wildcard_regex.replace("\\*", "[a-z0-9-]+"); - let wildcard_regex = format!("{{^{}$}}", wildcard_regex); - - return Some(Box::new(move |hostname: &str| { - Preg::is_match(&wildcard_regex, hostname).unwrap_or(false) - })); - } - - None - } -} - -#[derive(Debug)] -pub struct CertificateNames { - pub cn: String, - pub san: Vec<String>, -} |
