From 94476c36846af5917233d79765fb09f1f7462071 Mon Sep 17 00:00:00 2001 From: ax-i-om <134003515+ax-i-om@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:55:51 -0400 Subject: [PATCH] GUI Overhaul --- README.md | 7 +- api/api.go | 19 ++ api/static/app.js | 604 +++++++++++++++++++++++---------------- api/static/bitcrook.png | Bin 0 -> 24096 bytes api/static/discord.html | 47 --- api/static/domain.html | 46 --- api/static/favicon.ico | Bin 0 -> 15406 bytes api/static/index.html | 81 +++--- api/static/ip.html | 47 --- api/static/script.js | 25 -- api/static/search.png | Bin 6420 -> 10933 bytes api/static/style.css | 89 +++--- api/static/tin.html | 47 --- api/static/tools.html | 62 ---- api/static/username.html | 47 --- api/static/vin.html | 48 ---- go.mod | 2 +- go.sum | 4 +- images/cliprev.png | Bin 64860 -> 96982 bytes images/guiprev.png | Bin 47532 -> 202191 bytes main.go | 2 +- 21 files changed, 470 insertions(+), 707 deletions(-) create mode 100644 api/static/bitcrook.png delete mode 100644 api/static/discord.html delete mode 100644 api/static/domain.html create mode 100644 api/static/favicon.ico delete mode 100644 api/static/ip.html delete mode 100644 api/static/script.js delete mode 100644 api/static/tin.html delete mode 100644 api/static/tools.html delete mode 100644 api/static/username.html delete mode 100644 api/static/vin.html diff --git a/README.md b/README.md index 90141f4..bd87f36 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Documentation Go Report Card Tests - v2.1.1
+ v2.2.0
DeepSource
Centralize and expedite OSINT investigations
View the roadmap
@@ -43,7 +43,7 @@ It is the end user's responsibility to obey all applicable local, state, and fed Bitcrook v2.0.0 has been released as of October 11, 2023, only one day after v1.0.0 due to some significant changes to project structure. Here are some highlights of the recent changes in the v1.0.0 and v2.0.0 releases: - Switch web framework from Fiber to Go (enabled Bitcrook to be more lightweight) - - Completely revamped the CLI output scheme + - Complete CLI and GUI design overhaul - Proper docker implementation - Binary release to support `go install` - Switched secret configuration from .json to .env, see [Authentication](#authentication) @@ -51,6 +51,7 @@ Bitcrook v2.0.0 has been released as of October 11, 2023, only one day after v1. - Fixed CORS error when accessing web app over LAN - Username lookup command now only displays valid results - Added HaveIBeenPwned breach check to email and domain lookup commands + - Added phone and email search to web app - Removed Caselaw package due to instability, will replace - Packages now grouped based on field type rather than authentication type - Fixed tests and some documentation @@ -95,7 +96,7 @@ You can also host the Bitcrook webapp via docker: 1. Navigate to the root directory of Bitcrook via `cd` 2. Build the Docker image: `docker build -t bitcrook .` -3. Run Bitcrook via Docker: `docker run --env-file .env --name bitcrook -d -p 6174:6174 bitcrook` +3. Run Bitcrook via Docker: `docker run --restart always --env-file .env --name bitcrook -d -p 6174:6174 bitcrook` 4. Access the interface via `http://127.0.0.1:6174` ### Authentication diff --git a/api/api.go b/api/api.go index 9923a66..c5a13d9 100644 --- a/api/api.go +++ b/api/api.go @@ -26,7 +26,9 @@ import ( "github.com/TwiN/go-color" "github.com/ax-i-om/bitcrook/pkg/discord" "github.com/ax-i-om/bitcrook/pkg/domain" + "github.com/ax-i-om/bitcrook/pkg/email" "github.com/ax-i-om/bitcrook/pkg/ip" + "github.com/ax-i-om/bitcrook/pkg/phone" "github.com/ax-i-om/bitcrook/pkg/tin" "github.com/ax-i-om/bitcrook/pkg/userlookup" "github.com/ax-i-om/bitcrook/pkg/vin" @@ -92,6 +94,23 @@ func StartServer() { } return c.JSON(http.StatusOK, tinInfo) }) + + e.GET("/phone/:phone", func(c echo.Context) error { + phoneInfo, err := phone.MelissaLookup(os.Getenv("BITCROOK_MLSA"), c.Param("phone")) + if err != nil { + return c.JSON(http.StatusInternalServerError, err) + } + return c.JSON(http.StatusOK, phoneInfo) + }) + + e.GET("/email/:email", func(c echo.Context) error { + emailInfo, err := email.MelissaLookup(os.Getenv("BITCROOK_MLSA"), c.Param("email")) + if err != nil { + return c.JSON(http.StatusInternalServerError, err) + } + return c.JSON(http.StatusOK, emailInfo) + }) + fmt.Println(color.Colorize(color.Blue, "[i]"), "HTTP server started on", color.Colorize(color.Green, "[::]:6174")) fmt.Println(color.Colorize(color.Blue, "[i]"), "Access Bitcrook via", color.Colorize(color.Green, "127.0.0.1:6174")) fmt.Println() diff --git a/api/static/app.js b/api/static/app.js index b60528f..def045f 100644 --- a/api/static/app.js +++ b/api/static/app.js @@ -14,6 +14,94 @@ See the License for the specific language governing permissions and limitations under the License. */ +let selectList = document.querySelector("#querytype") +// get initial width of select element. +// we have to remember there is a dropdown arrow make it a little wider +let initialWidth = selectList.offsetWidth +// get text content length (not a value length) of widest option. +let maxOptValLen = findMaxLengthOpt(selectList) +// calc width of single letter +let letterWidth = initialWidth / maxOptValLen +let corCoef = 4.875; // Based on visual appearance +// console.log(initialWidth, maxOptValLen) + +function reSizeDrop(selist) { + let newOptValLen = getSelected(selist).textContent.length + let correction = (maxOptValLen - newOptValLen) * corCoef + let newValueWidth = (newOptValLen * letterWidth) + correction + // console.log('new width', newValueWidth, 'new option len', newOptValLen) + selist.style.width = newValueWidth + "px" +} + +selectList.addEventListener("change", e => { + reSizeDrop(e.target) +}, false); + + +function getSelected(selectEl) { + return [...selectEl.options].find(o => o.selected) +} + +function findMaxLengthOpt(selectEl) { + return [...selectEl.options].reduce((result, o) => o.textContent.length > result ? o.textContent.length : result, 0) +} + +particlesJS("particles-js", { + particles: { + number: { value: 80, density: { enable: true, value_area: 800 } }, + color: { value: "#ffffff" }, + shape: { + type: "circle", + stroke: { width: 0, color: "#000000" }, + polygon: { nb_sides: 5 }, + image: { src: "img/github.svg", width: 100, height: 100 } + }, + opacity: { + value: 0.5, + random: false, + anim: { enable: false, speed: 1, opacity_min: 0.1, sync: false } + }, + size: { + value: 3, + random: true, + anim: { enable: false, speed: 40, size_min: 0.1, sync: false } + }, + line_linked: { + enable: true, + distance: 150, + color: "#ffffff", + opacity: 0.4, + width: 1 + }, + move: { + enable: true, + speed: 4, + direction: "none", + random: false, + straight: false, + out_mode: "out", + bounce: false, + attract: { enable: false, rotateX: 600, rotateY: 1200 } + } + }, + interactivity: { + detect_on: "canvas", + events: { + onhover: { enable: false, mode: "repulse" }, + onclick: { enable: false, mode: "push" }, + resize: true + }, + modes: { + grab: { distance: 400, line_linked: { opacity: 1 } }, + bubble: { distance: 400, size: 40, duration: 2, opacity: 8, speed: 3 }, + repulse: { distance: 100, duration: 0.4 }, + push: { particles_nb: 4 }, + remove: { particles_nb: 2 } + } + }, + retina_detect: true +}); + /** * Function to add a row of information with a light background to a results table * @param table The result table where the row will be added @@ -22,7 +110,7 @@ limitations under the License. * @returns Nothing */ function addLight(table, key, value) { - table.innerHTML += `${key}: ${value}`; + table.innerHTML += `${key}: ${value}`; } /** @@ -33,7 +121,7 @@ function addLight(table, key, value) { * @returns Nothing */ function addDark(table, key, value) { - table.innerHTML += `${key}: ${value}`; + table.innerHTML += `${key}: ${value}`; } /** @@ -45,258 +133,278 @@ function addGap(table) { table.innerHTML += "

