parent
781af50471
commit
ef705af3fc
@ -1,19 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd "$(dirname $0)"
|
||||
|
||||
if [[ -z "$(which docker)" ]]; then
|
||||
echo "Please install Docker from https://www.docker.com"
|
||||
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev"
|
||||
|
||||
$cmd sh -c "\
|
||||
yarn install; \
|
||||
cd ../npm; \
|
||||
yarn install"
|
||||
|
||||
$cmd ./bin/run links
|
||||
$cmd ./bin/run $@
|
@ -1,169 +0,0 @@
|
||||
/* eslint-env browser */
|
||||
/* globals wappalyzer */
|
||||
|
||||
;(function() {
|
||||
wappalyzer.driver.document = document
|
||||
|
||||
const container = document.getElementById('wappalyzer-container')
|
||||
const url = wappalyzer.parseUrl(window.top.location.href)
|
||||
const hasOwn = Object.prototype.hasOwnProperty
|
||||
|
||||
/**
|
||||
* Log messages to console
|
||||
*/
|
||||
wappalyzer.driver.log = (message, source, type) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[wappalyzer ${type}]`, `[${source}]`, message)
|
||||
}
|
||||
|
||||
function getPageContent() {
|
||||
wappalyzer.log('func: getPageContent', 'driver')
|
||||
|
||||
const scripts = Array.prototype.slice
|
||||
.apply(document.scripts)
|
||||
.filter((s) => s.src)
|
||||
.map((s) => s.src)
|
||||
|
||||
let html = new window.XMLSerializer()
|
||||
.serializeToString(document)
|
||||
.split('\n')
|
||||
|
||||
html = html
|
||||
.slice(0, 1000)
|
||||
.concat(html.slice(html.length - 1000))
|
||||
.map((line) => line.substring(0, 1000))
|
||||
.join('\n')
|
||||
|
||||
wappalyzer.analyze(url, {
|
||||
html,
|
||||
scripts
|
||||
})
|
||||
}
|
||||
|
||||
function getResponseHeaders() {
|
||||
wappalyzer.log('func: getResponseHeaders', 'driver')
|
||||
|
||||
const xhr = new XMLHttpRequest()
|
||||
|
||||
xhr.open('GET', url, true)
|
||||
|
||||
xhr.onreadystatechange = () => {
|
||||
if (xhr.readyState === 4 && xhr.status) {
|
||||
const headers = xhr.getAllResponseHeaders().split('\n')
|
||||
|
||||
if (headers.length > 0 && headers[0] !== '') {
|
||||
wappalyzer.log(
|
||||
`responseHeaders: ${xhr.getAllResponseHeaders()}`,
|
||||
'driver'
|
||||
)
|
||||
|
||||
const responseHeaders = {}
|
||||
|
||||
headers.forEach((line) => {
|
||||
let name, value
|
||||
|
||||
if (line) {
|
||||
name = line.substring(0, line.indexOf(': '))
|
||||
value = line.substring(line.indexOf(': ') + 2, line.length - 1)
|
||||
|
||||
if (!responseHeaders[name.toLowerCase()]) {
|
||||
responseHeaders[name.toLowerCase()] = []
|
||||
}
|
||||
responseHeaders[name.toLowerCase()].push(value)
|
||||
}
|
||||
})
|
||||
|
||||
wappalyzer.analyze(url, {
|
||||
headers: responseHeaders
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xhr.send()
|
||||
}
|
||||
|
||||
/**
|
||||
* Display apps
|
||||
*/
|
||||
wappalyzer.driver.displayApps = (detected) => {
|
||||
wappalyzer.log('func: displayApps', 'driver')
|
||||
|
||||
let first = true
|
||||
let app
|
||||
let category
|
||||
let html
|
||||
|
||||
html =
|
||||
'<a id="wappalyzer-close" href="javascript: document.body.removeChild(document.getElementById(\'wappalyzer-container\')); void(0);">' +
|
||||
'Close' +
|
||||
'</a>' +
|
||||
'<div id="wappalyzer-apps">'
|
||||
|
||||
if (detected != null && Object.keys(detected).length) {
|
||||
for (app in detected) {
|
||||
if (!hasOwn.call(detected, app)) {
|
||||
continue
|
||||
}
|
||||
|
||||
const version = detected[app].version
|
||||
const confidence = detected[app].confidence
|
||||
|
||||
html +=
|
||||
`<div class="wappalyzer-app${first ? ' wappalyzer-first' : ''}">` +
|
||||
`<a target="_blank" class="wappalyzer-application" href="${
|
||||
wappalyzer.config.websiteURL
|
||||
}applications/${app
|
||||
.toLowerCase()
|
||||
.replace(/ /g, '-')
|
||||
.replace(/[^a-z0-9-]/g, '')}">` +
|
||||
'<strong>' +
|
||||
`<img src="${wappalyzer.config.websiteURL}images/icons/${wappalyzer
|
||||
.apps[app].icon ||
|
||||
'default.svg'}" width="16" height="16"/> ${app}</strong>${
|
||||
version ? ` ${version}` : ''
|
||||
}${confidence < 100 ? ` (${confidence}% sure)` : ''}</a>`
|
||||
|
||||
for (const i in wappalyzer.apps[app].cats) {
|
||||
if (!hasOwn.call(wappalyzer.apps[app].cats, i)) {
|
||||
continue
|
||||
}
|
||||
|
||||
category = wappalyzer.categories[wappalyzer.apps[app].cats[i]].name
|
||||
|
||||
html += `<a target="_blank" class="wappalyzer-category" href="${
|
||||
wappalyzer.config.websiteURL
|
||||
}categories/${slugify(category)}">${category}</a>`
|
||||
}
|
||||
|
||||
html += '</div>'
|
||||
|
||||
first = false
|
||||
}
|
||||
} else {
|
||||
html += '<div id="wappalyzer-empty">No applications detected</div>'
|
||||
}
|
||||
|
||||
html += '</div>'
|
||||
|
||||
container.innerHTML = html
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a tab
|
||||
*/
|
||||
// function openTab(args) {
|
||||
// open(args.url)
|
||||
// }
|
||||
|
||||
function slugify(string) {
|
||||
return string
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z0-9-]/g, '-')
|
||||
.replace(/--+/g, '-')
|
||||
.replace(/(?:^-|-$)/, '')
|
||||
}
|
||||
|
||||
getPageContent()
|
||||
getResponseHeaders()
|
||||
})()
|
Reference in new issue