@@ -64,7 +64,7 @@ app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in e-mail. | |||||
email_title = E-mail Service Settings(Optional) | email_title = E-mail Service Settings(Optional) | ||||
smtp_host = SMTP Host | smtp_host = SMTP Host | ||||
mailer_user = Sender E-mail | mailer_user = Sender E-mail | ||||
mailer_password = Sender Password | |||||
mailer_password = Sender Password | |||||
notify_title = Notification Settings(Optional) | notify_title = Notification Settings(Optional) | ||||
register_confirm = Enable Register Confirmation | register_confirm = Enable Register Confirmation | ||||
mail_notify = Enable Mail Notification | mail_notify = Enable Mail Notification | ||||
@@ -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.delete_repo_archives_success = All repositories archives have been deleted successfully. | ||||
dashboard.git_gc_repos = Do garbage collection on repositories | dashboard.git_gc_repos = Do garbage collection on repositories | ||||
dashboard.git_gc_repos_success = All repositories have done garbage collection successfully. | 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.server_uptime = Server Uptime | ||||
dashboard.current_goroutine = Current Goroutines | dashboard.current_goroutine = Current Goroutines | ||||
dashboard.current_memory_usage = Current Memory Usage | dashboard.current_memory_usage = Current Memory Usage | ||||
@@ -711,16 +713,3 @@ months = %d months %s | |||||
years = %d years %s | years = %d years %s | ||||
raw_seconds = seconds | raw_seconds = seconds | ||||
raw_minutes = minutes | raw_minutes = minutes | ||||
@@ -163,7 +163,7 @@ func CheckPublicKeyString(content string) (bool, error) { | |||||
} | } | ||||
// saveAuthorizedKeyFile writes SSH key content to authorized_keys file. | // saveAuthorizedKeyFile writes SSH key content to authorized_keys file. | ||||
func saveAuthorizedKeyFile(key *PublicKey) error { | |||||
func saveAuthorizedKeyFile(keys ...*PublicKey) error { | |||||
sshOpLocker.Lock() | sshOpLocker.Lock() | ||||
defer sshOpLocker.Unlock() | 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. | // 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) | 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_INACTIVATE_USER | ||||
CLEAN_REPO_ARCHIVES | CLEAN_REPO_ARCHIVES | ||||
GIT_GC_REPOS | GIT_GC_REPOS | ||||
SYNC_SSH_AUTHORIZED_KEY | |||||
) | ) | ||||
func Dashboard(ctx *middleware.Context) { | func Dashboard(ctx *middleware.Context) { | ||||
@@ -144,6 +145,9 @@ func Dashboard(ctx *middleware.Context) { | |||||
case GIT_GC_REPOS: | case GIT_GC_REPOS: | ||||
success = ctx.Tr("admin.dashboard.git_gc_repos_success") | success = ctx.Tr("admin.dashboard.git_gc_repos_success") | ||||
err = models.GitGcRepos() | err = models.GitGcRepos() | ||||
case SYNC_SSH_AUTHORIZED_KEY: | |||||
success = ctx.Tr("admin.dashboard.resync_all_sshkeys_success") | |||||
err = models.RewriteAllPublicKeys() | |||||
} | } | ||||
if err != nil { | if err != nil { | ||||
@@ -48,6 +48,11 @@ | |||||
<td>{{.i18n.Tr "admin.dashboard.git_gc_repos"}}</td> | <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> | <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> | ||||
<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> | </tbody> | ||||
</table> | </table> | ||||
</div> | </div> | ||||