quintodrome/ui/src/authProvider.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

125 lines
3.4 KiB
JavaScript
Raw Normal View History

2020-01-20 05:54:29 -09:00
import jwtDecode from 'jwt-decode'
import md5 from 'md5-hex'
import { v4 as uuidv4 } from 'uuid'
import { baseUrl } from './utils'
import config from './config'
import { startEventStream, stopEventStream } from './eventStream'
2020-01-20 05:54:29 -09:00
const authProvider = {
login: ({ username, password }) => {
2020-04-03 13:50:42 -08:00
let url = baseUrl('/app/login')
if (config.firstTime) {
2020-04-03 13:50:42 -08:00
url = baseUrl('/app/createAdmin')
}
const request = new Request(url, {
2020-01-20 05:54:29 -09:00
method: 'POST',
body: JSON.stringify({ username, password }),
2020-04-26 10:50:44 -08:00
headers: new Headers({ 'Content-Type': 'application/json' }),
2020-01-20 05:54:29 -09:00
})
return fetch(request)
.then((response) => {
if (response.status < 200 || response.status >= 300) {
throw new Error(response.statusText)
}
return response.json()
})
.then((response) => {
// Validate token
jwtDecode(response.token)
// TODO Store all items in one object
2020-01-20 05:54:29 -09:00
localStorage.setItem('token', response.token)
localStorage.setItem('userId', response.id)
2020-01-20 05:54:29 -09:00
localStorage.setItem('name', response.name)
localStorage.setItem('username', response.username)
response.avatar && localStorage.setItem('avatar', response.avatar)
localStorage.setItem('role', response.isAdmin ? 'admin' : 'regular')
const salt = generateSubsonicSalt()
localStorage.setItem('subsonic-salt', salt)
localStorage.setItem(
'subsonic-token',
generateSubsonicToken(password, salt)
)
2020-04-08 09:20:02 -08:00
// Avoid going to create admin dialog after logout/login without a refresh
config.firstTime = false
if (config.devActivityPanel) {
startEventStream()
}
2020-01-20 05:54:29 -09:00
return response
})
.catch((error) => {
if (
error.message === 'Failed to fetch' ||
error.stack === 'TypeError: Failed to fetch'
) {
throw new Error('errors.network_error')
}
throw new Error(error)
})
},
logout: () => {
stopEventStream()
2020-01-20 05:54:29 -09:00
removeItems()
try {
clearServiceWorkerCache()
} catch (e) {
console.log('Error clearing service worker cache:', e)
}
2020-01-20 05:54:29 -09:00
return Promise.resolve()
},
checkAuth: () =>
localStorage.getItem('token') ? Promise.resolve() : Promise.reject(),
2020-01-20 05:54:29 -09:00
checkError: ({ status }) => {
2020-01-20 05:54:29 -09:00
if (status === 401 || status === 403) {
removeItems()
return Promise.reject()
}
return Promise.resolve()
},
getPermissions: () => {
const role = localStorage.getItem('role')
return role ? Promise.resolve(role) : Promise.reject()
2020-04-26 10:50:44 -08:00
},
2020-11-02 13:13:12 -09:00
getIdentity: () => {
return {
id: localStorage.getItem('username'),
fullName: localStorage.getItem('name'),
avatar: localStorage.getItem('avatar'),
2020-11-02 13:13:12 -09:00
}
},
2020-01-20 05:54:29 -09:00
}
const removeItems = () => {
localStorage.removeItem('token')
localStorage.removeItem('userId')
2020-01-20 05:54:29 -09:00
localStorage.removeItem('name')
localStorage.removeItem('username')
localStorage.removeItem('avatar')
localStorage.removeItem('role')
localStorage.removeItem('subsonic-salt')
localStorage.removeItem('subsonic-token')
}
const clearServiceWorkerCache = () => {
window.caches &&
caches.keys().then(function (keyList) {
for (let key of keyList) caches.delete(key)
})
}
const generateSubsonicSalt = () => {
const h = md5(uuidv4())
return h.slice(0, 6)
}
const generateSubsonicToken = (password, salt) => {
return md5(password + salt)
2020-01-20 05:54:29 -09:00
}
export default authProvider