finishing adding alt identity

This commit is contained in:
Paul Rodwell
2016-08-29 15:44:58 +01:00
parent 507f272d02
commit 04d56d7303
2 changed files with 105 additions and 60 deletions

View File

@ -77,34 +77,38 @@ update_footer = (ownerName, isAuthenticated) ->
e.preventDefault() e.preventDefault()
claim_wiki() claim_wiki()
else else
$('footer > #security').append "<a href='#' id='addAltAuth' class='foot-item' title='Add Alternative Credentials'><i class='fa fa-user-plus fa-lg fa-fw'></i></a>" # only offer to add alternative id if using persona - at least initially.
$('footer > #security > #addAltAuth').click (e) -> if settings.usingPersona
e.preventDefault $('footer > #security').append "<a href='#' id='addAltAuth' class='foot-item' title='Add Alternative Credentials'><i class='fa fa-user-plus fa-lg fa-fw'></i></a>"
$('footer > #security > #addAltAuth').click (e) ->
e.preventDefault
w = WinChan.open({ w = WinChan.open({
url: settings.dialogAddAltURL url: settings.dialogAddAltURL
relay_url: settings.relayURL relay_url: settings.relayURL
window_features: "menubar=0, location=0, resizable=0, scrollbars=0, status=0, dialog=1, width=700, height=375" window_features: "menubar=0, location=0, resizable=0, scrollbars=0, status=0, dialog=1, width=700, height=375"
params: {} params: {}
}, (err, r) -> }, (err, r) ->
if err if err
console.log err console.log err
else else
# add call to add alternative to owner here # add call to add alternative to owner here
console.log 'send request to add owner identity' console.log 'send request to add owner identity'
myInit = { myInit = {
method: 'GET' method: 'GET'
cache: 'no-cache' cache: 'no-cache'
mode: 'same-origin' mode: 'same-origin'
credentials: 'include' credentials: 'include'
} }
fetch '/auth/addAltAuth', myInit fetch '/auth/addAltAuth', myInit
.then (response) -> .then (response) ->
if response.ok if response.ok
console.log 'Alternative Identity added', response console.log 'Alternative Identity added', response
else settings.usingPersona = false
console.log 'Attempt to claim site failed', response update_footer ownerName, isAuthenticated
) else
console.log 'Attempt to claim site failed', response
)
else else
if !isClaimed if !isClaimed
signonTitle = 'Claim this Wiki' signonTitle = 'Claim this Wiki'

View File

