summaryrefslogtreecommitdiff
path: root/contrib/importers/fpm2pass.pl
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