mirror of https://github.com/go-gitea/gitea.git
feat(ui): add repository permissions settings page
Three permission modes with individual toggles. UI could use some polish but functional. Signed-off-by: SBALAVIGNESH123 <balavignesh449@gmail.com>pull/36113/head
parent
242053648a
commit
03b3af4579
@ -0,0 +1,242 @@
|
||||
{{template "base/head" .}}
|
||||
<div class="page-content repository settings options">
|
||||
{{template "repo/header" .}}
|
||||
<div class="ui container">
|
||||
<div class="ui grid">
|
||||
{{template "repo/settings/navbar" .}}
|
||||
<div class="twelve wide column content">
|
||||
{{template "base/alert" .}}
|
||||
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "repo.settings.actions.permissions.title"}}
|
||||
</h4>
|
||||
|
||||
<div class="ui attached segment">
|
||||
<p class="help">
|
||||
{{.locale.Tr "repo.settings.actions.permissions.desc"}}
|
||||
<!-- TODO: Add link to documentation once it's written -->
|
||||
<!-- Need to explain this feature clearly for users -->
|
||||
</p>
|
||||
|
||||
<form class="ui form" method="post" action="{{.Link}}">
|
||||
{{.CsrfTokenHtml}}
|
||||
|
||||
<!-- Permission Mode Selector -->
|
||||
<div class="field">
|
||||
<label>{{.locale.Tr "repo.settings.actions.permissions.mode"}}</label>
|
||||
<div class="ui selection dropdown">
|
||||
<input type="hidden" name="permission_mode" value="{{.PermissionMode}}">
|
||||
<i class="dropdown icon"></i>
|
||||
<div class="default text">Select permission mode</div>
|
||||
<div class="menu">
|
||||
<!-- Restricted mode - recommended for most users -->
|
||||
<div class="item" data-value="0" data-text="Restricted (Recommended)">
|
||||
<div class="header">🔒 Restricted (Recommended)</div>
|
||||
<div class="description">
|
||||
Minimal permissions. Actions can only read code. Secure default.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Permissive mode - for trusted repos -->
|
||||
<div class="item" data-value="1" data-text="Permissive">
|
||||
<div class="header">🔓 Permissive</div>
|
||||
<div class="description">
|
||||
Broad permissions. Actions can read/write most resources. For trusted environments only.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Custom mode - for advanced users -->
|
||||
<div class="item" data-value="2" data-text="Custom">
|
||||
<div class="header">⚙️ Custom</div>
|
||||
<div class="description">
|
||||
Fine-grained control. Configure each permission individually.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Custom permissions - only shown when mode is Custom -->
|
||||
<!-- Note: We could use Vue.js here for reactivity, but keeping it simple with vanilla JS -->
|
||||
<!-- If this gets more complex, consider refactoring to use Vue component -->
|
||||
<div id="custom-permissions" class="{{if ne .PermissionMode 2}}hide{{end}}">
|
||||
<div class="ui divider"></div>
|
||||
<h5>Individual Permissions</h5>
|
||||
|
||||
{{/* Actions Permission */}}
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="actions_read" id="actions_read" {{if .ActionsRead}}checked{{end}}>
|
||||
<label for="actions_read">
|
||||
<strong>Actions (Read)</strong> - View workflow runs and logs
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="actions_write" id="actions_write" {{if .ActionsWrite}}checked{{end}}>
|
||||
<label for="actions_write">
|
||||
<strong>Actions (Write)</strong> - Cancel or re-run workflows
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/* Contents Permission */}}
|
||||
<div class="ui divider"></div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="contents_read" id="contents_read" {{if .ContentsRead}}checked{{end}}>
|
||||
<label for="contents_read">
|
||||
<strong>Contents (Read)</strong> - Clone and read repository code
|
||||
<span class="text grey">(Recommended: Keep enabled)</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="contents_write" id="contents_write" {{if .ContentsWrite}}checked{{end}}>
|
||||
<label for="contents_write">
|
||||
<strong>Contents (Write)</strong> - Push commits and create branches
|
||||
<span class="text red">(Warning: High risk for fork PRs)</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/* Packages Permission */}}
|
||||
<div class="ui divider"></div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="packages_read" id="packages_read" {{if .PackagesRead}}checked{{end}}>
|
||||
<label for="packages_read">
|
||||
<strong>Packages (Read)</strong> - Pull packages from registry
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="packages_write" id="packages_write" {{if .PackagesWrite}}checked{{end}}>
|
||||
<label for="packages_write">
|
||||
<strong>Packages (Write)</strong> - Publish and update packages
|
||||
<!-- Note: Requires package-repository linking (see org settings) -->
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/* Issues Permission */}}
|
||||
<div class="ui divider"></div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="issues_read" id="issues_read" {{if .IssuesRead}}checked{{end}}>
|
||||
<label for="issues_read">
|
||||
<strong>Issues (Read)</strong> - View issues
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="issues_write" id="issues_write" {{if .IssuesWrite}}checked{{end}}>
|
||||
<label for="issues_write">
|
||||
<strong>Issues (Write)</strong> - Create, comment, and close issues
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/* Pull Requests Permission */}}
|
||||
<div class="ui divider"></div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="pull_requests_read" id="pull_requests_read" {{if .PullRequestsRead}}checked{{end}}>
|
||||
<label for="pull_requests_read">
|
||||
<strong>Pull Requests (Read)</strong> - View pull requests
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" name="pull_requests_write" id="pull_requests_write" {{if .PullRequestsWrite}}checked{{end}}>
|
||||
<label for="pull_requests_write">
|
||||
<strong>Pull Requests (Write)</strong> - Create and merge pull requests
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Warning Message for fork PRs -->
|
||||
<!-- This is important - users need to understand that fork PRs are always restricted -->
|
||||
<div class="ui warning message">
|
||||
<div class="header">
|
||||
<i class="shield icon"></i>
|
||||
Security Notice: Fork Pull Requests
|
||||
</div>
|
||||
<p>
|
||||
For security reasons, workflows triggered by pull requests from forked repositories
|
||||
are <strong>always restricted</strong> to read-only access, regardless of the settings above.
|
||||
This prevents malicious forks from accessing secrets or modifying your repository.
|
||||
</p>
|
||||
<!-- Reference the security discussion that led to this decision -->
|
||||
<!-- https://github.com/go-gitea/gitea/pull/24554#issuecomment-1537040811 -->
|
||||
</div>
|
||||
|
||||
<!-- Organization Cap Notice (if applicable) -->
|
||||
{{if .OrgID}}
|
||||
{{if .OrgHasRestrictions}}
|
||||
<div class="ui info message">
|
||||
<div class="header">
|
||||
<i class="building icon"></i>
|
||||
Organization Restrictions Apply
|
||||
</div>
|
||||
<p>
|
||||
This repository belongs to an organization with permission restrictions.
|
||||
The settings above cannot exceed the organization's maximum permissions.
|
||||
Contact your organization admin to grant additional permissions.
|
||||
</p>
|
||||
</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
<!-- Submit Buttons -->
|
||||
<div class="field">
|
||||
<button class="ui green button" type="submit">
|
||||
{{.locale.Tr "repo.settings.actions.permissions.save"}}
|
||||
</button>
|
||||
<a class="ui button" href="{{.Link}}">
|
||||
{{.locale.Tr "repo.settings.cancel"}}
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- JavaScript for UI interactions -->
|
||||
<script>
|
||||
// Show/hide custom permissions based on mode selection
|
||||
// TODO: Could move this to a separate JS file if it gets more complex
|
||||
$(document).ready(function() {
|
||||
// Drop down initialization
|
||||
$('.ui.dropdown').dropdown({
|
||||
onChange: function(value) {
|
||||
// Show custom options only when Custom mode is selected
|
||||
if (value === '2') {
|
||||
$('#custom-permissions').removeClass('hide');
|
||||
} else {
|
||||
$('#custom-permissions').addClass('hide');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Warning when enabling write permissions
|
||||
// Helps prevent accidental security issues
|
||||
$('#contents_write, #packages_write').change(function() {
|
||||
if ($(this).is(':checked')) {
|
||||
// Maybe add a confirmation dialog here?
|
||||
// For now, just the inline warning text is probably enough
|
||||
console.log('Write permission enabled - ensure this is intentional');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{{template "base/footer" .}}
|
||||
Loading…
Reference in New Issue