1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/controllers/auth/login.js

220 lines
8.9 KiB
JavaScript
Raw Normal View History

2020-05-04 12:44:12 +02:00
define(['apphost', 'appSettings', 'dom', 'connectionManager', 'loading', 'layoutManager', 'browser', 'globalize', 'cardStyle', 'emby-checkbox'], function (appHost, appSettings, dom, connectionManager, loading, layoutManager, browser, globalize) {
'use strict';
2018-10-23 01:05:09 +03:00
var enableFocusTransform = !browser.slow && !browser.edge;
2018-10-23 01:05:09 +03:00
function authenticateUserByName(page, apiClient, username, password) {
2019-04-06 23:07:02 -07:00
loading.show();
2020-01-22 03:29:52 +03:00
apiClient.authenticateUserByName(username, password).then(function (result) {
2019-04-06 23:07:02 -07:00
var user = result.User;
2020-05-04 12:44:12 +02:00
var serverId = getParameterByName('serverid');
2020-01-22 03:29:52 +03:00
var newUrl;
if (user.Policy.IsAdministrator && !serverId) {
2020-05-04 12:44:12 +02:00
newUrl = 'dashboard.html';
2020-01-22 03:29:52 +03:00
} else {
2020-05-04 12:44:12 +02:00
newUrl = 'home.html';
2020-01-22 03:29:52 +03:00
}
2019-04-06 23:07:02 -07:00
loading.hide();
Dashboard.onServerChanged(user.Id, result.AccessToken, apiClient);
Dashboard.navigate(newUrl);
2020-01-22 03:29:52 +03:00
}, function (response) {
2020-05-04 12:44:12 +02:00
page.querySelector('#txtManualName').value = '';
page.querySelector('#txtManualPassword').value = '';
2019-04-06 23:07:02 -07:00
loading.hide();
2020-01-22 03:29:52 +03:00
2020-04-13 16:41:24 -04:00
const UnauthorizedOrForbidden = [401, 403];
if (UnauthorizedOrForbidden.includes(response.status)) {
2020-05-04 12:44:12 +02:00
require(['toast'], function (toast) {
const messageKey = response.status === 401 ? 'MessageInvalidUser' : 'MessageUnauthorizedUser';
toast(globalize.translate(messageKey));
2019-04-06 23:07:02 -07:00
});
} else {
Dashboard.alert({
2020-05-04 12:44:12 +02:00
message: globalize.translate('MessageUnableToConnectToServer'),
title: globalize.translate('HeaderConnectionFailure')
2019-04-06 23:07:02 -07:00
});
}
});
2018-10-23 01:05:09 +03:00
}
function showManualForm(context, showCancel, focusPassword) {
2020-05-04 12:44:12 +02:00
context.querySelector('.chkRememberLogin').checked = appSettings.enableAutoLogin();
context.querySelector('.manualLoginForm').classList.remove('hide');
context.querySelector('.visualLoginForm').classList.add('hide');
context.querySelector('.btnManual').classList.add('hide');
2020-01-22 03:29:52 +03:00
if (focusPassword) {
2020-05-04 12:44:12 +02:00
context.querySelector('#txtManualPassword').focus();
2020-01-22 03:29:52 +03:00
} else {
2020-05-04 12:44:12 +02:00
context.querySelector('#txtManualName').focus();
2020-01-22 03:29:52 +03:00
}
if (showCancel) {
2020-05-04 12:44:12 +02:00
context.querySelector('.btnCancel').classList.remove('hide');
2020-01-22 03:29:52 +03:00
} else {
2020-05-04 12:44:12 +02:00
context.querySelector('.btnCancel').classList.add('hide');
2020-01-22 03:29:52 +03:00
}
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
var metroColors = ['#6FBD45', '#4BB3DD', '#4164A5', '#E12026', '#800080', '#E1B222', '#008040', '#0094FF', '#FF00C7', '#FF870F', '#7F0037'];
2019-04-06 23:07:02 -07:00
2018-10-23 01:05:09 +03:00
function getRandomMetroColor() {
var index = Math.floor(Math.random() * (metroColors.length - 1));
2019-04-06 23:07:02 -07:00
return metroColors[index];
2018-10-23 01:05:09 +03:00
}
function getMetroColor(str) {
if (str) {
2019-04-06 23:07:02 -07:00
var character = String(str.substr(0, 1).charCodeAt());
var sum = 0;
2020-01-22 03:29:52 +03:00
2019-04-06 23:07:02 -07:00
for (var i = 0; i < character.length; i++) {
sum += parseInt(character.charAt(i));
}
2020-01-22 03:29:52 +03:00
2018-10-23 01:05:09 +03:00
var index = String(sum).substr(-1);
2019-04-06 23:07:02 -07:00
return metroColors[index];
2018-10-23 01:05:09 +03:00
}
2020-01-22 03:29:52 +03:00
2019-04-06 23:07:02 -07:00
return getRandomMetroColor();
2018-10-23 01:05:09 +03:00
}
function loadUserList(context, apiClient, users) {
2020-05-04 12:44:12 +02:00
var html = '';
2020-01-22 03:29:52 +03:00
2019-04-06 23:07:02 -07:00
for (var i = 0; i < users.length; i++) {
2018-10-23 01:05:09 +03:00
var user = users[i];
// TODO move card creation code to Card component
2020-05-04 12:44:12 +02:00
var cssClass = 'card squareCard scalableCard squareCard-scalable';
if (layoutManager.tv) {
2020-05-04 12:44:12 +02:00
cssClass += ' show-focus';
if (enableFocusTransform) {
2020-05-04 12:44:12 +02:00
cssClass += ' show-animation';
}
}
2020-05-04 12:44:12 +02:00
var cardBoxCssClass = 'cardBox cardBox-bottompadded';
html += '<button type="button" class="' + cssClass + '">';
html += '<div class="' + cardBoxCssClass + '">';
2019-04-06 23:07:02 -07:00
html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-square"></div>';
html += '<div class="cardContent" data-haspw="' + user.HasPassword + '" data-username="' + user.Name + '" data-userid="' + user.Id + '">';
2018-10-23 01:05:09 +03:00
var imgUrl;
2020-01-22 03:29:52 +03:00
2019-04-06 23:07:02 -07:00
if (user.PrimaryImageTag) {
imgUrl = apiClient.getUserImageUrl(user.Id, {
width: 300,
tag: user.PrimaryImageTag,
2020-05-04 12:44:12 +02:00
type: 'Primary'
2019-04-06 23:07:02 -07:00
});
html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');\"></div>";
} else {
2018-10-23 01:05:09 +03:00
var background = getMetroColor(user.Id);
2020-05-04 12:44:12 +02:00
imgUrl = 'assets/img/avatar.png';
2019-04-06 23:07:02 -07:00
html += '<div class="cardImageContainer coveredImage coveredImage-noScale" style="background-image:url(\'' + imgUrl + "');background-color:" + background + ';"></div>';
2018-10-23 01:05:09 +03:00
}
2020-01-22 03:29:52 +03:00
2020-05-04 12:44:12 +02:00
html += '</div>';
html += '</div>';
2019-04-06 23:07:02 -07:00
html += '<div class="cardFooter visualCardBox-cardFooter">';
2020-05-04 12:44:12 +02:00
html += '<div class="cardText singleCardText cardTextCentered">' + user.Name + '</div>';
html += '</div>';
html += '</div>';
html += '</button>';
2018-10-23 01:05:09 +03:00
}
2020-01-22 03:29:52 +03:00
2020-05-04 12:44:12 +02:00
context.querySelector('#divUsers').innerHTML = html;
2018-10-23 01:05:09 +03:00
}
2019-04-06 23:07:02 -07:00
2020-01-22 03:29:52 +03:00
return function (view, params) {
2018-10-23 01:05:09 +03:00
function getApiClient() {
var serverId = params.serverid;
2020-01-22 03:29:52 +03:00
if (serverId) {
return connectionManager.getOrCreateApiClient(serverId);
}
return ApiClient;
2018-10-23 01:05:09 +03:00
}
function showVisualForm() {
2020-05-04 12:44:12 +02:00
view.querySelector('.visualLoginForm').classList.remove('hide');
view.querySelector('.manualLoginForm').classList.add('hide');
view.querySelector('.btnManual').classList.remove('hide');
2019-11-02 20:38:58 +03:00
2020-05-04 12:44:12 +02:00
require(['autoFocuser'], function (autoFocuser) {
2019-11-02 20:38:58 +03:00
autoFocuser.autoFocus(view);
});
2018-10-23 01:05:09 +03:00
}
2019-04-06 23:07:02 -07:00
2020-05-04 12:44:12 +02:00
view.querySelector('#divUsers').addEventListener('click', function (e) {
var card = dom.parentWithClass(e.target, 'card');
var cardContent = card ? card.querySelector('.cardContent') : null;
2020-01-22 03:29:52 +03:00
2018-10-23 01:05:09 +03:00
if (cardContent) {
2019-04-06 23:07:02 -07:00
var context = view;
2020-05-04 12:44:12 +02:00
var id = cardContent.getAttribute('data-userid');
var name = cardContent.getAttribute('data-username');
var haspw = cardContent.getAttribute('data-haspw');
2020-01-22 03:29:52 +03:00
2019-04-06 23:07:02 -07:00
if (id === 'manual') {
2020-05-04 12:44:12 +02:00
context.querySelector('#txtManualName').value = '';
2019-04-06 23:07:02 -07:00
showManualForm(context, true);
} else if (haspw == 'false') {
2020-05-04 12:44:12 +02:00
authenticateUserByName(context, getApiClient(), name, '');
2019-04-06 23:07:02 -07:00
} else {
2020-05-04 12:44:12 +02:00
context.querySelector('#txtManualName').value = name;
context.querySelector('#txtManualPassword').value = '';
2019-04-06 23:07:02 -07:00
showManualForm(context, true, true);
}
2018-10-23 01:05:09 +03:00
}
2019-04-06 23:07:02 -07:00
});
2020-05-04 12:44:12 +02:00
view.querySelector('.manualLoginForm').addEventListener('submit', function (e) {
appSettings.enableAutoLogin(view.querySelector('.chkRememberLogin').checked);
2018-10-23 01:05:09 +03:00
var apiClient = getApiClient();
2020-05-04 12:44:12 +02:00
authenticateUserByName(view, apiClient, view.querySelector('#txtManualName').value, view.querySelector('#txtManualPassword').value);
2019-04-06 23:07:02 -07:00
e.preventDefault();
return false;
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnForgotPassword').addEventListener('click', function () {
Dashboard.navigate('forgotpassword.html');
2019-04-06 23:07:02 -07:00
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnCancel').addEventListener('click', showVisualForm);
view.querySelector('.btnManual').addEventListener('click', function () {
view.querySelector('#txtManualName').value = '';
2019-04-06 23:07:02 -07:00
showManualForm(view, true);
});
2020-05-04 12:44:12 +02:00
view.querySelector('.btnSelectServer').addEventListener('click', function () {
Dashboard.selectServer();
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewshow', function (e) {
2018-10-23 01:05:09 +03:00
loading.show();
2020-01-22 03:29:52 +03:00
if (!appHost.supports('multiserver')) {
2020-05-04 12:44:12 +02:00
view.querySelector('.btnSelectServer').classList.add('hide');
}
2020-01-22 03:29:52 +03:00
2018-10-23 01:05:09 +03:00
var apiClient = getApiClient();
2020-01-22 03:29:52 +03:00
apiClient.getPublicUsers().then(function (users) {
if (users.length) {
showVisualForm();
loadUserList(view, apiClient, users);
} else {
2020-05-04 12:44:12 +02:00
view.querySelector('#txtManualName').value = '';
showManualForm(view, false, false);
}
2020-01-22 03:29:52 +03:00
}).catch().then(function () {
loading.hide();
});
2020-05-04 12:44:12 +02:00
apiClient.getJSON(apiClient.getUrl('Branding/Configuration')).then(function (options) {
view.querySelector('.disclaimer').textContent = options.LoginDisclaimer || '';
});
});
2020-01-22 03:29:52 +03:00
};
2019-05-05 23:55:42 +02:00
});