]> source.dussan.org Git - gitea.git/commitdiff
Extract the username and password from the mirror url (#7651)
authorzeripath <art27@cantab.net>
Fri, 16 Aug 2019 21:56:57 +0000 (22:56 +0100)
committerGitHub <noreply@github.com>
Fri, 16 Aug 2019 21:56:57 +0000 (22:56 +0100)
* Explode out mirror username and password

* Update models/repo_mirror.go

* Just roundtrip the password

* remove unused declaration

* Update templates/repo/settings/options.tmpl

models/repo_mirror.go
modules/auth/repo_form.go
options/locale/locale_en-US.ini
routers/repo/setting.go
templates/repo/settings/options.tmpl

index 7f703a1c978491e2df02c1625d8485351d0dcfc4..02c87daf69356206db05b32ba4d2c282f3df73f8 100644 (file)
@@ -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()
index 0333c3c92614a195cf7e113d81a88ddada7ce877..cdac210ddeaff56f3f08eca8c5a1c55f7a414356 100644 (file)
@@ -98,13 +98,15 @@ func (f MigrateRepoForm) ParseRemoteAddr(user *models.User) (string, error) {
 
 // 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
index 0df7cdf7e0d09a831f0356f77058192bd14f2ea4..fb86d54903756c694c98af335b184d54687e4ccf 100644 (file)
@@ -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
index c9ecb6302059b6c5712c9f917fe0dc2912588919..38c6ecf56e9f19b7ff2d6a80062a8362f04f9034 100644 (file)
@@ -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 != "" {
index c6d715acbee88ab36277cd6a39863869f1a8ebee..87e23b693700196fc49045c6932b004755e6338a 100644 (file)
                                        </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>