@@ -1397,6 +1397,13 @@ func GetUserIDsByNames(names []string, ignoreNonExistent bool) ([]int64, error)
1397
1397
return ids , nil
1398
1398
}
1399
1399
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
+
1400
1407
// UserCommit represents a commit with validation of user.
1401
1408
type UserCommit struct {
1402
1409
User * User
@@ -1658,8 +1665,8 @@ func deleteKeysMarkedForDeletion(keys []string) (bool, error) {
1658
1665
return sshKeysNeedUpdate , nil
1659
1666
}
1660
1667
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 {
1663
1670
var sshKeysNeedUpdate bool
1664
1671
for _ , sshKey := range sshPublicKeys {
1665
1672
var err error
@@ -1680,82 +1687,82 @@ func AddLdapSSHPublicKeys(usr *User, s *LoginSource, sshPublicKeys []string) boo
1680
1687
1681
1688
if _ , err := AddPublicKey (usr .ID , sshKeyName , marshalled , s .ID ); err != nil {
1682
1689
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 )
1684
1691
} 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 )
1686
1693
}
1687
1694
} 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 )
1689
1696
sshKeysNeedUpdate = true
1690
1697
}
1691
1698
}
1692
1699
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 )
1694
1701
}
1695
1702
}
1696
1703
return sshKeysNeedUpdate
1697
1704
}
1698
1705
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 {
1701
1708
var sshKeysNeedUpdate bool
1702
1709
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 )
1704
1711
1705
1712
// Get Public Keys from DB with current LDAP source
1706
1713
var giteaKeys []string
1707
- keys , err := ListPublicLdapSSHKeys (usr .ID , s .ID )
1714
+ keys , err := ListPublicKeysBySource (usr .ID , s .ID )
1708
1715
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 )
1710
1717
}
1711
1718
1712
1719
for _ , v := range keys {
1713
1720
giteaKeys = append (giteaKeys , v .OmitEmail ())
1714
1721
}
1715
1722
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
1718
1725
for _ , v := range sshPublicKeys {
1719
1726
sshKeySplit := strings .Split (v , " " )
1720
1727
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 )
1724
1731
}
1725
1732
}
1726
1733
}
1727
1734
1728
1735
// 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 ))
1731
1738
return false
1732
1739
}
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 ))
1734
1741
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 )
1740
1747
}
1741
1748
}
1742
- if AddLdapSSHPublicKeys (usr , s , newLdapSSHKeys ) {
1749
+ if AddPublicKeysBySource (usr , s , newKeys ) {
1743
1750
sshKeysNeedUpdate = true
1744
1751
}
1745
1752
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
1747
1754
var giteaKeysToDelete []string
1748
1755
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 )
1751
1758
giteaKeysToDelete = append (giteaKeysToDelete , giteaKey )
1752
1759
}
1753
1760
}
1754
1761
1755
- // Delete LDAP keys from DB that doesn't exist in LDAP
1762
+ // Delete keys from DB that no longer exist in the source
1756
1763
needUpd , err := deleteKeysMarkedForDeletion (giteaKeysToDelete )
1757
1764
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 )
1759
1766
}
1760
1767
if needUpd {
1761
1768
sshKeysNeedUpdate = true
@@ -1764,202 +1771,6 @@ func SynchronizeLdapSSHPublicKeys(usr *User, s *LoginSource, sshPublicKeys []str
1764
1771
return sshKeysNeedUpdate
1765
1772
}
1766
1773
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
-
1963
1774
// IterateUser iterate users
1964
1775
func IterateUser (f func (user * User ) error ) error {
1965
1776
var start int
0 commit comments