Only in ./roost-test/: .git
Only in /afs/sipb.mit.edu/project/roost/web_scripts/test/: .htaccess
Only in /afs/sipb.mit.edu/project/roost/web_scripts/test/: .htaccess-header
diff -ru3 /afs/sipb.mit.edu/project/roost/web_scripts/test/index.html ./roost-test/index.html
--- /afs/sipb.mit.edu/project/roost/web_scripts/test/index.html	2014-08-01 18:40:50.000000001 -0400
+++ ./roost-test/index.html	2020-10-16 00:10:40.989300179 -0400
@@ -6,100 +6,100 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
     <title>Roost</title>
 
-    <link rel="stylesheet" href="/styles/font-awesome/css/font-awesome.min.css">
-    <link rel="stylesheet" href="/styles/main.css">
+    <link rel="stylesheet" href="styles/font-awesome/css/font-awesome.min.css">
+    <link rel="stylesheet" href="styles/main.css">
 
-    <link rel="SHORTCUT ICON" href="/favicon.ico">
-    <link rel="apple-touch-icon" href="/img/roost-logo_57x57.png">
-    <link rel="apple-touch-icon" sizes="72x72" href="/img/roost-logo_72x72.png">
-    <link rel="apple-touch-icon" sizes="114x114" href="/img/roost-logo_114x114.png">
-    <link rel="apple-touch-icon" sizes="144x144" href="/img/roost-logo_144x144.png">
+    <link rel="SHORTCUT ICON" href="favicon.ico">
+    <link rel="apple-touch-icon" href="img/roost-logo_57x57.png">
+    <link rel="apple-touch-icon" sizes="72x72" href="img/roost-logo_72x72.png">
+    <link rel="apple-touch-icon" sizes="114x114" href="img/roost-logo_114x114.png">
+    <link rel="apple-touch-icon" sizes="144x144" href="img/roost-logo_144x144.png">
 
     <!-- build:js /scripts/q.min.js -->
-    <script src="/bower_components/q/q.js"></script>
+    <script src="bower_components/q/q.js"></script>
     <!-- endbuild -->
 
-    <script src="/scripts/sockjs.min.js"></script>
+    <script src="scripts/sockjs.min.js"></script>
 
     <!-- build:js /scripts/winchan.min.js -->
-    <script src="/bower_components/winchan/winchan.js"></script>
+    <script src="bower_components/winchan/winchan.js"></script>
     <!-- endbuild -->
 
-    <script src="/scripts/jquery.min.js"></script>
-    <script src="/scripts/jquery.linkify-1.0-min.js"></script>
-    <script src="/scripts/jquery.touchSwipe.min.js"></script>
-    <script src="/scripts/cryptojs-md5.js"></script>
-    <script src="/scripts/sjcl.js"></script>
-    <script src="/scripts/webathena.js"></script>
-    <script src="/scripts/underscore.js"></script>
-    <script src="/scripts/backbone.js"></script>
-    <script src="/scripts/handlebars.js"></script>
-    <script src="/scripts/moment.min.js"></script>
-    <script src="/scripts/mousetrap.min.js"></script>
-    <script src="/scripts/mousetrap-pause.min.js"></script>
-    <script src="/scripts/typeahead.jquery.min.js"></script>
-    <script src="/scripts/weakmap.js"></script>
-    <script src="/scripts/hammer.js"></script>
-    <script src="/scripts/jquery.hammer.js"></script>
+    <script src="scripts/jquery.min.js"></script>
+    <script src="scripts/jquery.linkify-1.0-min.js"></script>
+    <script src="scripts/jquery.touchSwipe.min.js"></script>
+    <script src="scripts/cryptojs-md5.js"></script>
+    <script src="scripts/sjcl.js"></script>
+    <script src="scripts/webathena.js"></script>
+    <script src="scripts/underscore.js"></script>
+    <script src="scripts/backbone.js"></script>
+    <script src="scripts/handlebars.js"></script>
+    <script src="scripts/moment.min.js"></script>
+    <script src="scripts/mousetrap.min.js"></script>
+    <script src="scripts/mousetrap-pause.min.js"></script>
+    <script src="scripts/typeahead.jquery.min.js"></script>
+    <script src="scripts/weakmap.js"></script>
+    <script src="scripts/hammer.js"></script>
+    <script src="scripts/jquery.hammer.js"></script>
 
     <!-- build:js /scripts/gss.min.js -->
