@@ -47885,6 +47885,7 @@ const WorkflowsChecks_1 = __nccwpck_require__(8336);
4788547885const RunnersChecks_1 = __nccwpck_require__(9863);
4788647886const WebHooksChecks_1 = __nccwpck_require__(1149);
4788747887const AdminsChecks_1 = __nccwpck_require__(2818);
47888+ const TagProtectionChecks_1 = __nccwpck_require__(3739);
4788847889const outputFormatter_1 = __nccwpck_require__(6871);
4788947890// This class is the main Repository evaluator. It evaluates the policy for a given repository.
4789047891class RepoPolicyEvaluator {
@@ -47964,6 +47965,12 @@ class RepoPolicyEvaluator {
4796447965 logger_1.logger.debug(`Admins checks results: ${JSON.stringify(admins_checks)}`);
4796547966 this.repositoryCheckResults.push(admins_checks);
4796647967 }
47968+ if (this.policy.protected_tags && this.policy.protected_tags.length > 0) {
47969+ const tag_protection = new TagProtectionChecks_1.TagProtectionChecks(this.policy, this.repository);
47970+ const tag_protection_results = await tag_protection.checkTagProtection();
47971+ logger_1.logger.debug(`Tag protection rule results: ${JSON.stringify(tag_protection_results, null, 2)}`);
47972+ this.repositoryCheckResults.push(tag_protection_results);
47973+ }
4796747974 }
4796847975 // Run webhook checks
4796947976 printCheckResults() {
@@ -49215,6 +49222,88 @@ class RunnersChecks {
4921549222exports.RunnersChecks = RunnersChecks;
4921649223
4921749224
49225+ /***/ }),
49226+
49227+ /***/ 3739:
49228+ /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
49229+
49230+ "use strict";
49231+
49232+ Object.defineProperty(exports, "__esModule", ({ value: true }));
49233+ exports.TagProtectionChecks = void 0;
49234+ const Repositories_1 = __nccwpck_require__(3354);
49235+ class TagProtectionChecks {
49236+ policy;
49237+ repository;
49238+ constructor(policy, repository) {
49239+ this.policy = policy;
49240+ this.repository = repository;
49241+ }
49242+ async checkTagProtection() {
49243+ const rulesets = await (0, Repositories_1.getRepoRulesets)(this.repository.owner, this.repository.name);
49244+ // Filter to get only tag rulesets that are active
49245+ const tagRulesets = rulesets.filter((ruleset) => ruleset.target === "tag" && ruleset.enforcement === "active");
49246+ const policyTags = this.policy.protected_tags || [];
49247+ const protectedTagPatterns = tagRulesets
49248+ .map((ruleset) => {
49249+ // Extract tag patterns from conditions
49250+ if (ruleset.conditions?.ref_name?.include) {
49251+ return ruleset.conditions.ref_name.include;
49252+ }
49253+ return [];
49254+ })
49255+ .flat();
49256+ // Check which policy tags are protected
49257+ const passedTags = [];
49258+ const failedTags = [];
49259+ for (const policyTag of policyTags) {
49260+ const isProtected = this.isTagProtected(policyTag.name, protectedTagPatterns);
49261+ if (isProtected) {
49262+ passedTags.push(policyTag.name);
49263+ }
49264+ else {
49265+ failedTags.push(policyTag.name);
49266+ }
49267+ }
49268+ return this.createResult(passedTags, failedTags, protectedTagPatterns);
49269+ }
49270+ isTagProtected(tagName, protectedPatterns) {
49271+ // Check if tag name matches any protected pattern
49272+ for (const pattern of protectedPatterns) {
49273+ if (pattern === "~ALL") {
49274+ return true;
49275+ }
49276+ // Convert GitHub pattern to regex
49277+ const regexPattern = pattern
49278+ .replace(/\*/g, ".*")
49279+ .replace(/\?/g, ".")
49280+ .replace(/\[/g, "\\[")
49281+ .replace(/\]/g, "\\]");
49282+ const regex = new RegExp(`^${regexPattern}$`);
49283+ if (regex.test(tagName)) {
49284+ return true;
49285+ }
49286+ }
49287+ return false;
49288+ }
49289+ createResult(passed, failed, protectedPatterns) {
49290+ const name = "Tag Protection";
49291+ const pass = failed.length === 0;
49292+ const data = {
49293+ passed,
49294+ failed: {
49295+ not_protected: failed,
49296+ },
49297+ info: {
49298+ protected_patterns: protectedPatterns,
49299+ },
49300+ };
49301+ return { name, pass, data };
49302+ }
49303+ }
49304+ exports.TagProtectionChecks = TagProtectionChecks;
49305+
49306+
4921849307/***/ }),
4921949308
4922049309/***/ 1149:
@@ -49656,7 +49745,7 @@ exports.getCustomRolesForOrg = getCustomRolesForOrg;
4965649745"use strict";
4965749746
4965849747Object.defineProperty(exports, "__esModule", ({ value: true }));
49659- exports.getRepositoryCodeScanningAnalysis = exports.getRepoDependabotSecurityUpdates = exports.getRepoDependabotAlerts = exports.getRepoFile = exports.getRepoBranchProtection = exports.getRepoProtectedBranches = exports.getRepoBranch = exports.getRepoCollaborators = exports.getRepoPullRequests = exports.getRepository = exports.getRepositoriesForTeamAsAdmin = void 0;
49748+ exports.getRepoRulesets = exports. getRepositoryCodeScanningAnalysis = exports.getRepoDependabotSecurityUpdates = exports.getRepoDependabotAlerts = exports.getRepoFile = exports.getRepoBranchProtection = exports.getRepoProtectedBranches = exports.getRepoBranch = exports.getRepoCollaborators = exports.getRepoPullRequests = exports.getRepository = exports.getRepositoriesForTeamAsAdmin = void 0;
4966049749const GitArmorKit_1 = __nccwpck_require__(2009);
4966149750const logger_1 = __nccwpck_require__(8836);
4966249751const getRepositoriesForTeamAsAdmin = async (org, teamSlug) => {
@@ -49807,6 +49896,27 @@ const getRepositoryCodeScanningAnalysis = async (owner, repo) => {
4980749896 }
4980849897};
4980949898exports.getRepositoryCodeScanningAnalysis = getRepositoryCodeScanningAnalysis;
49899+ // get repository rulesets for tag protection
49900+ const getRepoRulesets = async (owner, repo) => {
49901+ const octokit = new GitArmorKit_1.GitArmorKit();
49902+ try {
49903+ const response = await octokit.rest.repos.getRepoRulesets({
49904+ owner: owner,
49905+ repo: repo,
49906+ });
49907+ return response.data;
49908+ }
49909+ catch (error) {
49910+ logger_1.logger.debug(`Repository rulesets fetching error: ${error.message}`);
49911+ if (error.status === 404) {
49912+ return [];
49913+ }
49914+ else {
49915+ throw error;
49916+ }
49917+ }
49918+ };
49919+ exports.getRepoRulesets = getRepoRulesets;
4981049920
4981149921
4981249922/***/ }),
0 commit comments