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:
		@@ -0,0 +1,77 @@
 | 
			
		||||
import {Loader} from '../Loader.js?v=2';
 | 
			
		||||
import {Tooltip} from '../Tooltip.js?v=2';
 | 
			
		||||
import {handleAjaxError} from '../utils/ErrorHandler.js?v=2';
 | 
			
		||||
import {fireEvent} from '../utils/Event.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class BaseTiles {
 | 
			
		||||
 | 
			
		||||
    constructor(tilesParams) {
 | 
			
		||||
        const me = this;
 | 
			
		||||
        this.config = tilesParams;
 | 
			
		||||
        this.loaders = {};
 | 
			
		||||
 | 
			
		||||
        this.elems.forEach(elem => {
 | 
			
		||||
            me.loaders[elem] = new Loader();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (!this.config.sequential) {
 | 
			
		||||
            this.loadData();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    loadData() {
 | 
			
		||||
        const me     = this;
 | 
			
		||||
        const url    = this.url;
 | 
			
		||||
        const params = this.config.getParams();
 | 
			
		||||
        const token  = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
			
		||||
 | 
			
		||||
        if (!this.config.sequential) {
 | 
			
		||||
            this.startLoaders();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fireEvent('dateFilterChangedCaught');
 | 
			
		||||
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            url: `${url}?token=${token}`,
 | 
			
		||||
            type: 'get',
 | 
			
		||||
            scope: me,
 | 
			
		||||
            data: params,
 | 
			
		||||
            success: function(response) {
 | 
			
		||||
                me.onLoad(response, 'success');
 | 
			
		||||
                me.initTooltips();
 | 
			
		||||
            },
 | 
			
		||||
            error: handleAjaxError,
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    stopLoaders() {
 | 
			
		||||
        for (const property in this.loaders) {
 | 
			
		||||
            this.loaders[property].stop();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startLoaders() {
 | 
			
		||||
        for (const property in this.loaders) {
 | 
			
		||||
            const el = document.querySelector(`#${property}`);
 | 
			
		||||
            this.loaders[property].start(el);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startLoader() {
 | 
			
		||||
        this.startLoaders();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onLoad(data, status) {
 | 
			
		||||
        if ('success' == status) {
 | 
			
		||||
            this.stopLoaders();
 | 
			
		||||
            this.updateTiles(data);
 | 
			
		||||
            fireEvent('dateFilterChangedCompleted');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initTooltips() {
 | 
			
		||||
        Tooltip.addTooltipsToTiles();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateTiles(data) {}
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,41 @@
 | 
			
		||||
import {BaseTiles} from './BaseTiles.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderDefaultIfEmptyElement,
 | 
			
		||||
    renderBrowser,
 | 
			
		||||
    renderOs,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
const URL   = '/admin/loadBotDetails';
 | 
			
		||||
const ELEMS = ['title', 'os', 'browser', 'modified'];
 | 
			
		||||
 | 
			
		||||
export class BotTiles extends BaseTiles {
 | 
			
		||||
    updateTiles(data) {
 | 
			
		||||
 | 
			
		||||
        const os = [];
 | 
			
		||||
        if (data.os_name)    os.push(data.os_name);
 | 
			
		||||
        if (data.os_version) os.push(data.os_version);
 | 
			
		||||
 | 
			
		||||
        const browser = [];
 | 
			
		||||
        if (data.browser_name)    browser.push(data.browser_name);
 | 
			
		||||
        if (data.browser_version) browser.push(data.browser_version);
 | 
			
		||||
 | 
			
		||||
        const record = {
 | 
			
		||||
            os: os.join(' '),
 | 
			
		||||
            browser: browser.join(' ')
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        document.getElementById('title').replaceChildren(renderDefaultIfEmptyElement(data.title));
 | 
			
		||||
        document.getElementById('os').replaceChildren(renderOs(record));
 | 
			
		||||
        document.getElementById('browser').replaceChildren(renderBrowser(record));
 | 
			
		||||
        document.getElementById('modified').replaceChildren(renderBoolean(data.modified));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get elems() {
 | 
			
		||||
        return ELEMS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get url() {
 | 
			
		||||
        return URL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,33 @@
 | 
			
		||||
import {BaseTiles} from './BaseTiles.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderDefaultIfEmptyElement,
 | 
			
		||||
    renderDate,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
const URL   = '/admin/loadDomainDetails';
 | 
			
		||||
const ELEMS = [
 | 
			
		||||
    'free-email', 'tranco-rank', 'unavailable', 'disposable',
 | 
			
		||||
    'creation-date', 'expiration-date', 'total-account', 'fraud'];
 | 
			
		||||
 | 
			
		||||
export class DomainTiles extends BaseTiles {
 | 
			
		||||
    updateTiles(data) {
 | 
			
		||||
        document.getElementById('free-email').replaceChildren(renderBoolean(data.free_email_provider));
 | 
			
		||||
        document.getElementById('tranco-rank').replaceChildren(renderDefaultIfEmptyElement(data.tranco_rank));
 | 
			
		||||
        document.getElementById('unavailable').replaceChildren(renderBoolean(data.disabled));
 | 
			
		||||
        document.getElementById('disposable').replaceChildren(renderBoolean(data.disposable_domains));
 | 
			
		||||
 | 
			
		||||
        document.getElementById('creation-date').replaceChildren(renderDate(data.creation_date));
 | 
			
		||||
        document.getElementById('expiration-date').replaceChildren(renderDate(data.expiration_date));
 | 
			
		||||
        document.getElementById('total-account').replaceChildren(data.total_account);
 | 
			
		||||
        document.getElementById('fraud').replaceChildren(data.fraud);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get elems() {
 | 
			
		||||
        return ELEMS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get url() {
 | 
			
		||||
        return URL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
import {BaseTiles} from './BaseTiles.js?v=2';
 | 
			
		||||
import {Tooltip} from '../Tooltip.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderClickableCountryTruncated,
 | 
			
		||||
    renderClickableAsn,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
const URL   = '/admin/loadIpDetails';
 | 
			
		||||
const ELEMS = ['country', 'asn', 'blocklist', 'blacklist', 'dc', 'vpn', 'tor', 'ar'];
 | 
			
		||||
 | 
			
		||||
export class IpTiles extends BaseTiles {
 | 
			
		||||
    updateTiles(data) {
 | 
			
		||||
        const record = {
 | 
			
		||||
            full_country:   data.full_country,
 | 
			
		||||
            country_id:     data.country_id,
 | 
			
		||||
            country_iso:    data.country_iso,
 | 
			
		||||
            asn:            data.asn,
 | 
			
		||||
            ispid:          data.ispid,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        document.getElementById('country').replaceChildren(renderClickableCountryTruncated(record));
 | 
			
		||||
        document.getElementById('asn').replaceChildren(renderClickableAsn(record));
 | 
			
		||||
        document.getElementById('blocklist').replaceChildren(renderBoolean(data.blocklist));
 | 
			
		||||
        document.getElementById('blacklist').replaceChildren(renderBoolean(data.fraud_detected));
 | 
			
		||||
        document.getElementById('dc').replaceChildren(renderBoolean(data.data_center));
 | 
			
		||||
        document.getElementById('vpn').replaceChildren(renderBoolean(data.vpn));
 | 
			
		||||
        document.getElementById('tor').replaceChildren(renderBoolean(data.tor));
 | 
			
		||||
        document.getElementById('ar').replaceChildren(renderBoolean(data.relay));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initTooltips() {
 | 
			
		||||
        super.initTooltips();
 | 
			
		||||
        Tooltip.addTooltipToSpans();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get elems() {
 | 
			
		||||
        return ELEMS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get url() {
 | 
			
		||||
        return URL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
import {BaseTiles} from './BaseTiles.js?v=2';
 | 
			
		||||
import {renderAsn} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
const URL   = '/admin/loadIspDetails';
 | 
			
		||||
const ELEMS = ['asn', 'total-ips', 'total-visits', 'total-accounts', 'total-fraud'];
 | 
			
		||||
 | 
			
		||||
export class IspTiles extends BaseTiles {
 | 
			
		||||
    updateTiles(data) {
 | 
			
		||||
        document.getElementById('asn').replaceChildren(renderAsn(data));
 | 
			
		||||
        document.getElementById('total-accounts').replaceChildren(data.total_account);
 | 
			
		||||
        document.getElementById('total-visits').replaceChildren(data.total_visit);
 | 
			
		||||
        document.getElementById('total-fraud').replaceChildren(data.total_fraud);
 | 
			
		||||
        document.getElementById('total-ips').replaceChildren(data.total_ip);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get elems() {
 | 
			
		||||
        return ELEMS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get url() {
 | 
			
		||||
        return URL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,133 @@
 | 
			
		||||
import {BaseTiles} from './BaseTiles.js?v=2';
 | 
			
		||||
import {
 | 
			
		||||
    renderDate,
 | 
			
		||||
    renderBoolean,
 | 
			
		||||
    renderUserCounter,
 | 
			
		||||
    renderReputation,
 | 
			
		||||
    renderUserId,
 | 
			
		||||
    renderUserFirstname,
 | 
			
		||||
    renderUserLastname,
 | 
			
		||||
    renderUserReviewedStatus,
 | 
			
		||||
} from '../DataRenderers.js?v=2';
 | 
			
		||||
 | 
			
		||||
const URL   = '/admin/loadUserDetails';
 | 
			
		||||
 | 
			
		||||
export class UserTiles extends BaseTiles {
 | 
			
		||||
    updateTiles(data) {
 | 
			
		||||
        this.updateIdDetails(data);
 | 
			
		||||
        this.updateIpDetails(data);
 | 
			
		||||
        this.updateDayDetails(data);
 | 
			
		||||
        this.updateWeekDetails(data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateIdDetails(data) {
 | 
			
		||||
        const tile = document.querySelector('#user-id-tile');
 | 
			
		||||
 | 
			
		||||
        if (!tile) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const record = data.userDetails;
 | 
			
		||||
        this.removeLoaderBackground(tile);
 | 
			
		||||
 | 
			
		||||
        tile.querySelector('#signup-date').replaceChildren(renderDate(record.created));
 | 
			
		||||
        tile.querySelector('#lastseen').replaceChildren(renderDate(record.lastseen));
 | 
			
		||||
        tile.querySelector('#latest-decision').replaceChildren(renderDate(record.latest_decision));
 | 
			
		||||
        tile.querySelector('#review-status').replaceChildren(renderUserReviewedStatus(record));
 | 
			
		||||
        tile.querySelector('#firstname').replaceChildren(renderUserFirstname(record));
 | 
			
		||||
        tile.querySelector('#lastname').replaceChildren(renderUserLastname(record));
 | 
			
		||||
        tile.querySelector('#userid').replaceChildren(renderUserId(record.userid));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateIpDetails(data) {
 | 
			
		||||
        const tile = document.querySelector('#user-ip-tile');
 | 
			
		||||
 | 
			
		||||
        if (!tile) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const record = data.ipDetails;
 | 
			
		||||
        this.removeLoaderBackground(tile);
 | 
			
		||||
 | 
			
		||||
        tile.querySelector('#datacenter').replaceChildren(renderBoolean(record.withdc));
 | 
			
		||||
        tile.querySelector('#vpn').replaceChildren(renderBoolean(record.withvpn));
 | 
			
		||||
        tile.querySelector('#tor').replaceChildren(renderBoolean(record.withtor));
 | 
			
		||||
        tile.querySelector('#apple-relay').replaceChildren(renderBoolean(record.withar));
 | 
			
		||||
        tile.querySelector('#ip-shared').replaceChildren(renderBoolean(record.sharedips));
 | 
			
		||||
        tile.querySelector('#spam-list').replaceChildren(renderBoolean(record.spamlist));
 | 
			
		||||
        tile.querySelector('#blacklisted').replaceChildren(renderBoolean(record.fraud_detected));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateDayDetails(data) {
 | 
			
		||||
        const limits = {
 | 
			
		||||
            median_event_cnt:   20,
 | 
			
		||||
            login_cnt:          3,
 | 
			
		||||
            session_cnt:        5,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.updateDateRangeDetails(data.dayDetails, '#day-behaviour-tile', limits);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateWeekDetails(data) {
 | 
			
		||||
        const limits = {
 | 
			
		||||
            median_event_cnt:   20,
 | 
			
		||||
            login_cnt:          10,
 | 
			
		||||
            session_cnt:        25,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.updateDateRangeDetails(data.weekDetails, '#week-behaviour-tile', limits);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateDateRangeDetails(record, tileId, limits) {
 | 
			
		||||
        const tile = document.querySelector(tileId);
 | 
			
		||||
 | 
			
		||||
        if (!tile) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const span = document.createElement('span');
 | 
			
		||||
        span.className = 'nolight';
 | 
			
		||||
        span.textContent = 'N/A';
 | 
			
		||||
 | 
			
		||||
        this.removeLoaderBackground(tile);
 | 
			
		||||
 | 
			
		||||
        if (record.session_cnt === 0) {
 | 
			
		||||
            tile.querySelector('#failed-login-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
            tile.querySelector('#password-reset-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
            tile.querySelector('#auth-error-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
            tile.querySelector('#off-hours-login-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
            tile.querySelector('#median-event-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
            tile.querySelector('#login-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
            tile.querySelector('#session-count').replaceChildren(span.cloneNode(true));
 | 
			
		||||
        } else {
 | 
			
		||||
            const map = [
 | 
			
		||||
                ['#failed-login-count',     'failed_login_cnt'],
 | 
			
		||||
                ['#password-reset-count',   'password_reset_cnt'],
 | 
			
		||||
                ['#auth-error-count',       'auth_error_cnt'],
 | 
			
		||||
                ['#off-hours-login-count',  'off_hours_login_cnt'],
 | 
			
		||||
                ['#median-event-count',     'median_event_cnt'],
 | 
			
		||||
                ['#login-count',            'login_cnt'],
 | 
			
		||||
                ['#session-count',          'session_cnt'],
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
            for (const [id, el] of map) {
 | 
			
		||||
                tile.querySelector(id).replaceChildren(renderUserCounter(record[el], limits[el] || 1));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    removeLoaderBackground(tile) {
 | 
			
		||||
        const backgrounds = tile.querySelectorAll('.loading-background');
 | 
			
		||||
        for (let i = 0; i < backgrounds.length; i++) {
 | 
			
		||||
            backgrounds[i].classList.remove('loading-background');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get elems() {
 | 
			
		||||
        return [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get url() {
 | 
			
		||||
        return URL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user