-    <script src="/bower_components/webathena/dist/gss.js"></script>
+    <script src="bower_components/webathena/dist/gss.js"></script>
     <!-- endbuild -->
 
     <!-- build:js /scripts/roost.min.js -->
-    <script src="/scripts-src/init.js"></script>
-    <script src="/scripts-src/config.js"></script>
-    <script src="/scripts-src/sequtil.js"></script>
-    <script src="/scripts-src/polyfills.js"></script>
-    <script src="/scripts-src/events.js"></script>
-    <script src="/scripts-src/timespan.js"></script>
-    <script src="/scripts-src/url.js"></script>
-    <script src="/scripts-src/util.js"></script>
-    <script src="/scripts-src/filter.js"></script>
-    <script src="/scripts-src/storage.js"></script>
-    <script src="/scripts-src/tickets.js"></script>
-    <script src="/scripts-src/userinfo.js"></script>
-    <script src="/scripts-src/api.js"></script>
-    <script src="/scripts-src/model.js"></script>
-    <script src="/scripts-src/ztext.js"></script>
-    <script src="/scripts-src/tapClick.js"></script>
+    <script src="scripts-src/init.js"></script>
+    <script src="scripts-src/config.js"></script>
+    <script src="scripts-src/sequtil.js"></script>
+    <script src="scripts-src/polyfills.js"></script>
+    <script src="scripts-src/events.js"></script>
+    <script src="scripts-src/timespan.js"></script>
+    <script src="scripts-src/url.js"></script>
+    <script src="scripts-src/util.js"></script>
+    <script src="scripts-src/filter.js"></script>
+    <script src="scripts-src/storage.js"></script>
+    <script src="scripts-src/tickets.js"></script>
+    <script src="scripts-src/userinfo.js"></script>
+    <script src="scripts-src/api.js"></script>
+    <script src="scripts-src/model.js"></script>
+    <script src="scripts-src/ztext.js"></script>
+    <script src="scripts-src/tapClick.js"></script>
     <!-- endbuild -->
 
     <!-- build:js /scripts/app.min.js -->
-    <script src="/scripts-src/reflow.js"></script>
-    <script src="/scripts-src/helpers.js"></script>
-    <script src="/scripts-src/colors.js"></script>
-    <script src="/scripts-src/templates.js"></script>
-
-    <script src="/scripts-src/LoginView.js"></script>
-    <script src="/scripts-src/MessagePane.js"></script>
-    <script src="/scripts-src/MessagePaneView.js"></script>
-    <script src="/scripts-src/MessageView.js"></script>
-    <script src="/scripts-src/ComposeBar.js"></script>
-    <script src="/scripts-src/FilterBar.js"></script>
-    <script src="/scripts-src/SettingsPanel.js"></script>
-    <script src="/scripts-src/GeneralSettingsView.js"></script>
-    <script src="/scripts-src/HotkeySettingsView.js"></script>
-    <script src="/scripts-src/SubscriptionSettingsView.js"></script>
-    <script src="/scripts-src/ZSigSettingsView.js"></script>
-    <script src="/scripts-src/HelpView.js"></script>
-    <script src="/scripts-src/NavBar.js"></script>
-
-    <script src="/scripts-src/SubscriptionModel.js"></script>
-    <script src="/scripts-src/UserInfoModel.js"></script>
-    <script src="/scripts-src/UserSettingsModel.js"></script>
-    <script src="/scripts-src/UIStateModel.js"></script>
-    <script src="/scripts-src/MessageModel.js"></script>
-    <script src="/scripts-src/MessagePaneModel.js"></script>
-    <script src="/scripts-src/RoostSession.js"></script>
-
-    <script src="/scripts-src/MessagePaneController.js"></script>
-    <script src="/scripts-src/ComposeController.js"></script>
-    <script src="/scripts-src/AuthenticationController.js"></script>
-    <script src="/scripts-src/SubscriptionController.js"></script>
-    <script src="/scripts-src/SettingsController.js"></script>
+    <script src="scripts-src/reflow.js"></script>
+    <script src="scripts-src/helpers.js"></script>
+    <script src="scripts-src/colors.js"></script>
+    <script src="scripts-src/templates.js"></script>
+
+    <script src="scripts-src/LoginView.js"></script>
+    <script src="scripts-src/MessagePane.js"></script>
+    <script src="scripts-src/MessagePaneView.js"></script>
+    <script src="scripts-src/MessageView.js"></script>
+    <script src="scripts-src/ComposeBar.js"></script>
+    <script src="scripts-src/FilterBar.js"></script>
+    <script src="scripts-src/SettingsPanel.js"></script>
+    <script src="scripts-src/GeneralSettingsView.js"></script>
+    <script src="scripts-src/HotkeySettingsView.js"></script>
+    <script src="scripts-src/SubscriptionSettingsView.js"></script>
+    <script src="scripts-src/ZSigSettingsView.js"></script>
+    <script src="scripts-src/HelpView.js"></script>
+    <script src="scripts-src/NavBar.js"></script>
+
+    <script src="scripts-src/SubscriptionModel.js"></script>
+    <script src="scripts-src/UserInfoModel.js"></script>
+    <script src="scripts-src/UserSettingsModel.js"></script>
+    <script src="scripts-src/UIStateModel.js"></script>
+    <script src="scripts-src/MessageModel.js"></script>
+    <script src="scripts-src/MessagePaneModel.js"></script>
+    <script src="scripts-src/RoostSession.js"></script>
+
+    <script src="scripts-src/MessagePaneController.js"></script>
+    <script src="scripts-src/ComposeController.js"></script>
+    <script src="scripts-src/AuthenticationController.js"></script>
+    <script src="scripts-src/SubscriptionController.js"></script>
+    <script src="scripts-src/SettingsController.js"></script>
 
