blob: d1a0908eae641f3ace3e2b65754a7672360bfc05 (
plain)
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
69
70
71
72
73
74
75
76
77
78
79
|
#!/usr/bin/perl
# Copyright (C) 2012 Jeffrey Ratcliffe <jeffrey.ratcliffe@gmail.com>. All Rights Reserved.
# This file is licensed under the GPLv2+. Please see COPYING for more information.
use warnings;
use strict;
use XML::Simple;
use Getopt::Long;
use Pod::Usage;
my ($help, $man);
my @args = ('help' => \$help,
'man' => \$man,);
GetOptions (@args) or pod2usage(2);
pod2usage(1) if ($help);
pod2usage(-exitstatus => 0, -verbose => 2) if $man;
pod2usage(
-msg => "Syntax error: must specify a file to read.",
-exitval => 2,
-verbose => 1
)
if (@ARGV != 1);
# Grab the XML to a perl structure
my $xs = XML::Simple->new();
my $doc = $xs->XMLin(shift);
for (@{$doc->{PasswordList}{PasswordItem}}) {
my $name;
if (ref($_->{category}) eq 'HASH') {
$name = escape($_->{title});
}
else {
$name = escape($_->{category})."/".escape($_->{title});
}
my $contents = '';
$contents .= "$_->{password}\n" unless (ref($_->{password}) eq 'HASH');
$contents .= "user $_->{user}\n" unless (ref($_->{user}) eq 'HASH');
$contents .= "url $_->{url}\n" unless (ref($_->{url}) eq 'HASH');
unless (ref($_->{notes}) eq 'HASH') {
$_->{notes} =~ s/\n/\n /g;
$contents .= "notes:\n $_->{notes}\n";
}
my $cmd = "pass insert -f -m $name";
my $pid = open(my $fh, "| $cmd") or die "Couldn't fork: $!\n";
print $fh $contents;
close $fh;
}
# escape inverted commas, spaces, ampersands and brackets
sub escape {
my ($s) = @_;
$s =~ s/\//-/g;
$s =~ s/(['\(\) &])/\\$1/g;
return $s;
}
=head1 NAME
fpm2pass.pl - imports an .xml exported by fpm2 into pass
=head1 SYNOPSIS
=head1 USAGE
fpm2pass.pl [--help] [--man] <xml>
The following options are available:
=over
=item --help
=item --man
=back
=cut
|