Guest User

Untitled

a guest
Dec 11th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.18 KB | None | 0 0
  1. /**
  2. * Store information about every EME Calls stubbed in this file.
  3. * @type {Object}
  4. */
  5. const EME_CALLS = {
  6. close: [],
  7. createMediaKeys: [],
  8. createSession: [],
  9. generateRequest: [],
  10. getConfiguration: [],
  11. load: [],
  12. remove: [],
  13. requestMediaKeySystemAccess: [],
  14. setMediaKeys: [],
  15. setServerCertificate: [],
  16. update: [],
  17. };
  18.  
  19. /**
  20. * Define the logger for spyEME.
  21. * Allows to re-define a specific logger on runtime / before applying this
  22. * script.
  23. * @type {Object}
  24. */
  25. const spyLogger = window.spyLogger || {
  26. /* eslint-disable no-console */
  27. log: function(...args) {
  28. console.log(...args);
  29. },
  30. debug: function(...args) {
  31. console.debug(...args);
  32. },
  33. info: function(...args) {
  34. console.info(...args);
  35. },
  36. error: function(...args) {
  37. console.error(...args);
  38. },
  39. warning: function(...args) {
  40. console.warning(...args);
  41. },
  42. /* eslint-enable no-console */
  43. };
  44.  
  45. /**
  46. * Start spying on EME API calls.
  47. * @returns {Object} - Object with a "restore" function, restoring all stubs
  48. * done here.
  49. */
  50. function spyEME() {
  51. /**
  52. * Log when a function is called with its arguments.
  53. * @param {string} fnName
  54. * @param {Array.<*>} args
  55. */
  56. function onAPICall(fnName, args) {
  57. if (args.length) {
  58. spyLogger.debug(`>>> ${fnName} called with arguments:`, args);
  59. } else {
  60. spyLogger.debug(`>>> ${fnName} called`);
  61. }
  62. }
  63. const saveRequestMediaKeySystemAccess = navigator.requestMediaKeySystemAccess;
  64. navigator.requestMediaKeySystemAccess = function(...args) {
  65.  
  66. const robustnesses = [
  67. "HW_SECURE_ALL",
  68. "HW_SECURE_DECODE",
  69. "HW_SECURE_CRYPTO",
  70. "SW_SECURE_DECODE",
  71. "SW_SECURE_CRYPTO",
  72. ];
  73. if (!args[1]) {
  74. args[1] = {};
  75. }
  76. const secondArg = args[1];
  77. secondArg.audioCapabilities = robustnesses.map(robustness => {
  78. return {
  79. contentType: "audio/mp4;codecs=\"mp4a.40.2\"", // standard mp4 codec
  80. robustness,
  81. };
  82. });
  83. secondArg.videoCapabilities = robustnesses.map(robustness => {
  84. return {
  85. contentType: "video/mp4;codecs=\"avc1.4d401e\"", // standard mp4 codec
  86. robustness,
  87. };
  88. });
  89. onAPICall("navigator.requestMediaKeySystemAccess", args);
  90. const myObj = {
  91. self: this,
  92. date: Date.now(),
  93. args,
  94. };
  95. EME_CALLS.requestMediaKeySystemAccess.push(myObj);
  96.  
  97. let prom;
  98. try {
  99. prom = saveRequestMediaKeySystemAccess.apply(navigator, args);
  100. } catch (e) {
  101. spyLogger.error(">> navigator.requestMediaKeySystemAccess failed:", e);
  102. myObj.error = e;
  103. myObj.errorDate = Date.now();
  104. throw e;
  105. }
  106. myObj.response = prom;
  107. myObj.responseDate = Date.now();
  108.  
  109. prom.then((r) => {
  110. spyLogger.debug(">> navigator.requestMediaKeySystemAccess resolved:", r);
  111. myObj.responseResolved = r;
  112. myObj.responseResolvedDate = Date.now();
  113. }, (e) => {
  114. spyLogger.error(">> navigator.requestMediaKeySystemAccess rejected:", e);
  115. myObj.responseError = e;
  116. myObj.responseErrorDate = Date.now();
  117. });
  118. return prom;
  119. };
  120.  
  121. const saveUpdate = MediaKeySession.prototype.update;
  122. MediaKeySession.prototype.update = function(...args) {
  123. onAPICall("MediaKeySession.prototype.update", args);
  124. const myObj = {
  125. self: this,
  126. date: Date.now(),
  127. args,
  128. };
  129. EME_CALLS.update.push(myObj);
  130. let prom;
  131. try {
  132. prom = saveUpdate.apply(this, args);
  133. } catch (e) {
  134. spyLogger.error(">> MediaKeySession.prototype.update failed:", e);
  135. myObj.error = e;
  136. myObj.errorDate = Date.now();
  137. throw e;
  138. }
  139. myObj.response = prom;
  140. myObj.responseDate = Date.now();
  141.  
  142. prom.then((r) => {
  143. spyLogger.debug(">> MediaKeySession.prototype.update resolved:", r);
  144. myObj.responseResolved = r;
  145. myObj.responseResolvedDate = Date.now();
  146. }, (e) => {
  147. spyLogger.error(">> MediaKeySession.prototype.update rejected:", e);
  148. myObj.responseError = e;
  149. myObj.responseErrorDate = Date.now();
  150. });
  151. return prom;
  152. };
  153.  
  154. const saveload = MediaKeySession.prototype.load;
  155. MediaKeySession.prototype.load = function(...args) {
  156. onAPICall("MediaKeySession.prototype.load", args);
  157. const myObj = {
  158. self: this,
  159. date: Date.now(),
  160. args,
  161. };
  162. EME_CALLS.load.push(myObj);
  163. let prom;
  164. try {
  165. prom = saveload.apply(this, args);
  166. } catch (e) {
  167. spyLogger.error(">> MediaKeySession.prototype.load failed:", e);
  168. myObj.error = e;
  169. myObj.errorDate = Date.now();
  170. throw e;
  171. }
  172. myObj.response = prom;
  173. myObj.responseDate = Date.now();
  174.  
  175. prom.then((r) => {
  176. spyLogger.debug(">> MediaKeySession.prototype.load resolved:", r);
  177. myObj.responseResolved = r;
  178. myObj.responseResolvedDate = Date.now();
  179. }, (e) => {
  180. spyLogger.error(">> MediaKeySession.prototype.load rejected:", e);
  181. myObj.responseError = e;
  182. myObj.responseErrorDate = Date.now();
  183. });
  184. return prom;
  185. };
  186.  
  187. const saveremove = MediaKeySession.prototype.remove;
  188. MediaKeySession.prototype.remove = function(...args) {
  189. onAPICall("MediaKeySession.prototype.remove", args);
  190. const myObj = {
  191. self: this,
  192. date: Date.now(),
  193. args,
  194. };
  195. EME_CALLS.remove.push(myObj);
  196. let prom;
  197. try {
  198. prom = saveremove.apply(this, args);
  199. } catch (e) {
  200. spyLogger.error(">> MediaKeySession.prototype.remove failed:", e);
  201. myObj.error = e;
  202. myObj.errorDate = Date.now();
  203. throw e;
  204. }
  205. myObj.response = prom;
  206. myObj.responseDate = Date.now();
  207.  
  208. prom.then((r) => {
  209. spyLogger.debug(">> MediaKeySession.prototype.remove resolved:", r);
  210. myObj.responseResolved = r;
  211. myObj.responseResolvedDate = Date.now();
  212. }, (e) => {
  213. spyLogger.error(">> MediaKeySession.prototype.remove rejected:", e);
  214. myObj.responseError = e;
  215. myObj.responseErrorDate = Date.now();
  216. });
  217. return prom;
  218. };
  219.  
  220. const saveclose = MediaKeySession.prototype.close;
  221. MediaKeySession.prototype.close = function(...args) {
  222. onAPICall("MediaKeySession.prototype.close", args);
  223. const myObj = {
  224. self: this,
  225. date: Date.now(),
  226. args,
  227. };
  228. EME_CALLS.close.push(myObj);
  229. let prom;
  230. try {
  231. prom = saveclose.apply(this, args);
  232. } catch (e) {
  233. spyLogger.error(">> MediaKeySession.prototype.close failed:", e);
  234. myObj.error = e;
  235. myObj.errorDate = Date.now();
  236. throw e;
  237. }
  238. myObj.response = prom;
  239. myObj.responseDate = Date.now();
  240.  
  241. prom.then((r) => {
  242. spyLogger.debug(">> MediaKeySession.prototype.close resolved:", r);
  243. myObj.responseResolved = r;
  244. myObj.responseResolvedDate = Date.now();
  245. }, (e) => {
  246. spyLogger.error(">> MediaKeySession.prototype.close rejected:", e);
  247. myObj.responseError = e;
  248. myObj.responseErrorDate = Date.now();
  249. });
  250. return prom;
  251. };
  252.  
  253. const savegenerateRequest = MediaKeySession.prototype.generateRequest;
  254. MediaKeySession.prototype.generateRequest = function(...args) {
  255. onAPICall("MediaKeySession.prototype.generateRequest", args);
  256. const myObj = {
  257. self: this,
  258. date: Date.now(),
  259. args,
  260. };
  261. EME_CALLS.generateRequest.push(myObj);
  262. let prom;
  263. try {
  264. prom = savegenerateRequest.apply(this, args);
  265. } catch (e) {
  266. spyLogger.error(">> MediaKeySession.prototype.generateRequest failed:", e);
  267. myObj.error = e;
  268. myObj.errorDate = Date.now();
  269. throw e;
  270. }
  271. myObj.response = prom;
  272. myObj.responseDate = Date.now();
  273.  
  274. prom.then((r) => {
  275. spyLogger.debug(">> MediaKeySession.prototype.generateRequest resolved:", r);
  276. myObj.responseResolved = r;
  277. myObj.responseResolvedDate = Date.now();
  278. }, (e) => {
  279. spyLogger.error(">> MediaKeySession.prototype.generateRequest rejected:", e);
  280. myObj.responseError = e;
  281. myObj.responseErrorDate = Date.now();
  282. });
  283. return prom;
  284. };
  285.  
  286. const savecreateSession = MediaKeys.prototype.createSession;
  287. MediaKeys.prototype.createSession = function(...args) {
  288. onAPICall("MediaKeys.prototype.createSession", args);
  289. const myObj = {
  290. self: this,
  291. date: Date.now(),
  292. args,
  293. };
  294. EME_CALLS.createSession.push(myObj);
  295. let session;
  296. try {
  297. session = savecreateSession.apply(this, args);
  298. } catch (e) {
  299. spyLogger.error(">> MediaKeys.prototype.createSession failed:", e);
  300. myObj.error = e;
  301. myObj.errorDate = Date.now();
  302. throw e;
  303. }
  304. spyLogger.debug(">> MediaKeys.prototype.createSession succeeded:", session);
  305. myObj.response = session;
  306. myObj.responseDate = Date.now();
  307. return session;
  308. };
  309.  
  310. const savesetServerCertificate = MediaKeys.prototype.setServerCertificate;
  311. MediaKeys.prototype.setServerCertificate = function(...args) {
  312. onAPICall("MediaKeys.prototype.setServerCertificate", args);
  313. const myObj = {
  314. self: this,
  315. date: Date.now(),
  316. args,
  317. };
  318. EME_CALLS.setServerCertificate.push(myObj);
  319. let prom;
  320. try {
  321. prom = savesetServerCertificate.apply(this, args);
  322. } catch (e) {
  323. spyLogger.error(">> MediaKeys.prototype.setServerCertificate failed:", e);
  324. myObj.error = e;
  325. myObj.errorDate = Date.now();
  326. throw e;
  327. }
  328. myObj.response = prom;
  329. myObj.responseDate = Date.now();
  330.  
  331. prom.then((r) => {
  332. spyLogger.debug(">> MediaKeys.prototype.setServerCertificate resolved:", r);
  333. myObj.responseResolved = r;
  334. myObj.responseResolvedDate = Date.now();
  335. }, (e) => {
  336. spyLogger.error(">> MediaKeys.prototype.setServerCertificate rejected:", e);
  337. myObj.responseError = e;
  338. myObj.responseErrorDate = Date.now();
  339. });
  340. return prom;
  341. };
  342.  
  343. const savecreateMediaKeys = MediaKeySystemAccess.prototype.createMediaKeys;
  344. MediaKeySystemAccess.prototype.createMediaKeys = function(...args) {
  345. onAPICall("MediaKeySystemAccess.prototype.createMediaKeys", args);
  346. const myObj = {
  347. self: this,
  348. date: Date.now(),
  349. args,
  350. };
  351. EME_CALLS.createMediaKeys.push(myObj);
  352. let prom;
  353. try {
  354. prom = savecreateMediaKeys.apply(this, args);
  355. } catch (e) {
  356. spyLogger.error(">> MediaKeySystemAccess.prototype.createMediaKeys failed:", e);
  357. myObj.error = e;
  358. myObj.errorDate = Date.now();
  359. throw e;
  360. }
  361. myObj.response = prom;
  362. myObj.responseDate = Date.now();
  363.  
  364. prom.then((r) => {
  365. spyLogger.debug(">> MediaKeySystemAccess.prototype.createMediaKeys resolved:", r);
  366. myObj.responseResolved = r;
  367. myObj.responseResolvedDate = Date.now();
  368. }, (e) => {
  369. spyLogger.error(">> MediaKeySystemAccess.prototype.createMediaKeys rejected:", e);
  370. myObj.responseError = e;
  371. myObj.responseErrorDate = Date.now();
  372. });
  373. return prom;
  374. };
  375.  
  376. const savegetConfiguration = MediaKeySystemAccess.prototype.getConfiguration;
  377. MediaKeySystemAccess.prototype.getConfiguration = function(...args) {
  378. onAPICall("MediaKeySystemAccess.prototype.getConfiguration", args);
  379. const myObj = {
  380. self: this,
  381. date: Date.now(),
  382. args,
  383. };
  384. EME_CALLS.getConfiguration.push(myObj);
  385. let mk;
  386. try {
  387. mk = savegetConfiguration.apply(this, args);
  388. } catch (e) {
  389. spyLogger.error(">> MediaKeySystemAccess.prototype.getConfiguration failed:", e);
  390. myObj.error = e;
  391. myObj.errorDate = Date.now();
  392. throw e;
  393. }
  394. spyLogger.debug(">> MediaKeySystemAccess.prototype.getConfiguration succeeded:", mk);
  395. myObj.response = mk;
  396. myObj.responseDate = Date.now();
  397. return mk;
  398. };
  399.  
  400. const savesetMediaKeys = HTMLMediaElement.prototype.setMediaKeys;
  401. HTMLMediaElement.prototype.setMediaKeys = function(...args) {
  402. onAPICall("HTMLMediaElement.prototype.setMediaKeys", args);
  403. const myObj = {
  404. self: this,
  405. date: Date.now(),
  406. args,
  407. };
  408. EME_CALLS.setMediaKeys.push(myObj);
  409. let prom;
  410. try {
  411. prom = savesetMediaKeys.apply(this, args);
  412. } catch (e) {
  413. spyLogger.error(">> HTMLMediaElement.prototype.setMediaKeys failed:", e);
  414. myObj.error = e;
  415. myObj.errorDate = Date.now();
  416. throw e;
  417. }
  418. myObj.response = prom;
  419. myObj.responseDate = Date.now();
  420.  
  421. prom.then((r) => {
  422. spyLogger.debug(">> HTMLMediaElement.prototype.setMediaKeys resolved:", r);
  423. myObj.responseResolved = r;
  424. myObj.responseResolvedDate = Date.now();
  425. }, (e) => {
  426. spyLogger.error(">> HTMLMediaElement.prototype.setMediaKeys rejected:", e);
  427. myObj.responseError = e;
  428. myObj.responseErrorDate = Date.now();
  429. });
  430. return prom;
  431. };
  432.  
  433. return {
  434. restore: function () {
  435. navigator.requestMediaKeySystemAccess = saveRequestMediaKeySystemAccess;
  436.  
  437. MediaKeySession.prototype.update = saveUpdate;
  438. MediaKeySession.prototype.load = saveload;
  439. MediaKeySession.prototype.close = saveclose;
  440. MediaKeySession.prototype.remove = saveremove;
  441. MediaKeySession.prototype.generateRequest = savegenerateRequest;
  442.  
  443. MediaKeys.prototype.createSession = savecreateSession;
  444. MediaKeys.prototype.setServerCertificate = savesetServerCertificate;
  445. MediaKeySystemAccess.prototype.createMediaKeys = savecreateMediaKeys;
  446. MediaKeySystemAccess.prototype.getConfiguration = savegetConfiguration;
  447.  
  448. HTMLMediaElement.prototype.setMediaKeys = savesetMediaKeys;
  449. },
  450. };
  451. }
  452.  
  453. window.EME_CALLS = EME_CALLS;
  454. window.spyLogger = spyLogger;
  455. window.spyEME = spyEME;
  456. window.restoreEME = spyEME().restore;
Add Comment
Please, Sign In to add comment