11// Copyright 2014 The Gogs Authors. All rights reserved. 
2+ // Copyright 2019 The Gitea Authors. All rights reserved. 
23// Use of this source code is governed by a MIT-style 
34// license that can be found in the LICENSE file. 
45
56package  admin
67
78import  (
89	"fmt" 
10+ 	"net/url" 
911	"os" 
1012	"runtime" 
1113	"strings" 
@@ -19,6 +21,7 @@ import (
1921	"code.gitea.io/gitea/modules/context" 
2022	"code.gitea.io/gitea/modules/cron" 
2123	"code.gitea.io/gitea/modules/git" 
24+ 	"code.gitea.io/gitea/modules/log" 
2225	"code.gitea.io/gitea/modules/process" 
2326	"code.gitea.io/gitea/modules/setting" 
2427)
@@ -202,6 +205,63 @@ func SendTestMail(ctx *context.Context) {
202205	ctx .Redirect (setting .AppSubURL  +  "/admin/config" )
203206}
204207
208+ func  shadownPasswordKV (cfgItem , splitter  string ) string  {
209+ 	fields  :=  strings .Split (cfgItem , splitter )
210+ 	for  i  :=  0 ; i  <  len (fields ); i ++  {
211+ 		if  strings .HasPrefix (fields [i ], "password=" ) {
212+ 			fields [i ] =  "password=******" 
213+ 			break 
214+ 		}
215+ 	}
216+ 	return  strings .Join (fields , splitter )
217+ }
218+ 
219+ func  shadownURL (provider , cfgItem  string ) string  {
220+ 	u , err  :=  url .Parse (cfgItem )
221+ 	if  err  !=  nil  {
222+ 		log .Error ("shodowPassword %v failed: %v" , provider , err )
223+ 		return  cfgItem 
224+ 	}
225+ 	if  u .User  !=  nil  {
226+ 		atIdx  :=  strings .Index (cfgItem , "@" )
227+ 		if  atIdx  >  0  {
228+ 			colonIdx  :=  strings .LastIndex (cfgItem [:atIdx ], ":" )
229+ 			if  colonIdx  >  0  {
230+ 				return  cfgItem [:colonIdx + 1 ] +  "******"  +  cfgItem [atIdx :]
231+ 			}
232+ 		}
233+ 	}
234+ 	return  cfgItem 
235+ }
236+ 
237+ func  shadowPassword (provider , cfgItem  string ) string  {
238+ 	switch  provider  {
239+ 	case  "redis" :
240+ 		return  shadownPasswordKV (cfgItem , "," )
241+ 	case  "mysql" :
242+ 		//root:@tcp(localhost:3306)/macaron?charset=utf8 
243+ 		atIdx  :=  strings .Index (cfgItem , "@" )
244+ 		if  atIdx  >  0  {
245+ 			colonIdx  :=  strings .Index (cfgItem [:atIdx ], ":" )
246+ 			if  colonIdx  >  0  {
247+ 				return  cfgItem [:colonIdx + 1 ] +  "******"  +  cfgItem [atIdx :]
248+ 			}
249+ 		}
250+ 		return  cfgItem 
251+ 	case  "postgres" :
252+ 		// user=jiahuachen dbname=macaron port=5432 sslmode=disable 
253+ 		if  ! strings .HasPrefix (cfgItem , "postgres://" ) {
254+ 			return  shadownPasswordKV (cfgItem , " " )
255+ 		}
256+ 
257+ 		// postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full 
258+ 		// Notice: use shadwonURL 
259+ 	}
260+ 
261+ 	// "couchbase" 
262+ 	return  shadownURL (provider , cfgItem )
263+ }
264+ 
205265// Config show admin config page 
206266func  Config (ctx  * context.Context ) {
207267	ctx .Data ["Title" ] =  ctx .Tr ("admin.config" )
@@ -239,10 +299,14 @@ func Config(ctx *context.Context) {
239299
240300	ctx .Data ["CacheAdapter" ] =  setting .CacheService .Adapter 
241301	ctx .Data ["CacheInterval" ] =  setting .CacheService .Interval 
242- 	ctx .Data ["CacheConn" ] =  setting .CacheService .Conn 
302+ 
303+ 	ctx .Data ["CacheConn" ] =  shadowPassword (setting .CacheService .Adapter , setting .CacheService .Conn )
243304	ctx .Data ["CacheItemTTL" ] =  setting .CacheService .TTL 
244305
245- 	ctx .Data ["SessionConfig" ] =  setting .SessionConfig 
306+ 	sessionCfg  :=  setting .SessionConfig 
307+ 	sessionCfg .ProviderConfig  =  shadowPassword (sessionCfg .Provider , sessionCfg .ProviderConfig )
308+ 
309+ 	ctx .Data ["SessionConfig" ] =  sessionCfg 
246310
247311	ctx .Data ["DisableGravatar" ] =  setting .DisableGravatar 
248312	ctx .Data ["EnableFederatedAvatar" ] =  setting .EnableFederatedAvatar 
0 commit comments