feat(cloudron): add tirreno package artifacts

- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents
- Includes package manifest, Dockerfile, source code, documentation, and build artifacts
- Add tirreno-1761840148.tar.gz as a build artifact
- Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package
- Include all necessary files for the tirreno Cloudron package

This adds the complete tirreno Cloudron package artifacts to the repository.
This commit is contained in:
2025-10-30 11:43:06 -05:00
parent 0ce353ea9d
commit 91d52d2de5
1692 changed files with 202851 additions and 0 deletions

View File

@@ -0,0 +1,318 @@
import {
renderDefaultIfEmptyElement,
renderBoolean,
renderDate,
renderCountryIso,
renderHttpCode,
renderPhoneType,
renderPhoneCarrierName,
renderAsn,
} from '../parts/DataRenderers.js?v=2';
export class ManualCheckItems {
constructor() {
const table = document.querySelector('.events-card.is-hidden');
if (!table) return;
table.classList.remove('is-hidden');
const itemType = table.dataset.itemType;
if ('ip' == itemType) {
this.enrichIpDetails();
}
if ('email' == itemType) {
this.enrichEmailDetails();
}
if ('domain' == itemType) {
this.enrichDomainDetails();
}
if ('phone' == itemType) {
this.enrichPhoneDetails();
}
}
enrichPhoneDetails() {
let item = null;
item = 'iso_country_code';
this.renderCountryIso(item);
item = 'type';
this.renderPhoneType(item);
item = 'invalid';
this.renderBoolean(item);
item = 'profiles';
this.renderProfiles(item);
item = 'carrier_name';
this.renderPhoneCarrierName(item);
}
enrichDomainDetails() {
let item = null;
item = 'blockdomains';
this.renderBoolean(item);
item = 'disposable_domains';
this.renderBoolean(item);
item = 'free_email_provider';
this.renderBoolean(item);
item = 'geo_ip';
this.renderCountryIso(item);
item = 'geo_html';
this.renderCountryIso(item);
item = 'web_server';
this.renderDefaultIfEmptyElement(item);
item = 'hostname';
this.renderDefaultIfEmptyElement(item);
item = 'emails';
this.renderDefaultIfEmptyElement(item);
item = 'phone';
this.renderDefaultIfEmptyElement(item);
item = 'discovery_date';
this.renderDate(item);
item = 'creation_date';
this.renderDate(item);
item = 'expiration_date';
this.renderDate(item);
item = 'mx_record';
this.renderBoolean(item);
item = 'return_code';
this.renderHttpCode(item);
item = 'disabled';
this.renderBoolean(item);
item = 'closest_snapshot';
this.renderDate(item);
}
enrichIpDetails() {
let item = null;
let value = null;
item = 'country';
this.renderCountryIso(item);
item = 'asn';
value = this.getItem(item);
value = {asn: value};
value = renderAsn(value);
this.setItem(item, value);
item = 'hosting';
this.renderBoolean(item);
item = 'vpn';
this.renderBoolean(item);
item = 'tor';
this.renderBoolean(item);
item = 'relay';
this.renderBoolean(item);
item = 'starlink';
this.renderBoolean(item);
item = 'description';
this.renderDefaultIfEmptyElement(item);
item = 'blocklist';
this.renderBoolean(item);
item = 'domains_count';
value = this.getItem(item);
if (value) {
value = JSON.parse(value);
if (Array.isArray(value)) {
value = value.length;
} else {
value = parseInt(value, 10);
}
if (isNaN(value)) {
value = renderDefaultIfEmptyElement(value);
} else {
value = !!value;
value = renderBoolean(value);
}
} else {
value = renderDefaultIfEmptyElement(value);
}
this.setItem(item, value);
}
enrichEmailDetails() {
let item = null;
item = 'blockemails';
this.renderBoolean(item);
item = 'data_breach';
this.renderDataBreach(item);
item = 'earliest_breach';
this.renderDate(item);
item = 'domain_contact_email';
this.renderBoolean(item);
item = 'profiles';
this.renderProfiles(item);
}
renderDataBreach(itemId) {
let value;
value = this.getItem(itemId);
if (null === value) {
value = renderDefaultIfEmptyElement(value);
} else {
//Revert databreach to "No databreach"
value = !value;
value = renderBoolean(value);
}
this.setItem(itemId, value);
}
renderProfiles(itemId) {
let value;
value = this.getItem(itemId);
value = parseInt(value, 10);
if (isNaN(value)) {
value = renderDefaultIfEmptyElement(value);
} else {
//Convert to boolean
value = !!value;
//Revert profiles to "No profiles"
value = !value;
value = renderBoolean(value);
}
this.setItem(itemId, value);
}
renderDate(itemId) {
let value;
value = this.getItem(itemId);
value = renderDate(value);
this.setItem(itemId, value);
}
renderCountryIso(itemId) {
let value;
value = this.getItem(itemId);
value = {country_iso: value, full_country: value};
value = renderCountryIso(value);
this.setItem(itemId, value);
}
renderHttpCode(itemId) {
let value;
value = this.getItem(itemId);
value = {http_code: value};
value = renderHttpCode(value);
this.setItem(itemId, value);
}
renderPhoneType(itemId) {
let value;
value = this.getItem(itemId);
value = {type: value};
value = renderPhoneType(value);
this.setItem(itemId, value);
}
renderPhoneCarrierName(itemId) {
let value;
value = this.getItem(itemId);
value = {carrier_name: value};
value = renderPhoneCarrierName(value);
this.setItem(itemId, value);
}
renderBoolean(itemId) {
let value;
value = this.getItem(itemId);
value = renderBoolean(value);
this.setItem(itemId, value);
}
renderDefaultIfEmptyElement(itemId) {
let value;
value = this.getItem(itemId);
value = renderDefaultIfEmptyElement(value);
this.setItem(itemId, value);
}
getItem(itemId, returnNode = false) {
const td = document.querySelector(`td[data-item-id="${itemId}"]`);
if (!td) return null;
const tr = td.closest('tr');
const valueTd = tr.lastElementChild;
if (returnNode) {
return valueTd;
} else {
let text = valueTd.innerText;
let value = text;
if ('false' === text) value = false;
if ('true' === text) value = true;
if ('null' === text) value = null;
return value;
}
}
setItem(itemId, value) {
const item = this.getItem(itemId, true);
if (item) {
if (item instanceof Node) {
item.replaceChildren(value);
} else {
item.innerHTML = value;
}
}
}
}