" } -$('#ipsearch').on('click', () => { - const ip = $('#ip').val() - if (ip) { - $('#iploadercircle').addClass('loader'); - $.getJSON(`/ip/${ip}`, (res) => { - const iptable = document.getElementById('ipresult'); - iptable.innerHTML = ""; - $('#iploadercircle').removeClass('loader'); - addLight(iptable, "Status", res.status) - addDark(iptable, "Continent", res.continent) - addLight(iptable, "Country", res.country) - addDark(iptable, "Region Name", res.regionname) - addLight(iptable, "City", res.city) - addDark(iptable, "District", res.district) - addLight(iptable, "Zip", res.zip) - addDark(iptable, "Latitude", res.lat) - addLight(iptable, "Longitude", res.lon) - addDark(iptable, "Timezone", res.timezone) - addLight(iptable, "Currency", res.currency) - addDark(iptable, "ISP", res.isp) - addLight(iptable, "Org", res.org) - addDark(iptable, "As", res.as) - addLight(iptable, "Asname", res.asname) - addDark(iptable, "Reverse", res.reverse) - addLight(iptable, "Mobile", res.mobile) - addDark(iptable, "Proxy", res.proxy) - addLight(iptable, "Hosting", res.hosting) - }) - $('#ipresult').val('') - } else { - const iptable = document.getElementById('ipresult'); - iptable.innerHTML = ""; - addLight(iptable, "Error", "IP address field was left empty") - } -}) - -$('#usernamesearch').on('click', () => { - const username = $('#username').val() - if (username) { - $('#userloadercircle').addClass('loader'); - const usernametable = document.getElementById('usernameresult'); - usernametable.innerHTML = ""; - $.getJSON(`/username/${username}`, (res) => { - let recentswap = false; - $('#userloadercircle').removeClass('loader'); - for(let i = 0; i < res.length; i++) { - const obj = res[i]; - if (obj.Valid) { - if (recentswap) { - usernametable.innerHTML += `${obj.Title}: ${obj.Domain}`; - $(function(){ $(`a:contains(${obj.Domain})`).attr("href", obj.Domain)}); - $(function(){ $(`a:contains(${obj.Domain})`).attr("target", "_blank")}); - recentswap = false; - } else { - usernametable.innerHTML += `${obj.Title}: ${obj.Domain}`; - $(function(){ $(`a:contains(${obj.Domain})`).attr("href", obj.Domain)}); - $(function(){ $(`a:contains(${obj.Domain})`).attr("target", "_blank")}); - recentswap = true; - } +function launch() { + $('#queryloadercircle').addClass('loader'); + const query = $('#query').val() + const resulttable = document.getElementById('queryresult'); + resulttable.innerHTML = ""; + if (query) { + const type = $('#querytype').val() + if (type === "discord") { + $.getJSON(`/discord/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "ID", res.id) + addDark(resulttable, "Username", res.username) + addLight(resulttable, "Avatar", res.avatar) + addDark(resulttable, "Discriminator", res.discriminator) + addLight(resulttable, "Public Flags", res.public_flags) + addDark(resulttable, "Flags", res.flags) + addLight(resulttable, "Banner", res.banner) + addDark(resulttable, "Accent Color", res.accent_color) + addLight(resulttable, "Global Name", res.global_name) + addDark(resulttable, "Avatar Decoration", res.avatar_decoration_data) + addLight(resulttable, "Banner Color", res.banner_color) + addDark(resulttable, "MFA Enabled", res.mfa_enabled) + addLight(resulttable, "Locale", res.locale) + addDark(resulttable, "Premium Type", res.premium_type) + addLight(resulttable, "Email", res.email) + addDark(resulttable, "Verified", res.verified) + addLight(resulttable, "Phone", res.phne) + addDark(resulttable, "NSFW Allowed", res.nsfw_allowed) + addLight(resulttable, "Linked Users", res.linked_users) + addDark(resulttable, "Bought Flags", res.purchased_flags) + addLight(resulttable, "Bio", res.bio) + addDark(resulttable, "Auth Types", res.authenticator_types) + }) + } else if (type === "domain") { + $.getJSON(`/domain/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "Domain", res.domain) + addDark(resulttable, "Domain ID", res.domain_id) + addLight(resulttable, "Status", res.status) + addDark(resulttable, "Domain Age", res.domain_age) + addLight(resulttable, "WHOIS Server", res.whois_server) + + addGap(resulttable) + + addLight(resulttable, "Registrar IANA ID", res.registrar.iana_id) + addDark(resulttable, "Registrar Name", res.registrar.name) + addLight(resulttable, "Registrar URL", res.registrar.url) + + if (res.registrant.name) { + addGap(resulttable) + + addLight(resulttable, "Registrant Name", res.registrant.name) + addDark(resulttable, "Registrant Organization", res.registrant.organization) + addLight(resulttable, "Registrant Street Address", res.registrant.street_address) + addDark(resulttable, "Registrant City", res.registrant.city) + addLight(resulttable, "Registrant Region", res.registrant.region) + addDark(resulttable, "Registrant Zip Code", res.registrant.zip_code) + addLight(resulttable, "Registrant Country", res.registrant.country) + addDark(resulttable, "Registrant Phone", res.registrant.phone) + addLight(resulttable, "Registrant Fax", res.registrant.fax) + addDark(resulttable, "Registrant Email", res.registrant.email) } - } - }) - $('#usernameresult').val('') - } else { - const usernametable = document.getElementById('usernameresult'); - usernametable.innerHTML = ""; - addLight(usernametable, "Error", "Username field was left empty") - } -}) - -$('#vinsearch').on('click', () => { - $('#vinloadercircle').addClass('loader'); - const vin = $('#vin').val() - $.getJSON(`/vin/${vin}`, (res) => { - const vintable = document.getElementById('vinresult'); - vintable.innerHTML = ""; - $('#vinloadercircle').removeClass('loader'); - addLight(vintable, "VIN", res.Vin) - addDark(vintable, "Make", res.Make) - addLight(vintable, "Model", res.Model) - addDark(vintable, "Year", res.Year) - addLight(vintable, "Trim", res.Trim) - addDark(vintable, "Body", res.Body) - addLight(vintable, "Engine", res.Engine) - addDark(vintable, "Manufactured In", res.ManufacturedIn) - addLight(vintable, "Trim Level", res.TrimLevel) - addDark(vintable, "Steering Type", res.SteeringType) - addLight(vintable, "ABS", res.Abs) - addDark(vintable, "Tank Size", res.TankSize) - addLight(vintable, "Overall Height", res.OverallHeight) - addDark(vintable, "Overall Length", res.OverallLength) - addLight(vintable, "Overall Width", res.OverallWidth) - addDark(vintable, "Standard Seating", res.StandardSeating) - addLight(vintable, "Optional Seating", res.OptionalSeating) - addDark(vintable, "Highway Mileage", res.HighwayMileage) - addLight(vintable, "City Mileage", res.CityMileage) - addDark(vintable, "Fuel Type", res.FuelType) - addLight(vintable, "Drive Type", res.DriveType) - addDark(vintable, "Transmission", res.Transmission) - }) - $('#vinresult').val('') -}) - -$('#domainsearch').on('click', () => { - const domain = $('#domain').val() - if (domain) { - $('#domainloadercircle').addClass('loader'); - $.getJSON(`/domain/${domain}`, (res) => { - $('#domainloadercircle').removeClass('loader'); - const domaintable = document.getElementById('domainresult'); - domaintable.innerHTML = ""; - addLight(domaintable, "Domain", res.domain) - addDark(domaintable, "Domain ID", res.domain_id) - addLight(domaintable, "Status", res.status) - addDark(domaintable, "Domain Age", res.domain_age) - addLight(domaintable, "WHOIS Server", res.whois_server) - addGap(domaintable) - - addLight(domaintable, "Registrar IANA ID", res.registrar.iana_id) - addDark(domaintable, "Registrar Name", res.registrar.name) - addLight(domaintable, "Registrar URL", res.registrar.url) - - addGap(domaintable) + if (res.admin.name) { + addGap(resulttable) - addLight(domaintable, "Registrant Name", res.registrant.name) - addDark(domaintable, "Registrant Organization", res.registrant.organization) - addLight(domaintable, "Registrant Street Address", res.registrant.street_address) - addDark(domaintable, "Registrant City", res.registrant.city) - addLight(domaintable, "Registrant Region", res.registrant.region) - addDark(domaintable, "Registrant Zip Code", res.registrant.zip_code) - addLight(domaintable, "Registrant Country", res.registrant.country) - addDark(domaintable, "Registrant Phone", res.registrant.phone) - addLight(domaintable, "Registrant Fax", res.registrant.fax) - addDark(domaintable, "Registrant Email", res.registrant.email) - - addGap(domaintable) - - addLight(domaintable, "Admin Name", res.admin.name) - addDark(domaintable, "Admin Organization", res.admin.organization) - addLight(domaintable, "Admin Street Address", res.admin.street_address) - addDark(domaintable, "Admin City", res.admin.city) - addLight(domaintable, "Admin Region", res.admin.region) - addDark(domaintable, "Admin Zip Code", res.admin.zip_code) - addLight(domaintable, "Admin Country", res.admin.country) - addDark(domaintable, "Admin Phone", res.admin.phone) - addLight(domaintable, "Admin Fax", res.admin.fax) - addDark(domaintable, "Admin Email", res.admin.email) - - addGap(domaintable) - - addLight(domaintable, "Tech Name", res.tech.name) - addDark(domaintable, "Tech Organization", res.tech.organization) - addLight(domaintable, "Tech Street Address", res.tech.street_address) - addDark(domaintable, "Tech City", res.tech.city) - addLight(domaintable, "Tech Region", res.tech.region) - addDark(domaintable, "Tech Zip Code", res.tech.zip_code) - addLight(domaintable, "Tech Country", res.tech.country) - addDark(domaintable, "Tech Phone", res.tech.phone) - addLight(domaintable, "Tech Fax", res.tech.fax) - addDark(domaintable, "Tech Email", res.tech.email) - - addGap(domaintable) - - addLight(domaintable, "Billing Name", res.billing.name) - addDark(domaintable, "Billing Organization", res.billing.organization) - addLight(domaintable, "Billing Street Address", res.billing.street_address) - addDark(domaintable, "Billing City", res.billing.city) - addLight(domaintable, "Billing Region", res.billing.region) - addDark(domaintable, "Billing Zip Code", res.billing.zip_code) - addLight(domaintable, "Billing Country", res.billing.country) - addDark(domaintable, "Billing Phone", res.billing.phone) - addLight(domaintable, "Billing Fax", res.billing.fax) - addDark(domaintable, "Billing Email", res.billing.email) - - addGap(domaintable) - - addLight(domaintable, "Nameservers", res.nameservers) - }) - $('#domainresult').val('') + addLight(resulttable, "Admin Name", res.admin.name) + addDark(resulttable, "Admin Organization", res.admin.organization) + addLight(resulttable, "Admin Street Address", res.admin.street_address) + addDark(resulttable, "Admin City", res.admin.city) + addLight(resulttable, "Admin Region", res.admin.region) + addDark(resulttable, "Admin Zip Code", res.admin.zip_code) + addLight(resulttable, "Admin Country", res.admin.country) + addDark(resulttable, "Admin Phone", res.admin.phone) + addLight(resulttable, "Admin Fax", res.admin.fax) + addDark(resulttable, "Admin Email", res.admin.email) + } + + if (res.tech.name) { + addGap(resulttable) + + addLight(resulttable, "Tech Name", res.tech.name) + addDark(resulttable, "Tech Organization", res.tech.organization) + addLight(resulttable, "Tech Street Address", res.tech.street_address) + addDark(resulttable, "Tech City", res.tech.city) + addLight(resulttable, "Tech Region", res.tech.region) + addDark(resulttable, "Tech Zip Code", res.tech.zip_code) + addLight(resulttable, "Tech Country", res.tech.country) + addDark(resulttable, "Tech Phone", res.tech.phone) + addLight(resulttable, "Tech Fax", res.tech.fax) + addDark(resulttable, "Tech Email", res.tech.email) + } + + if (res.billing.name) { + addGap(resulttable) + + addLight(resulttable, "Billing Name", res.billing.name) + addDark(resulttable, "Billing Organization", res.billing.organization) + addLight(resulttable, "Billing Street Address", res.billing.street_address) + addDark(resulttable, "Billing City", res.billing.city) + addLight(resulttable, "Billing Region", res.billing.region) + addDark(resulttable, "Billing Zip Code", res.billing.zip_code) + addLight(resulttable, "Billing Country", res.billing.country) + addDark(resulttable, "Billing Phone", res.billing.phone) + addLight(resulttable, "Billing Fax", res.billing.fax) + addDark(resulttable, "Billing Email", res.billing.email) + } + + addGap(resulttable) + + addLight(resulttable, "Nameservers", res.nameservers) + }) + } else if (type === "email") { + $.getJSON(`/email/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "Deliverability Confidence Score", res.Deliverabilityconfidencescore) + addDark(resulttable, "Email Address", res.Emailaddress) + addLight(resulttable, "Mailbox Name", res.Mailboxname) + addDark(resulttable, "Domain Name", res.Domainname) + addLight(resulttable, "Top Level Domain", res.Topleveldomain) + addDark(resulttable, "TopLevel Domain Name", res.Topleveldomainname) + addLight(resulttable, "Date Checked", res.Datechecked) + addDark(resulttable, "Estimated Email Age", res.Emailageestimated) + addLight(resulttable, "Estimated Domain Age", res.Domainageestimated) + addDark(resulttable, "Domain Expiration Date", res.Domainexpirationdate) + addLight(resulttable, "Domain Created Date", res.Domaincreateddate) + addDark(resulttable, "Domain Updated Date", res.Domainupdateddate) + addLight(resulttable, "Domain Email", res.Domainemail) + addDark(resulttable, "Domain Organization", res.Domainorganization) + addLight(resulttable, "Domain Address 1", res.Domainaddress1) + addDark(resulttable, "Domain Locality", res.Domainlocality) + addLight(resulttable, "Domain Administrative Area", res.Domainadministrativearea) + addDark(resulttable, "Domain Postal Code", res.Domainpostalcode) + addLight(resulttable, "Domain Country", res.Domaincountry) + addDark(resulttable, "Domain Availability", res.Domainavailability) + addLight(resulttable, "Domain Country Code", res.Domaincountrycode) + addDark(resulttable, "Domain Private Proxy", res.Domainprivateproxy) + addLight(resulttable, "Privacy Flag", res.Privacyflag) + addDark(resulttable, "MX Server", res.Mxserver) + }) + } else if (type === "ip") { + $.getJSON(`/ip/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "Status", res.status) + addDark(resulttable, "Continent", res.continent) + addLight(resulttable, "Country", res.country) + addDark(resulttable, "Region Name", res.regionname) + addLight(resulttable, "City", res.city) + addDark(resulttable, "District", res.district) + addLight(resulttable, "Zip", res.zip) + addDark(resulttable, "Latitude", res.lat) + addLight(resulttable, "Longitude", res.lon) + addDark(resulttable, "Timezone", res.timezone) + addLight(resulttable, "Currency", res.currency) + addDark(resulttable, "ISP", res.isp) + addLight(resulttable, "Org", res.org) + addDark(resulttable, "As", res.as) + addLight(resulttable, "Asname", res.asname) + addDark(resulttable, "Reverse", res.reverse) + addLight(resulttable, "Mobile", res.mobile) + addDark(resulttable, "Proxy", res.proxy) + addLight(resulttable, "Hosting", res.hosting) + }) + } else if (type === "phone") { + $.getJSON(`/phone/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "Phone Number", res.Phonenumber) + addDark(resulttable, "Administrative Area", res.Administrativearea) + addLight(resulttable, "Country Abbreviation", res.Countryabbreviation) + addDark(resulttable, "Country Name", res.Countryname) + addLight(resulttable, "Carrier", res.Carrier) + addDark(resulttable, "Caller ID", res.Callerid) + addLight(resulttable, "DST", res.Dst) + addDark(resulttable, "International Phone Number", res.Internationalphonenumber) + addLight(resulttable, "Language", res.Language) + addDark(resulttable, "Latitude", res.Latitude) + addLight(resulttable, "Longitude", res.Longitude) + addDark(resulttable, "Locality", res.Locality) + addLight(resulttable, "Phone International Prefix", res.Phoneinternationalprefix) + addDark(resulttable, "Phone Country Dialing Code", res.Phonecountrydialingcode) + addLight(resulttable, "Phone Nation Prefix", res.Phonenationprefix) + addDark(resulttable, "Phone National Destination Code", res.Phonenationaldestinationcode) + addLight(resulttable, "Phone Subscriber Number", res.Phonesubscribernumber) + addDark(resulttable, "UTC", res.Utc) + addLight(resulttable, "Timezone Code", res.Timezonecode) + addDark(resulttable, "Timezone Name", res.Timezonename) + addLight(resulttable, "Postal Code", res.Postalcode) + }) + } else if (type === "tin") { + $.getJSON(`/tin/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + for(let i = 0; i < res.rows.length; i++) { + const obj = res.rows[i]; + addLight(resulttable, "Assignment Date", obj.r) + addDark(resulttable, "Termination Date", obj.e) + addLight(resulttable, "Page", obj.pg) + addDark(resulttable, "Total", obj.tot) + addLight(resulttable, "Count", obj.cnt) + addDark(resulttable, "INN", obj.i) + addLight(resulttable, "K", obj.k) + addDark(resulttable, "Name", obj.n) + addLight(resulttable, "OGRNIP", obj.o) + addGap(resulttable) + } + }) + } else if (type === "username") { + $.getJSON(`/username/${query}`, (res) => { + let recentswap = false; + $('#queryloadercircle').removeClass('loader'); + for(let i = 0; i < res.length; i++) { + const obj = res[i]; + if (obj.Valid) { + if (recentswap) { + resulttable.innerHTML += `${obj.Title}: ${obj.Domain}`; + $(function(){ $(`a:contains(${obj.Domain})`).attr("href", obj.Domain)}); + $(function(){ $(`a:contains(${obj.Domain})`).attr("target", "_blank")}); + recentswap = false; + } else { + resulttable.innerHTML += `${obj.Title}: ${obj.Domain}`; + $(function(){ $(`a:contains(${obj.Domain})`).attr("href", obj.Domain)}); + $(function(){ $(`a:contains(${obj.Domain})`).attr("target", "_blank")}); + recentswap = true; + } + } + } + }) + } else if (type === "vin") { + $.getJSON(`/vin/${query}`, (res) => { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "VIN", res.Vin) + addDark(resulttable, "Make", res.Make) + addLight(resulttable, "Model", res.Model) + addDark(resulttable, "Year", res.Year) + addLight(resulttable, "Trim", res.Trim) + addDark(resulttable, "Body", res.Body) + addLight(resulttable, "Engine", res.Engine) + addDark(resulttable, "Manufactured In", res.ManufacturedIn) + addLight(resulttable, "Trim Level", res.TrimLevel) + addDark(resulttable, "Steering Type", res.SteeringType) + addLight(resulttable, "ABS", res.Abs) + addDark(resulttable, "Tank Size", res.TankSize) + addLight(resulttable, "Overall Height", res.OverallHeight) + addDark(resulttable, "Overall Length", res.OverallLength) + addLight(resulttable, "Overall Width", res.OverallWidth) + addDark(resulttable, "Standard Seating", res.StandardSeating) + addLight(resulttable, "Optional Seating", res.OptionalSeating) + addDark(resulttable, "Highway Mileage", res.HighwayMileage) + addLight(resulttable, "City Mileage", res.CityMileage) + addDark(resulttable, "Fuel Type", res.FuelType) + addLight(resulttable, "Drive Type", res.DriveType) + addDark(resulttable, "Transmission", res.Transmission) + }) + } else { + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "Error", "Malformed query type") + } } else { - const domaintable = document.getElementById('domainresult'); - domaintable.innerHTML = ""; - addLight(domaintable, "Error", "Domain field was left empty") + $('#queryloadercircle').removeClass('loader'); + addLight(resulttable, "Error", "Query was not specified") } -}) +} -$('#discordsearch').on('click', () => { - const discord = $('#discord').val() - if (discord) { - $('#discordloadercircle').addClass('loader'); - $.getJSON(`/discord/${discord}`, (res) => { - const discordtable = document.getElementById('discordresult'); - discordtable.innerHTML = ""; - $('#discordloadercircle').removeClass('loader'); - addLight(discordtable, "ID", res.id) - addDark(discordtable, "Username", res.username) - addLight(discordtable, "Avatar", res.avatar) - addDark(discordtable, "Discriminator", res.discriminator) - addLight(discordtable, "Public Flags", res.public_flags) - addDark(discordtable, "Flags", res.flags) - addLight(discordtable, "Banner", res.banner) - addDark(discordtable, "Accent Color", res.accent_color) - addLight(discordtable, "Global Name", res.global_name) - addDark(discordtable, "Avatar Decoration", res.avatar_decoration_data) - addLight(discordtable, "Banner Color", res.banner_color) - addDark(discordtable, "MFA Enabled", res.mfa_enabled) - addLight(discordtable, "Locale", res.locale) - addDark(discordtable, "Premium Type", res.premium_type) - addLight(discordtable, "Email", res.email) - addDark(discordtable, "Verified", res.verified) - addLight(discordtable, "Phone", res.phne) - addDark(discordtable, "NSFW Allowed", res.nsfw_allowed) - addLight(discordtable, "Linked Users", res.linked_users) - addDark(discordtable, "Bought Flags", res.purchased_flags) - addLight(discordtable, "Bio", res.bio) - addDark(discordtable, "Auth Types", res.authenticator_types) - }) - $('#ipresult').val('') - } else { - const discordtable = document.getElementById('discordresult'); - discordtable.innerHTML = ""; - addLight(discordtable, "Error", "Discord token field was left empty") +$('#query').keypress(function (e) { + if (e.which == 13) { + e.preventDefault(); + launch() } +}); + + +$('#launchquery').on('click', () => { + launch() }) -$('#tinsearch').on('click', () => { - const tin = $('#tin').val() - if (tin) { - const tintable = document.getElementById('tinresult'); - tintable.innerHTML = ""; - $('#tinloadercircle').addClass('loader'); - $.getJSON(`/tin/${tin}`, (res) => { - $('#tinloadercircle').removeClass('loader'); - for(let i = 0; i < res.rows.length; i++) { - const obj = res.rows[i]; - addLight(tintable, "Assignment Date", obj.r) - addDark(tintable, "Termination Date", obj.e) - addLight(tintable, "Page", obj.pg) - addDark(tintable, "Total", obj.tot) - addLight(tintable, "Count", obj.cnt) - addDark(tintable, "INN", obj.i) - addLight(tintable, "K", obj.k) - addDark(tintable, "Name", obj.n) - addLight(tintable, "OGRNIP", obj.o) - addGap(tintable) - } - }) - $('#tinresult').val('') - } else { - const tintable = document.getElementById('tinresult'); - tintable.innerHTML = ""; - addLight(tintable, "Error", "TIN field was left empty") - } -}) \ No newline at end of file +window.onload = reSizeDrop(selectList); \ No newline at end of file diff --git a/api/static/bitcrook.png b/api/static/bitcrook.png new file mode 100644 index 0000000000000000000000000000000000000000..e24bfbb8852c10a47dd5395d4275071e106ab485 GIT binary patch literal 24096 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 literal 0 HcmV?d00001 diff --git a/api/static/discord.html b/api/static/discord.html deleted file mode 100644 index a3a72ed..0000000 --- a/api/static/discord.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Bitcrook - - - - - - - - -

