mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	@@ -511,6 +511,8 @@ dashboard.delete_repo_archives = Delete all repositories archives
 | 
			
		||||
dashboard.delete_repo_archives_success = All repositories archives have been deleted successfully.
 | 
			
		||||
dashboard.git_gc_repos = Do garbage collection on repositories
 | 
			
		||||
dashboard.git_gc_repos_success = All repositories have done garbage collection successfully.
 | 
			
		||||
dashboard.resync_all_sshkeys = Do resync .ssh/autorized_key file
 | 
			
		||||
dashboard.resync_all_sshkeys_success = All keys are synced again.
 | 
			
		||||
dashboard.server_uptime = Server Uptime
 | 
			
		||||
dashboard.current_goroutine = Current Goroutines
 | 
			
		||||
dashboard.current_memory_usage = Current Memory Usage
 | 
			
		||||
@@ -711,16 +713,3 @@ months = %d months %s
 | 
			
		||||
years = %d years %s
 | 
			
		||||
raw_seconds = seconds
 | 
			
		||||
raw_minutes = minutes
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -163,7 +163,7 @@ func CheckPublicKeyString(content string) (bool, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// saveAuthorizedKeyFile writes SSH key content to authorized_keys file.
 | 
			
		||||
func saveAuthorizedKeyFile(key *PublicKey) error {
 | 
			
		||||
func saveAuthorizedKeyFile(keys ...*PublicKey) error {
 | 
			
		||||
	sshOpLocker.Lock()
 | 
			
		||||
	defer sshOpLocker.Unlock()
 | 
			
		||||
 | 
			
		||||
@@ -188,8 +188,13 @@ func saveAuthorizedKeyFile(key *PublicKey) error {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = f.WriteString(key.GetAuthorizedString())
 | 
			
		||||
	return err
 | 
			
		||||
	for _, key := range keys {
 | 
			
		||||
		_, err = f.WriteString(key.GetAuthorizedString())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddPublicKey adds new public key to database and authorized_keys file.
 | 
			
		||||
@@ -341,3 +346,21 @@ func DeletePublicKey(key *PublicKey) error {
 | 
			
		||||
	}
 | 
			
		||||
	return os.Rename(tmpPath, fpath)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RewriteAllPublicKeys remove any authorized key and re-write all key from database again
 | 
			
		||||
func RewriteAllPublicKeys() error {
 | 
			
		||||
	keys := make([]*PublicKey, 0, 5)
 | 
			
		||||
	err := x.Find(&keys)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fpath := filepath.Join(SshPath, "authorized_keys")
 | 
			
		||||
	if _, err := os.Stat(fpath); os.IsNotExist(err) {
 | 
			
		||||
		return saveAuthorizedKeyFile(keys...)
 | 
			
		||||
	}
 | 
			
		||||
	if err := os.Remove(fpath); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return saveAuthorizedKeyFile(keys...)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -118,6 +118,7 @@ const (
 | 
			
		||||
	CLEAN_INACTIVATE_USER
 | 
			
		||||
	CLEAN_REPO_ARCHIVES
 | 
			
		||||
	GIT_GC_REPOS
 | 
			
		||||
	SYNC_SSH_AUTHORIZED_KEY
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Dashboard(ctx *middleware.Context) {
 | 
			
		||||
@@ -144,6 +145,9 @@ func Dashboard(ctx *middleware.Context) {
 | 
			
		||||
		case GIT_GC_REPOS:
 | 
			
		||||
			success = ctx.Tr("admin.dashboard.git_gc_repos_success")
 | 
			
		||||
			err = models.GitGcRepos()
 | 
			
		||||
		case SYNC_SSH_AUTHORIZED_KEY:
 | 
			
		||||
			success = ctx.Tr("admin.dashboard.resync_all_sshkeys_success")
 | 
			
		||||
			err = models.RewriteAllPublicKeys()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,11 @@
 | 
			
		||||
                                                <td>{{.i18n.Tr "admin.dashboard.git_gc_repos"}}</td>
 | 
			
		||||
                                                <td><i class="fa fa-caret-square-o-right"></i> <a href="{{AppSubUrl}}/admin?op=4">{{.i18n.Tr "admin.dashboard.operation_run"}}</a></td>
 | 
			
		||||
                                            </tr>
 | 
			
		||||
                                            <tr>
 | 
			
		||||
                                                <td>{{.i18n.Tr "admin.dashboard.resync_all_sshkeys"}}</td>
 | 
			
		||||
                                                <td><i class="fa fa-caret-square-o-right"></i> <a href="{{AppSubUrl}}/admin?op=5">{{.i18n.Tr "admin.dashboard.operation_run"}}</a></td>
 | 
			
		||||
                                            </tr>
 | 
			
		||||
 | 
			
		||||
                                        </tbody>
 | 
			
		||||
                                    </table>
 | 
			
		||||
                                </div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user