-    <script src="/scripts-src/endpoint.js"></script>
+    <script src="scripts-src/endpoint.js"></script>
     <!-- endbuild -->
 
   </head>
Only in ./roost-test/: index.html~
diff -ru3 /afs/sipb.mit.edu/project/roost/web_scripts/test/scripts-src/api.js ./roost-test/scripts-src/api.js
--- /afs/sipb.mit.edu/project/roost/web_scripts/test/scripts-src/api.js	2014-07-24 17:45:02.000000001 -0400
+++ ./roost-test/scripts-src/api.js	2020-10-16 00:55:56.857333872 -0400
@@ -30,7 +30,7 @@
   return this.responseText;
 };
 
-function corsRequest(method, url, data) {
+function corsRequest(method, url, data, token) {
   var xhr = new XMLHttpRequest();
   var isXdr = false;
   if ("withCredentials" in xhr) {
@@ -65,11 +65,16 @@
     xhr.ontimeout = function() { };
   }
 
+  if (token) {
+    xhr.setRequestHeader('Authorization', 'Bearer ' + token);
+  }
+
   if (isXdr) {
     // Mumble cached requests mumble? I don't... think I care? Either
     // way, avoid silliness.
     setTimeout(function() {
       if (data !== undefined) {
+        xhr.setRequestHeader('Content-Type', 'application/json');
         xhr.send(JSON.stringify(data));
       } else {
         xhr.send();
@@ -82,7 +87,7 @@
       // an optimization to avoid the preflight. For IE9
       // (XDomainRequest) as a necessity. (It accepts application/json
       // just fine too, of course.)
-      xhr.setRequestHeader("Content-Type", "text/plain");
+      xhr.setRequestHeader("Content-Type", "application/json");
 
       // Wat. Work around Chrome/Safari NFC normalizing text before in
       // XMLHttpRequest#send. This seems to date back to something
@@ -395,7 +400,7 @@
   return Q.all([tokenPromise, credsPromise, params, data]).then(function(ret) {
     var token = ret[0], credentials = ret[1], params = ret[2], data = ret[3];
     var url =
-      this.urlBase_ + path + "?access_token=" + encodeURIComponent(token);
+      this.urlBase_ + path + "?foo";
     if (method != "GET")
       url += "&clientId=" + encodeURIComponent(this.clientId_);
     for (var key in params) {
@@ -404,7 +409,7 @@
     if (opts.withZephyr) {
       data.credentials = credentials.toDict();
     }
-    return corsRequest(method, url, data).then(function(responseText) {
+    return corsRequest(method, url, data, token).then(function(responseText) {
       return JSON.parse(responseText);
     }, function(err) {
       // 401 means we had a bad token (it may have expired). Refresh it.
@@ -464,7 +469,7 @@
 
   this.socketPending_ = true;
   this.getAuthToken_(false).then(function(token) {
-    var socket = new RoostSocket(new SockJS(this.urlBase_ + "/v1/socket"));
+    var socket = new RoostSocket(new WebSocket(this.urlBase_.replace('https://', 'wss://') + "/v1/socket/websocket"));
     socket.sockJS().addEventListener("open", function() {
       socket.send({
         type: "auth",
Only in ./roost-test/scripts-src: api.js~
diff -ru3 /afs/sipb.mit.edu/project/roost/web_scripts/test/scripts-src/config.js ./roost-test/scripts-src/config.js
--- /afs/sipb.mit.edu/project/roost/web_scripts/test/scripts-src/config.js	2014-08-07 01:02:39.000000001 -0400
+++ ./roost-test/scripts-src/config.js	2020-10-16 00:09:28.668909001 -0400
@@ -1,2 +1,2 @@
 "use strict"
-var CONFIG = {"realm":"ATHENA.MIT.EDU","server":"https://roost-api.mit.edu","serverPrincipal":"HTTP/roost-api.mit.edu","webathena":"https://webathena.mit.edu"};
\ No newline at end of file
+var CONFIG = {"realm":"ATHENA.MIT.EDU","server":"https://darkmatter.mit.edu/roost-api","serverPrincipal":"HTTP/darkmatter.mit.edu","webathena":"https://webathena.mit.edu"};
Only in ./roost-test/scripts-src: config.js~
diff -ru3 /afs/sipb.mit.edu/project/roost/web_scripts/test/scripts-src/userinfo.js ./roost-test/scripts-src/userinfo.js
--- /afs/sipb.mit.edu/project/roost/web_scripts/test/scripts-src/userinfo.js	2014-06-04 01:46:41.000000001 -0400
+++ ./roost-test/scripts-src/userinfo.js	2020-10-16 19:48:10.181022239 -0400
@@ -50,7 +50,7 @@
     return;
 
   try {
-    this.base_ = JSON.parse(info);
+    this.base_ = info;
   } catch (err) {
     if (window.console && console.log)
       console.log("Error parsing user info", err);
@@ -216,10 +216,37 @@
   }, this.pending_.scrollStates).add;
 
   var newVersion = this.baseVersion_ + 1;
-  var newInfoStr = JSON.stringify(newInfo);
+  // var newInfoStr = JSON.stringify(newInfo);
 
-  var oldInfoStr = JSON.stringify(this.base_);
-  if (oldInfoStr === newInfoStr) {
+  function deepEqual(object1, object2) {
+    const keys1 = Object.keys(object1);
+    const keys2 = Object.keys(object2);
+
+    if (keys1.length !== keys2.length) {
+      return false;
+    }
+
+    for (const key of keys1) {
+      const val1 = object1[key];
+      const val2 = object2[key];
+      const areObjects = isObject(val1) && isObject(val2);
+      if (
+        areObjects && !deepEqual(val1, val2) ||
+          !areObjects && val1 !== val2
+      ) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  function isObject(object) {
+    return object != null && typeof object === 'object';
+  }
+
+  // var oldInfoStr = JSON.stringify(this.base_);
+  if (deepEqual(this.base_, newInfo)) {
     // Nothing changed. Don't bother.
     this.pending_ = null;
     return;
@@ -228,12 +255,12 @@
   // Fire off a test-and-set.
   return this.api_.post("/v1/info", {
     expectedVersion: this.baseVersion_,
-    info: newInfoStr
+    info: newInfo
   }).then(function(ret) {
     if (ret.updated) {
       // Success!
       this.pending_ = null;
-      this.handleNewInfo_(newInfoStr, newVersion, true);
+      this.handleNewInfo_(newInfo, newVersion, true);
     } else {
       // Failure. Retry.
       this.mergeLocalAndPending_();
Only in ./roost-test/scripts-src: userinfo.js~