@ -59,6 +59,22 @@ module.exports = exports = (log, loga, argv) ->
# Mozilla Persona service closes on # Mozilla Persona service closes on
personaEnd = new Date('2016-11-30') personaEnd = new Date('2016-11-30')
watchForOwnerChange = ->
# we watch for owner changes, so we can update the information held here
fs.watch(idFile, (eventType, filename) ->
# re-read the owner file
fs.readFile(idFile, (err, data) ->
if err
console.log 'Error reading ', idFile, err
return
owner = JSON.parse(data)
usingPersona = false
if _.isEmpty(_.intersection(_.keys(owner), ids))
if _.has(owner, 'persona')
usingPersona = true
ownerName = owner.name
)
)
#### Public stuff #### #### Public stuff ####
@ -71,8 +87,11 @@ module.exports = exports = (log, loga, argv) ->
fs.readFile(idFile, (err, data) -> fs.readFile(idFile, (err, data) ->
if err then return cb err if err then return cb err
owner = JSON.parse(data) owner = JSON.parse(data)
if _.has(owner, 'persona') # we only enable persona if it is the only owner information.
usingPersona = true if _.isEmpty(_.intersection(_.keys(owner), ids))
if _.has(owner, 'persona')
usingPersona = true
watchForOwnerChange()
cb()) cb())
else else
owner = '' owner = ''
@ -93,6 +112,7 @@ module.exports = exports = (log, loga, argv) ->
console.log "Claiming wiki #{wikiName} for #{id}" console.log "Claiming wiki #{wikiName} for #{id}"
owner = id owner = id
ownerName = owner.name ownerName = owner.name
watchForOwnerChange()
cb()) cb())
else else
cb('Already Claimed') cb('Already Claimed')
@ -113,7 +133,6 @@ module.exports = exports = (log, loga, argv) ->
else else
try try
idProvider = _.head(_.keys(req.session.passport.user)) idProvider = _.head(_.keys(req.session.passport.user))
console.log 'isAuth - idProvider: ', idProvider
switch idProvider switch idProvider
when 'github', 'google', 'twitter' when 'github', 'google', 'twitter'
if _.isEqual(owner[idProvider].id, req.session.passport.user[idProvider].id) if _.isEqual(owner[idProvider].id, req.session.passport.user[idProvider].id)
@ -238,7 +257,6 @@ module.exports = exports = (log, loga, argv) ->
PersonaStrategy = require('persona-pass').Strategy PersonaStrategy = require('persona-pass').Strategy
personaAudience = callbackProtocol + '//' + callbackHost personaAudience = callbackProtocol + '//' + callbackHost
console.log 'Persona Audience: ', personaAudience
personaStrategyName = callbackHost + 'Persona' personaStrategyName = callbackHost + 'Persona'
@ -290,8 +308,6 @@ module.exports = exports = (log, loga, argv) ->
app.get '/auth/loginDialog', (req, res) -> app.get '/auth/loginDialog', (req, res) ->
referer = req.headers.referer referer = req.headers.referer
console.log "logging into: ", url.parse(referer).hostname
schemeButtons = [] schemeButtons = []
_(ids).forEach (scheme) -> _(ids).forEach (scheme) ->
switch scheme switch scheme
@ -316,8 +332,6 @@ module.exports = exports = (log, loga, argv) ->
app.get '/auth/personaLogin', (req, res) -> app.get '/auth/personaLogin', (req, res) ->
referer = req.headers.referer referer = req.headers.referer
console.log "logging into: ", url.parse(referer).hostname
schemeButtons = [] schemeButtons = []
if Date.now() < personaEnd if Date.now() < personaEnd
schemeButtons.push({ schemeButtons.push({
@ -364,11 +378,10 @@ module.exports = exports = (log, loga, argv) ->
res.render(path.join(__dirname, '..', 'views', 'personaDialog.html'), info) res.render(path.join(__dirname, '..', 'views', 'personaDialog.html'), info)
app.get '/auth/loginDone', (req, res) -> app.get '/auth/loginDone', (req, res) ->
console.log "Done: ", req.session.passport
referer = req.headers.referer referer = req.headers.referer
if referer is undefined if referer is undefined
referer = '' referer = ''
console.log 'loginDone - referer: ', referer
info = { info = {
wikiName: if useHttps wikiName: if useHttps
url.parse(referer).hostname url.parse(referer).hostname
@ -390,16 +403,11 @@ module.exports = exports = (log, loga, argv) ->
app.get '/auth/addAuthDialog', (req, res) -> app.get '/auth/addAuthDialog', (req, res) ->
# only makes sense to add alternative authentication scheme if # only makes sense to add alternative authentication scheme if
# this the user is authenticated # this the user is authenticated
console.log 'User:', getUser(req)
if getUser(req) if getUser(req)
referer = req.headers.referer referer = req.headers.referer
console.log "User: ", owner currentSchemes = _.keys(user)
currentSchemes = _.keys(owner)
console.log "currentSchemes: ", currentSchemes
altSchemes = _.difference(ids, currentSchemes) altSchemes = _.difference(ids, currentSchemes)
console.log "altSchemes: ", altSchemes
schemeButtons = [] schemeButtons = []
_(altSchemes).forEach (scheme) -> _(altSchemes).forEach (scheme) ->
@ -430,7 +438,7 @@ module.exports = exports = (log, loga, argv) ->
if isAuthorized(req) if isAuthorized(req)
next() next()
else else
console.log 'rejecting', req.path console.log 'rejecting - not authorized', req.path
res.sendStatus(403) res.sendStatus(403)
app.get '/auth/addAltAuth', authorized, (req, res) -> app.get '/auth/addAltAuth', authorized, (req, res) ->
@ -439,10 +447,46 @@ module.exports = exports = (log, loga, argv) ->
user = req.session.passport.user user = req.session.passport.user
console.log 'User: ', user idProviders = _.keys(user)
console.log 'Owner: ', owner ids = {}
idProviders.forEach (idProvider) ->
console.log 'In add alt auth...' id = switch idProvider
when "twitter" then {
name: user.twitter.displayName
twitter: {
id: user.twitter.id
username: user.twitter.username
}
}
when "github" then {
name: user.github.displayName
github: {
id: user.github.id
username: user.github.username
email: user.github.emails
}
}
when "google" then {
name: user.google.displayName
google: {
id: user.google.id
emails: user.google.emails
}
}
# only needed until persona closes
when "persona" then {
name: user.persona.email
.substr(0, user.persona.email.indexOf('@'))
.split('.')
.join(' ')
.toLowerCase()
.replace(/(^| )(\w)/g, (x) ->
return x.toUpperCase())
persona: {
email: user.persona.email
}
}
ids = _.merge(ids, id)
wikiDir = path.resolve(argv.data, '..') wikiDir = path.resolve(argv.data, '..')
statusDir = argv.status.split(path.sep).slice(-1)[0] statusDir = argv.status.split(path.sep).slice(-1)[0]
@ -458,25 +502,22 @@ module.exports = exports = (log, loga, argv) ->
console.log 'Error reading ', file, err console.log 'Error reading ', file, err
return return
siteOwner = JSON.parse(data) siteOwner = JSON.parse(data)
console.log file , _.intersectionWith(_.entries(siteOwner), _.entries(user), _.isEqual)
if _.intersectionWith(_.entries(siteOwner), _.entries(user), _.isEqual).length > 0 if _.intersectionWith(_.entries(siteOwner), _.entries(user), _.isEqual).length > 0
console.log "Site: ", file, "is mine...\n\n" updateOwner = _.merge(user, siteOwner)
console.log "User: ", user fs.writeFile(path.join(wikiDir, file), JSON.stringify(ids), (err) ->
console.log "Owner (orig): ", siteOwner if err
updateOwner = _.merge(siteOwner, user) console.log 'Error writing ', file, err
console.log "Owner (updated): ", updateOwner # if the write works the change will be picked up by fs.watch() in watchForOwnerChange
else # so there is nothing more to do here.
console.log "Site: ", file, " not mine\n\n" )
)
)
) )
app.get '/auth/claim-wiki', (req, res) -> app.get '/auth/claim-wiki', (req, res) ->
if owner if owner
console.log 'Claim Request Ignored: Wiki already has owner' console.log 'Claim Request Ignored: Wiki already has owner - ', wikiName
res.sendStatus(403) res.sendStatus(403)
else else
user = req.session.passport.user user = req.session.passport.user