This file is indexed.

/usr/bin/pasaffe-dump-db is in pasaffe 0.46-0ubuntu1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  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
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
#
# Copyright (C) 2011 Jamie Strandboge <jamie@canonical.com>
# Based on work by Marc Deslauriers <marc.deslauriers@canonical.com>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 3, as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranties of
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
# PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see <http://www.gnu.org/licenses/>.
#

import getpass
import sys
import os
import struct
import time
from optparse import OptionParser

import gettext
from gettext import gettext as _
gettext.textdomain('pasaffe')

# Add project root directory (enable symlink and trunk execution)
PROJECT_ROOT_DIRECTORY = os.path.abspath(
    os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0]))))

python_path = []
if os.path.abspath(__file__).startswith('/opt'):
    syspath = sys.path[:]  # copy to avoid infinite loop in pending objects
    for path in syspath:
        opt_path = path.replace('/usr', '/opt/extras.ubuntu.com/pasaffe')
        python_path.insert(0, opt_path)
        sys.path.insert(0, opt_path)
if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'pasaffe')) and
        PROJECT_ROOT_DIRECTORY not in sys.path):
    python_path.insert(0, PROJECT_ROOT_DIRECTORY)
    sys.path.insert(0, PROJECT_ROOT_DIRECTORY)
if python_path:
    # for subprocesses
    os.putenv('PYTHONPATH', "%s:%s" % (os.getenv('PYTHONPATH', ''),
                                       ':'.join(python_path)))

from pasaffe_lib import readdb
from pasaffe_lib.helpers import get_database_path

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="specify alternate GPass database file", metavar="FILE")
parser.add_option("-m", "--masterpassword", dest="master", default=None,
                  help="specify Pasaffe database master password")
parser.add_option("-q", "--quiet", dest="quiet", action="store_true",
                  default=False, help="quiet messages")
parser.add_option("-d", "--dump", dest="dump", action="store_true",
                  default=False, help="print raw dump")

(options, args) = parser.parse_args()

if options.filename is None:
    db_filename = get_database_path()
else:
    db_filename = options.filename

if not os.path.exists(db_filename):
    print("\n\nERROR: Could not locate database file!")
    sys.exit(1)

if not options.quiet:
    print("WARNING: this will display all password entries.")

if options.dump:
    fixup = False
else:
    fixup = True

count = 0
max_tries = 3
while count < max_tries:
    count += 1
    if options.master is not None:
        master = options.master
    else:
        master = getpass.getpass("Password> ")
    try:
        passfile = readdb.PassSafeFile(db_filename, master, fixup=fixup)
        break
    except ValueError:
        print("Sorry, try again.")

    if count >= max_tries:
        print(("%d incorrect password attempts" % (count)))
        sys.exit(1)

record_dict = {'Entry': 3,
               'Username': 4,
               'Notes': 5,
               'Password': 6,
               'URL': 13
               }

if options.dump:
    print("Printing raw dump of database:\n")
    print(passfile.records)
    sys.exit(0)

for record in sorted(list(passfile.records.values()),
                     key=lambda entry: entry[3].lower()):
    # specify order of labels and values
    for label in ['Entry', 'Username', 'Password', 'URL', 'Notes']:
        record_type = record_dict[label]
        if record_type in record and record[record_type] != "":
            print(("%s: %s" % (label, record[record_type])))
    print("")