import (
"fmt"
+ "net/url"
"strings"
"time"
return util.SanitizeMessage(output, remoteAddr), nil
}
-// Address returns mirror address from Git repository config without credentials.
+// Address returns mirror address from Git repository config with credentials censored.
func (m *Mirror) Address() string {
m.readAddress()
return util.SanitizeURLCredentials(m.address, false)
return m.address
}
+// AddressNoCredentials returns mirror address from Git repository config without credentials.
+func (m *Mirror) AddressNoCredentials() string {
+ m.readAddress()
+ u, err := url.Parse(m.address)
+ if err != nil {
+ // this shouldn't happen but just return it unsanitised
+ return m.address
+ }
+ u.User = nil
+ return u.String()
+}
+
+// Username returns the mirror address username
+func (m *Mirror) Username() string {
+ m.readAddress()
+ u, err := url.Parse(m.address)
+ if err != nil {
+ // this shouldn't happen but if it does return ""
+ return ""
+ }
+ return u.User.Username()
+}
+
+// Password returns the mirror address password
+func (m *Mirror) Password() string {
+ m.readAddress()
+ u, err := url.Parse(m.address)
+ if err != nil {
+ // this shouldn't happen but if it does return ""
+ return ""
+ }
+ password, _ := u.User.Password()
+ return password
+}
+
// SaveAddress writes new address to Git repository config.
func (m *Mirror) SaveAddress(addr string) error {
repoPath := m.Repo.RepoPath()
// RepoSettingForm form for changing repository settings
type RepoSettingForm struct {
- RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
- Description string `binding:"MaxSize(255)"`
- Website string `binding:"ValidUrl;MaxSize(255)"`
- Interval string
- MirrorAddress string
- Private bool
- EnablePrune bool
+ RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
+ Description string `binding:"MaxSize(255)"`
+ Website string `binding:"ValidUrl;MaxSize(255)"`
+ Interval string
+ MirrorAddress string
+ MirrorUsername string
+ MirrorPassword string
+ Private bool
+ EnablePrune bool
// Advanced settings
EnableWiki bool
mirror_interval = Mirror Interval (valid time units are 'h', 'm', 's'). 0 to disable automatic sync.
mirror_interval_invalid = The mirror interval is not valid.
mirror_address = Clone From URL
-mirror_address_desc = Include any required authorization credentials in the URL. These must be url escaped as appropriate
+mirror_address_desc = Put any required credentials in the Clone Authorization section.
mirror_address_url_invalid = The provided url is invalid. You must escape all components of the url correctly.
mirror_address_protocol_invalid = The provided url is invalid. Only http(s):// or git:// locations can be mirrored from.
mirror_last_synced = Last Synchronized
return
}
+ if form.MirrorUsername != "" || form.MirrorPassword != "" {
+ u.User = url.UserPassword(form.MirrorUsername, form.MirrorPassword)
+ }
+
// Now use xurls
address := validFormAddress.FindString(form.MirrorAddress)
if address != form.MirrorAddress && form.MirrorAddress != "" {
</div>
<div class="field {{if .Err_MirrorAddress}}error{{end}}">
<label for="mirror_address">{{.i18n.Tr "repo.mirror_address"}}</label>
- <input id="mirror_address" name="mirror_address" value="{{.Mirror.FullAddress}}" required>
+ <input id="mirror_address" name="mirror_address" value="{{.Mirror.AddressNoCredentials}}" required>
<p class="help">{{.i18n.Tr "repo.mirror_address_desc"}}</p>
</div>
+ <div class="ui accordion optional field">
+ <label class="ui title {{if .Err_Auth}}text red active{{end}}">
+ <i class="icon dropdown"></i>
+ <label for="">{{.i18n.Tr "repo.need_auth"}}</label>
+ </label>
+ <div class="content {{if .Err_Auth}}active{{else if .Mirror.Username}}active{{end}}">
+ <div class="inline field {{if .Err_Auth}}error{{end}}">
+ <label for="mirror_username">{{.i18n.Tr "username"}}</label>
+ <input id="mirror_username" name="mirror_username" value="{{.Mirror.Username}}" {{if not .mirror_username}}data-need-clear="true"{{end}}>
+ </div>
+ <input class="fake" type="password">
+ <div class="inline field {{if .Err_Auth}}error{{end}}">
+ <label for="mirror_password">{{.i18n.Tr "password"}}</label>
+ <input id="mirror_password" name="mirror_password" type="password" value="{{.Mirror.Password}}" {{if not .mirror_password}}data-need-clear="true"{{end}}>
+ </div>
+ </div>
+ </div>
<div class="field">
<button class="ui green button">{{$.i18n.Tr "repo.settings.update_settings"}}</button>