Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "use strict";
- var lastUrl = "";
- var lastTitle = "";
- var lastBlockedUrl = "";
- var useXMLHttp = true;
- var limitingFlags = 0;
- var limitingState = 0;
- var urlList = [];
- var rawUrlList = [];
- var urlListType = 0;
- var receivedHeartBeat = false;
- var blockIPAddresses = false;
- var blockIncognito = false;
- var tabWindowId = 0;
- var studentConfigReceived = false;
- var lastLimitFlags = 0;
- var limitTimeout = 30;
- var ALLOW_ALL = "0";
- var BLOCK_ALL = "1";
- var ALLOW_SPECIFIC = "2";
- var BLOCK_SPECIFIC = "3";
- var DISABLE_WEB_PORT80 = 2147483872;
- var ALLOW_SPECIFIC_APPS = 524512;
- var DISABLE_SPECIFIC_APPS = 1048800;
- var DISABLE_DOTTEDCECIMALS = 4194304;
- var DISABLE_WEB_CHROME = 480;
- var ENABLE_TASKMANAGER = 736;
- var DISABLE_PRIVATE_BROWSE = 1248;
- var DISABLE_TASKMANAGER = 4320;
- var ChromeAppsWhitelist = ["cclepbmimdmoahcbccbpbnpfnaakheja", "ifeifkfohlobcbhmlfkenopaimbmnahb", "hgdgmhjbhldlejgpjbphhoegapekcbcc", "glifclcedbcpeplpmnplaekopdgjggcd", "jhiggjblhjhknbhjffjpfoanbghcfmga", "cdjokdjlmmgodojedmlfppkfnnjnfigf", "kmklemnfjbnkliegakkhbbljlmhohcjf"];
- var currentStudent = "";
- var myPort = 56797;
- var portDead = false;
- var studentConfigData = null;
- var neverBlock = ["chrome-extension://", "chrome://", "chrome-devtools://", "file://"];
- function PostHistory(c, g) {
- if (useXMLHttp == false) {
- return
- }
- if (portDead) {
- console.log("PostHistory - port is dead");
- return
- }
- console.log("PostHistory: ");
- try {
- if (c.active === null || c.active == false) {
- console.log("tab is not active: " + c.url);
- return
- }
- if (c.url.valueOf() == lastBlockedUrl.valueOf()) {
- console.log("not reporting history for blocked url " + c.url);
- return
- }
- var d = JSON.stringify(c.title);
- d = d.trim();
- if (c.url.valueOf() != lastUrl.valueOf() && lastTitle.valueOf() != d.valueOf()) {
- if (useXMLHttp == false) {
- return
- }
- var b = new XMLHttpRequest();
- if (g === null) {
- g = "en"
- }
- b.open("POST", "http://localhost:" + myPort + "/History", false);
- var a = JSON.stringify({
- url: c.url,
- title: d,
- lang: g,
- windowId: c.windowId
- });
- b.setRequestHeader("Content-Type", "application/json");
- b.send(a);
- lastUrl = c.url;
- lastTitle = d
- } else {
- console.log("already posted history for " + lastUrl + " title: " + lastTitle)
- }
- } catch (f) {
- console.log("exception in PostHistory: " + f.message + " code " + f.code);
- if (f.code == 19) {
- console.log("network error!");
- portDead = true
- }
- }
- }
- function PostNewUrl(c) {
- if (useXMLHttp == false) {
- return
- }
- if (portDead) {
- console.log("PostNewUrl - port is dead");
- return
- }
- try {
- var a = new XMLHttpRequest();
- a.open("POST", "http://localhost:" + myPort + "/WebLimit", false);
- var f = JSON.stringify({
- url: c.url
- });
- a.setRequestHeader("Content-Type", "application/json");
- a.send(f);
- var d = a.responseText;
- d = d.trim();
- if (a.status == 200) {
- var b = JSON.parse(d);
- if (b.block != null) {
- if (b.block == "true") {
- lastBlockedUrl = c.url;
- if (c.url.substring(0, 12) == "view-source:") {
- chrome.tabs.remove(c.id, null);
- console.log("tried to remove the view-source tab!")
- } else {
- var f = JSON.stringify(b.redirect);
- var h = """;
- var j = new RegExp(h, "g");
- f = f.replace(j, '\\"');
- var i = 'document.head.innerHTML = ""; document.body.innerHTML = ' + f + ";";
- console.log("PostNewUrl: site is blocked: " + c.url);
- chrome.tabs.insertCSS(c.tabId, {
- file: "style.css",
- runAt: "document_end"
- });
- chrome.tabs.executeScript(c.tabId, {
- code: i
- })
- }
- } else {
- console.log("PostNewUrl: site is allowed: " + c.url)
- }
- } else {
- console.log("PostNewUrl failed to get response from sserver")
- }
- } else {
- console.log("PostNewUrl bad response from sserver: " + a.status)
- }
- } catch (g) {
- console.log("exception in PostNewUrl: " + g.message + " code " + g.code);
- if (g.code == 19) {
- console.log("network error!");
- portDead = true
- }
- }
- }
- function discoverPort() {
- chrome.runtime.getPlatformInfo(function(b) {
- console.log("operating system: " + b.os);
- if (b.os == "win") {
- console.log("trying to load file");
- try {
- var d = chrome.extension.getURL("svrproc42");
- console.log(d);
- var c = new XMLHttpRequest();
- c.open("GET", d, true);
- c.onreadystatechange = function() {
- if (c.readyState == XMLHttpRequest.DONE && c.status == 200) {
- console.log(c.responseText);
- myPort = c.responseText.toString().trim();
- console.log("myPort = " + myPort.toString())
- }
- };
- c.send(null)
- } catch (a) {
- console.log("discoverPort exception: " + a.message)
- }
- } else {
- if (b.os === "cros") {
- console.log("Chromebook, disabling XMLHttp!");
- useXMLHttp = false;
- enableChromeStudentListeners();
- reEnableBrowsing()
- } else {
- console.log("not windows")
- }
- }
- })
- }
- function connectListeners() {
- discoverPort();
- chrome.tabs.onActivated.addListener(ontabactivated);
- chrome.webNavigation.onCompleted.addListener(navigationOnCompleted);
- chrome.tabs.onUpdated.addListener(tabOnUpdated);
- chrome.runtime.onMessageExternal.addListener(function(d, c, a) {
- if (!isAppInWhitelist(c.id)) {
- console.log("Rejecting message from " + c.id + ". (not in whitelist)");
- return
- }
- var e = false;
- switch (d.message) {
- case "DisableXMLHttp":
- disableXMLHttp();
- if (studentConfigData) {
- a({
- message: "StudentConfigData",
- data: studentConfigData
- })
- }
- break;
- case "WebLimitFlags":
- var b = d.value.split("::");
- console.log("WebLimiting flags: " + d.value.toString(16));
- limitingFlags = parseInt(b[0]);
- limitingState = parseInt(b[1]);
- lastLimitFlags = Math.round(new Date().getTime() / 1000);
- if ((limitingFlags & DISABLE_DOTTEDCECIMALS) == DISABLE_DOTTEDCECIMALS) {
- blockIPAddresses = true;
- console.log("IP Browsing disabled")
- } else {
- blockIPAddresses = false
- }
- if ((limitingFlags & DISABLE_PRIVATE_BROWSE) == DISABLE_PRIVATE_BROWSE) {
- blockIncognito = true;
- console.log("Incognito Browsing disabled")
- } else {
- blockIncognito = false
- }
- disableXMLHttp();
- break;
- case "WebLimitURLList":
- disableXMLHttp();
- handleURLList(d.value);
- break;
- case "RunURL":
- console.log("RunURL: " + d.value.url);
- handleRunURL(d.value, a);
- break;
- case "HeartBeat":
- currentStudent = c.id;
- receivedHeartBeat = true;
- disableXMLHttp();
- if (studentConfigData) {
- a({
- message: "StudentConfigData",
- data: studentConfigData
- })
- }
- break;
- case "get_screenshot":
- if (a) {
- a({
- message: "ACK",
- width: 0,
- height: 0,
- data: "pending"
- });
- requestTabThumbnail(c.id, d.width, d.height)
- }
- break;
- default:
- }
- });
- chrome.runtime.onMessage.addListener(function(c, b, a) {
- if (c.message === "student_config") {
- console.log("CONFIG: " + c.data);
- if (studentConfigReceived === false) {
- studentConfigData = c.data;
- studentConfigReceived = true;
- if (currentStudent != "") {
- chrome.runtime.sendMessage(currentStudent, {
- message: "StudentConfigData",
- data: c.data
- }, function(d) {})
- }
- }
- }
- })
- }
- function enableChromeStudentListeners() {
- console.log("Enabling Chrome student listener");
- chrome.webRequest.onBeforeRequest.addListener(function(a) {
- if (!receivedHeartBeat) {
- return
- }
- if (isNeverBlocked(a.url)) {
- return
- }
- var d = false;
- switch (a.type) {
- case "sub_frame":
- case "main_frame":
- var h = chrome.extension.getURL("blocked.html");
- if (a.url.indexOf(h) > -1) {
- break
- }
- lastUrl = a.url;
- if (a.type == "main_frame" && currentStudent !== "") {
- chrome.runtime.sendMessage(currentStudent, {
- message: "WebURLChanged",
- url: a.url,
- title: "",
- lang: "",
- windowId: a.tabId
- }, function(j) {})
- }
- if (urlListType != 0) {
- var f = escape(a.url);
- var e = "";
- var b = "blocked";
- var i = parseURLex(a.url);
- var c = "";
- if (blockIPAddresses && i.isIP) {
- d = true;
- b = "noip"
- } else {
- switch (urlListType) {
- case BLOCK_ALL:
- d = true;
- c = "Web disabled";
- break;
- case ALLOW_SPECIFIC:
- d = !isURLInBlockedList(a.url);
- b = "allowed";
- if (d) {
- for (var g = 0; g < urlList.length; g++) {
- if (g > 0) {
- e += ","
- }
- e += rawUrlList[g]
- }
- lastBlockedUrl = a.url;
- c = "Page not in allowed list"
- }
- break;
- case BLOCK_SPECIFIC:
- d = isURLInBlockedList(a.url);
- if (d) {
- lastBlockedUrl = a.url;
- c = "Page in blocked list"
- }
- break
- }
- }
- if (d) {
- console.log("Blocking page: [" + a.url + "] (" + c + ")");
- return {
- redirectUrl: chrome.extension.getURL("blocked.html?action=" + b + "&url=" + f + "&sites=" + escape(e))
- }
- }
- }
- break;
- case "stylesheet":
- case "script":
- case "image":
- case "object":
- case "xmlhttprequest":
- case "other":
- break
- }
- }, {
- urls: ["<all_urls>"]
- }, ["blocking"]);
- window.setInterval(checkLimitingTimeout, 20000)
- }
- function checkLimitingTimeout() {
- if (lastLimitFlags === 0 || (urlListType === 0)) {
- return
- }
- var a = Math.round(new Date().getTime() / 1000);
- var b = lastLimitFlags + limitTimeout;
- if (a > (lastLimitFlags + limitTimeout)) {
- console.log("It's been a while since we've recived a status from the teacher. Disabling web limiting.");
- reEnableBrowsing()
- }
- }
- function disableXMLHttp() {
- if (useXMLHttp == true) {
- console.log("Disabling XMLHttp methods and listeners");
- useXMLHttp = false;
- chrome.tabs.onActivated.removeListener(ontabactivated);
- chrome.tabs.onUpdated.removeListener(tabOnUpdated);
- reEnableBrowsing();
- enableChromeStudentListeners()
- }
- }
- function ontabactivated(a) {
- if (!(a === null && a.tabId === null && a.tabId < 0)) {
- chrome.tabs.get(a.tabId, function(b) {
- if (chrome.runtime.lastError || !b) {
- return
- }
- if (!(b.url === null)) {
- PostNewUrl(b)
- }
- })
- }
- }
- function navigationOnCompleted(a) {
- if (!(a === null && a.tabId === null && a.url === null && a.tabId < 0)) {
- chrome.tabs.get(a.tabId, function(b) {
- if (b && (!(b.url === null))) {
- chrome.tabs.detectLanguage(b.tabId, function(c) {
- PostHistory(b, c)
- })
- }
- })
- }
- }
- function tabOnUpdated(b, a, c) {
- if (!(b === null && b < 0)) {
- chrome.tabs.get(b, function(d) {
- if (!(d.url === null)) {
- PostNewUrl(d)
- }
- })
- }
- }
- function detectStudentConfig() {
- console.log("Detecting Student configuration data")
- }
- function reEnableBrowsing() {
- urlListType = 0;
- blockIPAddresses = false;
- blockIncognito = false;
- updateWebLimitingIcon(false)
- }
- function handleURLList(d) {
- var e = JSON.parse(d);
- urlList.length = 0;
- rawUrlList.length = 0;
- urlListType = e.listType;
- if (urlListType == 0) {
- reEnableBrowsing()
- } else {
- updateWebLimitingIcon(true)
- }
- if (e.entries && e.entries.length > 0) {
- for (var a = 0; a < e.entries.length; a++) {
- var c = 0;
- rawUrlList[a] = e.entries[a];
- var b = e.entries[a];
- b = b.replace(/[.]/g, "[.]");
- b = b.replace(/\*/g, ".*");
- b = b.replace(/\?/g, ".");
- b = b.replace(/\//g, "[/]");
- c = b.search(/\.\*/);
- if (c === 0) {
- urlList[a] = new RegExp(b, "i")
- } else {
- urlList[a] = new RegExp(".*[.]{0,1}" + b, "i")
- }
- }
- }
- validateCurrentTabs()
- }
- function updateWebLimitingIcon(a) {
- if (a) {
- chrome.browserAction.setIcon({
- path: "./disableweb.png"
- });
- chrome.browserAction.setTitle({
- title: chrome.i18n.getMessage("web_limited")
- })
- } else {
- chrome.browserAction.setIcon({
- path: "./icon16.png"
- });
- chrome.browserAction.setPopup({
- popup: ""
- });
- chrome.browserAction.setTitle({
- title: ""
- })
- }
- }
- function validateCurrentTabs() {
- var c = new Array();
- var b = false;
- var a = "";
- chrome.tabs.query({}, function(h) {
- for (var g = 0; g < h.length; g++) {
- a = "";
- if (isNeverBlocked(h[g].url)) {
- continue
- }
- var f = parseURLex(h[g].url);
- var e = escape(h[g].url);
- if (blockIPAddresses && f.isIP) {
- chrome.tabs.update(h[g].id, {
- url: chrome.extension.getURL("blocked.html?action=blocked&url=" + e + "&sites=")
- });
- continue
- }
- if (h[g].incognito && blockIncognito) {
- chrome.tabs.remove(h[g].id);
- continue
- }
- switch (urlListType) {
- case BLOCK_ALL:
- b = true;
- chrome.tabs.update(h[g].id, {
- url: chrome.extension.getURL("blocked.html?action=blocked&url=" + e + "&sites=")
- });
- break;
- case ALLOW_SPECIFIC:
- b = !isURLInBlockedList(h[g].url);
- if (b) {
- for (var d = 0; d < urlList.length; d++) {
- if (d > 0) {
- a += ","
- }
- a += rawUrlList[d]
- }
- lastBlockedUrl = h[g].url;
- chrome.tabs.update(h[g].id, {
- url: chrome.extension.getURL("blocked.html?action=allowed&url=" + e + "&sites=" + escape(a))
- })
- }
- break;
- case BLOCK_SPECIFIC:
- b = isURLInBlockedList(h[g].url);
- if (b) {
- lastBlockedUrl = h[g].url;
- chrome.tabs.update(h[g].id, {
- url: chrome.extension.getURL("blocked.html?action=blocked&url=" + e + "&sites=")
- })
- }
- break
- }
- }
- })
- }
- function isAppInWhitelist(c) {
- var b = ChromeAppsWhitelist.length;
- for (var a = 0; a < b; a++) {
- if (ChromeAppsWhitelist[a] === c) {
- return true
- }
- }
- return false
- }
- function handleRunURL(d, a) {
- var c = d.url;
- var e = d.teacher;
- var b = d.flags;
- console.log("Received RunURL from teacher: " + e + " URL: [" + c + "]");
- if (typeof chrome.tabs != "undefined") {
- chrome.tabs.query({}, function(g) {
- for (var f = 0; f < g.length; f++) {
- if (g[f].selected) {
- chrome.tabs.update(g[f].id, {
- url: c
- });
- a({
- message: "OK",
- data: ""
- });
- return true
- }
- }
- a({
- message: "no_tab",
- data: "unable to open tab"
- });
- console.log("URL not handled")
- })
- }
- return false
- }
- function isURLInBlockedList(b) {
- var d = false;
- var c = urlList.length;
- for (var a = 0; a < c; a++) {
- if (b.match(urlList[a])) {
- d = true
- }
- }
- return d
- }
- function isNeverBlocked(b) {
- var c = neverBlock.length;
- for (var a = 0; a < c; a++) {
- if (b.match(neverBlock[a])) {
- return true
- }
- }
- return false
- }
- function checkCurrentTabsForConfig() {
- chrome.tabs.query({}, function(b) {
- for (var a = 0; a < b.length; a++) {
- if ((b[a].url.indexOf("chrome-devtools://") == -1) && (b[a].url.indexOf("chrome://") == -1)) {
- chrome.tabs.executeScript(b[a].id, {
- file: "js/configstudent.js"
- }, function(c) {
- if (chrome.runtime.lastError) {
- console.log("Script not executed: " + chrome.runtime.lastError.message)
- }
- })
- }
- }
- })
- }
- connectListeners();
- checkCurrentTabsForConfig();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement