1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
package fs::remote::davfs; # $Id: smb.pm 231184 2007-10-24 14:36:29Z pixel $
use strict;
use diagnostics;
use common;
use fs::mount_options;
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);
$h{mntpoint} = $part->{mntpoint} or return;
fs::mount_options::pack_($part, $options, $unknown), \%h;
}
sub save_credentials {
my ($credentials) = @_;
@$credentials or return;
output_with_perm(secrets_file(), 0600,
map { to_double_quoted($_->{mntpoint}, $_->{username}, $_->{password}) . "\n" } @$credentials);
}
sub read_credentials_raw {
my ($file) = @_;
map {
my %h;
@h{'mntpoint', 'username', 'password'} = from_double_quoted($_);
\%h;
} cat_(secrets_file());
}
sub read_credentials {
my ($mntpoint) = @_;
find { $mntpoint eq $_->{mntpoint} } read_credentials_raw();
}
sub from_double_quoted {
my ($s) = @_;
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 '';
}
@l;
}
sub to_double_quoted {
my (@l) = @_;
join(' ', map {
s/(["\\])/\\$1/g;
/\s/ ? qq("$_") : $_;
} @l);
}
1;
|