@@ -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.
14011408type 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
19641775func IterateUser (f func (user * User ) error ) error {
19651776 var start int
0 commit comments