Configuring Web App UI Settings
Configuring Web App UI Settings
"logo_link_name":
"[Link]
[Link]",
"login_image": "[Link] // Login page logo image
"fixed_header": true, // If you want the footer to be flexible or fixed.
"header_padding": "80", // Value 80 for fixed header, Value 20 for flexible
header. Required to be changed accordingly in some themes.
"nav_link_1": "Home", // change navigation link name
"nav_link_3": "Current Path", // change navigation link name
"nav_link_4": "Contact", // change navigation link name
"fixed_footer": false, // If you want the footer to be flexible or fixed.
"hide_footer": true, // hides the footer from site entirely.
"header_style_class": "navbar-dark bg-primary", // navbar-dark bg-primary ||
navbar-dark bg-dark || navbar-light bg-light
"footer_style_class": "bg-primary", // bg-primary || bg-dark || bg-light
"css_a_tag_color": "white", // Color Name or Hex Code eg. #ffffff
"css_p_tag_color": "white", // Color Name or Hex Code eg. #ffffff
"folder_text_color": "white", // Color Name or Hex Code eg. #ffffff
"loading_spinner_class": "text-light", //
[Link]
"search_button_class": "btn btn-danger", //
[Link]
"path_nav_alert_class": "alert alert-primary", //
[Link]
"file_view_alert_class": "alert alert-danger", //
[Link]
"file_count_alert_class": "alert alert-secondary", //
[Link]
"contact_link": "[Link] // Link to Contact Button
on Menu
"copyright_year": "2025", // year of copyright, can be anything like 2015 - 2020
or just 2020
"company_name": "The Bay Index", // Name next to copyright
"company_link": "[Link] // link of copyright name
"credit": true, // Set this to true to give us credit
"display_size": true, // Set this to false to hide display file size
"display_time": false, // Set this to false to hide display modified time for
folder and files
"display_download": true, // Set this to false to hide download icon for folder
and files on main index
"disable_player": false, // Set this to true to hide audio and video players
"disable_video_download": false, // Remove Download, Copy Button on Videos
"allow_selecting_files": true, // Disable Selecting Files to Download in Bulk
"second_domain_for_dl": false, // If you want to display other URL for
Downloading to protect your main domain.
"poster":
"[Link] // Video
poster URL or see Readme to how to load from Drive
"audioposter":
"[Link] // Video
poster URL or see Readme to how to load from Drive
"jsdelivr_cdn_src": "[Link] // If
Project is Forked, then enter your GitHub repo
"render_head_md": true, // Render [Link]
"render_readme_md": true, // Render [Link]
"unauthorized_owner_link": "[Link] // Unauthorized
Error Page Link to Owner
"unauthorized_owner_email": "abuse@[Link]", // Unauthorized Error Page
Owner Email
"downloaddomain": domain_for_dl, // Ignore this and set domains at top of this
page after service accounts.
"show_logout_button": authConfig.enable_login ? true : false, // set to true if
you want to add logout button
};
const player_config = {
"player": "videojs", // videojs || plyr || dplayer || jwplayer
"videojs_version": "8.3.0", // Change videojs version in future when needed.
"plyr_io_version": "3.7.8",
"jwplayer_version": "8.16.2"
}
// DON'T TOUCH BELOW THIS UNLESS YOU KNOW WHAT YOU'RE DOING
var gds = [];
const drive_list = [Link](it => [Link])
let app_js_file
if (environment === 'production') {
app_js_file = uiConfig.jsdelivr_cdn_src + '@' + [Link] +
'/src/[Link]'
} else if (environment === 'development') {
app_js_file = '/[Link]'
} else if (environment === 'local') {
app_js_file = '[Link]
}
</div>
<div class="${uiConfig.file_count_alert_class} text-center" role="alert"
id="count">Total <span id="n_drives" class="number text-center"></span>
drives</div>
</div>
</div>
<div class="modal fade" id="SearchModel" data-bs-backdrop="static" data-bs-
keyboard="false" tabindex="-1" aria-labelledby="SearchModelLabel" aria-
hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="SearchModelLabel"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-
label="Close">
<span aria-hidden="true"></span>
</button>
</div>
<div class="modal-body" id="modal-body-space">
</div>
<div class="modal-footer" id="modal-body-space-buttons">
</div>
</div>
</div>
</div>
<br>
<footer class="footer mt-auto py-3 text-muted ${uiConfig.footer_style_class}"
style="${uiConfig.fixed_footer ?'position: fixed; ': ''}left: 0; bottom: 0; width:
100%; color: white; z-index: 9999;${uiConfig.hide_footer ? ' display:none;': '
display:block;'}"> <div class="container" style="width: auto; padding: 0 10px;"> <p
class="float-end"> <a href="#">Back to top</a> </p> ${[Link] ?
'<p>Redesigned with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-
heart-fill" fill="red" xmlns="[Link] <path fill-
rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8
1.314z" /> </svg> by <a href="[Link]
target="_blank">TheFirstSpeedster</a>, based on Open Source Softwares.</p>' : ''}
<p>© ${uiConfig.copyright_year} - <a href=" ${uiConfig.company_link}"
target="_blank"> ${uiConfig.company_name}</a>, All Rights Reserved.</p> </div>
</footer>
</div>
</body>
<script
src="${uiConfig.jsdelivr_cdn_src}@${[Link]}/assets/[Link]"></
script>
<script
src="[Link]
integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8"
crossorigin="anonymous"></script>
</html>`
const login_html = `<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Sign in - ${[Link]}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex, nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="${[Link]}">
<script type="text/javascript" src="//[Link]/jquery-
[Link]"></script>
<link rel="stylesheet"
href="[Link]
integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z"
crossorigin="anonymous">
<link rel="stylesheet"
href="[Link]
[Link]" integrity="sha384-
wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
crossorigin="anonymous">
<style id="compiled-css" type="text/css">.login,.image{min-height:100vh}.bg-
image{background-image:url('[Link]
[Link]');background-size:cover;background-position:center center}#error-
message{display:none}</style>
<link rel="preconnect" href="[Link]
<link rel="preconnect" href="[Link] crossorigin>
<link href="[Link]
rel="stylesheet">
<style>
.logo {
font-family: 'Orbitron', sans-serif;
color: #007bff;
}
</style>
<script src="[Link]
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
<script>
$(document).ready(function(){
$("#btn-login").click(function() {
const formData = new URLSearchParams();
[Link]('username', $("#email").val());
[Link]('password', $("#password").val());
fetch('/login', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: [Link]()
})
.then(res => [Link]())
.then(data => {
if (![Link]) {
[Link]("error-message").[Link] = "block";
[Link]("error-message").innerHTML = "Invalid
Credentials";
} else {
[Link]();
}
});
});
const queryparams = new URLSearchParams([Link]);
if ([Link]('error')) {
[Link]("error-message").[Link] = "block";
[Link]("error-message").innerHTML =
[Link]('error');
}
});
</script>
</head>
<body>
<div class="container-fluid">
<div class="row no-gutter">
<div class="col-md-6 d-none d-md-flex bg-image"></div>
<div class="col-md-6 bg-light">
<div class="login d-flex align-items-center py-5">
<div class="container">
<div class="row">
<div class="col-lg-10 col-xl-7 mx-auto">
<img src="${uiConfig.login_image}" class="img-fluid" style="width:
150px; display: block; margin-left: auto; margin-right: auto; margin-bottom:
20px;">
<div id="error-message" class="alert alert-danger"></div>
<form false;" method="post">
<p id="error" style="color:red;"></p>
<div class="form-group mb-3">
<input id="email" type="text" placeholder="Username" autofocus=""
class="form-control rounded-pill border-0 shadow-sm px-4" required>
</div>
<div class="form-group mb-3">
<input id="password" type="password" placeholder="Password"
class="form-control rounded-pill border-0 shadow-sm px-4 text-primary" required>
</div>
<button id="btn-login" type="submit" class="btn btn-primary btn-
block text-uppercase mb-2 rounded-pill shadow-sm">Login</button>
${authConfig.enable_signup ? `<a href="/signup" class="btn btn-
outline-danger btn-block text-uppercase mb-2 rounded-pill shadow-sm">Signup</a>` :
''}
</form>
<hr class="solid">
${authConfig.enable_social_login ? `<div id="allsociallogins"
style="display:block;">
<a href="[Link]
client_id=`+authConfig.google_client_id_for_login+`&redirect_uri=`+[Link]
ect_domain+`/google_callback&response_type=code&scope=email
%20profile&response_mode=query" id="btn-google" class="btn btn-block btn-social
btn-google"><span class="fa fa-google"></span> Sign in with Google</a>
</div>` : ''}
</div>
</div>
</div>
</div>
<center>
<p>
© <script>[Link](new Date().getFullYear())</script> $
{uiConfig.company_name}
</p>
</center>
</div>
</div>
</div>
</body>
</html>`
fetch('/signup_api', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: [Link]()
})
.then(res => [Link]())
.then(data => {
if (![Link]) {
[Link]("error-message").[Link] = "block";
[Link]("error-message").innerHTML = "Failed to Create
Account, Error: " + [Link];
} else {
[Link]("error-message").[Link] = "block";
[Link]("error-message").innerHTML = "Account Created,
Please Login";
}
});
});
const queryparams = new URLSearchParams([Link]);
if ([Link]('error')) {
[Link]("error-message").[Link] = "block";
[Link]("error-message").innerHTML =
[Link]('error');
}
});
</script>
</head>
<body>
<div class="container-fluid">
<div class="row no-gutter">
<div class="col-md-6 d-none d-md-flex bg-image"></div>
<div class="col-md-6 bg-light">
<div class="login d-flex align-items-center py-5">
<div class="container">
<div class="row">
<div class="col-lg-10 col-xl-7 mx-auto">
<h3 class="logo text-center mb-3">${[Link]}</h3>
<div id="error-message" class="alert alert-danger"></div>
<form false;" method="post">
<p id="error" style="color:red;"></p>
<div class="form-group mb-3">
<input id="email" type="text" placeholder="Username" autofocus=""
class="form-control rounded-pill border-0 shadow-sm px-4" required>
</div>
<div class="form-group mb-3">
<input id="password" type="password" placeholder="Password"
class="form-control rounded-pill border-0 shadow-sm px-4 text-primary" required>
</div>
<button id="btn-login" type="submit" class="btn btn-primary btn-
block text-uppercase mb-2 rounded-pill shadow-sm">SIGNUP</button>
<a href="/login" class="btn btn-outline-danger btn-block text-
uppercase mb-2 rounded-pill shadow-sm">LOGIN</a>
</form>
<hr class="solid">
${authConfig.enable_social_login ? `<div id="allsociallogins"
style="display:block;">
<a href="[Link]
client_id=`+authConfig.google_client_id_for_login+`&redirect_uri=`+[Link]
ect_domain+`/google_callback&response_type=code&scope=email
%20profile&response_mode=query" id="btn-google" class="btn btn-block btn-social
btn-google"><span class="fa fa-google"></span> Sign in with Google</a>
</div>` : ''}
</div>
</div>
</div>
</div>
<center>
<p>
© <script>[Link](new Date().getFullYear())</script> $
{uiConfig.company_name}
</p>
</center>
</div>
</div>
</div>
</body>
</html>`
<script>
[Link]("status").innerHTML =
"The requested URL <code>" + [Link] + "</code> was not found on
this server. <ins>That’s all we know.</ins>";
</script>`
</style>
</head>
<body>
<div class="container">
<div class="content">
<div class="message">Access Denied</div>
</div>
</div>
</body>
</html>`
const directlink = `
<html>
<head>
<title>Direct Link - Access Denied</title>
<link href='[Link] rel='stylesheet'
type='text/css'>
<style>
body{
margin:0;
padding:0;
width:100%;
height:100%;
color:#b0bec5;
display:table;
font-weight:100;
font-family:Lato
}
.container{
text-align:center;
display:table-cell;
vertical-align:middle
}
.content{
text-align:center;
display:inline-block
}
.message{
font-size:80px;
margin-bottom:40px
}
a{
text-decoration:none;
color:#3498db
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<div class="message">Access Denied</div>
<center><a href=""><button id="goto">Click Here to Proceed!</button></a></center>
</div>
</div>
</body>
</html>
`
const SearchFunction = {
formatSearchKeyword: function(keyword) {
let nothing = "";
let space = " ";
if (!keyword) return nothing;
return [Link](/(!=)|['"=<>/\\:]/g, nothing)
.replace(/[,,|(){}]/g, space)
.trim()
}
};
return hmacHex;
}
function login() {
return new Response(login_html, {
status: 401,
headers: {
'Content-Type': 'text/html; charset=utf-8'
}
});
}
// start handlerequest
async function handleRequest(request, event) {
const region = [Link]('cf-ipcountry');
const asn_servers = [Link];
const referer = [Link]("Referer");
var user_ip = [Link]("CF-Connecting-IP");
let url = new URL([Link]);
let path = [Link];
let hostname = [Link];
if (path == '/[Link]') {
const js = await fetch('[Link]
Index/-/raw/dev/src/[Link]', {
method: 'GET',
})
const data = await [Link]()
return new Response(data, {
status: 200,
headers: {
'Content-Type': 'application/javascript; charset=utf-8',
'Access-Control-Allow-Origin': '*', // Required for CORS support to work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
}
if (path == '/logout') {
let response = new Response("", {});
[Link]('Set-Cookie', `session=; HttpOnly; Secure;
SameSite=Lax;`);
[Link]("Refresh", "1; url=/?error=Logged Out");
return response;
}
if (path == '/findpath') {
const params = [Link];
const id = [Link]('id');
const view = [Link]('view') || 'false';
return [Link]([Link] + hostname + '/0:findpath?id=' + id +
'&view=' + view, 307);
}
if (authConfig.enable_login) {
const login_database = authConfig.login_database.toLowerCase();
//[Link]("Login Enabled")
if (path == '/[Link]' && !authConfig.disable_anonymous_download) {
[Link]("Anonymous Download")
} else if (path == '/google_callback') {
// Extract the authorization code from the query parameters
const code = [Link]('code')
if (!code) {
return new Response('Missing authorization code.', {
status: 400
});
}
if (!user_found) {
const jsonResponse = {
ok: false,
}
let response = new Response([Link](jsonResponse), {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
return response;
}
if (user_found) {
const current_time = [Link](); // this results in a timestamp of the
number of milliseconds since epoch.
const session_time = current_time + 86400000 * authConfig.login_days;
const encryptedSession = `${await encryptString(username)}|${await
encryptString(password)}|${await encryptString(session_time.toString())}`;
if (authConfig.single_session) {
await [Link](username + '_session', encryptedSession);
}
if (authConfig.ip_changed_action && user_ip) {
await [Link](username + '_ip', user_ip);
}
const jsonResponse = {
ok: true,
}
let response = new Response([Link](jsonResponse), {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Set-Cookie': `session=${encryptedSession}; path=/; HttpOnly; Secure;
SameSite=Lax`,
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
return response;
} else {
const jsonResponse = {
ok: false,
}
let response = new Response([Link](jsonResponse), {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
return response;
}
} else if (path == '/signup' && authConfig.enable_signup) {
return new Response(signup_html, {
status: 200,
headers: {
'Content-Type': 'text/html; charset=utf-8',
'Access-Control-Allow-Origin': '*', // Required for CORS support to work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
} else if (authConfig.enable_signup && [Link] === 'POST' && path ===
'/signup_api') {
if (login_database == 'kv') {
const formdata = await [Link]();
const username = [Link]('username');
const password = [Link]('password');
if (username == null || password == null) {
const jsonResponse = {
ok: true,
error: "Username or Password is null"
}
let response = new Response([Link](jsonResponse), {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Set-Cookie': `session=; path=/; HttpOnly; Secure; SameSite=Lax`,
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
return response;
} else if ([Link] > 8 && [Link] > 8) {
const checkKey = await [Link](username);
let jsonResponse;
if (checkKey != null) {
jsonResponse = {
ok: false,
error: "User Already Exists"
}
} else {
await [Link](username, password);
jsonResponse = {
ok: true,
error: "User Created"
}
}
let response = new Response([Link](jsonResponse), {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Set-Cookie': `session=; path=/; HttpOnly; Secure; SameSite=Lax`,
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
return response;
} else {
const jsonResponse = {
ok: false,
error: "Username or Password length is less than 8 characters"
}
let response = new Response([Link](jsonResponse), {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Set-Cookie': `session=; path=/; HttpOnly; Secure; SameSite=Lax`,
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
return response;
}
} else if (login_database == 'mongodb') {
// to be implemented later
} else {
return new Response("Signup is not supported with local database", {
status: 200,
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*', // Required for CORS support to
work
'Access-Control-Allow-Credentials': true, // Required for cookies,
authorization headers with HTTPS
}
});
}
} else if ([Link] === 'GET') {
//[Link]("GET Request")
const cookie = [Link]('cookie');
if (cookie && [Link]('session=')) {
const session = [Link]('session=').pop().split(';').shift().trim();
if (session == 'null' || session == '' || session == null) {
return login()
}
const username = await decryptString([Link]('|')[0]);
let kv_session
if (authConfig.single_session) {
kv_session = await [Link](username + '_session');
if (kv_session != session) {
let response = new Response('User Logged in Someplace Else!', {
headers: {
'Set-Cookie': `session=; HttpOnly; Secure; SameSite=Lax;`,
}
});
[Link]("Refresh", "1; url=/?error=User Logged in
Someplace Else!");
return response;
}
}
if (authConfig.ip_changed_action && user_ip) {
const kv_ip = await [Link](username + '_ip');
if (kv_ip != user_ip) {
let response = new Response('IP Changed! Login Required', {
headers: {
'Set-Cookie': `session=; HttpOnly; Secure; SameSite=Lax;`,
}
});
[Link]("Refresh", "1; url=/?error=IP Changed! Login
Required");
return response;
}
}
const session_time = await decryptString([Link]('|')[2]);
[Link]("User: " + username + " | Session Time: " + session_time)
const current_time = [Link](); // this results in a timestamp of the
number of milliseconds since epoch.
if (Number(session_time) < current_time) {
let response = new Response('Session Expired!', {
headers: {
'Set-Cookie': `session=; HttpOnly; Secure; SameSite=Lax;`,
}
});
[Link]("Refresh", "1; url=/?error=Session Expired!");
return response;
}
if (login_database == 'kv') {
const kv_key = await [Link](username);
if (kv_key == null) {
var user_found = false;
} else {
if (kv_key) {
var user_found = true;
} else {
var user_found = false;
}
}
} else if (login_database == 'mongodb') {
// to be implemented later
} else { // local database
for (i = 0; i < authConfig.users_list.length; i++) {
if (authConfig.users_list[i].username == username) {
var user_found = true;
break;
}
}
}
if (user_found) {
[Link]("User Found")
} else {
let response = new Response('Invalid User! Something Wrong', {});
[Link]('Set-Cookie', `session=; HttpOnly; Secure;
SameSite=Lax;`);
[Link]("Refresh", "1; url=/?error=Invalid User");
return response;
}
} else {
return login()
}
}
}
if ([Link] === 0) {
for (let i = 0; i < [Link]; i++) {
const gd = new googleDrive(authConfig, i);
await [Link]();
[Link](gd)
}
let tasks = [];
[Link](gd => {
[Link]([Link]());
});
for (let task of tasks) {
await task;
}
}
let gd;
function redirectToIndexPage() {
return new Response('', {
status: 307,
headers: {
'Location': `${[Link]}/0:/`
}
});
}
if (authConfig['direct_link_protection']) {
if (referer == null) {
return new Response(directlink, {
headers: {
'content-type': 'text/html;charset=UTF-8'
},
status: 401
});
} else if ([Link](hostname)) {
[Link]("Refer Detected");
} else {
return new Response(directlink, {
headers: {
'content-type': 'text/html;charset=UTF-8'
},
status: 401
});
}
}
const command_reg = /^\/(?<num>\d+):(?<command>[a-zA-Z0-9]+)(\/.*)?$/g;
const match = command_reg.exec(path);
if (match) {
const num = [Link];
const order = Number(num);
if (order >= 0 && order < [Link]) {
gd = gds[order];
} else {
return redirectToIndexPage()
}
//for (const r = [Link](request); r;) return r;
const command = [Link];
if (command === 'search') {
if ([Link] === 'POST') {
return handleSearch(request, gd, user_ip);
} else {
const params = [Link];
return new Response(html([Link], {
q: [Link]("q").replace(/'/g, "").replace(/"/g, "") || '',
is_search_page: true,
root_type: gd.root_type
}), {
status: 200,
headers: {
'Content-Type': 'text/html; charset=utf-8'
}
});
}
} else if (command === 'id2path' && [Link] === 'POST') {
return handleId2Path(request, gd)
} else if (command === 'fallback' && [Link] === 'POST') {
const formdata = await [Link]();
const id = await decryptString([Link]);
const type = [Link];
if (type && type == 'folder') {
const page_token = formdata.page_token || null;
const page_index = formdata.page_index || 0;
const details = await gd._list_gdrive_files(id, page_token, page_index);
for (const file of [Link]) {
if ([Link] != 'application/[Link]') {
[Link] = await generateLink([Link], user_ip);
}
[Link] = await encryptString([Link]);
[Link] = await encryptString([Link]);
}
const encryptedDetails = details;
return new Response([Link](encryptedDetails), {});
}
const details = await [Link](id)
[Link] = await generateLink([Link], user_ip);
[Link] = [Link];
[Link][0] = null;
return new Response([Link](details), {});
} else if (command === 'findpath' && [Link] === 'GET') {
return findId2Path(gd, url)
}
}
const common_reg = /^\/\d+:\/.*$/g;
try {
if () {
return redirectToIndexPage();
}
let split = [Link]("/");
let order = Number(split[1].slice(0, -1));
if (order >= 0 && order < [Link]) {
gd = gds[order];
} else {
return redirectToIndexPage()
}
} catch (e) {
return redirectToIndexPage()
}
}
// end handlerequest
function enQuery(data) {
const ret = [];
for (let d in data) {
[Link](encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
}
return [Link]('&');
}
let requestOption = {
'method': 'POST',
'headers': headers,
'body': enQuery(post_data)
};
let response;
for (let i = 0; i < 3; i++) {
response = await fetch(url, requestOption);
if ([Link]) {
break;
}
await sleep(800 * (i + 1));
}
return await [Link]();
}
if ([Link](-1) == '/') {
let requestData = await [Link]();
let list_result = await gd.request_list_of_files(
path,
requestData.page_token || null,
Number(requestData.page_index) || 0
);
if (authConfig['enable_password_file_verify']) {
let password = await [Link](path);
// [Link]("dir password", password);
if (password && [Link]("\n", "") !== [Link]('password')) {
let html =
`Y29kZWlzcHJvdGVjdGVk=0Xfi4icvJnclBCZy92dzNXYwJCI6ISZnF2czVWbiwSMwQDI6ISZk92YisHI6I
icvJnclJyeYmFzZTY0aXNleGNsdWRlZA==`;
return new Response(html, option);
}
}
return {
...fileWithoutId,
id: encryptedId,
driveId: encryptedDriveId,
mimeType: mimeType,
link: link,
};
}));
}
});
} else {
let file_json = await gd.get_single_file(path);
const {
driveId,
id,
...fileWithoutId
} = file_json;
}
});
}
}
async initRootType() {
const root_id = [Link]['id'];
const types = DriveFixedTerms.gd_root_type;
if (root_id === 'root' || root_id === authConfig.user_drive_real_root_id) {
this.root_type = types.user_drive;
} else {
this.root_type = types.share_drive;
}
}
async get_single_file(path) {
if (typeof [Link][path] == 'undefined') {
[Link][path] = await this.get_single_file_api(path);
}
return [Link][path];
}
async get_single_file_api(path) {
let arr = [Link]('/');
let name = [Link]();
name = decodeURIComponent(name).replace(/\'/g, "\\'");
let dir = [Link]('/') + '/';
[Link]("try " + name, dir);
let parent = await [Link](dir);
[Link]("try " + parent)
let url = '[Link]
let params = {
'includeItemsFromAllDrives': true,
'supportsAllDrives': true
};
params.q = `'${parent}' in parents and name = '${name}' and trashed = false and
mimeType != 'application/[Link]'`;
[Link] = "files(id, name, mimeType, size ,createdTime, modifiedTime,
iconLink, thumbnailLink, driveId, fileExtension)";
url += '?' + enQuery(params);
let requestOption = await [Link]();
let response;
for (let i = 0; i < 3; i++) {
response = await fetch(url, requestOption);
if ([Link]) {
break;
}
await sleep(800 * (i + 1));
}
let obj = await [Link]();
// [Link](obj);
return [Link][0];
}
if (this.path_children_cache[path] &&
this.path_children_cache[path][page_index] &&
this.path_children_cache[path][page_index].data
) {
let child_obj = this.path_children_cache[path][page_index];
return {
nextPageToken: child_obj.nextPageToken || null,
curPageIndex: page_index,
data: child_obj.data
};
}
return result
}
if (parent == undefined) {
return null;
}
let obj;
let params = {
'includeItemsFromAllDrives': true,
'supportsAllDrives': true
};
params.q = `'${parent}' in parents and trashed = false AND name !='.password'
and mimeType != 'application/[Link]' and mimeType !=
'application/[Link]' and mimeType != 'application/[Link]-
[Link]' and mimeType != 'application/[Link]' and mimeType !
= 'application/[Link]'`;
[Link] = 'folder, name, modifiedTime desc';
[Link] = "nextPageToken, files(id, name, mimeType, size, modifiedTime,
driveId, kind, fileExtension)";
[Link] = [Link].files_list_page_size;
if (page_token) {
[Link] = page_token;
}
let url = '[Link]
url += '?' + enQuery(params);
let requestOption = await [Link]();
let response;
for (let i = 0; i < 3; i++) {
response = await fetch(url, requestOption);
if ([Link]) {
break;
}
await sleep(800 * (i + 1));
}
obj = await [Link]();
return {
nextPageToken: [Link] || null,
curPageIndex: page_index,
data: obj
};
}
async password(path) {
if ([Link][path] !== undefined) {
return [Link][path];
}
return [Link][path];
}
return {
nextPageToken: res_obj.nextPageToken || null,
curPageIndex: page_index,
data: res_obj
};
}
async findPathById(child_id) {
let p_files
let drive_index_no = 0;
try {
[p_files, drive_index_no] = await [Link](child_id);
} catch (error) {
return null;
}
async findItemById(id) {
const is_user_drive = this.root_type ===
DriveFixedTerms.gd_root_type.user_drive;
let url = `[Link]
{DriveFixedTerms.default_file_fields}${is_user_drive ? '' :
'&supportsAllDrives=true'}`;
let requestOption = await [Link]();
let res = await fetch(url, requestOption);
return await [Link]()
}
async findPathId(path) {
let c_path = '/';
let c_id = [Link][c_path];
c_id = [Link][c_path];
if (c_id == undefined || c_id == null) {
break;
}
}
[Link]('findPathId: ', path, c_id)
return [Link][path];
}
/*async getAccessToken() {
[Link]("accessToken");
if ([Link] == undefined || [Link] <
[Link]()) {
const obj = await fetchAccessToken();
if (obj.access_token != undefined) {
[Link] = obj.access_token;
[Link] = [Link]() + 3500 * 1000;
}
}
return [Link];
}*/
/*async fetchAccessToken() {
[Link]("fetchAccessToken");
const url = "[Link]
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
var post_data;
if ([Link].service_account && typeof
[Link].service_account_json != "undefined") {
const jwttoken = await
[Link]([Link].service_account_json);
post_data = {
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
assertion: jwttoken,
};
} else {
post_data = {
client_id: [Link].client_id,
client_secret: [Link].client_secret,
refresh_token: [Link].refresh_token,
grant_type: "refresh_token",
};
}
let requestOption = {
'method': 'POST',
'headers': headers,
'body': enQuery(post_data)
};
let response;
for (let i = 0; i < 3; i++) {
response = await fetch(url, requestOption);
if ([Link]) {
break;
}
await sleep(800 * (i + 1));
}
return await [Link]();
}*/
/*sleep(ms) {
return new Promise(function(resolve, reject) {
let i = 0;
setTimeout(function() {
[Link]('sleep' + ms);
i++;
if (i >= 2) reject(new Error('i>=2'));
else resolve(i);
}, ms);
})
}*/
}
// end of class googleDrive
const drive = new googleDrive(authConfig, 0);
async function download(id, range = '', inline) {
let url = `[Link]
const requestOption = await [Link]();
[Link]['Range'] = range;
let file = await [Link](id);
if (![Link]) {
return new Response(`{"error":"Unable to Find this File, Try Again."}`, {
status: 500,
headers: {
"content-type": "application/json",
"Access-Control-Allow-Origin": authConfig.cors_domain,
"Cache-Control": "max-age=3600",
}
});
}
let res;
for (let i = 0; i < 3; i++) {
res = await fetch(url, requestOption);
if ([Link]) {
break;
}
sleep(800 * (i + 1));
[Link](res);
}
const second_domain_for_dl = `${uiConfig.second_domain_for_dl}`
if (second_domain_for_dl == 'true') {
const res = await
fetch(`${uiConfig.jsdelivr_cdn_src}@${[Link]}/assets/disable_download.htm
l`);
return new Response(await [Link](), {
headers: {
"content-type": "text/html;charset=UTF-8",
},
})
} else if ([Link]) {
const {
headers
} = res = new Response([Link], res)
[Link]("Content-Disposition", `attachment; filename="${[Link]}"`);
[Link]("Content-Length", [Link]);
authConfig.enable_cors_file_down && [Link]('Access-Control-Allow-
Origin', '*');
inline === true && [Link]('Content-Disposition', 'inline');
return res;
} else if ([Link] == 404) {
return new Response(not_found, {
status: 404,
headers: {
"content-type": "text/html;charset=UTF-8",
},
})
} else if ([Link] == 403) {
const details = await [Link]()
return new Response(details, {
status: 403,
headers: {
"content-type": "text/html;charset=UTF-8",
},
})
} else {
const details = await [Link]()
/*const res = await
fetch(`${uiConfig.jsdelivr_cdn_src}@${[Link]}/assets/download_error.html`
);
return new Response(await [Link](), {
headers: {
"content-type": "text/html;charset=UTF-8",
},
})*/
return new Response(details, {})
}
}
[Link] = function(char) {
if (char) {
return [Link](new RegExp('^\\' + char + '+|\\' + char + '+$', 'g'), '');
}
return [Link](/^\s+|\s+$/g, '');
};
function decodeJwtToken(token) {
const base64Url = [Link]('.')[1];
const base64 = [Link](/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + [Link](0).toString(16)).slice(-2);
}).join(''));
return [Link](jsonPayload);
}