Skip to content

Commit 3a16817

Browse files
committed
Move client-imported GPL code to separate package
1 parent c20202a commit 3a16817

File tree

18 files changed

+142
-130
lines changed

18 files changed

+142
-130
lines changed

.github/workflows/check-license-dependencies.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,28 @@ jobs:
1515
- name: Check for problematic license dependencies
1616
run: |
1717
echo "Checking for dependencies on management/, signal/, and relay/ packages..."
18+
echo ""
1819
1920
# Find all directories except the problematic ones and system dirs
2021
FOUND_ISSUES=0
21-
find . -maxdepth 1 -type d -not -name "." -not -name "management" -not -name "signal" -not -name "relay" -not -name ".git*" | sort | while read dir; do
22+
while IFS= read -r dir; do
2223
echo "=== Checking $dir ==="
2324
# Search for problematic imports, excluding test files
24-
RESULTS=$(grep -r "github.com/netbirdio/netbird/\(management\|signal\|relay\)" "$dir" --include="*.go" | grep -v "_test.go" | grep -v "test_" | grep -v "/test/" || true)
25-
if [ ! -z "$RESULTS" ]; then
25+
RESULTS=$(grep -r "github.com/netbirdio/netbird/\(management\|signal\|relay\)" "$dir" --include="*.go" 2>/dev/null | grep -v "_test.go" | grep -v "test_" | grep -v "/test/" || true)
26+
if [ -n "$RESULTS" ]; then
2627
echo "❌ Found problematic dependencies:"
2728
echo "$RESULTS"
2829
FOUND_ISSUES=1
2930
else
3031
echo "✓ No problematic dependencies found"
3132
fi
32-
done
33+
done < <(find . -maxdepth 1 -type d -not -name "." -not -name "management" -not -name "signal" -not -name "relay" -not -name ".git*" | sort)
34+
35+
echo ""
3336
if [ $FOUND_ISSUES -eq 1 ]; then
34-
echo ""
3537
echo "❌ Found dependencies on management/, signal/, or relay/ packages"
36-
echo "These packages will change license and should not be imported by client or shared code"
38+
echo "These packages are licensed under AGPLv3 and must not be imported by BSD-licensed code"
3739
exit 1
3840
else
39-
echo ""
4041
echo "✅ All license dependencies are clean"
4142
fi

client/ssh/proxy/proxy_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
nbssh "github.com/netbirdio/netbird/client/ssh"
3030
"github.com/netbirdio/netbird/client/ssh/server"
3131
"github.com/netbirdio/netbird/client/ssh/testutil"
32-
nbjwt "github.com/netbirdio/netbird/management/server/auth/jwt"
32+
nbjwt "github.com/netbirdio/netbird/shared/auth/jwt"
3333
)
3434

3535
func TestMain(m *testing.M) {

client/ssh/server/jwt_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"github.com/netbirdio/netbird/client/ssh/client"
2727
"github.com/netbirdio/netbird/client/ssh/detection"
2828
"github.com/netbirdio/netbird/client/ssh/testutil"
29-
nbjwt "github.com/netbirdio/netbird/management/server/auth/jwt"
29+
nbjwt "github.com/netbirdio/netbird/shared/auth/jwt"
3030
)
3131

