Skip to content

Commit d98bbbc

Browse files
committed
Move SyncExternal to services/auth
Signed-off-by: Andrew Thornton <[email protected]>
1 parent d1d9e44 commit d98bbbc

File tree

11 files changed

+303
-252
lines changed

11 files changed

+303
-252
lines changed

integrations/auth_ldap_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"strings"
1212
"testing"
1313

14-
"code.gitea.io/gitea/models"
14+
"code.gitea.io/gitea/services/auth"
1515

1616
"github.com/stretchr/testify/assert"
1717
"github.com/unknwon/i18n"
@@ -151,7 +151,7 @@ func TestLDAPUserSync(t *testing.T) {
151151
}
152152
defer prepareTestEnv(t)()
153153
addAuthSourceLDAP(t, "")
154-
models.SyncExternalUsers(context.Background(), true)
154+
auth.SyncExternalUsers(context.Background(), true)
155155

156156
session := loginUser(t, "user1")
157157
// Check if users exists
@@ -216,7 +216,7 @@ func TestLDAPUserSSHKeySync(t *testing.T) {
216216
defer prepareTestEnv(t)()
217217
addAuthSourceLDAP(t, "sshPublicKey")
218218

219-
models.SyncExternalUsers(context.Background(), true)
219+
auth.SyncExternalUsers(context.Background(), true)
220220

221221
// Check if users has SSH keys synced
222222
for _, u := range gitLDAPUsers {

models/login_source.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -463,17 +463,3 @@ func CountLoginSources() int64 {
463463
count, _ := x.Count(new(LoginSource))
464464
return count
465465
}
466-
467-
// ComposeFullName composes a firstname surname or username
468-
func ComposeFullName(firstname, surname, username string) string {
469-
switch {
470-
case len(firstname) == 0 && len(surname) == 0:
471-
return username
472-
case len(firstname) == 0:
473-
return surname
474-
case len(surname) == 0:
475-
return firstname
476-
default:
477-
return firstname + " " + surname
478-
}
479-
}

models/ssh_key.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,8 +635,8 @@ func ListPublicKeys(uid int64, listOptions ListOptions) ([]*PublicKey, error) {
635635
return keys, sess.Find(&keys)
636636
}
637637

638-
// ListPublicLdapSSHKeys returns a list of synchronized public ldap ssh keys belongs to given user and login source.
639-
func ListPublicLdapSSHKeys(uid, loginSourceID int64) ([]*PublicKey, error) {
638+
// ListPublicKeysBySource returns a list of synchronized public keys for a given user and login source.
639+
func ListPublicKeysBySource(uid, loginSourceID int64) ([]*PublicKey, error) {
640640
keys := make([]*PublicKey, 0, 5)
641641
return keys, x.
642642
Where("owner_id = ? AND login_source_id = ?", uid, loginSourceID).

models/user.go

Lines changed: 37 additions & 226 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,6 +1397,13 @@ func GetUserIDsByNames(names []string, ignoreNonExistent bool) ([]int64, error)
13971397
return ids, nil
13981398
}
13991399

1400+
// GetUsersBySource returns a list of Users for a login source
1401+
func GetUsersBySource(s *LoginSource) ([]*User, error) {
1402+
var users []*User
1403+
err := x.Where("login_type = ? AND login_source = ?", s.Type, s.ID).Find(&users)
1404+
return users, err
1405+
}
1406+
14001407
// UserCommit represents a commit with validation of user.
14011408
type UserCommit struct {
14021409
User *User
@@ -1658,8 +1665,8 @@ func deleteKeysMarkedForDeletion(keys []string) (bool, error) {
16581665
return sshKeysNeedUpdate, nil
16591666
}
16601667

1661-
// AddLdapSSHPublicKeys add a users public keys. Returns true if there are changes.
1662-
func AddLdapSSHPublicKeys(usr *User, s *LoginSource, sshPublicKeys []string) bool {
1668+
// AddPublicKeysBySource add a users public keys. Returns true if there are changes.
1669+
func AddPublicKeysBySource(usr *User, s *LoginSource, sshPublicKeys []string) bool {
16631670
var sshKeysNeedUpdate bool
16641671
for _, sshKey := range sshPublicKeys {
16651672
var err error
@@ -1680,82 +1687,82 @@ func AddLdapSSHPublicKeys(usr *User, s *LoginSource, sshPublicKeys []string) boo
16801687

16811688
if _, err := AddPublicKey(usr.ID, sshKeyName, marshalled, s.ID); err != nil {
16821689
if IsErrKeyAlreadyExist(err) {
1683-
log.Trace("addLdapSSHPublicKeys[%s]: LDAP Public SSH Key %s already exists for user", sshKeyName, usr.Name)
1690+
log.Trace("AddPublicKeysBySource[%s]: Public SSH Key %s already exists for user", sshKeyName, usr.Name)
16841691
} else {
1685-
log.Error("addLdapSSHPublicKeys[%s]: Error adding LDAP Public SSH Key for user %s: %v", sshKeyName, usr.Name, err)
1692+
log.Error("AddPublicKeysBySource[%s]: Error adding Public SSH Key for user %s: %v", sshKeyName, usr.Name, err)
16861693
}
16871694
} else {
1688-
log.Trace("addLdapSSHPublicKeys[%s]: Added LDAP Public SSH Key for user %s", sshKeyName, usr.Name)
1695+
log.Trace("AddPublicKeysBySource[%s]: Added Public SSH Key for user %s", sshKeyName, usr.Name)
16891696
sshKeysNeedUpdate = true
16901697
}
16911698
}
16921699
if !found && err != nil {
1693-
log.Warn("addLdapSSHPublicKeys[%s]: Skipping invalid LDAP Public SSH Key for user %s: %v", s.Name, usr.Name, sshKey)
1700+
log.Warn("AddPublicKeysBySource[%s]: Skipping invalid Public SSH Key for user %s: %v", s.Name, usr.Name, sshKey)
16941701
}
16951702
}
16961703
return sshKeysNeedUpdate
16971704
}
16981705

1699-
// SynchronizeLdapSSHPublicKeys updates a users public keys. Returns true if there are changes.
1700-
func SynchronizeLdapSSHPublicKeys(usr *User, s *LoginSource, sshPublicKeys []string) bool {
1706+
// SynchronizePublicKeys updates a users public keys. Returns true if there are changes.
1707+
func SynchronizePublicKeys(usr *User, s *LoginSource, sshPublicKeys []string) bool {
17011708
var sshKeysNeedUpdate bool
17021709

1703-
log.Trace("synchronizeLdapSSHPublicKeys[%s]: Handling LDAP Public SSH Key synchronization for user %s", s.Name, usr.Name)
1710+
log.Trace("synchronizePublicKeys[%s]: Handling Public SSH Key synchronization for user %s", s.Name, usr.Name)
17041711

17051712
// Get Public Keys from DB with current LDAP source
17061713
var giteaKeys []string
1707-
keys, err := ListPublicLdapSSHKeys(usr.ID, s.ID)
1714+
keys, err := ListPublicKeysBySource(usr.ID, s.ID)
17081715
if err != nil {
1709-
log.Error("synchronizeLdapSSHPublicKeys[%s]: Error listing LDAP Public SSH Keys for user %s: %v", s.Name, usr.Name, err)
1716+
log.Error("synchronizePublicKeys[%s]: Error listing Public SSH Keys for user %s: %v", s.Name, usr.Name, err)
17101717
}
17111718

17121719
for _, v := range keys {
17131720
giteaKeys = append(giteaKeys, v.OmitEmail())
17141721
}
17151722

1716-
// Get Public Keys from LDAP and skip duplicate keys
1717-
var ldapKeys []string
1723+
// Process the provided keys to remove duplicates and name part
1724+
var providedKeys []string
17181725
for _, v := range sshPublicKeys {
17191726
sshKeySplit := strings.Split(v, " ")
17201727
if len(sshKeySplit) > 1 {
1721-
ldapKey := strings.Join(sshKeySplit[:2], " ")
1722-
if !util.ExistsInSlice(ldapKey, ldapKeys) {
1723-
ldapKeys = append(ldapKeys, ldapKey)
1728+
key := strings.Join(sshKeySplit[:2], " ")
1729+
if !util.ExistsInSlice(key, providedKeys) {
1730+
providedKeys = append(providedKeys, key)
17241731
}
17251732
}
17261733
}
17271734

17281735
// Check if Public Key sync is needed
1729-
if util.IsEqualSlice(giteaKeys, ldapKeys) {
1730-
log.Trace("synchronizeLdapSSHPublicKeys[%s]: LDAP Public Keys are already in sync for %s (LDAP:%v/DB:%v)", s.Name, usr.Name, len(ldapKeys), len(giteaKeys))
1736+
if util.IsEqualSlice(giteaKeys, providedKeys) {
1737+
log.Trace("synchronizePublicKeys[%s]: Public Keys are already in sync for %s (Source:%v/DB:%v)", s.Name, usr.Name, len(providedKeys), len(giteaKeys))
17311738
return false
17321739
}
1733-
log.Trace("synchronizeLdapSSHPublicKeys[%s]: LDAP Public Key needs update for user %s (LDAP:%v/DB:%v)", s.Name, usr.Name, len(ldapKeys), len(giteaKeys))
1740+
log.Trace("synchronizePublicKeys[%s]: Public Key needs update for user %s (Source:%v/DB:%v)", s.Name, usr.Name, len(providedKeys), len(giteaKeys))
17341741

1735-
// Add LDAP Public SSH Keys that doesn't already exist in DB
1736-
var newLdapSSHKeys []string
1737-
for _, LDAPPublicSSHKey := range ldapKeys {
1738-
if !util.ExistsInSlice(LDAPPublicSSHKey, giteaKeys) {
1739-
newLdapSSHKeys = append(newLdapSSHKeys, LDAPPublicSSHKey)
1742+
// Add new Public SSH Keys that doesn't already exist in DB
1743+
var newKeys []string
1744+
for _, key := range providedKeys {
1745+
if !util.ExistsInSlice(key, giteaKeys) {
1746+
newKeys = append(newKeys, key)
17401747
}
17411748
}
1742-
if AddLdapSSHPublicKeys(usr, s, newLdapSSHKeys) {
1749+
if AddPublicKeysBySource(usr, s, newKeys) {
17431750
sshKeysNeedUpdate = true
17441751
}
17451752

1746-
// Mark LDAP keys from DB that doesn't exist in LDAP for deletion
1753+
// Mark keys from DB that no longer exist in the source for deletion
17471754
var giteaKeysToDelete []string
17481755
for _, giteaKey := range giteaKeys {
1749-
if !util.ExistsInSlice(giteaKey, ldapKeys) {
1750-
log.Trace("synchronizeLdapSSHPublicKeys[%s]: Marking LDAP Public SSH Key for deletion for user %s: %v", s.Name, usr.Name, giteaKey)
1756+
if !util.ExistsInSlice(giteaKey, providedKeys) {
1757+
log.Trace("synchronizePublicKeys[%s]: Marking Public SSH Key for deletion for user %s: %v", s.Name, usr.Name, giteaKey)
17511758
giteaKeysToDelete = append(giteaKeysToDelete, giteaKey)
17521759
}
17531760
}
17541761

1755-
// Delete LDAP keys from DB that doesn't exist in LDAP
1762+
// Delete keys from DB that no longer exist in the source
17561763
needUpd, err := deleteKeysMarkedForDeletion(giteaKeysToDelete)
17571764
if err != nil {
1758-
log.Error("synchronizeLdapSSHPublicKeys[%s]: Error deleting LDAP Public SSH Keys marked for deletion for user %s: %v", s.Name, usr.Name, err)
1765+
log.Error("synchronizePublicKeys[%s]: Error deleting Public Keys marked for deletion for user %s: %v", s.Name, usr.Name, err)
17591766
}
17601767
if needUpd {
17611768
sshKeysNeedUpdate = true
@@ -1764,202 +1771,6 @@ func SynchronizeLdapSSHPublicKeys(usr *User, s *LoginSource, sshPublicKeys []str
17641771
return sshKeysNeedUpdate
17651772
}
17661773

1767-
// SyncExternalUsers is used to synchronize users with external authorization source
1768-
func SyncExternalUsers(ctx context.Context, updateExisting bool) error {
1769-
log.Trace("Doing: SyncExternalUsers")
1770-
1771-
ls, err := LoginSources()
1772-
if err != nil {
1773-
log.Error("SyncExternalUsers: %v", err)
1774-
return err
1775-
}
1776-
1777-
for _, s := range ls {
1778-
if !s.IsActived || !s.IsSyncEnabled {
1779-
continue
1780-
}
1781-
select {
1782-
case <-ctx.Done():
1783-
log.Warn("SyncExternalUsers: Cancelled before update of %s", s.Name)
1784-
return ErrCancelledf("Before update of %s", s.Name)
1785-
default:
1786-
}
1787-
1788-
if s.IsLDAP() {
1789-
log.Trace("Doing: SyncExternalUsers[%s]", s.Name)
1790-
1791-
var existingUsers []int64
1792-
isAttributeSSHPublicKeySet := len(strings.TrimSpace(s.LDAP().AttributeSSHPublicKey)) > 0
1793-
var sshKeysNeedUpdate bool
1794-
1795-
// Find all users with this login type
1796-
var users []*User
1797-
err = x.Where("login_type = ?", LoginLDAP).
1798-
And("login_source = ?", s.ID).
1799-
Find(&users)
1800-
if err != nil {
1801-
log.Error("SyncExternalUsers: %v", err)
1802-
return err
1803-
}
1804-
select {
1805-
case <-ctx.Done():
1806-
log.Warn("SyncExternalUsers: Cancelled before update of %s", s.Name)
1807-
return ErrCancelledf("Before update of %s", s.Name)
1808-
default:
1809-
}
1810-
1811-
sr, err := s.LDAP().SearchEntries()
1812-
if err != nil {
1813-
log.Error("SyncExternalUsers LDAP source failure [%s], skipped", s.Name)
1814-
continue
1815-
}
1816-
1817-
if len(sr) == 0 {
1818-
if !s.LDAP().AllowDeactivateAll {
1819-
log.Error("LDAP search found no entries but did not report an error. Refusing to deactivate all users")
1820-
continue
1821-
} else {
1822-
log.Warn("LDAP search found no entries but did not report an error. All users will be deactivated as per settings")
1823-
}
1824-
}
1825-
1826-
for _, su := range sr {
1827-
select {
1828-
case <-ctx.Done():
1829-
log.Warn("SyncExternalUsers: Cancelled at update of %s before completed update of users", s.Name)
1830-
// Rewrite authorized_keys file if LDAP Public SSH Key attribute is set and any key was added or removed
1831-
if sshKeysNeedUpdate {
1832-
err = RewriteAllPublicKeys()
1833-
if err != nil {
1834-
log.Error("RewriteAllPublicKeys: %v", err)
1835-
}
1836-
}
1837-
return ErrCancelledf("During update of %s before completed update of users", s.Name)
1838-
default:
1839-
}
1840-
if len(su.Username) == 0 {
1841-
continue
1842-
}
1843-
1844-
if len(su.Mail) == 0 {
1845-
su.Mail = fmt.Sprintf("%s@localhost", su.Username)
1846-
}
1847-
1848-
var usr *User
1849-
// Search for existing user
1850-
for _, du := range users {
1851-
if du.LowerName == strings.ToLower(su.Username) {
1852-
usr = du
1853-
break
1854-
}
1855-
}
1856-
1857-
fullName := ComposeFullName(su.Name, su.Surname, su.Username)
1858-
// If no existing user found, create one
1859-
if usr == nil {
1860-
log.Trace("SyncExternalUsers[%s]: Creating user %s", s.Name, su.Username)
1861-
1862-
usr = &User{
1863-
LowerName: strings.ToLower(su.Username),
1864-
Name: su.Username,
1865-
FullName: fullName,
1866-
LoginType: s.Type,
1867-
LoginSource: s.ID,
1868-
LoginName: su.Username,
1869-
Email: su.Mail,
1870-
IsAdmin: su.IsAdmin,
1871-
IsRestricted: su.IsRestricted,
1872-
IsActive: true,
1873-
}
1874-
1875-
err = CreateUser(usr)
1876-
1877-
if err != nil {
1878-
log.Error("SyncExternalUsers[%s]: Error creating user %s: %v", s.Name, su.Username, err)
1879-
} else if isAttributeSSHPublicKeySet {
1880-
log.Trace("SyncExternalUsers[%s]: Adding LDAP Public SSH Keys for user %s", s.Name, usr.Name)
1881-
if AddLdapSSHPublicKeys(usr, s, su.SSHPublicKey) {
1882-
sshKeysNeedUpdate = true
1883-
}
1884-
}
1885-
} else if updateExisting {
1886-
existingUsers = append(existingUsers, usr.ID)
1887-
1888-
// Synchronize SSH Public Key if that attribute is set
1889-
if isAttributeSSHPublicKeySet && SynchronizeLdapSSHPublicKeys(usr, s, su.SSHPublicKey) {
1890-
sshKeysNeedUpdate = true
1891-
}
1892-
1893-
// Check if user data has changed
1894-
if (len(s.LDAP().AdminFilter) > 0 && usr.IsAdmin != su.IsAdmin) ||
1895-
(len(s.LDAP().RestrictedFilter) > 0 && usr.IsRestricted != su.IsRestricted) ||
1896-
!strings.EqualFold(usr.Email, su.Mail) ||
1897-
usr.FullName != fullName ||
1898-
!usr.IsActive {
1899-
1900-
log.Trace("SyncExternalUsers[%s]: Updating user %s", s.Name, usr.Name)
1901-
1902-
usr.FullName = fullName
1903-
usr.Email = su.Mail
1904-
// Change existing admin flag only if AdminFilter option is set
1905-
if len(s.LDAP().AdminFilter) > 0 {
1906-
usr.IsAdmin = su.IsAdmin
1907-
}
1908-
// Change existing restricted flag only if RestrictedFilter option is set
1909-
if !usr.IsAdmin && len(s.LDAP().RestrictedFilter) > 0 {
1910-
usr.IsRestricted = su.IsRestricted
1911-
}
1912-
usr.IsActive = true
1913-
1914-
err = UpdateUserCols(usr, "full_name", "email", "is_admin", "is_restricted", "is_active")
1915-
if err != nil {
1916-
log.Error("SyncExternalUsers[%s]: Error updating user %s: %v", s.Name, usr.Name, err)
1917-
}
1918-
}
1919-
}
1920-
}
1921-
1922-
// Rewrite authorized_keys file if LDAP Public SSH Key attribute is set and any key was added or removed
1923-
if sshKeysNeedUpdate {
1924-
err = RewriteAllPublicKeys()
1925-
if err != nil {
1926-
log.Error("RewriteAllPublicKeys: %v", err)
1927-
}
1928-
}
1929-
1930-
select {
1931-
case <-ctx.Done():
1932-
log.Warn("SyncExternalUsers: Cancelled during update of %s before delete users", s.Name)
1933-
return ErrCancelledf("During update of %s before delete users", s.Name)
1934-
default:
1935-
}
1936-
1937-
// Deactivate users not present in LDAP
1938-
if updateExisting {
1939-
for _, usr := range users {
1940-
found := false
1941-
for _, uid := range existingUsers {
1942-
if usr.ID == uid {
1943-
found = true
1944-
break
1945-
}
1946-
}
1947-
if !found {
1948-
log.Trace("SyncExternalUsers[%s]: Deactivating user %s", s.Name, usr.Name)
1949-
1950-
usr.IsActive = false
1951-
err = UpdateUserCols(usr, "is_active")
1952-
if err != nil {
1953-
log.Error("SyncExternalUsers[%s]: Error deactivating user %s: %v", s.Name, usr.Name, err)
1954-
}
1955-
}
1956-
}
1957-
}
1958-
}
1959-
}
1960-
return nil
1961-
}
1962-
19631774
// IterateUser iterate users
19641775
func IterateUser(f func(user *User) error) error {
19651776
var start int

0 commit comments

Comments
 (0)