@@ -2,5 +2,4 @@ language: go | |||||
go: | go: | ||||
- 1.2 | - 1.2 | ||||
- 1.3 | |||||
- tip | |||||
- 1.3 |
@@ -5,7 +5,7 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. | |||||
 |  | ||||
##### Current version: 0.5.2 Beta | |||||
##### Current version: 0.5.3 Beta | |||||
### NOTICES | ### NOTICES | ||||
@@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。 | |||||
 |  | ||||
##### 当前版本:0.5.2 Beta | |||||
##### 当前版本:0.5.3 Beta | |||||
## 开发目的 | ## 开发目的 | ||||
@@ -97,9 +97,10 @@ func newMacaron() *macaron.Macaron { | |||||
Config: *setting.SessionConfig, | Config: *setting.SessionConfig, | ||||
})) | })) | ||||
m.Use(csrf.Generate(csrf.Options{ | m.Use(csrf.Generate(csrf.Options{ | ||||
Secret: setting.SecretKey, | |||||
SetCookie: true, | |||||
Header: "X-Csrf-Token", | |||||
Secret: setting.SecretKey, | |||||
SetCookie: true, | |||||
Header: "X-Csrf-Token", | |||||
CookiePath: setting.AppSubUrl, | |||||
})) | })) | ||||
m.Use(toolbox.Toolboxer(m, toolbox.Options{ | m.Use(toolbox.Toolboxer(m, toolbox.Options{ | ||||
HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ | HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ | ||||
@@ -363,6 +364,15 @@ func runWeb(*cli.Context) { | |||||
r.Any("/:reponame/*", ignSignInAndCsrf, repo.Http) | r.Any("/:reponame/*", ignSignInAndCsrf, repo.Http) | ||||
}) | }) | ||||
// robots.txt | |||||
m.Get("/robots.txt", func(ctx *middleware.Context) { | |||||
if setting.HasRobotsTxt { | |||||
ctx.ServeFile(path.Join(setting.CustomPath, "robots.txt")) | |||||
} else { | |||||
ctx.Error(404) | |||||
} | |||||
}) | |||||
// Not found handler. | // Not found handler. | ||||
m.NotFound(routers.NotFound) | m.NotFound(routers.NotFound) | ||||
@@ -38,6 +38,50 @@ issues = Issues | |||||
cancel = Abbrechen | cancel = Abbrechen | ||||
[install] | |||||
install = Installation | |||||
title = Installation für erstmaligen Start | |||||
requite_db_desc = Gogs erfordert MySQL, PostgreSQL oder SQLite 3, aber SQLite3 ist in der offiziellen binären Version akiviert. | |||||
db_type = Datenbanktyp | |||||
host = Host | |||||
user = Benutzer | |||||
password = Passwort | |||||
db_name = Datenbankname | |||||
db_helper = Bitte verwenden InnoDB-Engine mit utf8_general_ci Zeichensatz für MySQL. | |||||
ssl_mode = SSL-Modus | |||||
path = Pfad | |||||
sqlite_helper = Der Dateipfad des SQLite3 Datenbank. | |||||
general_title = Allgemeine Einstellungen von Gogs | |||||
repo_path = Repository Root-Verzeichnispfad | |||||
repo_path_helper = Alle Git-Repositorys werden in diesem Verzeichnis gespeichert. | |||||
run_user = Ausführender Benutzer | |||||
run_user_helper = Der Benutzer muss die Zugriffsberechtigung für das Repository Root-Verzeichnis haben und der ausführende Benutzer von Gogs sein. | |||||
domain = Domain | |||||
domain_helper = Dies hat Auswirkung auf die SSH clone URLs. | |||||
app_url = Anwendungs-URL | |||||
app_url_helper = Dies hat Auswirkung auf die HTTP/HTTPS clone URLs und für die E-Mails. | |||||
email_title = E-Mail-Service-Einstellungen(Optional) | |||||
smtp_host = SMTP Host | |||||
mailer_user = Sender E-mail | |||||
mailer_password = Sender Passwort | |||||
notify_title = Benachrichtigungseinstellungen(Optional) | |||||
register_confirm = Registrierungsbestätigung aktvieren | |||||
mail_notify = E-Mail-Benachrichtgung aktivieren | |||||
admin_title = Konto-Einstellungen für den Administrator | |||||
admin_name = Benutzername | |||||
admin_password = Passwort | |||||
confirm_password = Passwort bestätigen | |||||
admin_email = E-Mail | |||||
install_gogs = Gogs installieren | |||||
test_git_failed = Fehler beim Test des 'git' Kommandos: %v | |||||
sqlite3_not_available = Deine Version unterstüzt nicht SQLite3, bitte downloade dir die offiziele binäre Version von http://gogs.io/docs/installation/install_from_binary.html, NICHT die gobuild Version. | |||||
invalid_db_setting = Datenbank-Einstellungen sind nicht korrekt: %v | |||||
invalid_repo_path = Repository Root-Verzeichnis ist ungültig: %v | |||||
run_user_not_match = Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s | |||||
save_config_failed = Versuche die Konfiguration zu speichern ist fehlgeschlagen: %v | |||||
invalid_admin_setting = Admin-Konto Einstellungen sind ungültig: %v | |||||
install_success = Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Hab viel Vergnügen damit. | |||||
[home] | [home] | ||||
uname_holder = Benutzername oder E-Mail | uname_holder = Benutzername oder E-Mail | ||||
password_holder = Passwort | password_holder = Passwort | ||||
@@ -47,6 +91,9 @@ collaborative_repos = Gemeinschaftliche Repositorys | |||||
my_orgs = Meine Organisationen | my_orgs = Meine Organisationen | ||||
my_mirrors = Meine Spiegel | my_mirrors = Meine Spiegel | ||||
[explore] | |||||
repos = Repositories | |||||
[auth] | [auth] | ||||
create_new_account = Neues Konto erstellen | create_new_account = Neues Konto erstellen | ||||
register_hepler_msg = Du hast schon ein Konto? Jetzt anmelden! | register_hepler_msg = Du hast schon ein Konto? Jetzt anmelden! | ||||
@@ -81,6 +128,7 @@ HttpsUrl = HTTPS-URL | |||||
PayloadUrl = Payload-URL | PayloadUrl = Payload-URL | ||||
TeamName = Teamname | TeamName = Teamname | ||||
AuthName = Authentifizierungsname | AuthName = Authentifizierungsname | ||||
AdminEmail = Admin E-mail | |||||
require_error = ` darf nicht leer sein.` | require_error = ` darf nicht leer sein.` | ||||
alpha_dash_error = ` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.` | alpha_dash_error = ` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.` | ||||
@@ -125,6 +173,7 @@ ssh_keys = SSH-Schlüssel | |||||
social = Soziale Konten | social = Soziale Konten | ||||
orgs = Organisationen | orgs = Organisationen | ||||
delete = Konto löschen | delete = Konto löschen | ||||
uid = Uid | |||||
public_profile = Öffentliches Profil | public_profile = Öffentliches Profil | ||||
profile_desc = Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken. | profile_desc = Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken. | ||||
@@ -178,7 +227,6 @@ create_repo = Repository erstellen | |||||
default_branch = Standard-Branch | default_branch = Standard-Branch | ||||
mirror_interval = Spiegel-Intervall (in Stunden) | mirror_interval = Spiegel-Intervall (in Stunden) | ||||
goget_meta = Go-Get Meta | goget_meta = Go-Get Meta | ||||
goget_meta_helper = This repository will be <span class="label label-blue label-radius">Go-Getable</span> | |||||
goget_meta_helper = Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können. | goget_meta_helper = Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können. | ||||
need_auth = Authorisierung benötigt | need_auth = Authorisierung benötigt | ||||
@@ -210,11 +258,13 @@ settings.site = Offizielle Webseite | |||||
settings.update_settings = Aktualisierungseinstellungen | settings.update_settings = Aktualisierungseinstellungen | ||||
settings.transfer = Besitz übertragen | settings.transfer = Besitz übertragen | ||||
settings.transfer_desc = Übertrage dieses Repository einem anderen Benutzer oder einer Organisation. | settings.transfer_desc = Übertrage dieses Repository einem anderen Benutzer oder einer Organisation. | ||||
settings.new_owner_has_same_repo = Neuer Eigentümer hat bereits ein Repository mit dem gleichen Namen. | |||||
settings.delete = Repository löschen | settings.delete = Repository löschen | ||||
settings.delete_desc = Wenn dieses Repository gelöschet ist, gibt es keinen Weg zurück. Sei dir sicher! | settings.delete_desc = Wenn dieses Repository gelöschet ist, gibt es keinen Weg zurück. Sei dir sicher! | ||||
settings.update_settings_success = Repository-Optionen aktualisiert | settings.update_settings_success = Repository-Optionen aktualisiert | ||||
settings.transfer_owner = Neuer Besitzer | settings.transfer_owner = Neuer Besitzer | ||||
settings.make_transfer = übertragen | settings.make_transfer = übertragen | ||||
settings.transfer_succeed = Repository-Eigentum wurde erfolgreich übertragen. | |||||
settings.confirm_delete = Löschen | settings.confirm_delete = Löschen | ||||
settings.add_collaborator = Mitarbeiter hinzufügen | settings.add_collaborator = Mitarbeiter hinzufügen | ||||
settings.add_collaborator_success = Mitarbeiter hinzugefügt | settings.add_collaborator_success = Mitarbeiter hinzugefügt | ||||
@@ -271,6 +321,7 @@ settings.delete = Organisation löschen | |||||
settings.delete_account = Diese Organisation löschen | settings.delete_account = Diese Organisation löschen | ||||
settings.delete_prompt = Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden! | settings.delete_prompt = Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden! | ||||
settings.confirm_delete_account = Löschen | settings.confirm_delete_account = Löschen | ||||
settings.hooks_desc = Add webhooks that will be triggered for <strong>all repositories</strong> under this organization. | |||||
members.public = Öffentlich | members.public = Öffentlich | ||||
members.public_helper = Privat machen | members.public_helper = Privat machen | ||||
@@ -515,3 +566,16 @@ months = %d Monate %s | |||||
years = %d Jahre %s | years = %d Jahre %s | ||||
raw_seconds = Sekunden | raw_seconds = Sekunden | ||||
raw_minutes = Minuten | raw_minutes = Minuten | ||||
@@ -17,7 +17,7 @@ import ( | |||||
"github.com/gogits/gogs/modules/setting" | "github.com/gogits/gogs/modules/setting" | ||||
) | ) | ||||
const APP_VER = "0.5.3.0919 Beta" | |||||
const APP_VER = "0.5.3.0921 Beta" | |||||
func init() { | func init() { | ||||
runtime.GOMAXPROCS(runtime.NumCPU()) | runtime.GOMAXPROCS(runtime.NumCPU()) | ||||
@@ -48,7 +48,7 @@ func Toggle(options *ToggleOptions) macaron.Handler { | |||||
if strings.HasSuffix(ctx.Req.RequestURI, "watch") { | if strings.HasSuffix(ctx.Req.RequestURI, "watch") { | ||||
return | return | ||||
} | } | ||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI)) | |||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | ctx.Redirect(setting.AppSubUrl + "/user/login") | ||||
return | return | ||||
} else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | } else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | ||||
@@ -298,7 +298,7 @@ func RequireTrueOwner() macaron.Handler { | |||||
return func(ctx *Context) { | return func(ctx *Context) { | ||||
if !ctx.Repo.IsTrueOwner && !ctx.Repo.IsAdmin { | if !ctx.Repo.IsTrueOwner && !ctx.Repo.IsAdmin { | ||||
if !ctx.IsSigned { | if !ctx.IsSigned { | ||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI)) | |||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | ctx.Redirect(setting.AppSubUrl + "/user/login") | ||||
return | return | ||||
} | } | ||||
@@ -108,6 +108,7 @@ var ( | |||||
ProdMode bool | ProdMode bool | ||||
RunUser string | RunUser string | ||||
IsWindows bool | IsWindows bool | ||||
HasRobotsTxt bool | |||||
) | ) | ||||
func init() { | func init() { | ||||
@@ -260,6 +261,8 @@ func NewConfigContext() { | |||||
Langs = Cfg.MustValueArray("i18n", "LANGS", ",") | Langs = Cfg.MustValueArray("i18n", "LANGS", ",") | ||||
Names = Cfg.MustValueArray("i18n", "NAMES", ",") | Names = Cfg.MustValueArray("i18n", "NAMES", ",") | ||||
HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) | |||||
} | } | ||||
var Service struct { | var Service struct { | ||||
@@ -380,6 +383,7 @@ func newSessionService() { | |||||
SessionConfig = new(session.Config) | SessionConfig = new(session.Config) | ||||
SessionConfig.ProviderConfig = strings.Trim(Cfg.MustValue("session", "PROVIDER_CONFIG"), "\" ") | SessionConfig.ProviderConfig = strings.Trim(Cfg.MustValue("session", "PROVIDER_CONFIG"), "\" ") | ||||
SessionConfig.CookieName = Cfg.MustValue("session", "COOKIE_NAME", "i_like_gogits") | SessionConfig.CookieName = Cfg.MustValue("session", "COOKIE_NAME", "i_like_gogits") | ||||
SessionConfig.CookiePath = AppSubUrl | |||||
SessionConfig.Secure = Cfg.MustBool("session", "COOKIE_SECURE") | SessionConfig.Secure = Cfg.MustBool("session", "COOKIE_SECURE") | ||||
SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true) | SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true) | ||||
SessionConfig.Gclifetime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400) | SessionConfig.Gclifetime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400) | ||||
@@ -54,7 +54,7 @@ func Issues(ctx *middleware.Context) { | |||||
isShowClosed := ctx.Query("state") == "closed" | isShowClosed := ctx.Query("state") == "closed" | ||||
if viewType != "all" && !ctx.IsSigned { | if viewType != "all" && !ctx.IsSigned { | ||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI)) | |||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | ctx.Redirect(setting.AppSubUrl + "/user/login") | ||||
return | return | ||||
} | } | ||||
@@ -52,8 +52,8 @@ func SignIn(ctx *middleware.Context) { | |||||
defer func() { | defer func() { | ||||
if !isSucceed { | if !isSucceed { | ||||
log.Trace("auto-login cookie cleared: %s", uname) | log.Trace("auto-login cookie cleared: %s", uname) | ||||
ctx.SetCookie(setting.CookieUserName, "", -1) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1) | |||||
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl) | |||||
return | return | ||||
} | } | ||||
}() | }() | ||||
@@ -77,7 +77,7 @@ func SignIn(ctx *middleware.Context) { | |||||
ctx.Session.Set("uid", u.Id) | ctx.Session.Set("uid", u.Id) | ||||
ctx.Session.Set("uname", u.Name) | ctx.Session.Set("uname", u.Name) | ||||
if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { | if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { | ||||
ctx.SetCookie("redirect_to", "", -1) | |||||
ctx.SetCookie("redirect_to", "", -1, setting.AppSubUrl) | |||||
ctx.Redirect(redirectTo) | ctx.Redirect(redirectTo) | ||||
return | return | ||||
} | } | ||||
@@ -113,9 +113,9 @@ func SignInPost(ctx *middleware.Context, form auth.SignInForm) { | |||||
if form.Remember { | if form.Remember { | ||||
days := 86400 * setting.LogInRememberDays | days := 86400 * setting.LogInRememberDays | ||||
ctx.SetCookie(setting.CookieUserName, u.Name, days) | |||||
ctx.SetCookie(setting.CookieUserName, u.Name, days, setting.AppSubUrl) | |||||
ctx.SetSuperSecureCookie(base.EncodeMd5(u.Rands+u.Passwd), | ctx.SetSuperSecureCookie(base.EncodeMd5(u.Rands+u.Passwd), | ||||
setting.CookieRememberName, u.Name, days) | |||||
setting.CookieRememberName, u.Name, days, setting.AppSubUrl) | |||||
} | } | ||||
// Bind with social account. | // Bind with social account. | ||||
@@ -135,7 +135,7 @@ func SignInPost(ctx *middleware.Context, form auth.SignInForm) { | |||||
ctx.Session.Set("uid", u.Id) | ctx.Session.Set("uid", u.Id) | ||||
ctx.Session.Set("uname", u.Name) | ctx.Session.Set("uname", u.Name) | ||||
if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { | if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { | ||||
ctx.SetCookie("redirect_to", "", -1) | |||||
ctx.SetCookie("redirect_to", "", -1, setting.AppSubUrl) | |||||
ctx.Redirect(redirectTo) | ctx.Redirect(redirectTo) | ||||
return | return | ||||
} | } | ||||
@@ -149,8 +149,8 @@ func SignOut(ctx *middleware.Context) { | |||||
ctx.Session.Delete("socialId") | ctx.Session.Delete("socialId") | ||||
ctx.Session.Delete("socialName") | ctx.Session.Delete("socialName") | ||||
ctx.Session.Delete("socialEmail") | ctx.Session.Delete("socialEmail") | ||||
ctx.SetCookie(setting.CookieUserName, "", -1) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1) | |||||
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/") | ctx.Redirect(setting.AppSubUrl + "/") | ||||
} | } | ||||
@@ -1 +1 @@ | |||||
0.5.3.0919 Beta | |||||
0.5.3.0921 Beta |