3232
func TestJWTEnforcement(t *testing.T) {

client/ssh/server/server.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import (
2020

2121
"github.com/netbirdio/netbird/client/iface/wgaddr"
2222
"github.com/netbirdio/netbird/client/ssh/detection"
23-
"github.com/netbirdio/netbird/management/server/auth/jwt"
24-
nbcontext "github.com/netbirdio/netbird/management/server/context"
23+
"github.com/netbirdio/netbird/shared/auth"
24+
"github.com/netbirdio/netbird/shared/auth/jwt"
2525
"github.com/netbirdio/netbird/version"
2626
)
2727

@@ -341,7 +341,7 @@ func (s *Server) checkTokenAge(token *gojwt.Token, jwtConfig *JWTConfig) error {
341341
return nil
342342
}
343343

344-
func (s *Server) extractAndValidateUser(token *gojwt.Token) (*nbcontext.UserAuth, error) {
344+
func (s *Server) extractAndValidateUser(token *gojwt.Token) (*auth.UserAuth, error) {
345345
s.mu.RLock()
346346
jwtExtractor := s.jwtExtractor
347347
s.mu.RUnlock()
@@ -364,7 +364,7 @@ func (s *Server) extractAndValidateUser(token *gojwt.Token) (*nbcontext.UserAuth
364364
return &userAuth, nil
365365
}
366366

367-
func (s *Server) hasSSHAccess(userAuth *nbcontext.UserAuth) bool {
367+
func (s *Server) hasSSHAccess(userAuth *auth.UserAuth) bool {
368368
return userAuth.UserId != ""
369369
}
370370

management/server/account.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"github.com/netbirdio/netbird/shared/auth"
78
"math/rand"
89
"net"
910
"net/netip"
@@ -1046,7 +1047,7 @@ func (am *DefaultAccountManager) removeUserFromCache(ctx context.Context, accoun
10461047
}
10471048

10481049
// updateAccountDomainAttributesIfNotUpToDate updates the account domain attributes if they are not up to date and then, saves the account changes
1049-
func (am *DefaultAccountManager) updateAccountDomainAttributesIfNotUpToDate(ctx context.Context, accountID string, userAuth nbcontext.UserAuth,
1050+
func (am *DefaultAccountManager) updateAccountDomainAttributesIfNotUpToDate(ctx context.Context, accountID string, userAuth auth.UserAuth,
10501051
primaryDomain bool,
10511052
) error {
10521053
if userAuth.Domain == "" {
@@ -1095,7 +1096,7 @@ func (am *DefaultAccountManager) handleExistingUserAccount(
10951096
ctx context.Context,
10961097
userAccountID string,
10971098
domainAccountID string,
1098-
userAuth nbcontext.UserAuth,
1099+
userAuth auth.UserAuth,
10991100
) error {
11001101
primaryDomain := domainAccountID == "" || userAccountID == domainAccountID
11011102
err := am.updateAccountDomainAttributesIfNotUpToDate(ctx, userAccountID, userAuth, primaryDomain)
@@ -1114,7 +1115,7 @@ func (am *DefaultAccountManager) handleExistingUserAccount(
11141115

11151116
// addNewPrivateAccount validates if there is an existing primary account for the domain, if so it adds the new user to that account,
11161117
// otherwise it will create a new account and make it primary account for the domain.
1117-
func (am *DefaultAccountManager) addNewPrivateAccount(ctx context.Context, domainAccountID string, userAuth nbcontext.UserAuth) (string, error) {
1118+
func (am *DefaultAccountManager) addNewPrivateAccount(ctx context.Context, domainAccountID string, userAuth auth.UserAuth) (string, error) {
11181119
if userAuth.UserId == "" {
11191120
return "", fmt.Errorf("user ID is empty")
11201121
}
@@ -1145,7 +1146,7 @@ func (am *DefaultAccountManager) addNewPrivateAccount(ctx context.Context, domai
11451146
return newAccount.Id, nil
11461147
}
11471148

1148-
func (am *DefaultAccountManager) addNewUserToDomainAccount(ctx context.Context, domainAccountID string, userAuth nbcontext.UserAuth) (string, error) {
1149+
func (am *DefaultAccountManager) addNewUserToDomainAccount(ctx context.Context, domainAccountID string, userAuth auth.UserAuth) (string, error) {
11491150
newUser := types.NewRegularUser(userAuth.UserId)
11501151
newUser.AccountID = domainAccountID
11511152

@@ -1309,7 +1310,7 @@ func (am *DefaultAccountManager) UpdateAccountOnboarding(ctx context.Context, ac
13091310
return newOnboarding, nil
13101311
}
13111312

1312-
func (am *DefaultAccountManager) GetAccountIDFromUserAuth(ctx context.Context, userAuth nbcontext.UserAuth) (string, string, error) {
1313+
func (am *DefaultAccountManager) GetAccountIDFromUserAuth(ctx context.Context, userAuth auth.UserAuth) (string, string, error) {
13131314
if userAuth.UserId == "" {
13141315
return "", "", errors.New(emptyUserID)
13151316
}
@@ -1353,7 +1354,7 @@ func (am *DefaultAccountManager) GetAccountIDFromUserAuth(ctx context.Context, u
13531354
// syncJWTGroups processes the JWT groups for a user, updates the account based on the groups,
13541355
// and propagates changes to peers if group propagation is enabled.
13551356
// requires userAuth to have been ValidateAndParseToken and EnsureUserAccessByJWTGroups by the AuthManager
1356-
func (am *DefaultAccountManager) SyncUserJWTGroups(ctx context.Context, userAuth nbcontext.UserAuth) error {
1357+
func (am *DefaultAccountManager) SyncUserJWTGroups(ctx context.Context, userAuth auth.UserAuth) error {
13571358
if userAuth.IsChild || userAuth.IsPAT {
13581359
return nil
13591360
}
@@ -1511,7 +1512,7 @@ func (am *DefaultAccountManager) SyncUserJWTGroups(ctx context.Context, userAuth
15111512
// Existing user + Existing account + Existing domain reclassified Domain as private -> Nothing changes (index domain)
15121513
//
15131514
// UserAuth IsChild -> checks that account exists
1514-
func (am *DefaultAccountManager) getAccountIDWithAuthorizationClaims(ctx context.Context, userAuth nbcontext.UserAuth) (string, error) {
1515+
func (am *DefaultAccountManager) getAccountIDWithAuthorizationClaims(ctx context.Context, userAuth auth.UserAuth) (string, error) {
15151516
log.WithContext(ctx).Tracef("getting account with authorization claims. User ID: \"%s\", Account ID: \"%s\", Domain: \"%s\", Domain Category: \"%s\"",
15161517
userAuth.UserId, userAuth.AccountId, userAuth.Domain, userAuth.DomainCategory)
15171518

@@ -1590,7 +1591,7 @@ func (am *DefaultAccountManager) getPrivateDomainWithGlobalLock(ctx context.Cont
15901591
return domainAccountID, cancel, nil
15911592
}
15921593

1593-
func (am *DefaultAccountManager) handlePrivateAccountWithIDFromClaim(ctx context.Context, userAuth nbcontext.UserAuth) (string, error) {
1594+
func (am *DefaultAccountManager) handlePrivateAccountWithIDFromClaim(ctx context.Context, userAuth auth.UserAuth) (string, error) {
15941595
userAccountID, err := am.Store.GetAccountIDByUserID(ctx, store.LockingStrengthNone, userAuth.UserId)
15951596
if err != nil {
15961597
log.WithContext(ctx).Errorf("error getting account ID by user ID: %v", err)
@@ -1638,7 +1639,7 @@ func handleNotFound(err error) error {
16381639
return nil
16391640
}
16401641

1641-
func domainIsUpToDate(domain string, domainCategory string, userAuth nbcontext.UserAuth) bool {
1642+
func domainIsUpToDate(domain string, domainCategory string, userAuth auth.UserAuth) bool {
16421643
return domainCategory == types.PrivateCategory || userAuth.DomainCategory != types.PrivateCategory || domain != userAuth.Domain
16431644
}
16441645

management/server/account/manager.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package account
22

33
import (
44
"context"
5+
"github.com/netbirdio/netbird/shared/auth"
56
"net"
67
"net/netip"
78
"time"
89

910
nbdns "github.com/netbirdio/netbird/dns"
1011
"github.com/netbirdio/netbird/management/server/activity"
1112
nbcache "github.com/netbirdio/netbird/management/server/cache"
12-
nbcontext "github.com/netbirdio/netbird/management/server/context"
1313
"github.com/netbirdio/netbird/management/server/idp"
1414
nbpeer "github.com/netbirdio/netbird/management/server/peer"
1515
"github.com/netbirdio/netbird/management/server/peers/ephemeral"
@@ -45,10 +45,10 @@ type Manager interface {
4545
GetAccountOnboarding(ctx context.Context, accountID string, userID string) (*types.AccountOnboarding, error)
4646
AccountExists(ctx context.Context, accountID string) (bool, error)
4747
GetAccountIDByUserID(ctx context.Context, userID, domain string) (string, error)
48-
GetAccountIDFromUserAuth(ctx context.Context, userAuth nbcontext.UserAuth) (string, string, error)
48+
GetAccountIDFromUserAuth(ctx context.Context, userAuth auth.UserAuth) (string, string, error)
4949
DeleteAccount(ctx context.Context, accountID, userID string) error
5050
GetUserByID(ctx context.Context, id string) (*types.User, error)
51-
GetUserFromUserAuth(ctx context.Context, userAuth nbcontext.UserAuth) (*types.User, error)
51+
GetUserFromUserAuth(ctx context.Context, userAuth auth.UserAuth) (*types.User, error)
5252
ListUsers(ctx context.Context, accountID string) ([]*types.User, error)
5353
GetPeers(ctx context.Context, accountID, userID, nameFilter, ipFilter string) ([]*nbpeer.Peer, error)
5454
MarkPeerConnected(ctx context.Context, peerKey string, connected bool, realIP net.IP, accountID string) error
@@ -120,12 +120,12 @@ type Manager interface {
120120
UpdateAccountPeers(ctx context.Context, accountID string)
121121
BufferUpdateAccountPeers(ctx context.Context, accountID string)
122122
BuildUserInfosForAccount(ctx context.Context, accountID, initiatorUserID string, accountUsers []*types.User) (map[string]*types.UserInfo, error)
123-
SyncUserJWTGroups(ctx context.Context, userAuth nbcontext.UserAuth) error
123+
SyncUserJWTGroups(ctx context.Context, userAuth auth.UserAuth) error
124124
GetStore() store.Store
125125
GetOrCreateAccountByPrivateDomain(ctx context.Context, initiatorId, domain string) (*types.Account, bool, error)
126126
UpdateToPrimaryAccount(ctx context.Context, accountId string) error
127127
GetOwnerInfo(ctx context.Context, accountId string) (*types.UserInfo, error)
128-
GetCurrentUserInfo(ctx context.Context, userAuth nbcontext.UserAuth) (*users.UserInfoWithPermissions, error)
128+
GetCurrentUserInfo(ctx context.Context, userAuth auth.UserAuth) (*users.UserInfoWithPermissions, error)
129129
SetEphemeralManager(em ephemeral.Manager)
130130
AllowSync(string, uint64) bool
131131
}

management/server/auth/manager.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@ import (
55
"crypto/sha256"
66
"encoding/base64"
77
"fmt"
8+
"github.com/netbirdio/netbird/shared/auth"
89
"hash/crc32"
910

1011
"github.com/golang-jwt/jwt/v5"
1112

1213
"github.com/netbirdio/netbird/base62"
13-
nbjwt "github.com/netbirdio/netbird/management/server/auth/jwt"
14-
nbcontext "github.com/netbirdio/netbird/management/server/context"
1514
"github.com/netbirdio/netbird/management/server/store"
1615
"github.com/netbirdio/netbird/management/server/types"
16+
nbjwt "github.com/netbirdio/netbird/shared/auth/jwt"
1717
)
1818

1919
var _ Manager = (*manager)(nil)
2020

2121
type Manager interface {
22-
ValidateAndParseToken(ctx context.Context, value string) (nbcontext.UserAuth, *jwt.Token, error)
23-
EnsureUserAccessByJWTGroups(ctx context.Context, userAuth nbcontext.UserAuth, token *jwt.Token) (nbcontext.UserAuth, error)
22+
ValidateAndParseToken(ctx context.Context, value string) (auth.UserAuth, *jwt.Token, error)
23+
EnsureUserAccessByJWTGroups(ctx context.Context, userAuth auth.UserAuth, token *jwt.Token) (auth.UserAuth, error)
2424
MarkPATUsed(ctx context.Context, tokenID string) error
2525
GetPATInfo(ctx context.Context, token string) (user *types.User, pat *types.PersonalAccessToken, domain string, category string, err error)
2626
}
@@ -55,20 +55,20 @@ func NewManager(store store.Store, issuer, audience, keysLocation, userIdClaim s
5555
}
5656
}
5757

58-
func (m *manager) ValidateAndParseToken(ctx context.Context, value string) (nbcontext.UserAuth, *jwt.Token, error) {
58+
func (m *manager) ValidateAndParseToken(ctx context.Context, value string) (auth.UserAuth, *jwt.Token, error) {
5959
token, err := m.validator.ValidateAndParse(ctx, value)
6060
if err != nil {
61-
return nbcontext.UserAuth{}, nil, err
61+
return auth.UserAuth{}, nil, err
6262
}
6363

6464
userAuth, err := m.extractor.ToUserAuth(token)
6565
if err != nil {
66-
return nbcontext.UserAuth{}, nil, err
66+
return auth.UserAuth{}, nil, err
6767
}
6868
return userAuth, token, err
6969
}
7070

71-
func (m *manager) EnsureUserAccessByJWTGroups(ctx context.Context, userAuth nbcontext.UserAuth, token *jwt.Token) (nbcontext.UserAuth, error) {
71+
func (m *manager) EnsureUserAccessByJWTGroups(ctx context.Context, userAuth auth.UserAuth, token *jwt.Token) (auth.UserAuth, error) {
7272
if userAuth.IsChild || userAuth.IsPAT {
7373
return userAuth, nil
7474
}

management/server/auth/manager_mock.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package auth
22

33
import (
44
"context"
5+
"github.com/netbirdio/netbird/shared/auth"
56

67
"github.com/golang-jwt/jwt/v5"
78

8-
nbcontext "github.com/netbirdio/netbird/management/server/context"
99
"github.com/netbirdio/netbird/management/server/types"
1010
)
1111

@@ -15,18 +15,18 @@ var (
1515

1616
// @note really dislike this mocking approach but rather than have to do additional test refactoring.
1717
type MockManager struct {
18-
ValidateAndParseTokenFunc func(ctx context.Context, value string) (nbcontext.UserAuth, *jwt.Token, error)
19-
EnsureUserAccessByJWTGroupsFunc func(ctx context.Context, userAuth nbcontext.UserAuth, token *jwt.Token) (nbcontext.UserAuth, error)
18+
ValidateAndParseTokenFunc func(ctx context.Context, value string) (auth.UserAuth, *jwt.Token, error)
19+
EnsureUserAccessByJWTGroupsFunc func(ctx context.Context, userAuth auth.UserAuth, token *jwt.Token) (auth.UserAuth, error)
2020
MarkPATUsedFunc func(ctx context.Context, tokenID string) error
2121
GetPATInfoFunc func(ctx context.Context, token string) (user *types.User, pat *types.PersonalAccessToken, domain string, category string, err error)
2222
}
2323

2424
// EnsureUserAccessByJWTGroups implements Manager.
25-
func (m *MockManager) EnsureUserAccessByJWTGroups(ctx context.Context, userAuth nbcontext.UserAuth, token *jwt.Token) (nbcontext.UserAuth, error) {
25+
func (m *MockManager) EnsureUserAccessByJWTGroups(ctx context.Context, userAuth auth.UserAuth, token *jwt.Token) (auth.UserAuth, error) {
2626
if m.EnsureUserAccessByJWTGroupsFunc != nil {
2727
return m.EnsureUserAccessByJWTGroupsFunc(ctx, userAuth, token)
2828
}
29-
return nbcontext.UserAuth{}, nil
29+
return auth.UserAuth{}, nil
3030
}
3131

3232
// GetPATInfo implements Manager.
@@ -46,9 +46,9 @@ func (m *MockManager) MarkPATUsed(ctx context.Context, tokenID string) error {
4646
}
4747

4848
// ValidateAndParseToken implements Manager.
49-
func (m *MockManager) ValidateAndParseToken(ctx context.Context, value string) (nbcontext.UserAuth, *jwt.Token, error) {
49+
func (m *MockManager) ValidateAndParseToken(ctx context.Context, value string) (auth.UserAuth, *jwt.Token, error) {
5050
if m.ValidateAndParseTokenFunc != nil {
5151
return m.ValidateAndParseTokenFunc(ctx, value)
5252
}
53-
return nbcontext.UserAuth{}, &jwt.Token{}, nil
53+
return auth.UserAuth{}, &jwt.Token{}, nil
5454
}

management/server/auth/manager_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import (
1717
"github.com/stretchr/testify/require"
1818

1919
"github.com/netbirdio/netbird/management/server/auth"
20-
nbjwt "github.com/netbirdio/netbird/management/server/auth/jwt"
21-
nbcontext "github.com/netbirdio/netbird/management/server/context"
2220
"github.com/netbirdio/netbird/management/server/store"
2321
"github.com/netbirdio/netbird/management/server/types"
22+
nbauth "github.com/netbirdio/netbird/shared/auth"
23+
nbjwt "github.com/netbirdio/netbird/shared/auth/jwt"
2424
)
2525

2626
func TestAuthManager_GetAccountInfoFromPAT(t *testing.T) {
@@ -131,7 +131,7 @@ func TestAuthManager_EnsureUserAccessByJWTGroups(t *testing.T) {
131131
}
132132

133133
// this has been validated and parsed by ValidateAndParseToken
134-
userAuth := nbcontext.UserAuth{
134+
userAuth := nbauth.UserAuth{
135135
AccountId: account.Id,
136136
Domain: domain,
137137
UserId: userId,
@@ -236,7 +236,7 @@ func TestAuthManager_ValidateAndParseToken(t *testing.T) {
236236
tests := []struct {
237237
name string
238238
tokenFunc func() string
239-
expected *nbcontext.UserAuth // nil indicates expected error
239+
expected *nbauth.UserAuth // nil indicates expected error
240240
}{
241241
{
242242
name: "Valid with custom claims",
@@ -258,7 +258,7 @@ func TestAuthManager_ValidateAndParseToken(t *testing.T) {
258258
tokenString, _ := token.SignedString(key)
259259
return tokenString
260260
},
261-
expected: &nbcontext.UserAuth{
261+
expected: &nbauth.UserAuth{
262262
UserId: "user-id|123",
263263
AccountId: "account-id|567",
264264
Domain: "http://localhost",
@@ -282,7 +282,7 @@ func TestAuthManager_ValidateAndParseToken(t *testing.T) {
282282
tokenString, _ := token.SignedString(key)
283283
return tokenString
284284
},
285-
expected: &nbcontext.UserAuth{
285+
expected: &nbauth.UserAuth{
286286
UserId: "user-id|123",
287287
},
288288
},

0 commit comments

Comments
 (0)