This file is indexed.

/usr/lib/cups/driver/dymo is in printer-driver-dymo 1.4.0-5.

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
121
122
123
124
125
#!/usr/bin/env python3

# compressor.py
from subprocess import Popen, PIPE

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

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

def decompress(value):
    """Decompresses a byte array 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

import os
import sys
from optparse import OptionParser
from sys import argv
import base64
try:
    import cPickle as pickle
except ImportError:
    import pickle
from io import BytesIO

from os.path import basename
from errno import EPIPE

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

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.items():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            try:
                print(ppd.replace('"', '"' + binary_name + ':', 1))
            except IOError as e:
                # Errors like broken pipes (program which takes the standard
                # output terminates before this program terminates) should not
                # generate a traceback.
                if e.errno == EPIPE: exit(0)
                raise

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'] = BytesIO(decompress(ppds['ARCHIVE']))

    if ppd in ppds:
        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 1.0.2\n" \
              "Copyright (c) 2013 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])
        try:
            # avoid any assumption of encoding or system locale; just print the
            # bytes of the PPD as they are
            if sys.version_info.major < 3:
                sys.stdout.write(ppd)
            else:
                sys.stdout.buffer.write(ppd)
        except IOError as e:
            # Errors like broken pipes (program which takes the standard output
            # terminates before this program terminates) should not generate a
            # traceback.
            if e.errno == EPIPE: exit(0)
            raise
    else:
        parser.error("argument " + args[0] + " invalid")

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

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