This file is indexed.

/usr/lib/python2.7/dist-packages/DisplayCAL/webwin.py is in dispcalgui 3.5.0.0-1.

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

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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# -*- coding: utf-8 -*-

"""
Re-implementation of Argyll's webwin in pure python.

"""

import BaseHTTPServer
from StringIO import StringIO
import shutil
import threading
import time
from urllib import unquote

from meta import name as appname, version as appversion


WEBDISP_HTML = r"""<!DOCTYPE html>
<html>
<head>
<title>%s Web Display</title>
<script src="webdisp.js"></script>
<style>
html, body {
	background: #000;
	margin: 0;
	padding: 0;
	overflow: hidden;
	height: 100%%;
}
#pattern {
	position: absolute;
	left: 45%%;
	top: 45%%;
	width: 10%%;
	height: 10%%;
}
</style>
</head>
<body>
<div id="pattern"></div>
</body>
</html>
""" % appname

WEBDISP_JS = r"""if (typeof XMLHttpRequest == "undefined") {
	XMLHttpRequest = function () {
		try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
			catch (e) {}
		try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
			catch (e) {}
		try { return new ActiveXObject("Microsoft.XMLHTTP"); }
			catch (e) {}
		throw new Error("This browser does not support XMLHttpRequest.");
	};
}

var cpat = ["#000"];
var oXHR;
var pat;

function XHR_request() {
	oXHR.open("GET", "/ajax/messages?" + encodeURIComponent(cpat.join("|") + "|" + Math.random()), true);
	oXHR.onreadystatechange = XHR_response;
	oXHR.send();
}

function XHR_response() {
	if (oXHR.readyState != 4)
		return;

	if (oXHR.status != 200) {
		return;
	}
	var rt = oXHR.responseText;
	if (rt.charAt(0) == '\r' && rt.charAt(1) == '\n')
		rt = rt.slice(2);
	rt = rt.split("|")
	if (rt[0] && cpat != rt) {
		cpat = rt;
		pat.style.background = rt[1] ? rt[0] : "transparent";  // Older dispwin compat
		document.body.style.background = (rt[1] || rt[0]);  // Older dispwin compat
		if (rt.length == 6) {
			pat.style.left = (rt[2] * 100) + "%";
			pat.style.top = (rt[3] * 100) + "%";
			pat.style.width = (rt[4] * 100) + "%";
			pat.style.height = (rt[5] * 100) + "%";
		}
	}
	setTimeout(XHR_request, 50);
}

window.onload = function() {
	pat = document.getElementById("pattern");

	oXHR = new XMLHttpRequest();
	XHR_request();
};
"""


class WebWinHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

	"""
	Simple HTTP request handler with GET and HEAD commands.

	"""

	server_version = appname + "-WebWinHTTP/" + appversion

	def do_GET(self):
		"""Serve a GET request."""
		s = self.send_head()
		if s:
			self.wfile.write(s)

	def do_HEAD(self):
		"""Serve a HEAD request."""
		self.send_head()

	def log_message(self, format, *args):
		pass

	def send_head(self):
		"""Common code for GET and HEAD commands.

		This sends the response code and MIME headers.

		Return value is either a string (which has to be written
		to the outputfile by the caller unless the command was HEAD), or
		None, in which case the caller has nothing further to do.

		"""
		if self.path == "/":
			s = WEBDISP_HTML
			ctype = "text/html; charset=UTF-8"
		elif self.path == "/webdisp.js":
			s = WEBDISP_JS
			ctype = "application/javascript"
		elif self.path.startswith("/ajax/messages?"):
			curpat = "|".join(unquote(self.path.split("?").pop()).split("|")[:6])
			while (self.server.patterngenerator.listening and
				   self.server.patterngenerator.pattern == curpat):
				time.sleep(0.05)
			s = self.server.patterngenerator.pattern
			ctype = "text/plain; charset=UTF-8"
		else:
			self.send_error(404)
			return
		if self.server.patterngenerator.listening:
			try:
				self.send_response(200)
				self.send_header("Cache-Control", "no-cache")
				self.send_header("Content-Type", ctype)
				self.end_headers()
				return s
			except:
				pass