@@ -21,7 +21,7 @@ use crate::utils::{fmt as fmt_utils, parser as parser_utils, path as path_utils}
21
21
22
22
/// NOTE: about this damn regex <https://stackoverflow.com/questions/32480890/is-there-a-regex-to-parse-the-values-from-an-ftp-directory-listing>
23
23
static LS_RE : Lazy < Regex > = lazy_regex ! (
24
- r#"^([\-ld])([\-rwxsStT]{9})\ s+(\d+)\s+(.+)\s+(.+)\s+(\d+)\s+(\w{3}\s+\d{1,2}\s+(?:\d{1,2}:\d{1,2}|\d{4}))\s+(.+)$"#
24
+ r#"^(?<sym_dir> [\-ld])(?<pex> [\-rwxsStT]{9})(?<sec_ctx>\.|\+|\@)?\ s+(?<n_links> \d+)\s+(?<uid> .+)\s+(?<gid> .+)\s+(?<size> \d+)\s+(?<date_time> \w{3}\s+\d{1,2}\s+(?:\d{1,2}:\d{1,2}|\d{4}))\s+(?<name> .+)$"#
25
25
) ;
26
26
27
27
/// SCP "filesystem" client
@@ -72,20 +72,21 @@ impl ScpFs {
72
72
}
73
73
// Collect metadata
74
74
// Get if is directory and if is symlink
75
- let ( is_dir, is_symlink) : ( bool , bool ) = match metadata. get ( 1 ) . unwrap ( ) . as_str ( ) {
75
+
76
+ let ( is_dir, is_symlink) : ( bool , bool ) = match & metadata[ "sym_dir" ] {
76
77
"-" => ( false , false ) ,
77
78
"l" => ( false , true ) ,
78
79
"d" => ( true , false ) ,
79
80
_ => return Err ( ( ) ) , // Ignore special files
80
81
} ;
81
82
// Check string length (unix pex)
82
- if metadata. get ( 2 ) . unwrap ( ) . as_str ( ) . len ( ) < 9 {
83
+ if metadata[ "pex" ] . len ( ) < 9 {
83
84
return Err ( ( ) ) ;
84
85
}
85
86
86
87
let pex = |range : Range < usize > | {
87
88
let mut count: u8 = 0 ;
88
- for ( i, c) in metadata. get ( 2 ) . unwrap ( ) . as_str ( ) [ range] . chars ( ) . enumerate ( ) {
89
+ for ( i, c) in metadata[ "pex" ] [ range] . chars ( ) . enumerate ( ) {
89
90
match c {
90
91
'-' => { }
91
92
_ => {
@@ -110,34 +111,23 @@ impl ScpFs {
110
111
111
112
// Parse modified and convert to SystemTime
112
113
let modified: SystemTime = match parser_utils:: parse_lstime (
113
- metadata. get ( 7 ) . unwrap ( ) . as_str ( ) ,
114
+ & metadata[ "date_time" ] ,
114
115
"%b %d %Y" ,
115
116
"%b %d %H:%M" ,
116
117
) {
117
118
Ok ( t) => t,
118
119
Err ( _) => SystemTime :: UNIX_EPOCH ,
119
120
} ;
120
121
// Get uid
121
- let uid: Option < u32 > = match metadata. get ( 4 ) . unwrap ( ) . as_str ( ) . parse :: < u32 > ( ) {
122
- Ok ( uid) => Some ( uid) ,
123
- Err ( _) => None ,
124
- } ;
122
+ let uid: Option < u32 > = metadata[ "uid" ] . parse :: < u32 > ( ) . ok ( ) ;
125
123
// Get gid
126
- let gid: Option < u32 > = match metadata. get ( 5 ) . unwrap ( ) . as_str ( ) . parse :: < u32 > ( ) {
127
- Ok ( gid) => Some ( gid) ,
128
- Err ( _) => None ,
129
- } ;
124
+ let gid: Option < u32 > = metadata[ "gid" ] . parse :: < u32 > ( ) . ok ( ) ;
130
125
// Get filesize
131
- let size = metadata
132
- . get ( 6 )
133
- . unwrap ( )
134
- . as_str ( )
135
- . parse :: < u64 > ( )
136
- . unwrap_or ( 0 ) ;
126
+ let size = metadata[ "size" ] . parse :: < u64 > ( ) . unwrap_or ( 0 ) ;
137
127
// Get link and name
138
128
let ( file_name, symlink) : ( String , Option < PathBuf > ) = match is_symlink {
139
- true => self . get_name_and_link ( metadata. get ( 8 ) . unwrap ( ) . as_str ( ) ) ,
140
- false => ( String :: from ( metadata. get ( 8 ) . unwrap ( ) . as_str ( ) ) , None ) ,
129
+ true => self . get_name_and_link ( & metadata[ "name" ] ) ,
130
+ false => ( String :: from ( & metadata[ "name" ] ) , None ) ,
141
131
} ;
142
132
// Sanitize file name
143
133
let file_name = PathBuf :: from ( & file_name)
@@ -146,7 +136,6 @@ impl ScpFs {
146
136
. unwrap_or ( file_name) ;
147
137
// Check if file_name is '.' or '..'
148
138
if file_name. as_str ( ) == "." || file_name. as_str ( ) == ".." {
149
- debug ! ( "File name is {}; ignoring entry" , file_name) ;
150
139
return Err ( ( ) ) ;
151
140
}
152
141
// Re-check if is directory
0 commit comments