mirror of
https://github.com/hrfee/jellyfin-accounts.git
synced 2024-12-23 01:20:12 +00:00
Harvey Tindall
200ad24f96
Pressing the user settings button brings up a list of all jellyfin users, and allows you to add or change their stored email addresses. Additionally, changed emails.json to use user ID instead of username. The program automatically converts the file to the new format at start.
314 lines
13 KiB
JavaScript
314 lines
13 KiB
JavaScript
function parseInvite(invite, empty = false) {
|
||
if (empty === true) {
|
||
return ["None", "", "1"]
|
||
} else {
|
||
var i = ["", "", "0", invite['email']];
|
||
i[0] = invite['code'];
|
||
if (invite['hours'] == 0) {
|
||
i[1] = invite['minutes'] + 'm';
|
||
} else if (invite['minutes'] == 0) {
|
||
i[1] = invite['hours'] + 'h';
|
||
} else {
|
||
i[1] = invite['hours'] + 'h ' + invite['minutes'] + 'm';
|
||
}
|
||
i[1] = "Expires in " + i[1] + " ";
|
||
return i
|
||
}
|
||
}
|
||
function addItem(invite) {
|
||
var links = document.getElementById('invites');
|
||
var listItem = document.createElement('li');
|
||
listItem.id = invite[0]
|
||
listItem.classList.add('list-group-item', 'd-flex', 'justify-content-between', 'd-inline-block');
|
||
var listCode = document.createElement('div');
|
||
listCode.classList.add('d-flex', 'align-items-center', 'text-monospace');
|
||
var codeLink = document.createElement('a');
|
||
codeLink.setAttribute('style', 'margin-right: 2%;');
|
||
codeLink.appendChild(document.createTextNode(invite[0].replace(/-/g, '‑')));
|
||
listCode.appendChild(codeLink);
|
||
listItem.appendChild(listCode);
|
||
var listRight = document.createElement('div');
|
||
listText = document.createElement('span');
|
||
listText.id = invite[0] + '_expiry'
|
||
listText.appendChild(document.createTextNode(invite[1]));
|
||
listRight.appendChild(listText);
|
||
if (invite[2] == 0) {
|
||
var inviteCode = window.location.href + 'invite/' + invite[0];
|
||
codeLink.href = inviteCode;
|
||
// listCode.appendChild(document.createTextNode(" "));
|
||
var codeCopy = document.createElement('i');
|
||
codeCopy.onclick = function(){toClipboard(inviteCode)};
|
||
codeCopy.classList.add('fa', 'fa-clipboard');
|
||
listCode.appendChild(codeCopy);
|
||
console.log(invite[3]);
|
||
if (typeof(invite[3]) != 'undefined') {
|
||
var sentTo = document.createElement('span');
|
||
sentTo.setAttribute('style', 'color: grey; margin-left: 2%; font-style: italic; font-size: 75%;');
|
||
sentTo.appendChild(document.createTextNode('Sent to ' + invite[3]));
|
||
listCode.appendChild(sentTo);
|
||
};
|
||
var listDelete = document.createElement('button');
|
||
listDelete.onclick = function(){deleteInvite(invite[0])};
|
||
listDelete.classList.add('btn', 'btn-outline-danger');
|
||
listDelete.appendChild(document.createTextNode('Delete'));
|
||
listRight.appendChild(listDelete);
|
||
};
|
||
listItem.appendChild(listRight);
|
||
links.appendChild(listItem);
|
||
};
|
||
function updateInvite(invite) {
|
||
var expiry = document.getElementById(invite[0] + '_expiry');
|
||
expiry.textContent = invite[1];
|
||
}
|
||
function removeInvite(code) {
|
||
var item = document.getElementById(code);
|
||
item.parentNode.removeChild(item);
|
||
}
|
||
function generateInvites(empty = false) {
|
||
// document.getElementById('invites').textContent = '';
|
||
if (empty === false) {
|
||
$.ajax('/getInvites', {
|
||
type : 'GET',
|
||
dataType : 'json',
|
||
contentType: 'json',
|
||
xhrFields : {
|
||
withCredentials: true
|
||
},
|
||
beforeSend : function (xhr) {
|
||
xhr.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":"));
|
||
},
|
||
data: { get_param: 'value' },
|
||
complete: function(response) {
|
||
var data = JSON.parse(response['responseText']);
|
||
if (data['invites'].length == 0) {
|
||
document.getElementById('invites').textContent = '';
|
||
addItem(parseInvite([], true));
|
||
} else {
|
||
data['invites'].forEach(function(invite) {
|
||
var match = false;
|
||
var items = document.getElementById('invites').children;
|
||
for (var i = 0; i < items.length; i++) {
|
||
if (items[i].id == invite['code']) {
|
||
match = true;
|
||
updateInvite(parseInvite(invite));
|
||
};
|
||
};
|
||
if (match == false) {
|
||
addItem(parseInvite(invite));
|
||
};
|
||
});
|
||
var items = document.getElementById('invites').children;
|
||
for (var i = 0; i < items.length; i++) {
|
||
var exists = false;
|
||
data['invites'].forEach(function(invite) {
|
||
if (items[i].id == invite['code']) {
|
||
exists = true;
|
||
}
|
||
});
|
||
if (exists == false) {
|
||
removeInvite(items[i].id);
|
||
}
|
||
};
|
||
};
|
||
}
|
||
});
|
||
} else if (empty === true) {
|
||
document.getElementById('invites').textContent = '';
|
||
addItem(parseInvite([], true));
|
||
};
|
||
};
|
||
function deleteInvite(code) {
|
||
var send = JSON.stringify({ "code": code });
|
||
$.ajax('/deleteInvite', {
|
||
data : send,
|
||
contentType : 'application/json',
|
||
type : 'POST',
|
||
xhrFields : {
|
||
withCredentials: true
|
||
},
|
||
beforeSend : function (xhr) {
|
||
xhr.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":"));
|
||
},
|
||
success: function() { generateInvites(); },
|
||
});
|
||
};
|
||
function addOptions(le, sel) {
|
||
for (v = 0; v <= le; v++) {
|
||
var opt = document.createElement('option');
|
||
opt.appendChild(document.createTextNode(v))
|
||
opt.value = v
|
||
sel.appendChild(opt)
|
||
}
|
||
};
|
||
function toClipboard(str) {
|
||
const el = document.createElement('textarea');
|
||
el.value = str;
|
||
el.setAttribute('readonly', '');
|
||
el.style.position = 'absolute';
|
||
el.style.left = '-9999px';
|
||
document.body.appendChild(el);
|
||
const selected =
|
||
document.getSelection().rangeCount > 0
|
||
? document.getSelection().getRangeAt(0)
|
||
: false;
|
||
el.select();
|
||
document.execCommand('copy');
|
||
document.body.removeChild(el);
|
||
if (selected) {
|
||
document.getSelection().removeAllRanges();
|
||
document.getSelection().addRange(selected);
|
||
}
|
||
};
|
||
$("form#inviteForm").submit(function() {
|
||
var send_object = $("form#inviteForm").serializeObject();
|
||
if (document.getElementById('send_to_address_enabled').checked) {
|
||
send_object['email'] = document.getElementById('send_to_address').value;
|
||
}
|
||
var send = JSON.stringify(send_object);
|
||
$.ajax('/generateInvite', {
|
||
data : send,
|
||
contentType : 'application/json',
|
||
type : 'POST',
|
||
xhrFields : {
|
||
withCredentials: true
|
||
},
|
||
beforeSend : function (xhr) {
|
||
xhr.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":"));
|
||
},
|
||
success: function() { generateInvites(); },
|
||
|
||
});
|
||
return false;
|
||
});
|
||
$("form#loginForm").submit(function() {
|
||
window.token = "";
|
||
var details = $("form#loginForm").serializeObject();
|
||
$.ajax('/getToken', {
|
||
type : 'GET',
|
||
dataType : 'json',
|
||
contentType: 'json',
|
||
xhrFields : {
|
||
withCredentials: true
|
||
},
|
||
beforeSend : function (xhr) {
|
||
xhr.setRequestHeader("Authorization", "Basic " + btoa(details['username'] + ":" + details['password']));
|
||
},
|
||
data: { get_param: 'value' },
|
||
complete: function(data) {
|
||
if (data['status'] == 401) {
|
||
var formBody = document.getElementById('formBody');
|
||
var wrongPassword = document.createElement('div');
|
||
wrongPassword.classList.add('alert', 'alert-danger');
|
||
wrongPassword.setAttribute('role', 'alert');
|
||
wrongPassword.appendChild(document.createTextNode('Incorrect username or password.'));
|
||
formBody.appendChild(wrongPassword);
|
||
} else {
|
||
window.token = JSON.parse(data['responseText'])['token'];
|
||
generateInvites();
|
||
var interval = setInterval(function() { generateInvites(); }, 60 * 1000);
|
||
var hour = document.getElementById('hours');
|
||
addOptions(24, hour);
|
||
hour.selected = "0";
|
||
var minutes = document.getElementById('minutes');
|
||
addOptions(59, minutes);
|
||
minutes.selected = "30";
|
||
$('#login').modal('hide');
|
||
}
|
||
}
|
||
});
|
||
return false;
|
||
});
|
||
document.getElementById('openUsers').onclick = function () {
|
||
$.ajax('/getUsers', {
|
||
type : 'GET',
|
||
dataType : 'json',
|
||
contentType: 'json',
|
||
xhrFields : {
|
||
withCredentials: true
|
||
},
|
||
beforeSend : function (xhr) {
|
||
xhr.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":"));
|
||
},
|
||
data: { get_param: 'value' },
|
||
complete : function(data) {
|
||
if (data['status'] == 200) {
|
||
var list = document.getElementById('userList');
|
||
list.textContent = '';
|
||
if (document.getElementById('saveUsers')) {
|
||
document.getElementById('saveUsers').remove()
|
||
};
|
||
var users = data['responseJSON']['users'];
|
||
for (var i = 0; i < users.length; i++) {
|
||
var user = users[i]
|
||
var entry = document.createElement('p');
|
||
entry.id = 'user_' + user['name'];
|
||
entry.appendChild(document.createTextNode(user['name']));
|
||
var address = document.createElement('span');
|
||
address.setAttribute('style', 'margin-left: 2%; margin-right: 2%; color: grey;');
|
||
address.classList.add('addressText');
|
||
address.id = 'address_' + user['email'];
|
||
if (typeof(user['email']) != 'undefined') {
|
||
address.appendChild(document.createTextNode(user['email']));
|
||
};
|
||
var editButton = document.createElement('i');
|
||
editButton.classList.add('fa', 'fa-edit');
|
||
editButton.onclick = function() {
|
||
this.classList.remove('fa', 'fa-edit');
|
||
var input = document.createElement('input');
|
||
input.setAttribute('type', 'email');
|
||
input.setAttribute('style', 'margin-left: 2%; color: grey;');
|
||
var addressElement = this.parentNode.getElementsByClassName('addressText')[0];
|
||
if (addressElement.textContent != '') {
|
||
input.value = addressElement.textContent;
|
||
} else {
|
||
input.placeholder = 'Email Address';
|
||
};
|
||
this.parentNode.replaceChild(input, addressElement);
|
||
if (document.getElementById('saveUsers') == null) {
|
||
var footer = document.getElementById('userFooter')
|
||
var saveUsers = document.createElement('input');
|
||
saveUsers.classList.add('btn', 'btn-primary');
|
||
saveUsers.setAttribute('type', 'button');
|
||
saveUsers.value = 'Save Changes';
|
||
saveUsers.id = 'saveUsers';
|
||
saveUsers.onclick = function() {
|
||
var send = {}
|
||
var entries = document.getElementById('userList').children;
|
||
for (var i = 0; i < entries.length; i++) {
|
||
var entry = entries[i];
|
||
if (typeof(entry.getElementsByTagName('input')[0]) != 'undefined') {
|
||
var name = entry.id.replace(/user_/g, '')
|
||
var address = entry.getElementsByTagName('input')[0].value;
|
||
send[name] = address
|
||
};
|
||
};
|
||
console.log(send);
|
||
send = JSON.stringify(send);
|
||
$.ajax('/modifyUsers', {
|
||
data : send,
|
||
contentType : 'application/json',
|
||
type : 'POST',
|
||
xhrFields : {
|
||
withCredentials: true
|
||
},
|
||
beforeSend : function (xhr) {
|
||
xhr.setRequestHeader("Authorization", "Basic " + btoa(window.token + ":"));
|
||
},
|
||
success: function() { $('#users').modal('hide'); },
|
||
});
|
||
};
|
||
footer.appendChild(saveUsers);
|
||
};
|
||
};
|
||
entry.appendChild(address);
|
||
entry.appendChild(editButton);
|
||
list.appendChild(entry);
|
||
};
|
||
};
|
||
}
|
||
});
|
||
$('#users').modal('show');
|
||
};
|
||
generateInvites(empty = true);
|
||
$("#login").modal('show');
|