summaryrefslogtreecommitdiffstats
path: root/perl-install/fs/remote/davfs.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/fs/remote/davfs.pm')
-rw-r--r--perl-install/fs/remote/davfs.pm71
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;
}