-

Discord Token Lookup

-
-
- - -
-
- - - - -
- -
-
-
-
-
- - - - - \ No newline at end of file diff --git a/api/static/domain.html b/api/static/domain.html deleted file mode 100644 index c891ff8..0000000 --- a/api/static/domain.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - Bitcrook - - - - - - - - -

Domain Lookup

-
-
- - -
-
- - - - -
- -
-
-
-
-
- - - - - \ No newline at end of file diff --git a/api/static/favicon.ico b/api/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cf32ad49154d2539000df8334a8a697129d05f99 GIT binary patch literal 15406 zcmeHOdu$xV8DH~$1Tc>zr65S90%`bzP(NDU!v(n^Sb&F{Np(Rp*bJ9D>Z zgXEJ&yYs!~n{U6F`R1EBL1+<97Ft^cJm(2(PZ5M434$dR?O`8y?A`PD@99R<%N6evZeQX zVQyWq^{o5u_mpkzZt^uRULMshfnRia;of?D&xUg)*h|1S{~DLip9FhuTj}(j^EE8s zh5CxNwnE?aRN%Y66fNV50G67l#L&i8Dm9T20coC@hq45P=BID#FE+6HjCyr%gx75| zF_c+Crp(@Wn&lS`OCv(iA8ljbbU39ju($U>58TQER2uVc-X%ujE)yCS=k#D zC--6)AKLz#^1iwtjE)ztyri6*F6YWZK&+>j`O{!~hgUW${VLn|!%wWtwSM$sN&PX} z-{FUE6plGyZD1VXz&+du4uM_HFF^(NSOzf@91uUyg8?t*Unh{lVHq7L7?ndViB z0sZ9B-T*cz6RjUjJ#hJbb+%&XKIlB4e=m$*wEC`qj~pPLFj`i;Z0irB{m>ZQm4`8E z$hPr_TW|D9cE=igF{_-8Lic6Rxy(u*L`Qog_}q99O)VUJ@$&_ya#}4M4~$|@*zzC` z57A=1{>C>Zlzch?Hs~4d6NpgqwGqV zdb~mL%&_RfhwRG^6XSpHn>2RBB!AHx22mRwXf z$k^)yHXZ>|nV|Jf-y#*&+anNH5h0c`ofH?dD~}(Y=xCjg^?9n4xyFwsYB=Se5ex2>9qqYBWh0*5k+uy> ziC|B`qYK57=)->c{ycouv`Y(_^I-cT?C@AMd@9~k!W+k^Hle)`0BZa5vf z?|}b5>qpaUxKvitl|4s|^T)8ZWix+4+R5!jUMd|%+bq0dW{?jt_H|nQSM#<}$tRVK z(V)B+uS{P0%6Ss@eDLEtd3liwTZ28~%TdN5ygJZ&4;`LVoXw%<2VU8TL3YCbx5ft8 z?+JKiL{XQ^#@*<{L7tq}O?%g0h;j2@ck@( z@hF`GA5IKulrjkXDdl_{d}o|u*g(Q5M8=S_qP#HH;?O;fT+VHx9Qt&{41Q*z94O-8 zM}ziIJ`=bcK2L-zXHC)8w;i|mPi(}*CB@aST@z(dUbdCL^FGTdNg-9^-ea@ zb2(RjttZA`7v{?UwY}aww-%lUhJ5g)Sku0g%=+^HJna!JV$B@N0bV{odgL%Z!J7PF z)H&^%?cq!kd7rJgmr|;UuLDT&D8|4x$_>}S&d1{FZ|OE4qdztLXCLO#EiCJYzZ7;1 z;{86@>p$_Gao;m*R%u;tb)5tIe*u5&VdZI*E>+Z0w0{+c`4bjv$)7lBUEt{ymyU)UWjHV@J zW>-S@LyDz6#LgBC`MNF{yAwCi5gjrLc2&rX?{Hsp1vA730VN7JL5kGOU08~<9lON{g0D%Nk@ jE1jz*M%2X>yIWZ$iE|=4xBtc|I-}5x1!gQTtrqwS`!VSy literal 0 HcmV?d00001 diff --git a/api/static/index.html b/api/static/index.html index 009afae..c8819b5 100644 --- a/api/static/index.html +++ b/api/static/index.html @@ -1,42 +1,55 @@ - - + + + Bitcrook - - - + + + - + - - -