diff options
Diffstat (limited to 'perl-install/fs/remote/davfs.pm')
| -rw-r--r-- | perl-install/fs/remote/davfs.pm | 71 | 
1 files changed, 51 insertions, 20 deletions
| diff --git a/perl-install/fs/remote/davfs.pm b/perl-install/fs/remote/davfs.pm index ce708f0c0..890530cb9 100644 --- a/perl-install/fs/remote/davfs.pm +++ b/perl-install/fs/remote/davfs.pm @@ -1,4 +1,4 @@ -package fs::remote::davfs; # $Id: smb.pm 231184 2007-10-24 14:36:29Z pixel $ +package fs::remote::davfs;  use strict;  use diagnostics; @@ -6,14 +6,16 @@ use diagnostics;  use common;  use fs::mount_options; -sub secrets_file { "$::prefix/etc/davfs2/secrets" } +sub secrets_file() { "$::prefix/etc/davfs2/secrets" }  sub fstab_entry_to_credentials {      my ($part) = @_;          my ($options, $unknown) = fs::mount_options::unpack($part); -    $options->{'username='} && $options->{'password='} or return;      my %h = map { $_ => delete $options->{"$_="} } qw(username password); +    foreach (qw(username password)) { +        $h{$_} ||= 'nobody'; +    }      $h{mntpoint} = $part->{mntpoint} or return;      fs::mount_options::pack_($part, $options, $unknown), \%h;  } @@ -26,14 +28,25 @@ sub save_credentials {  		     map { to_double_quoted($_->{mntpoint}, $_->{username}, $_->{password}) . "\n" } @$credentials);  } +sub mountpoint_credentials_save { +    my ($mntpoint, $mount_opt) = @_; +    my @entries = read_credentials_raw(); +    my $entry = find { $mntpoint eq $_->{mntpoint} } @entries; +    die "mountpoint not found" if !$entry; +    my %h; +    foreach (@$mount_opt) { +        my @var = split(/=/); +        $h{$var[0]} = $var[1]; +    } +    foreach my $key (qw(username password)) { +        $entry->{$key} = $h{$key}; +    } +    save_credentials(\@entries); +} + -sub read_credentials_raw { -    my ($file) = @_; -    map {  -	my %h; -	@h{'mntpoint', 'username', 'password'} = from_double_quoted($_); -	\%h; -    } cat_(secrets_file()); +sub read_credentials_raw() { +    from_double_quoted(cat_(secrets_file()));  }  sub read_credentials { @@ -41,18 +54,36 @@ sub read_credentials {      find { $mntpoint eq $_->{mntpoint} } read_credentials_raw();  } +# Comments are indicated by a '#' character and the rest of the line +# is ignored. Empty lines are ignored too. +# +# Each line consists of two or three items separated by spaces or tabs. +# If an item contains one of the characters space, tab, #, \ or ", this +# character must be escaped by a preceding \. Alternatively, the item +# may be enclosed in double quotes. +  sub from_double_quoted { -    my ($s) = @_; +    my ($file) = @_;      my @l; -    while (1) { -	(my $e1, my $e2, $s) =  -	  $s =~ /^( "((?:\\.|[^"])*)" | (?:\\.|[^"\s])+ ) (.*)$/x or die "bad entry $_[0]\n"; -	my $entry = defined $e2 ? $e2 : $e1; -	$entry =~ s/\\(.)/$1/g; -	push @l, $entry; -	last if $s eq ''; -	$s =~ s/^\s+// or die "bad entry $_[0]\n"; -	last if $s eq ''; +    my @lines = split("\n",$file); +    foreach (@lines) { +	my ($mnt, $user, $pass, $comment);  +	if (/^\s*(#.*)?$/) { +	    $comment = $1; +	} else { +            if (/^(?:"((?:\\.|[^"])*)"|((?:\\.|[^"\s#])+))\s+(?:"((?:\\.|[^"])*)"|((?:\\.|[^"\s#])+))(?:\s+(?:"((?:\\.|[^"])*)"|((?:\\.|[^"\s#])+)))?(?:\s*|\s*(#.*))?$/) { +	            $mnt = "$1$2"; +		    $mnt =~ s/\\(.)/$1/g; +		    $user = "$3$4"; +	            $user =~ s/\\(.)/$1/g; +		    $pass = "$5$6"; +	            $pass =~ s/\\(.)/$1/g; +		    $comment=$7; +	    } else { +		    die "bad entry $_"; +	    } +        } +        push @l, { 'mntpoint' => $mnt, 'username' => $user, 'password' => $pass, 'comment' => $comment };      }      @l;  } | 
