This file is indexed.

/usr/lib/cups/driver/ptouch is in printer-driver-ptouch 1.3-3.

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
#!/usr/bin/env python

# compressor.py
from subprocess import Popen, PIPE

def compress(value):
    """Compresses a string with the xz binary"""

    process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def decompress(value):
    """Decompresses a string with the xz binary"""

    process = Popen(["xz", "--decompress", "--stdout", "--force"],
                    stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def compress_file(path):
    """Compress the file at 'path' with the xz binary"""

    process = Popen(["xz", "--compress", "--force", "--stdout", path], stdout=PIPE)
    return process.communicate()[0]

# compressor.py

from optparse import OptionParser
from sys import argv
import base64
import cPickle
from cStringIO import StringIO
from os.path import basename

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = cPickle.loads(ppds_decompressed)
    return ppds

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.iteritems():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            print ppd.replace('"', '"' + binary_name + ':', 1)

def cat(ppd):
    # Ignore driver's name, take only PPD's
    ppd = ppd.split(":")[-1]
    # Remove also the index
    ppd = "0/" + ppd[ppd.find("/")+1:]

    ppds = load()
    ppds['ARCHIVE'] = StringIO(decompress(ppds['ARCHIVE']))

    if ppds.has_key(ppd):
        start = ppds[ppd][0]
        length = ppds[ppd][1]
        ppds['ARCHIVE'].seek(start)
        return ppds['ARCHIVE'].read(length)

def main():
    usage = "usage: %prog list\n" \
            "       %prog cat URI"
    version = "%prog 0.4.9\n" \
              "Copyright (c) 2010 Vitor Baptista.\n" \
              "This is free software; see the source for copying conditions.\n" \
              "There is NO warranty; not even for MERCHANTABILITY or\n" \
              "FITNESS FOR A PARTICULAR PURPOSE."
    parser = OptionParser(usage=usage,
                          version=version)
    (options, args) = parser.parse_args()

    if len(args) == 0 or len(args) > 2:
        parser.error("incorrect number of arguments")

    if args[0].lower() == 'list':
        ls()
    elif args[0].lower() == 'cat':
        if not len(args) == 2:
            parser.error("incorrect number of arguments")
        ppd = cat(args[1])
        if not ppd:
            parser.error("Printer '%s' does not have default driver!" % args[1])
        print ppd
    else:
        parser.error("argument " + args[0] + " invalid")

# PPDs Archive
ppds_compressed_b64 = "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"

if __name__ == "__main__":
    try:
        main()
    except (IOError, KeyboardInterrupt):
        # We don't want neither IOError nor KeyboardInterrupt throwing a
        # traceback into stdout.
        pass