Skip to content

Commit 06e55f4

Browse files
authored
Merge branch 'main' into revert-alpine314
2 parents 407fcea + fdb0e82 commit 06e55f4

File tree

16 files changed

+81
-50
lines changed

16 files changed

+81
-50
lines changed

README.md

-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
<a href="https://discord.gg/Gitea" title="Join the Discord chat at https://discord.gg/Gitea">
1313
<img src="https://img.shields.io/discord/322538954119184384.svg">
1414
</a>
15-
<a href="https://microbadger.com/images/gitea/gitea" title="Get your own image badge on microbadger.com">
16-
<img src="https://images.microbadger.com/badges/image/gitea/gitea.svg">
17-
</a>
1815
<a href="https://codecov.io/gh/go-gitea/gitea" title="Codecov">
1916
<img src="https://codecov.io/gh/go-gitea/gitea/branch/main/graph/badge.svg">
2017
</a>

README_ZH.md

-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
<a href="https://discord.gg/Gitea" title="Join the Discord chat at https://discord.gg/Gitea">
1313
<img src="https://img.shields.io/discord/322538954119184384.svg">
1414
</a>
15-
<a href="https://microbadger.com/images/gitea/gitea" title="Get your own image badge on microbadger.com">
16-
<img src="https://images.microbadger.com/badges/image/gitea/gitea.svg">
17-
</a>
1815
<a href="https://codecov.io/gh/go-gitea/gitea" title="Codecov">
1916
<img src="https://codecov.io/gh/go-gitea/gitea/branch/main/graph/badge.svg">
2017
</a>

custom/conf/app.example.ini

+3
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,9 @@ PATH =
652652
;; Default value for AllowCreateOrganization
653653
;; Every new user will have rights set to create organizations depending on this setting
654654
;DEFAULT_ALLOW_CREATE_ORGANIZATION = true
655+
;; Default value for IsRestricted
656+
;; Every new user will have restricted permissions depending on this setting
657+
;DEFAULT_USER_IS_RESTRICTED = false
655658
;;
656659
;; Either "public", "limited" or "private", default is "public"
657660
;; Limited is for users visible only to signed users

docs/content/doc/advanced/adding-legal-pages.en-us.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ You absolutely must not place a general ToS or privacy statement that implies th
3232
Create or append to `/path/to/custom/templates/custom/extra_links_footer.tmpl`:
3333

3434
```go
35-
<a class="item" href="{{AppSubUrl}}/privacy.html">Privacy Policy</a>
35+
<a class="item" href="{{AppSubUrl}}/assets/privacy.html">Privacy Policy</a>
3636
```
3737

3838
Restart Gitea to see the changes.

docs/content/doc/advanced/config-cheat-sheet.en-us.md

+1
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ relation to port exhaustion.
502502
- `HCAPTCHA_SITEKEY`: **""**: Sign up at https://www.hcaptcha.com/ to get a sitekey for hcaptcha.
503503
- `DEFAULT_KEEP_EMAIL_PRIVATE`: **false**: By default set users to keep their email address private.
504504
- `DEFAULT_ALLOW_CREATE_ORGANIZATION`: **true**: Allow new users to create organizations by default.
505+
- `DEFAULT_USER_IS_RESTRICTED`: **false**: Give new users restricted permissions by default
505506
- `DEFAULT_ENABLE_DEPENDENCIES`: **true**: Enable this to have dependencies enabled by default.
506507
- `ALLOW_CROSS_REPOSITORY_DEPENDENCIES` : **true** Enable this to allow dependencies on issues from any repository where the user is granted access.
507508
- `ENABLE_USER_HEATMAP`: **true**: Enable this to display the heatmap on users profiles.

docs/content/doc/advanced/customizing-gitea.en-us.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ For instance, let's say you are in Germany and must add the famously legally-req
102102
just place it under your "$GITEA_CUSTOM/public/" directory (for instance `$GITEA_CUSTOM/public/impressum.html`) and put a link to it in either `$GITEA_CUSTOM/templates/custom/extra_links.tmpl` or `$GITEA_CUSTOM/templates/custom/extra_links_footer.tmpl`.
103103

104104
To match the current style, the link should have the class name "item", and you can use `{{AppSubUrl}}` to get the base URL:
105-
`<a class="item" href="{{AppSubUrl}}/impressum.html">Impressum</a>`
105+
`<a class="item" href="{{AppSubUrl}}/assets/impressum.html">Impressum</a>`
106106

