Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | /**
* Filtrage des containers Docker par les targets d'un groupe.
*
* Utilise par docker.js, logs.js, backups.js pour restreindre
* la visibilite des containers aux membres d'un groupe.
*
* @module helpers/dockerTargets
*/
const { pool: db } = require('../db');
/**
* Charge les docker targets d'un groupe pour un serveur.
* @param {string} groupId
* @param {string} serverId
* @returns {Promise<Array<{target_type: string, match_method: string, selector: string}>>}
*/
async function loadGroupTargets(groupId, serverId) {
const { rows } = await db.query(
'SELECT target_type, match_method, selector FROM access_group_docker_targets WHERE group_id = $1 AND server_id = $2',
[groupId, serverId],
);
return rows;
}
/**
* Verifie si un nom de container/service matche les targets du groupe.
* @param {string} containerName — Nom du container (ex: "coolcare_backend.1.abc123")
* @param {Array} targets — Targets charges via loadGroupTargets
* @param {Object} [labels] — Labels Docker du container (optionnel)
* @returns {boolean}
*/
function matchesTargets(containerName, targets, labels = {}) {
const serviceName = containerName.split('.')[0];
return targets.some((t) => {
if (t.match_method === 'name') {
return containerName === t.selector || serviceName === t.selector;
}
if (t.match_method === 'label') {
const [key, value] = t.selector.split('=');
return labels[key] === value;
}
return false;
});
}
/**
* Filtre une liste de containers par les targets Docker du groupe.
* En mode global (access null), retourne tout.
* Si aucun target configure, retourne une liste vide.
*
* @param {Array} containers — Objets avec au minimum { name } ou { Names }
* @param {object|null} access — req.access (contexte groupe)
* @param {string} serverId — ID du serveur
* @returns {Promise<Array>}
*/
async function filterByGroupTargets(containers, access, serverId) {
if (!access) return containers;
const targets = await loadGroupTargets(access.groupId, serverId);
if (targets.length === 0) return [];
return containers.filter((c) => {
const name = c.name || c.Names || '';
return matchesTargets(name, targets, c.labels || {});
});
}
/**
* Filtre une liste de noms de containers (strings) par les targets du groupe.
* Utile pour les scans (logs, backups) qui retournent des noms simples.
*
* @param {string[]} names — Liste de noms de containers
* @param {object|null} access — req.access
* @param {string} serverId
* @returns {Promise<string[]>}
*/
async function filterNamesByGroupTargets(names, access, serverId) {
if (!access) return names;
const targets = await loadGroupTargets(access.groupId, serverId);
if (targets.length === 0) return [];
return names.filter((name) => matchesTargets(name, targets));
}
module.exports = { filterByGroupTargets, filterNamesByGroupTargets, matchesTargets, loadGroupTargets };
|