2020-11-29 03:37:58 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-11-29 03:37:58 +03:00
package migrations
import (
2022-07-13 04:07:16 +03:00
"net"
2021-03-16 00:52:11 +03:00
"path/filepath"
2020-11-29 03:37:58 +03:00
"testing"
2021-11-12 17:36:47 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-11-29 03:37:58 +03:00
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
)
func TestMigrateWhiteBlocklist ( t * testing . T ) {
2021-11-12 17:36:47 +03:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-03-16 00:52:11 +03:00
2022-08-16 05:22:25 +03:00
adminUser := unittest . AssertExistsAndLoadBean ( t , & user_model . User { Name : "user1" } )
nonAdminUser := unittest . AssertExistsAndLoadBean ( t , & user_model . User { Name : "user2" } )
2021-03-16 00:52:11 +03:00
2021-11-20 12:34:05 +03:00
setting . Migrations . AllowedDomains = "github.com"
setting . Migrations . AllowLocalNetworks = false
2020-11-29 03:37:58 +03:00
assert . NoError ( t , Init ( ) )
2021-03-16 00:52:11 +03:00
err := IsMigrateURLAllowed ( "https://gitlab.com/gitlab/gitlab.git" , nonAdminUser )
2020-11-29 03:37:58 +03:00
assert . Error ( t , err )
2021-03-16 00:52:11 +03:00
err = IsMigrateURLAllowed ( "https://github.com/go-gitea/gitea.git" , nonAdminUser )
2020-11-29 03:37:58 +03:00
assert . NoError ( t , err )
2021-03-18 16:58:47 +03:00
err = IsMigrateURLAllowed ( "https://gITHUb.com/go-gitea/gitea.git" , nonAdminUser )
assert . NoError ( t , err )
2021-11-20 12:34:05 +03:00
setting . Migrations . AllowedDomains = ""
setting . Migrations . BlockedDomains = "github.com"
2020-11-29 03:37:58 +03:00
assert . NoError ( t , Init ( ) )
2021-03-16 00:52:11 +03:00
err = IsMigrateURLAllowed ( "https://gitlab.com/gitlab/gitlab.git" , nonAdminUser )
2020-11-29 03:37:58 +03:00
assert . NoError ( t , err )
2021-03-16 00:52:11 +03:00
err = IsMigrateURLAllowed ( "https://github.com/go-gitea/gitea.git" , nonAdminUser )
assert . Error ( t , err )
err = IsMigrateURLAllowed ( "https://10.0.0.1/go-gitea/gitea.git" , nonAdminUser )
2020-11-29 03:37:58 +03:00
assert . Error ( t , err )
2021-03-08 16:10:17 +03:00
2021-03-16 00:52:11 +03:00
setting . Migrations . AllowLocalNetworks = true
2021-11-20 12:34:05 +03:00
assert . NoError ( t , Init ( ) )
2021-03-16 00:52:11 +03:00
err = IsMigrateURLAllowed ( "https://10.0.0.1/go-gitea/gitea.git" , nonAdminUser )
assert . NoError ( t , err )
2021-03-08 16:10:17 +03:00
old := setting . ImportLocalPaths
setting . ImportLocalPaths = false
2021-03-16 00:52:11 +03:00
err = IsMigrateURLAllowed ( "/home/foo/bar/goo" , adminUser )
2021-03-08 16:10:17 +03:00
assert . Error ( t , err )
setting . ImportLocalPaths = true
2021-03-16 00:52:11 +03:00
abs , err := filepath . Abs ( "." )
assert . NoError ( t , err )
err = IsMigrateURLAllowed ( abs , adminUser )
assert . NoError ( t , err )
err = IsMigrateURLAllowed ( abs , nonAdminUser )
assert . Error ( t , err )
nonAdminUser . AllowImportLocal = true
err = IsMigrateURLAllowed ( abs , nonAdminUser )
2021-03-08 16:10:17 +03:00
assert . NoError ( t , err )
setting . ImportLocalPaths = old
2020-11-29 03:37:58 +03:00
}
2022-07-13 04:07:16 +03:00
func TestAllowBlockList ( t * testing . T ) {
init := func ( allow , block string , local bool ) {
setting . Migrations . AllowedDomains = allow
setting . Migrations . BlockedDomains = block
setting . Migrations . AllowLocalNetworks = local
assert . NoError ( t , Init ( ) )
}
// default, allow all external, block none, no local networks
init ( "" , "" , false )
assert . NoError ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
assert . Error ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "127.0.0.1" ) } ) )
// allow all including local networks (it could lead to SSRF in production)
init ( "" , "" , true )
assert . NoError ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
assert . NoError ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "127.0.0.1" ) } ) )
// allow wildcard, block some subdomains. if the domain name is allowed, then the local network check is skipped
init ( "*.domain.com" , "blocked.domain.com" , false )
assert . NoError ( t , checkByAllowBlockList ( "sub.domain.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
assert . NoError ( t , checkByAllowBlockList ( "sub.domain.com" , [ ] net . IP { net . ParseIP ( "127.0.0.1" ) } ) )
assert . Error ( t , checkByAllowBlockList ( "blocked.domain.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
assert . Error ( t , checkByAllowBlockList ( "sub.other.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
// allow wildcard (it could lead to SSRF in production)
init ( "*" , "" , false )
assert . NoError ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
assert . NoError ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "127.0.0.1" ) } ) )
// local network can still be blocked
init ( "*" , "127.0.0.*" , false )
assert . NoError ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "1.2.3.4" ) } ) )
assert . Error ( t , checkByAllowBlockList ( "domain.com" , [ ] net . IP { net . ParseIP ( "127.0.0.1" ) } ) )
// reset
init ( "" , "" , false )
}