mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 08:02:36 +09:00 
			
		
		
		
	Extract the username and password from the mirror url (#7651)
* Explode out mirror username and password * Update models/repo_mirror.go * Just roundtrip the password * remove unused declaration * Update templates/repo/settings/options.tmpl
This commit is contained in:
		@@ -7,6 +7,7 @@ package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
@@ -119,7 +120,7 @@ func sanitizeOutput(output, repoPath string) (string, error) {
 | 
			
		||||
	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)
 | 
			
		||||
@@ -131,6 +132,41 @@ func (m *Mirror) FullAddress() string {
 | 
			
		||||
	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()
 | 
			
		||||
 
 | 
			
		||||
@@ -103,6 +103,8 @@ type RepoSettingForm struct {
 | 
			
		||||
	Website        string `binding:"ValidUrl;MaxSize(255)"`
 | 
			
		||||
	Interval       string
 | 
			
		||||
	MirrorAddress  string
 | 
			
		||||
	MirrorUsername string
 | 
			
		||||
	MirrorPassword string
 | 
			
		||||
	Private        bool
 | 
			
		||||
	EnablePrune    bool
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -584,7 +584,7 @@ mirror_prune_desc = Remove obsolete remote-tracking references
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
@@ -169,6 +169,10 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 | 
			
		||||
			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 != "" {
 | 
			
		||||
 
 | 
			
		||||
@@ -80,9 +80,26 @@
 | 
			
		||||
					</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>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user