Add ldap auth plugin
This commit is contained in:
parent
42760de685
commit
002b6723bb
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules/
|
3
peertube-plugin-auth-ldap/README.md
Normal file
3
peertube-plugin-auth-ldap/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# LDAP auth plugin for PeerTube
|
||||
|
||||
Add LDAP support to login form in PeerTube.
|
46
peertube-plugin-auth-ldap/client/common-client-plugin.js
Normal file
46
peertube-plugin-auth-ldap/client/common-client-plugin.js
Normal file
@ -0,0 +1,46 @@
|
||||
function register ({ registerHook, peertubeHelpers }) {
|
||||
initMatomo(registerHook, peertubeHelpers)
|
||||
.catch(err => console.error('Cannot initialize Matomo', err))
|
||||
}
|
||||
|
||||
export {
|
||||
register
|
||||
}
|
||||
|
||||
function initMatomo (registerHook, peertubeHelpers) {
|
||||
return peertubeHelpers.getSettings()
|
||||
.then(s => {
|
||||
if (!s || !s['site-id'] || !s['url']) {
|
||||
console.error('Matomo settings are not set.')
|
||||
return
|
||||
}
|
||||
|
||||
const matomoUrl = s['url']
|
||||
const siteId = s['site-id']
|
||||
|
||||
window._paq = window._paq || [];
|
||||
window._paq.push(['trackPageView']);
|
||||
window._paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u = matomoUrl + '/';
|
||||
window._paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||
window._paq.push(['setSiteId', siteId]);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
|
||||
window._paq.push(['setDocumentTitle', window.document.title]);
|
||||
window._paq.push(['setCustomUrl', '/' + window.location.hash.substr(1)]);
|
||||
window._paq.push(['trackPageView']);
|
||||
|
||||
registerHook({
|
||||
target: 'action:router.navigation-end',
|
||||
handler: function (params) {
|
||||
window._paq.push(['setDocumentTitle', window.document.title]);
|
||||
window._paq.push(['setCustomUrl', params.path]);
|
||||
window._paq.push(['trackPageView']);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
}
|
157
peertube-plugin-auth-ldap/main.js
Normal file
157
peertube-plugin-auth-ldap/main.js
Normal file
@ -0,0 +1,157 @@
|
||||
const LdapAuth = require('ldapauth-fork')
|
||||
|
||||
async function register ({
|
||||
registerIdAndPassAuth,
|
||||
registerSetting,
|
||||
settingsManager,
|
||||
peertubeHelpers
|
||||
}) {
|
||||
registerSetting({
|
||||
name: 'url',
|
||||
label: 'URL',
|
||||
type: 'input',
|
||||
private: true
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'insecure-tls',
|
||||
label: 'Insecure TLS',
|
||||
type: 'input-checkbox',
|
||||
private: true,
|
||||
default: false
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'bind-dn',
|
||||
label: 'Bind DN',
|
||||
type: 'input',
|
||||
private: true
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'bind-credentials',
|
||||
label: 'Bind Password',
|
||||
type: 'input',
|
||||
private: true
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'search-base',
|
||||
label: 'Search base',
|
||||
type: 'input',
|
||||
private: true
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'search-filter',
|
||||
label: 'Search filter',
|
||||
type: 'input',
|
||||
private: true,
|
||||
default: '(|(mail={{username}})(uid={{username}}))'
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'mail-property',
|
||||
label: 'Mail property',
|
||||
type: 'input',
|
||||
private: true,
|
||||
default: 'mail'
|
||||
})
|
||||
|
||||
registerSetting({
|
||||
name: 'username-property',
|
||||
label: 'Username property',
|
||||
type: 'input',
|
||||
private: true,
|
||||
default: 'uid'
|
||||
})
|
||||
|
||||
registerIdAndPassAuth({
|
||||
authName: 'ldap',
|
||||
getWeight: () => 100,
|
||||
login: options => login(peertubeHelpers, settingsManager, options)
|
||||
})
|
||||
}
|
||||
|
||||
async function unregister () {
|
||||
return
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
register,
|
||||
unregister
|
||||
}
|
||||
|
||||
// ############################################################################
|
||||
|
||||
async function login (peertubeHelpers, settingsManager, options) {
|
||||
const logger = peertubeHelpers.logger
|
||||
|
||||
const settings = await settingsManager.getSettings([
|
||||
'url',
|
||||
'insecure-tls',
|
||||
'bind-dn',
|
||||
'bind-credentials',
|
||||
'search-base',
|
||||
'search-filter',
|
||||
'mail-property',
|
||||
'username-property',
|
||||
])
|
||||
|
||||
if (!settings['url']) {
|
||||
logger.info('Do not login user %s because admin did not configure LDAP.', options.id)
|
||||
return null
|
||||
}
|
||||
|
||||
const ldapClient = new LdapAuth({
|
||||
url: settings['url'],
|
||||
bindDN: settings['bind-dn'],
|
||||
bindCredentials: settings['bind-credentials'],
|
||||
searchBase: settings['search-base'],
|
||||
searchFilter: settings['search-filter'],
|
||||
reconnect: true,
|
||||
tlsOptions: {
|
||||
rejectUnauthorized: settings['insecure-tls'] !== true
|
||||
}
|
||||
})
|
||||
|
||||
return new Promise(res => {
|
||||
function onError (err) {
|
||||
logger.warn('Cannot login %s in LDAP plugin.', options.id, { err })
|
||||
return res(null)
|
||||
}
|
||||
|
||||
ldapClient.on('error', onError)
|
||||
|
||||
ldapClient.authenticate(options.id, options.password, function (err, user) {
|
||||
ldapClient.close(function () {
|
||||
// We don't care about the closing
|
||||
})
|
||||
|
||||
if (err) return onError(err)
|
||||
|
||||
if (!user) {
|
||||
logger.warn('Cannot find user %s in LDAP plugin.', options.id)
|
||||
return res(null)
|
||||
}
|
||||
|
||||
const mailProperty = settings['mail-property']
|
||||
const usernameProperty = settings['username-property']
|
||||
|
||||
if (!user[mailProperty]) {
|
||||
logger.warn('Cannot find mail property in LDAP plugin.', { mailProperty, user })
|
||||
return res(null)
|
||||
}
|
||||
|
||||
if (!user[usernameProperty]) {
|
||||
logger.warn('Cannot find username property in LDAP plugin.', { usernameProperty, user })
|
||||
return res(null)
|
||||
}
|
||||
|
||||
return res({
|
||||
username: user[usernameProperty],
|
||||
email: user[mailProperty]
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
151
peertube-plugin-auth-ldap/package-lock.json
generated
Normal file
151
peertube-plugin-auth-ldap/package-lock.json
generated
Normal file
@ -0,0 +1,151 @@
|
||||
{
|
||||
"name": "peertube-plugin-auth-ldap",
|
||||
"version": "0.0.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@types/ldapjs": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.7.tgz",
|
||||
"integrity": "sha512-Cacc0pQ6fw8+J5Qwebbj2+YpYANOl09WEDjJsNyPHpNSza318mUIuAhgXDfC8kXDViymlEQIvgbvuPKovRIVEQ==",
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "13.13.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.2.tgz",
|
||||
"integrity": "sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A=="
|
||||
},
|
||||
"abstract-logging": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-1.0.0.tgz",
|
||||
"integrity": "sha1-i33q/TEFWbwo93ck3RuzAXcnjBs="
|
||||
},
|
||||
"asn1": {
|
||||
"version": "0.2.4",
|
||||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
|
||||
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
|
||||
"requires": {
|
||||
"safer-buffer": "~2.1.0"
|
||||
}
|
||||
},
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
|
||||
},
|
||||
"backoff": {
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
|
||||
"integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=",
|
||||
"requires": {
|
||||
"precond": "0.2"
|
||||
}
|
||||
},
|
||||
"bcryptjs": {
|
||||
"version": "2.4.3",
|
||||
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
|
||||
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||
},
|
||||
"extsprintf": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz",
|
||||
"integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8="
|
||||
},
|
||||
"ldap-filter": {
|
||||
"version": "0.3.3",
|
||||
"resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz",
|
||||
"integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"ldapauth-fork": {
|
||||
"version": "5.0.0-rc.6",
|
||||
"resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-5.0.0-rc.6.tgz",
|
||||
"integrity": "sha512-0OfaaSq1ufXlMwcy1oTPVRsN7GYi2tYI1WH2mxL4aN+sJhPVf+JSzmuFDLqFPoAcZyY2slllWLdL+8WnZxg31g==",
|
||||
"requires": {
|
||||
"@types/ldapjs": "^1.0.4",
|
||||
"@types/node": "*",
|
||||
"bcryptjs": "^2.4.0",
|
||||
"ldapjs": "^2.0.0-pre.5",
|
||||
"lru-cache": "^5.1.1"
|
||||
}
|
||||
},
|
||||
"ldapjs": {
|
||||
"version": "2.0.0-pre.5",
|
||||
"resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.0.0-pre.5.tgz",
|
||||
"integrity": "sha512-nmcSqdUjS7dzloToGCrSX3/TCdKJqLKUD+mMeo2K+NAkRkyn2iDZJRVusUFwFykXcaAr8hPX2qOKzc9PeTA4MQ==",
|
||||
"requires": {
|
||||
"abstract-logging": "^1.0.0",
|
||||
"asn1": "^0.2.4",
|
||||
"assert-plus": "^1.0.0",
|
||||
"backoff": "^2.5.0",
|
||||
"ldap-filter": "^0.3.3",
|
||||
"once": "^1.4.0",
|
||||
"vasync": "^2.2.0",
|
||||
"verror": "^1.8.1"
|
||||
}
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||
"requires": {
|
||||
"yallist": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"precond": {
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
|
||||
"integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw="
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"vasync": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.0.tgz",
|
||||
"integrity": "sha1-z951GGChWCLbOxMrxZsRakra8Bs=",
|
||||
"requires": {
|
||||
"verror": "1.10.0"
|
||||
}
|
||||
},
|
||||
"verror": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
|
||||
"requires": {
|
||||
"assert-plus": "^1.0.0",
|
||||
"core-util-is": "1.0.2",
|
||||
"extsprintf": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
|
||||
}
|
||||
}
|
||||
}
|
24
peertube-plugin-auth-ldap/package.json
Normal file
24
peertube-plugin-auth-ldap/package.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "peertube-plugin-auth-ldap",
|
||||
"version": "0.0.1",
|
||||
"description": "Add LDAP support to login form in PeerTube.",
|
||||
"engine": {
|
||||
"peertube": ">=2.2.0"
|
||||
},
|
||||
"keywords": [
|
||||
"peertube",
|
||||
"plugin",
|
||||
"auth"
|
||||
],
|
||||
"homepage": "https://framagit.org/framasoft/peertube/official-plugins/tree/master/peertube-plugin-auth-ldap",
|
||||
"author": "Chocobozzz",
|
||||
"bugs": "https://framagit.org/framasoft/peertube/official-plugins/issues",
|
||||
"library": "./main.js",
|
||||
"staticDirs": {},
|
||||
"css": [],
|
||||
"clientScripts": [],
|
||||
"translations": {},
|
||||
"dependencies": {
|
||||
"ldapauth-fork": "^5.0.0-rc.6"
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user