107107
For more information, see [Adding Legal Pages](https://docs.gitea.io/en-us/adding-legal-pages).
108108

@@ -174,21 +174,21 @@ You can display STL file directly in Gitea by adding:
174174
175175
if ($('.view-raw>a[href$=".stl" i]').length) {
176176
$("body").append(
177-
'<link href="/Madeleine.js/src/css/Madeleine.css" rel="stylesheet">'
177+
'<link href="/assets/Madeleine.js/src/css/Madeleine.css" rel="stylesheet">'
178178
);
179179
Promise.all([
180-
lS("/Madeleine.js/src/lib/stats.js"),
181-
lS("/Madeleine.js/src/lib/detector.js"),
182-
lS("/Madeleine.js/src/lib/three.min.js"),
183-
lS("/Madeleine.js/src/Madeleine.js"),
180+
lS("/assets/Madeleine.js/src/lib/stats.js"),
181+
lS("/assets/Madeleine.js/src/lib/detector.js"),
182+
lS("/assets/Madeleine.js/src/lib/three.min.js"),
183+
lS("/assets/Madeleine.js/src/Madeleine.js"),
184184
]).then(function () {
185185
$(".view-raw")
186186
.attr("id", "view-raw")
187187
.attr("style", "padding: 0;margin-bottom: -10px;");
188188
new Madeleine({
189189
target: "view-raw",
190190
data: $('.view-raw>a[href$=".stl" i]').attr("href"),
191-
path: "/Madeleine.js/src",
191+
path: "/assets/Madeleine.js/src",
192192
});
193193
$('.view-raw>a[href$=".stl"]').remove();
194194
});

docs/content/doc/advanced/customizing-gitea.zh-cn.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ Gitea 引用 `custom` 目录中的自定义配置文件来覆盖配置、模板
6161
"custom/public/"目录下(比如 `custom/public/impressum.html`)并且将它与 `custom/templates/custom/extra_links.tmpl` 链接起来即可。
6262

6363
这个链接应当使用一个名为“item”的 class 来匹配当前样式,您可以使用 `{{AppSubUrl}}` 来获取 base URL:
64-
`<a class="item" href="{{AppSubUrl}}/impressum.html">Impressum</a>`
64+
`<a class="item" href="{{AppSubUrl}}/assets/impressum.html">Impressum</a>`
6565

6666
同理,您可以将页签添加到 `extra_tabs.tmpl` 中,使用同样的方式来添加页签。它的具体样式需要与
6767
`templates/repo/header.tmpl` 中已有的其他选项卡的样式匹配

docs/content/doc/advanced/external-renderers.en-us.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,5 +164,5 @@ And so you could write some CSS:
164164

165165
Add your stylesheet to your custom directory e.g `custom/public/css/my-style-XXXXX.css` and import it using a custom header file `custom/templates/custom/header.tmpl`:
166166
```html
167-
<link type="text/css" href="{{AppSubUrl}}/css/my-style-XXXXX.css" />
167+
<link type="text/css" href="{{AppSubUrl}}/assets/css/my-style-XXXXX.css" />
168168
```

integrations/signup_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"strings"
1111
"testing"
1212

13+
"code.gitea.io/gitea/models"
1314
"code.gitea.io/gitea/modules/setting"
1415
"github.com/stretchr/testify/assert"
1516
"github.com/unknwon/i18n"
@@ -33,6 +34,28 @@ func TestSignup(t *testing.T) {
3334
MakeRequest(t, req, http.StatusOK)
3435
}
3536

37+
func TestSignupAsRestricted(t *testing.T) {
38+
defer prepareTestEnv(t)()
39+
40+
setting.Service.EnableCaptcha = false
41+
setting.Service.DefaultUserIsRestricted = true
42+
43+
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
44+
"user_name": "restrictedUser",
45+
"email": "[email protected]",
46+
"password": "examplePassword!1",
47+
"retype": "examplePassword!1",
48+
})
49+
MakeRequest(t, req, http.StatusFound)
50+
51+
// should be able to view new user's page
52+
req = NewRequest(t, "GET", "/restrictedUser")
53+
MakeRequest(t, req, http.StatusOK)
54+
55+
user2 := models.AssertExistsAndLoadBean(t, &models.User{Name: "restrictedUser"}).(*models.User)
56+
assert.True(t, user2.IsRestricted)
57+
}
58+
3659
func TestSignupEmail(t *testing.T) {
3760
defer prepareTestEnv(t)()
3861

models/login_source.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ var (
7474
// possible that a Blob may gain an unwanted prefix of 0xff 0xfe.
7575
func jsonUnmarshalIgnoreErroneousBOM(bs []byte, v interface{}) error {
7676
json := jsoniter.ConfigCompatibleWithStandardLibrary
77-
err := json.Unmarshal(bs, &v)
77+
err := json.Unmarshal(bs, v)
7878
if err != nil && len(bs) > 2 && bs[0] == 0xff && bs[1] == 0xfe {
79-
err = json.Unmarshal(bs[2:], &v)
79+
err = json.Unmarshal(bs[2:], v)
8080
}
8181
return err
8282
}

modules/markup/html.go

+9-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"path/filepath"
1414
"regexp"
1515
"strings"
16+
"sync"
1617

1718
"code.gitea.io/gitea/modules/base"
1819
"code.gitea.io/gitea/modules/emoji"
@@ -71,9 +72,6 @@ var (
7172
// CSS class for action keywords (e.g. "closes: #1")
7273
const keywordClass = "issue-keyword"
7374

74-
// regexp for full links to issues/pulls
75-
var issueFullPattern *regexp.Regexp
76-
7775
// IsLink reports whether link fits valid format.
7876
func IsLink(link []byte) bool {
7977
return isLink(link)
@@ -88,12 +86,17 @@ func isLinkStr(link string) bool {
8886
return validLinksPattern.MatchString(link)
8987
}
9088

91-
// FIXME: This function is not concurrent safe
89+
// regexp for full links to issues/pulls
90+
var issueFullPattern *regexp.Regexp
91+
92+
// Once for to prevent races
93+
var issueFullPatternOnce sync.Once
94+
9295
func getIssueFullPattern() *regexp.Regexp {
93-
if issueFullPattern == nil {
96+
issueFullPatternOnce.Do(func() {
9497
issueFullPattern = regexp.MustCompile(regexp.QuoteMeta(setting.AppURL) +
9598
`\w+/\w+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`)
96-
}
99+
})
97100
return issueFullPattern
98101
}
99102

modules/markup/renderer.go

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919

2020
// Init initialize regexps for markdown parsing
2121
func Init() {
22-
getIssueFullPattern()
2322
NewSanitizer()
2423
if len(setting.Markdown.CustomURLSchemes) > 0 {
2524
CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes)

modules/setting/service.go

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ var Service = struct {
4949
HcaptchaSitekey string
5050
DefaultKeepEmailPrivate bool
5151
DefaultAllowCreateOrganization bool
52+
DefaultUserIsRestricted bool
5253
EnableTimetracking bool
5354
DefaultEnableTimetracking bool
5455
DefaultEnableDependencies bool
@@ -134,6 +135,7 @@ func newService() {
134135
Service.HcaptchaSitekey = sec.Key("HCAPTCHA_SITEKEY").MustString("")
135136
Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool()
136137
Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true)
138+
Service.DefaultUserIsRestricted = sec.Key("DEFAULT_USER_IS_RESTRICTED").MustBool(false)
137139
Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true)
138140
if Service.EnableTimetracking {
139141
Service.DefaultEnableTimetracking = sec.Key("DEFAULT_ENABLE_TIMETRACKING").MustBool(true)

options/locale/locale_pt-PT.ini

+17-17
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ issue_assigned.issue=@%[1]s atribuiu-lhe a questão %[2]s no repositório %[3]s.
350350

351351
issue.x_mentioned_you=<b>@%s</b> mencionou a si:
352352
issue.action.force_push=<b>%[1]s</b> forçou o envio de <b>%[2]s</b> de %[3]s para %[4]s.
353-
issue.action.push_1=<b>@%[1]s</b> enviou %[3]d cometimento(s) para o ramo %[2]s
353+
issue.action.push_1=<b>@%[1]s</b> enviou %[3]d cometimento para o ramo %[2]s
354354
issue.action.push_n=<b>@%[1]s</b> enviou %[3]d cometimentos para o ramo %[2]s
355355
issue.action.close=<b>@%[1]s</b> fechou #%[2]d.
356356
issue.action.reopen=<b>@%[1]s</b> reabriu #%[2]d.
@@ -1264,16 +1264,16 @@ issues.unlock=Desbloquear diálogo
12641264
issues.lock.unknown_reason=Não é possível bloquear uma questão com um motivo desconhecido.
12651265
issues.lock_duplicate=Uma questão não pode ser bloqueada duas vezes.
12661266
issues.unlock_error=Não é possível desbloquear uma questão que não está bloqueada.
1267-
issues.lock_with_reason=bloqueada como <strong>%s</strong> e o diálogo está limitado aos colaboradores %s
1268-
issues.lock_no_reason=bloqueada e o diálogo está limitado aos colaboradores %s
1269-
issues.unlock_comment=bloqueou este diálogo %s
1267+
issues.lock_with_reason=bloqueou como sendo <strong>%s</strong> e restringiu o diálogo aos colaboradores %s
1268+
issues.lock_no_reason=bloqueou e restringiu o diálogo aos colaboradores %s
1269+
issues.unlock_comment=desbloqueou este diálogo %s
12701270
issues.lock_confirm=Bloquear
12711271
issues.unlock_confirm=Desbloquear
1272-
issues.lock.notice_1=- Outros utilizadores não podem adicionar novos comentários a esta questão.
1273-
issues.lock.notice_2=- Você e outros colaboradores com acesso a este repositório ainda podem deixar comentários que outros possam ver.
1274-
issues.lock.notice_3=- Pode sempre voltar a desbloquear esta questão no futuro.
1272+
issues.lock.notice_1=- Os outros utilizadores deixarão de poder adicionar novos comentários a esta questão.
1273+
issues.lock.notice_2=- Você e outros colaboradores com acesso a este repositório ainda poderão deixar comentários que outros possam ver.
1274+
issues.lock.notice_3=- Poderá sempre voltar a desbloquear esta questão no futuro.
12751275
issues.unlock.notice_1=- Todos poderão voltar a comentar nesta questão.
1276-
issues.unlock.notice_2=- Pode sempre voltar a bloquear esta questão no futuro.
1276+
issues.unlock.notice_2=- Poderá sempre voltar a bloquear esta questão no futuro.
12771277
issues.lock.reason=Motivo do bloqueio
12781278
issues.lock.title=Bloquear diálogo sobre esta questão.
12791279
issues.unlock.title=Desbloquear diálogo sobre esta questão.
@@ -1363,11 +1363,11 @@ issues.review.reviewers=Revisores
13631363
issues.review.outdated=Obsoleta
13641364
issues.review.show_outdated=Mostrar as obsoletas
13651365
issues.review.hide_outdated=Esconder as obsoletas
1366-
issues.review.show_resolved=Mostrar resolvidos
1367-
issues.review.hide_resolved=Ocultar resolvidos
1366+
issues.review.show_resolved=Mostrar os concluídos
1367+
issues.review.hide_resolved=Ocultar os concluídos
13681368
issues.review.resolve_conversation=Passar diálogo ao estado de resolvido
13691369
issues.review.un_resolve_conversation=Passar diálogo ao estado de não resolvido
1370-
issues.review.resolved_by=marcou este diálogo como estando resolvido
1370+
issues.review.resolved_by=marcou este diálogo como estando concluído
13711371
issues.assignee.error=Nem todos os responsáveis foram adicionados devido a um erro inesperado.
13721372
issues.reference_issue.body=Conteúdo
13731373

@@ -1581,9 +1581,9 @@ activity.closed_issue_label=Encerrada
15811581
activity.new_issues_count_1=questão nova
15821582
activity.new_issues_count_n=questões novas
15831583
activity.new_issue_label=Em aberto
1584-
activity.title.unresolved_conv_1=%d diálogo não resolvido
1585-
activity.title.unresolved_conv_n=%d diálogos não resolvidos
1586-
activity.unresolved_conv_desc=Estas questões e estes pedidos de integração que foram modificados recentemente ainda não foram resolvidos.
1584+
activity.title.unresolved_conv_1=%d diálogo não concluído
1585+
activity.title.unresolved_conv_n=%d diálogos não concluídos
1586+
activity.unresolved_conv_desc=Estas questões e estes pedidos de integração que foram modificados recentemente ainda não foram concluídos.
15871587
activity.unresolved_conv_label=Em aberto
15881588
activity.title.releases_1=%d lançamento
15891589
activity.title.releases_n=%d Lançamentos
@@ -1703,8 +1703,8 @@ settings.transfer_abort_success=A transferência de repositório para %s foi can
17031703
settings.transfer_desc=Transferir este repositório para um utilizador ou para uma organização na qual você tenha direitos de administrador.
17041704
settings.transfer_form_title=Insira o nome do repositório para confirmar:
17051705
settings.transfer_in_progress=Está a ser feita uma transferência. Cancele-a, por favor, se quiser transferir este repositório para outro utilizador.
1706-
settings.transfer_notices_1=- Você perderá o acesso ao repositório se transferir para um utilizador individual.
1707-
settings.transfer_notices_2=- Você manterá o acesso ao repositório se o transferir para uma organização da qual você é (co-)proprietário.
1706+
settings.transfer_notices_1=- Você perderá o acesso ao repositório se o transferir para um utilizador individual.
1707+
settings.transfer_notices_2=- Você manterá o acesso ao repositório se o transferir para uma organização da qual você é (co-)proprietário(a).
17081708
settings.transfer_notices_3=- Se o repositório for privado e for transferido para um utilizador individual, esta operação certifica que o utilizador tem pelo menos a permissão de leitura (e altera as permissões se for necessário).
17091709
settings.transfer_owner=Novo proprietário
17101710
settings.transfer_perform=Executar transferência
@@ -1725,7 +1725,7 @@ settings.trust_model.collaboratorcommitter.long=Colaborador + Autor do cometimen
17251725
settings.trust_model.collaboratorcommitter.desc=Assinaturas válidas feitas por colaboradores deste repositório serão marcadas como "fiável" se corresponderem ao autor do cometimento. Caso contrário, assinaturas válidas serão marcadas como "não fiável" se a assinatura corresponder ao autor do cometimento e "não corresponde" se não corresponder. Isto irá forçar a que o Gitea seja marcado como sendo o autor do cometimento nos cometimentos assinados, ficando o autor real marcado como Co-Autorado-Por: e Co-Cometido-Por: no resumo do cometimento. A chave padrão do Gitea tem que corresponder a um utilizador na base de dados.
17261726
settings.wiki_delete=Eliminar dados do wiki
17271727
settings.wiki_delete_desc=Eliminar os dados do repositório do wiki é permanente e não pode ser revertido.
1728-
settings.wiki_delete_notices_1=- Isso excluirá e desabilitará permanentemente o repositório do wiki para %s.
1728+
settings.wiki_delete_notices_1=- Isso excluirá e desabilitará permanentemente o wiki do repositório para %s.
17291729
settings.confirm_wiki_delete=Eliminar dados do wiki
17301730
settings.wiki_deletion_success=Os dados do repositório do wiki foram eliminados.
17311731
settings.delete=Eliminar este repositório

routers/api/v1/repo/repo.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -374,16 +374,21 @@ func Generate(ctx *context.APIContext) {
374374
ctxUser := ctx.User
375375
var err error
376376
if form.Owner != ctxUser.Name {
377-
ctxUser, err = models.GetOrgByName(form.Owner)
377+
ctxUser, err = models.GetUserByName(form.Owner)
378378
if err != nil {
379-
if models.IsErrOrgNotExist(err) {
379+
if models.IsErrUserNotExist(err) {
380380
ctx.JSON(http.StatusNotFound, map[string]interface{}{
381-
"error": "request owner `" + form.Name + "` is not exist",
381+
"error": "request owner `" + form.Owner + "` does not exist",
382382
})
383383
return
384384
}
385385

386-
ctx.Error(http.StatusInternalServerError, "GetOrgByName", err)
386+
ctx.Error(http.StatusInternalServerError, "GetUserByName", err)
387+
return
388+
}
389+
390+
if !ctx.User.IsAdmin && !ctxUser.IsOrganization() {
391+
ctx.Error(http.StatusForbidden, "", "Only admin can generate repository for other user.")
387392
return
388393
}
389394

routers/web/user/auth.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -1204,10 +1204,11 @@ func SignUpPost(ctx *context.Context) {
12041204
}
12051205

12061206
u := &models.User{
1207-
Name: form.UserName,
1208-
Email: form.Email,
1209-
Passwd: form.Password,
1210-
IsActive: !(setting.Service.RegisterEmailConfirm || setting.Service.RegisterManualConfirm),
1207+
Name: form.UserName,
1208+
Email: form.Email,
1209+
Passwd: form.Password,
1210+
IsActive: !(setting.Service.RegisterEmailConfirm || setting.Service.RegisterManualConfirm),
1211+
IsRestricted: setting.Service.DefaultUserIsRestricted,
12111212
}
12121213

12131214
if !createAndHandleCreatedUser(ctx, tplSignUp, form, u, nil, false) {

0 commit comments

Comments
 (0)