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;