App-Kit

 view release on metacpan or  search on metacpan

lib/App/Kit/Obj/FS.pm  view on Meta::CPAN

    },
);

has inc => (
    'is'      => 'rw',
    'default' => sub { [] },
    'isa'     => sub { die "'inc' must be an array ref" unless ref( $_[0] ) eq 'ARRAY' },
);

# has starting_dir => (
#     'is'      => 'rw',
#     'default' => sub { undef },
# );

Sub::Defer::defer_sub __PACKAGE__ . '::read_dir' => sub {
    require File::Slurp;
    return sub {
        shift;
        goto &File::Slurp::read_dir;
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::read_file' => sub {
    require File::Slurp;
    return sub {
        shift;
        goto &File::Slurp::read_file;
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::write_file' => sub {
    require File::Slurp;
    return sub {
        shift;
        goto &File::Slurp::write_file;
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::get_iterator' => sub {
    require Path::Iter;
    return sub {
        shift;
        goto &Path::Iter::get_iterator;
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::yaml_write' => sub {
    require YAML::Syck;
    return sub {
        my ( $self, $file, $ref ) = @_;

        local $YAML::Syck::ImplicitTyping = 0;
        local $YAML::Syck::SingleQuote    = 1;    # to keep from arbitrary quoting/unquoting (to help make diff's cleaner)
        local $YAML::Syck::SortKeys       = 1;    # to make diff's cleaner

        return YAML::Syck::DumpFile( $file, $ref );    # this does not keep the same $YAML::Syck:: vars apparently: shift;goto &YAML::Syck::DumpFile;

        # as of at least v1.27 it writes the characters without \x escaping so no need for:
        # return $self->write_file(
        #     $file,
        #     String::UnicodeUTF8::unescape_utf8( YAML::Syck::Dump($ref) )
        # );
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::yaml_read' => sub {
    require YAML::Syck;
    return sub {
        my ( $self, $file ) = @_;
        local $YAML::Syck::ImplicitTyping = 0;
        return YAML::Syck::LoadFile($file);    # this does not keep the same $YAML::Syck:: vars apparently: shift;goto &YAML::Syck::LoadFile;
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::json_write' => sub {
    require JSON::Syck;
    return sub {
        shift;
        goto &JSON::Syck::DumpFile;            # already does ♥ instead of \xe2\x99\xa5 (i.e. so no need for String::UnicodeUTF8::unescape_utf8() like w/ the YAML above)
    };
};

Sub::Defer::defer_sub __PACKAGE__ . '::json_read' => sub {
    require JSON::Syck;
    return sub {
        shift;
        goto &JSON::Syck::LoadFile;
    };
};

sub is_safe_part {
    my ( $fs, $part ) = @_;

    return if !defined($part) || !length($part) || $part eq $fs->spec->updir;
    return if scalar( $fs->spec->splitdir($part) ) != 1;
    return if utf8::is_utf8($part);    # a Unicode string, see String::UnicodeUTF8
    return if $part =~ m/[><|*&]/;     # some common shell meta characters

    my $cleaned = $fs->_app->str->trim( $part, 1 );
    return if $cleaned ne $part;

    return 1;
}

sub is_safe_path {
    my ( $fs, $path, $abs_ok, $trl_ok ) = @_;

    return if !defined($path) || !length($path);
    return if utf8::is_utf8($path);    # a Unicode string, see String::UnicodeUTF8

    my @parts = $fs->spec->splitdir($path);

    return if !$abs_ok && $parts[0] eq '';
    return if !$trl_ok && $parts[-1] eq '';

    for my $idx ( 0 .. $#parts ) {
        next if $idx == 0 && $parts[$idx] eq '';
        next if $idx == $#parts && $parts[$idx] eq '';
        return if !$fs->is_safe_part( $parts[$idx] );
    }

    return 1;
}

# TODO new FCR

1;

__END__

=encoding utf-8

=head1 NAME

App::Kit::Obj::FS - file system utility object

=head1 VERSION

This document describes App::Kit::Obj::FS version 0.1



( run in 1.367 second using v1.01-cache-2.11-cpan-39bf76dae61 )