Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.60 KB | None | 0 0
  1. "use strict";
  2. var lastUrl = "";
  3. var lastTitle = "";
  4. var lastBlockedUrl = "";
  5. var useXMLHttp = true;
  6. var limitingFlags = 0;
  7. var limitingState = 0;
  8. var urlList = [];
  9. var rawUrlList = [];
  10. var urlListType = 0;
  11. var receivedHeartBeat = false;
  12. var blockIPAddresses = false;
  13. var blockIncognito = false;
  14. var tabWindowId = 0;
  15. var studentConfigReceived = false;
  16. var lastLimitFlags = 0;
  17. var limitTimeout = 30;
  18. var ALLOW_ALL = "0";
  19. var BLOCK_ALL = "1";
  20. var ALLOW_SPECIFIC = "2";
  21. var BLOCK_SPECIFIC = "3";
  22. var DISABLE_WEB_PORT80 = 2147483872;
  23. var ALLOW_SPECIFIC_APPS = 524512;
  24. var DISABLE_SPECIFIC_APPS = 1048800;
  25. var DISABLE_DOTTEDCECIMALS = 4194304;
  26. var DISABLE_WEB_CHROME = 480;
  27. var ENABLE_TASKMANAGER = 736;
  28. var DISABLE_PRIVATE_BROWSE = 1248;
  29. var DISABLE_TASKMANAGER = 4320;
  30. var ChromeAppsWhitelist = ["cclepbmimdmoahcbccbpbnpfnaakheja", "ifeifkfohlobcbhmlfkenopaimbmnahb", "hgdgmhjbhldlejgpjbphhoegapekcbcc", "glifclcedbcpeplpmnplaekopdgjggcd", "jhiggjblhjhknbhjffjpfoanbghcfmga", "cdjokdjlmmgodojedmlfppkfnnjnfigf", "kmklemnfjbnkliegakkhbbljlmhohcjf"];
  31. var currentStudent = "";
  32. var myPort = 56797;
  33. var portDead = false;
  34. var studentConfigData = null;
  35. var neverBlock = ["chrome-extension://", "chrome://", "chrome-devtools://", "file://"];
  36.  
  37. function PostHistory(c, g) {
  38. if (useXMLHttp == false) {
  39. return
  40. }
  41. if (portDead) {
  42. console.log("PostHistory - port is dead");
  43. return
  44. }
  45. console.log("PostHistory: ");
  46. try {
  47. if (c.active === null || c.active == false) {
  48. console.log("tab is not active: " + c.url);
  49. return
  50. }
  51. if (c.url.valueOf() == lastBlockedUrl.valueOf()) {
  52. console.log("not reporting history for blocked url " + c.url);
  53. return
  54. }
  55. var d = JSON.stringify(c.title);
  56. d = d.trim();
  57. if (c.url.valueOf() != lastUrl.valueOf() && lastTitle.valueOf() != d.valueOf()) {
  58. if (useXMLHttp == false) {
  59. return
  60. }
  61. var b = new XMLHttpRequest();
  62. if (g === null) {
  63. g = "en"
  64. }
  65. b.open("POST", "http://localhost:" + myPort + "/History", false);
  66. var a = JSON.stringify({
  67. url: c.url,
  68. title: d,
  69. lang: g,
  70. windowId: c.windowId
  71. });
  72. b.setRequestHeader("Content-Type", "application/json");
  73. b.send(a);
  74. lastUrl = c.url;
  75. lastTitle = d
  76. } else {
  77. console.log("already posted history for " + lastUrl + " title: " + lastTitle)
  78. }
  79. } catch (f) {
  80. console.log("exception in PostHistory: " + f.message + " code " + f.code);
  81. if (f.code == 19) {
  82. console.log("network error!");
  83. portDead = true
  84. }
  85. }
  86. }
  87.  
  88. function PostNewUrl(c) {
  89. if (useXMLHttp == false) {
  90. return
  91. }
  92. if (portDead) {
  93. console.log("PostNewUrl - port is dead");
  94. return
  95. }
  96. try {
  97. var a = new XMLHttpRequest();
  98. a.open("POST", "http://localhost:" + myPort + "/WebLimit", false);
  99. var f = JSON.stringify({
  100. url: c.url
  101. });
  102. a.setRequestHeader("Content-Type", "application/json");
  103. a.send(f);
  104. var d = a.responseText;
  105. d = d.trim();
  106. if (a.status == 200) {
  107. var b = JSON.parse(d);
  108. if (b.block != null) {
  109. if (b.block == "true") {
  110. lastBlockedUrl = c.url;
  111. if (c.url.substring(0, 12) == "view-source:") {
  112. chrome.tabs.remove(c.id, null);
  113. console.log("tried to remove the view-source tab!")
  114. } else {
  115. var f = JSON.stringify(b.redirect);
  116. var h = """;
  117. var j = new RegExp(h, "g");
  118. f = f.replace(j, '\\"');
  119. var i = 'document.head.innerHTML = ""; document.body.innerHTML = ' + f + ";";
  120. console.log("PostNewUrl: site is blocked: " + c.url);
  121. chrome.tabs.insertCSS(c.tabId, {
  122. file: "style.css",
  123. runAt: "document_end"
  124. });
  125. chrome.tabs.executeScript(c.tabId, {
  126. code: i
  127. })
  128. }
  129. } else {
  130. console.log("PostNewUrl: site is allowed: " + c.url)
  131. }
  132. } else {
  133. console.log("PostNewUrl failed to get response from sserver")
  134. }
  135. } else {
  136. console.log("PostNewUrl bad response from sserver: " + a.status)
  137. }
  138. } catch (g) {
  139. console.log("exception in PostNewUrl: " + g.message + " code " + g.code);
  140. if (g.code == 19) {
  141. console.log("network error!");
  142. portDead = true
  143. }
  144. }
  145. }
  146.  
  147. function discoverPort() {
  148. chrome.runtime.getPlatformInfo(function(b) {
  149. console.log("operating system: " + b.os);
  150. if (b.os == "win") {
  151. console.log("trying to load file");
  152. try {
  153. var d = chrome.extension.getURL("svrproc42");
  154. console.log(d);
  155. var c = new XMLHttpRequest();
  156. c.open("GET", d, true);
  157. c.onreadystatechange = function() {
  158. if (c.readyState == XMLHttpRequest.DONE && c.status == 200) {
  159. console.log(c.responseText);
  160. myPort = c.responseText.toString().trim();
  161. console.log("myPort = " + myPort.toString())
  162. }
  163. };
  164. c.send(null)
  165. } catch (a) {
  166. console.log("discoverPort exception: " + a.message)
  167. }
  168. } else {
  169. if (b.os === "cros") {
  170. console.log("Chromebook, disabling XMLHttp!");
  171. useXMLHttp = false;
  172. enableChromeStudentListeners();
  173. reEnableBrowsing()
  174. } else {
  175. console.log("not windows")
  176. }
  177. }
  178. })
  179. }
  180.  
  181. function connectListeners() {
  182. discoverPort();
  183. chrome.tabs.onActivated.addListener(ontabactivated);
  184. chrome.webNavigation.onCompleted.addListener(navigationOnCompleted);
  185. chrome.tabs.onUpdated.addListener(tabOnUpdated);
  186. chrome.runtime.onMessageExternal.addListener(function(d, c, a) {
  187. if (!isAppInWhitelist(c.id)) {
  188. console.log("Rejecting message from " + c.id + ". (not in whitelist)");
  189. return
  190. }
  191. var e = false;
  192. switch (d.message) {
  193. case "DisableXMLHttp":
  194. disableXMLHttp();
  195. if (studentConfigData) {
  196. a({
  197. message: "StudentConfigData",
  198. data: studentConfigData
  199. })
  200. }
  201. break;
  202. case "WebLimitFlags":
  203. var b = d.value.split("::");
  204. console.log("WebLimiting flags: " + d.value.toString(16));
  205. limitingFlags = parseInt(b[0]);
  206. limitingState = parseInt(b[1]);
  207. lastLimitFlags = Math.round(new Date().getTime() / 1000);
  208. if ((limitingFlags & DISABLE_DOTTEDCECIMALS) == DISABLE_DOTTEDCECIMALS) {
  209. blockIPAddresses = true;
  210. console.log("IP Browsing disabled")
  211. } else {
  212. blockIPAddresses = false
  213. }
  214. if ((limitingFlags & DISABLE_PRIVATE_BROWSE) == DISABLE_PRIVATE_BROWSE) {
  215. blockIncognito = true;
  216. console.log("Incognito Browsing disabled")
  217. } else {
  218. blockIncognito = false
  219. }
  220. disableXMLHttp();
  221. break;
  222. case "WebLimitURLList":
  223. disableXMLHttp();
  224. handleURLList(d.value);
  225. break;
  226. case "RunURL":
  227. console.log("RunURL: " + d.value.url);
  228. handleRunURL(d.value, a);
  229. break;
  230. case "HeartBeat":
  231. currentStudent = c.id;
  232. receivedHeartBeat = true;
  233. disableXMLHttp();
  234. if (studentConfigData) {
  235. a({
  236. message: "StudentConfigData",
  237. data: studentConfigData
  238. })
  239. }
  240. break;
  241. case "get_screenshot":
  242. if (a) {
  243. a({
  244. message: "ACK",
  245. width: 0,
  246. height: 0,
  247. data: "pending"
  248. });
  249. requestTabThumbnail(c.id, d.width, d.height)
  250. }
  251. break;
  252. default:
  253. }
  254. });
  255. chrome.runtime.onMessage.addListener(function(c, b, a) {
  256. if (c.message === "student_config") {
  257. console.log("CONFIG: " + c.data);
  258. if (studentConfigReceived === false) {
  259. studentConfigData = c.data;
  260. studentConfigReceived = true;
  261. if (currentStudent != "") {
  262. chrome.runtime.sendMessage(currentStudent, {
  263. message: "StudentConfigData",
  264. data: c.data
  265. }, function(d) {})
  266. }
  267. }
  268. }
  269. })
  270. }
  271.  
  272. function enableChromeStudentListeners() {
  273. console.log("Enabling Chrome student listener");
  274. chrome.webRequest.onBeforeRequest.addListener(function(a) {
  275. if (!receivedHeartBeat) {
  276. return
  277. }
  278. if (isNeverBlocked(a.url)) {
  279. return
  280. }
  281. var d = false;
  282. switch (a.type) {
  283. case "sub_frame":
  284. case "main_frame":
  285. var h = chrome.extension.getURL("blocked.html");
  286. if (a.url.indexOf(h) > -1) {
  287. break
  288. }
  289. lastUrl = a.url;
  290. if (a.type == "main_frame" && currentStudent !== "") {
  291. chrome.runtime.sendMessage(currentStudent, {
  292. message: "WebURLChanged",
  293. url: a.url,
  294. title: "",
  295. lang: "",
  296. windowId: a.tabId
  297. }, function(j) {})
  298. }
  299. if (urlListType != 0) {
  300. var f = escape(a.url);
  301. var e = "";
  302. var b = "blocked";
  303. var i = parseURLex(a.url);
  304. var c = "";
  305. if (blockIPAddresses && i.isIP) {
  306. d = true;
  307. b = "noip"
  308. } else {
  309. switch (urlListType) {
  310. case BLOCK_ALL:
  311. d = true;
  312. c = "Web disabled";
  313. break;
  314. case ALLOW_SPECIFIC:
  315. d = !isURLInBlockedList(a.url);
  316. b = "allowed";
  317. if (d) {
  318. for (var g = 0; g < urlList.length; g++) {
  319. if (g > 0) {
  320. e += ","
  321. }
  322. e += rawUrlList[g]
  323. }
  324. lastBlockedUrl = a.url;
  325. c = "Page not in allowed list"
  326. }
  327. break;
  328. case BLOCK_SPECIFIC:
  329. d = isURLInBlockedList(a.url);
  330. if (d) {
  331. lastBlockedUrl = a.url;
  332. c = "Page in blocked list"
  333. }
  334. break
  335. }
  336. }
  337. if (d) {
  338. console.log("Blocking page: [" + a.url + "] (" + c + ")");
  339. return {
  340. redirectUrl: chrome.extension.getURL("blocked.html?action=" + b + "&url=" + f + "&sites=" + escape(e))
  341. }
  342. }
  343. }
  344. break;
  345. case "stylesheet":
  346. case "script":
  347. case "image":
  348. case "object":
  349. case "xmlhttprequest":
  350. case "other":
  351. break
  352. }
  353. }, {
  354. urls: ["<all_urls>"]
  355. }, ["blocking"]);
  356. window.setInterval(checkLimitingTimeout, 20000)
  357. }
  358.  
  359. function checkLimitingTimeout() {
  360. if (lastLimitFlags === 0 || (urlListType === 0)) {
  361. return
  362. }
  363. var a = Math.round(new Date().getTime() / 1000);
  364. var b = lastLimitFlags + limitTimeout;
  365. if (a > (lastLimitFlags + limitTimeout)) {
  366. console.log("It's been a while since we've recived a status from the teacher. Disabling web limiting.");
  367. reEnableBrowsing()
  368. }
  369. }
  370.  
  371. function disableXMLHttp() {
  372. if (useXMLHttp == true) {
  373. console.log("Disabling XMLHttp methods and listeners");
  374. useXMLHttp = false;
  375. chrome.tabs.onActivated.removeListener(ontabactivated);
  376. chrome.tabs.onUpdated.removeListener(tabOnUpdated);
  377. reEnableBrowsing();
  378. enableChromeStudentListeners()
  379. }
  380. }
  381.  
  382. function ontabactivated(a) {
  383. if (!(a === null && a.tabId === null && a.tabId < 0)) {
  384. chrome.tabs.get(a.tabId, function(b) {
  385. if (chrome.runtime.lastError || !b) {
  386. return
  387. }
  388. if (!(b.url === null)) {
  389. PostNewUrl(b)
  390. }
  391. })
  392. }
  393. }
  394.  
  395. function navigationOnCompleted(a) {
  396. if (!(a === null && a.tabId === null && a.url === null && a.tabId < 0)) {
  397. chrome.tabs.get(a.tabId, function(b) {
  398. if (b && (!(b.url === null))) {
  399. chrome.tabs.detectLanguage(b.tabId, function(c) {
  400. PostHistory(b, c)
  401. })
  402. }
  403. })
  404. }
  405. }
  406.  
  407. function tabOnUpdated(b, a, c) {
  408. if (!(b === null && b < 0)) {
  409. chrome.tabs.get(b, function(d) {
  410. if (!(d.url === null)) {
  411. PostNewUrl(d)
  412. }
  413. })
  414. }
  415. }
  416.  
  417. function detectStudentConfig() {
  418. console.log("Detecting Student configuration data")
  419. }
  420.  
  421. function reEnableBrowsing() {
  422. urlListType = 0;
  423. blockIPAddresses = false;
  424. blockIncognito = false;
  425. updateWebLimitingIcon(false)
  426. }
  427.  
  428. function handleURLList(d) {
  429. var e = JSON.parse(d);
  430. urlList.length = 0;
  431. rawUrlList.length = 0;
  432. urlListType = e.listType;
  433. if (urlListType == 0) {
  434. reEnableBrowsing()
  435. } else {
  436. updateWebLimitingIcon(true)
  437. }
  438. if (e.entries && e.entries.length > 0) {
  439. for (var a = 0; a < e.entries.length; a++) {
  440. var c = 0;
  441. rawUrlList[a] = e.entries[a];
  442. var b = e.entries[a];
  443. b = b.replace(/[.]/g, "[.]");
  444. b = b.replace(/\*/g, ".*");
  445. b = b.replace(/\?/g, ".");
  446. b = b.replace(/\//g, "[/]");
  447. c = b.search(/\.\*/);
  448. if (c === 0) {
  449. urlList[a] = new RegExp(b, "i")
  450. } else {
  451. urlList[a] = new RegExp(".*[.]{0,1}" + b, "i")
  452. }
  453. }
  454. }
  455. validateCurrentTabs()
  456. }
  457.  
  458. function updateWebLimitingIcon(a) {
  459. if (a) {
  460. chrome.browserAction.setIcon({
  461. path: "./disableweb.png"
  462. });
  463. chrome.browserAction.setTitle({
  464. title: chrome.i18n.getMessage("web_limited")
  465. })
  466. } else {
  467. chrome.browserAction.setIcon({
  468. path: "./icon16.png"
  469. });
  470. chrome.browserAction.setPopup({
  471. popup: ""
  472. });
  473. chrome.browserAction.setTitle({
  474. title: ""
  475. })
  476. }
  477. }
  478.  
  479. function validateCurrentTabs() {
  480. var c = new Array();
  481. var b = false;
  482. var a = "";
  483. chrome.tabs.query({}, function(h) {
  484. for (var g = 0; g < h.length; g++) {
  485. a = "";
  486. if (isNeverBlocked(h[g].url)) {
  487. continue
  488. }
  489. var f = parseURLex(h[g].url);
  490. var e = escape(h[g].url);
  491. if (blockIPAddresses && f.isIP) {
  492. chrome.tabs.update(h[g].id, {
  493. url: chrome.extension.getURL("blocked.html?action=blocked&url=" + e + "&sites=")
  494. });
  495. continue
  496. }
  497. if (h[g].incognito && blockIncognito) {
  498. chrome.tabs.remove(h[g].id);
  499. continue
  500. }
  501. switch (urlListType) {
  502. case BLOCK_ALL:
  503. b = true;
  504. chrome.tabs.update(h[g].id, {
  505. url: chrome.extension.getURL("blocked.html?action=blocked&url=" + e + "&sites=")
  506. });
  507. break;
  508. case ALLOW_SPECIFIC:
  509. b = !isURLInBlockedList(h[g].url);
  510. if (b) {
  511. for (var d = 0; d < urlList.length; d++) {
  512. if (d > 0) {
  513. a += ","
  514. }
  515. a += rawUrlList[d]
  516. }
  517. lastBlockedUrl = h[g].url;
  518. chrome.tabs.update(h[g].id, {
  519. url: chrome.extension.getURL("blocked.html?action=allowed&url=" + e + "&sites=" + escape(a))
  520. })
  521. }
  522. break;
  523. case BLOCK_SPECIFIC:
  524. b = isURLInBlockedList(h[g].url);
  525. if (b) {
  526. lastBlockedUrl = h[g].url;
  527. chrome.tabs.update(h[g].id, {
  528. url: chrome.extension.getURL("blocked.html?action=blocked&url=" + e + "&sites=")
  529. })
  530. }
  531. break
  532. }
  533. }
  534. })
  535. }
  536.  
  537. function isAppInWhitelist(c) {
  538. var b = ChromeAppsWhitelist.length;
  539. for (var a = 0; a < b; a++) {
  540. if (ChromeAppsWhitelist[a] === c) {
  541. return true
  542. }
  543. }
  544. return false
  545. }
  546.  
  547. function handleRunURL(d, a) {
  548. var c = d.url;
  549. var e = d.teacher;
  550. var b = d.flags;
  551. console.log("Received RunURL from teacher: " + e + " URL: [" + c + "]");
  552. if (typeof chrome.tabs != "undefined") {
  553. chrome.tabs.query({}, function(g) {
  554. for (var f = 0; f < g.length; f++) {
  555. if (g[f].selected) {
  556. chrome.tabs.update(g[f].id, {
  557. url: c
  558. });
  559. a({
  560. message: "OK",
  561. data: ""
  562. });
  563. return true
  564. }
  565. }
  566. a({
  567. message: "no_tab",
  568. data: "unable to open tab"
  569. });
  570. console.log("URL not handled")
  571. })
  572. }
  573. return false
  574. }
  575.  
  576. function isURLInBlockedList(b) {
  577. var d = false;
  578. var c = urlList.length;
  579. for (var a = 0; a < c; a++) {
  580. if (b.match(urlList[a])) {
  581. d = true
  582. }
  583. }
  584. return d
  585. }
  586.  
  587. function isNeverBlocked(b) {
  588. var c = neverBlock.length;
  589. for (var a = 0; a < c; a++) {
  590. if (b.match(neverBlock[a])) {
  591. return true
  592. }
  593. }
  594. return false
  595. }
  596.  
  597. function checkCurrentTabsForConfig() {
  598. chrome.tabs.query({}, function(b) {
  599. for (var a = 0; a < b.length; a++) {
  600. if ((b[a].url.indexOf("chrome-devtools://") == -1) && (b[a].url.indexOf("chrome://") == -1)) {
  601. chrome.tabs.executeScript(b[a].id, {
  602. file: "js/configstudent.js"
  603. }, function(c) {
  604. if (chrome.runtime.lastError) {
  605. console.log("Script not executed: " + chrome.runtime.lastError.message)
  606. }
  607. })
  608. }
  609. }
  610. })
  611. }
  612. connectListeners();
  613. checkCurrentTabsForConfig();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement