Skip to content

Commit b8ddd99

Browse files
committed
new uauth stuff
1 parent 7ec0463 commit b8ddd99

File tree

6 files changed

+171
-24
lines changed

6 files changed

+171
-24
lines changed

uauth/demo.html

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
* fileTypes: array of file extensions (including dot before) (leave empty to allow all) [ignored on dropbox :(]
2424
* callback: function to call when either the file is ready, or the user cancelled it
2525
*
26-
* you can only have 1 picker open at a time
27-
*
2826
* this object is passed to the callback function:
2927
* message: either "success", "cancelled", or "error"
3028
* if success, name: name of the file

uauth/drive.html

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,7 @@
3434
<input type="button" id="authorizebutton" class="center" onclick="loadPicker()" value="Authorize">
3535
<script src="tokens.js"></script>
3636
<script>
37-
var search = decodeURIComponent(window.location.search).substring(1).split("&");
38-
var queries = {};
39-
for (var i = 0; i < search.length; i++) {
40-
var p = search[i].split("=");
41-
queries[p[0]] = p[1];
42-
}
37+
var queries = Object.fromEntries(window.location.search.substring(1).split("&").map(i => i.split("=")).map(i => i.map(i => i && decodeURIComponent(i))));
4338

4439
var fileTypes = queries.exts ? queries.exts.split(",") : [];
4540

@@ -100,7 +95,7 @@
10095

10196
window.addEventListener("unload", function() {
10297
if (!isDone) finish("cancelled");
103-
}, false)
98+
}, false);
10499

105100
function pickerCallback(data) {
106101
if (data.action == google.picker.Action.PICKED) {

uauth/index.html

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,12 @@ <h2>I'm supposed to be an invisible iframe... (you shouldn't see this)</h2>
99
<script src="https://js.live.net/v7.2/OneDrive.js"></script>
1010
<script src="tokens.js"></script>
1111
<script>
12-
var search = decodeURIComponent(window.location.search).substring(1).split("&");
13-
var queries = {};
14-
for (var i = 0; i < search.length; i++) {
15-
var p = search[i].split("=");
16-
queries[p[0]] = p[1];
17-
}
12+
var queries = Object.fromEntries(window.location.search.substring(1).split("&").map(i => i.split("=")).map(i => i.map(i => i && decodeURIComponent(i))));
1813

1914
var fileTypes = queries.exts ? queries.exts.split(",") : [];
2015

2116
function finish(message, name, data) {
22-
window.parent.postMessage({webretro: {message: message, name: name, data: data}}, "*");
17+
window.parent.postMessage({webretro: {timestamp: parseInt(queries.timestamp), message: message, name: name, data: data}}, "*");
2318
}
2419

2520
function xhr(loc, success, error) {

uauth/isolatedpicker.html

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Choose a File</title>
5+
<style>
6+
.center {
7+
position: absolute;
8+
left: 50%;
9+
top: 50%;
10+
transform: translate(-50%, -50%);
11+
margin: 0px;
12+
text-align: center;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
<div class="center">
18+
<h1>Choose a file...</h1>
19+
<h2>Make sure you have popups enabled!</h2>
20+
</div>
21+
<script src="https://www.dropbox.com/static/api/2/dropins.js"></script>
22+
<script src="https://js.live.net/v7.2/OneDrive.js"></script>
23+
<script src="tokens.js"></script>
24+
<script>
25+
var queries = Object.fromEntries(window.location.search.substring(1).split("&").map(i => i.split("=")).map(i => i.map(i => i && decodeURIComponent(i))));
26+
27+
var fileTypes = queries.exts ? queries.exts.split(",") : [];
28+
29+
var receiverFrame = document.createElement("iframe");
30+
receiverFrame.style.display = "none";
31+
receiverFrame.crossorigin = "anonymous"; // soon...
32+
receiverFrame.src = queries.returnurl;
33+
34+
var receiverLoaded = false;
35+
var frameTimer = setTimeout(function() {
36+
alert("The file receiver is taking an unusually long time to respond. This could be the result of Content-Security-Policy: frame-ancestors or X-Frame-Options blocking it. The frame is now shown:");
37+
receiverFrame.style.display = "block";
38+
}, 5000);
39+
40+
receiverFrame.onload = function() {
41+
receiverLoaded = true;
42+
clearTimeout(frameTimer);
43+
}
44+
document.body.appendChild(receiverFrame);
45+
46+
function finish(message, name, data) {
47+
function waitForReceiverLoad() {
48+
if (receiverLoaded) {
49+
receiverFrame.contentWindow.postMessage({webretro: {timestamp: parseInt(queries.timestamp), message: message, name: name, data: data}}, "*");
50+
} else {
51+
setTimeout(waitForReceiverLoad, 500);
52+
}
53+
}
54+
waitForReceiverLoad();
55+
}
56+
57+
window.addEventListener("unload", function() {
58+
if (queries.type) finish("cancelled");
59+
}, false);
60+
61+
window.addEventListener("message", function(e) {
62+
if (e.data == "acknowledged") window.close(); // with coop, this window has "ownership" over itself
63+
}, false);
64+
65+
function xhr(loc, success, error) {
66+
var xhr = new XMLHttpRequest();
67+
xhr.open("GET", loc, true);
68+
xhr.responseType = "arraybuffer";
69+
xhr.onload = function() {
70+
success(this.response);
71+
}
72+
xhr.onerror = function(e) {
73+
if (error) error(e);
74+
}
75+
xhr.send();
76+
}
77+
78+
// Pass on data from Google Drive picker
79+
window.addEventListener("message", function(e) {
80+
if (e.origin == window.location.origin && e.data.webretro) finish(e.data.webretro.message, e.data.webretro.name, e.data.webretro.data);
81+
}, false);
82+
83+
if (queries.type == "drive") {
84+
// Google Drive
85+
86+
var dwidth = window.screen.width - 320;
87+
var dheight = window.screen.height - 240;
88+
var dleft = 160;
89+
var dtop = 120;
90+
window.open("drive.html?exts=" + fileTypes.join(","), "Choose a File", "left=" + dleft + ",top=" + dtop + ",width=" + dwidth + ",height=" + dheight);
91+
} else if (queries.type == "dropbox") {
92+
// Dropbox
93+
94+
Dropbox.appKey = dropboxAppKey;
95+
Dropbox.choose({
96+
success: function(files) {
97+
var file = files[0];
98+
xhr(file.link, function(data) {
99+
finish("success", file.name, data);
100+
}, function() {
101+
finish("error");
102+
});
103+
},
104+
cancel: function() {
105+
finish("cancelled");
106+
},
107+
linkType: "direct",
108+
multiselect: false,
109+
folderselect: false
110+
});
111+
} else if (queries.type == "onedrive") {
112+
// OneDrive
113+
114+
OneDrive.open({
115+
clientId: onedriveClientId,
116+
action: "download",
117+
multiSelect: false,
118+
advanced: {
119+
filter: fileTypes.join(",")
120+
},
121+
success: function(response) {
122+
var name = response.value[0].name;
123+
var link = response.value[0]["@microsoft.graph.downloadUrl"];
124+
xhr(link, function(data) {
125+
finish("success", name, data);
126+
}, function() {
127+
finish("error");
128+
});
129+
},
130+
cancel: function() {
131+
finish("cancelled");
132+
},
133+
error: function(error) {
134+
finish("error");
135+
}
136+
});
137+
}
138+
</script>
139+
</body>
140+
</html>
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,31 @@
99
top: 50%;
1010
transform: translate(-50%, -50%);
1111
margin: 0px;
12+
text-align: center;
1213
}
1314
</style>
1415
</head>
1516
<body>
16-
<h1 class='center'>Choose a file... Do not close this window.</h1>
17+
<div class="center">
18+
<h1>Choose a file...</h1>
19+
<h2>Make sure you have popups enabled!</h2>
20+
</div>
1721
<script src="https://www.dropbox.com/static/api/2/dropins.js"></script>
1822
<script src="https://js.live.net/v7.2/OneDrive.js"></script>
1923
<script src="tokens.js"></script>
2024
<script>
21-
var search = decodeURIComponent(window.location.search).substring(1).split("&");
22-
var queries = {};
23-
for (var i = 0; i < search.length; i++) {
24-
var p = search[i].split("=");
25-
queries[p[0]] = p[1];
26-
}
25+
var queries = Object.fromEntries(window.location.search.substring(1).split("&").map(i => i.split("=")).map(i => i.map(i => i && decodeURIComponent(i))));
2726

2827
var fileTypes = queries.exts ? queries.exts.split(",") : [];
2928

3029
function finish(message, name, data) {
31-
window.parent.postMessage({webretro: {message: message, name: name, data: data}}, "*");
30+
window.opener.postMessage({webretro: {timestamp: parseInt(queries.timestamp), message: message, name: name, data: data}}, "*");
3231
}
3332

33+
window.addEventListener("unload", function() {
34+
if (queries.type) finish("cancelled");
35+
}, false);
36+
3437
function xhr(loc, success, error) {
3538
var xhr = new XMLHttpRequest();
3639
xhr.open("GET", loc, true);

uauth/receiver.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Choose a File</title>
5+
</head>
6+
<body>
7+
<h2>I'm supposed to be an invisible iframe... (you shouldn't see this)</h2>
8+
<script>
9+
let uauthBC = new BroadcastChannel("uauth");
10+
window.addEventListener("message", function(e) {
11+
uauthBC.postMessage(e.data);
12+
window.parent.postMessage("acknowledged", "*");
13+
}, false);
14+
</script>
15+
</body>
16+
</html>

0 commit comments

Comments
 (0)