67 lines
3.0 KiB
TypeScript
67 lines
3.0 KiB
TypeScript
import * as html from 'node-html-parser'
|
|
import { decode } from 'he'
|
|
|
|
// TODO: Move this into the parse folder and convert it to follow the pattern of other parsers (include tests).
|
|
|
|
export const extractInputField = (sought: string, attrs: string[]) => {
|
|
// there must be a better way to do this...
|
|
const s = attrs.find(e => e.indexOf(sought) >= 0) || ""
|
|
const v = s.substring(s.indexOf('value="') + 'value="'.length)
|
|
return v.substring(0, v.length - 2)
|
|
}
|
|
|
|
export function extractMvghostRequestBody(initBankIdResponseText: string) {
|
|
const doc = html.parse(decode(initBankIdResponseText))
|
|
const inputAttrs = doc.querySelectorAll('input').map(i => (i as any).rawAttrs)
|
|
const relayState = extractInputField('RelayState', inputAttrs)
|
|
const samlRequest = extractInputField("SAMLRequest", inputAttrs)
|
|
const mvghostRequestBody = new URLSearchParams({
|
|
RelayState: relayState,
|
|
SAMLRequest: samlRequest
|
|
}).toString()
|
|
return mvghostRequestBody
|
|
}
|
|
|
|
export function extractHjarntorgetSAMLLogin(authGbgLoginResponseText: string) {
|
|
const authGbgLoginDoc = html.parse(decode(authGbgLoginResponseText))
|
|
const inputAttrs = authGbgLoginDoc.querySelectorAll('input').map(i => (i as any).rawAttrs)
|
|
const relayState = extractInputField('RelayState', inputAttrs)
|
|
const samlResponse = extractInputField("SAMLResponse", inputAttrs)
|
|
const hjarntorgetSAMLLoginRequestBody = new URLSearchParams({
|
|
RelayState: relayState,
|
|
SAMLResponse: samlResponse
|
|
}).toString()
|
|
return hjarntorgetSAMLLoginRequestBody
|
|
}
|
|
|
|
export function extractAuthGbgLoginRequestBody(signatureResponseText: string) {
|
|
const signatureResponseDoc = html.parse(decode(signatureResponseText))
|
|
const signatureResponseTextAreas = signatureResponseDoc.querySelectorAll('textarea')
|
|
const SAMLResponseElem = signatureResponseTextAreas.find(ta => {
|
|
const nameAttr = ta.getAttribute("name")
|
|
return nameAttr === 'SAMLResponse'
|
|
})
|
|
const SAMLResponseText = SAMLResponseElem?.rawText
|
|
|
|
const RelayStateElem = signatureResponseTextAreas.find(ta => {
|
|
const nameAttr = ta.getAttribute("name")
|
|
return nameAttr === 'RelayState'
|
|
})
|
|
const RelayStateText = RelayStateElem?.rawText
|
|
const authGbgLoginBody = new URLSearchParams({
|
|
'SAMLResponse': SAMLResponseText || '',
|
|
'RelayState': RelayStateText || '',
|
|
}).toString()
|
|
return authGbgLoginBody
|
|
}
|
|
|
|
export const parseCalendarItem = (x: html.HTMLElement): { id: number; title: string; startDate: string; endDate: string } => {
|
|
const info = Array.from(x.querySelectorAll('a'))
|
|
// TODO: the identifier is realy on this format: '\d+:\d+' currently we only take the first part so Id will clash between items
|
|
const id = info[0].getAttribute("onClick")?.replace(new RegExp("return viewEvent\\('(\\d+).+"), "$1") || NaN
|
|
const day = info[1].textContent
|
|
const timeSpan = info[2].textContent
|
|
const [startTime, endTime] = timeSpan.replace(".", ":").split("-")
|
|
|
|
return { id: +id, title: info[0].textContent, startDate: `${day} ${startTime}`, endDate: `${day} ${endTime}` }
|
|
} |