Add add and delete SSH key
This commit is contained in:
		
							parent
							
								
									efa039a0f7
								
							
						
					
					
						commit
						897329a644
					
				
					 11 changed files with 117 additions and 78 deletions
				
			
		
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							|  | @ -19,7 +19,7 @@ import ( | |||
| // Test that go1.1 tag above is included in builds. main.go refers to this definition.
 | ||||
| const go11tag = true | ||||
| 
 | ||||
| const APP_VER = "0.0.2.0309" | ||||
| const APP_VER = "0.0.2.0310" | ||||
| 
 | ||||
| func init() { | ||||
| 	runtime.GOMAXPROCS(runtime.NumCPU()) | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ package models | |||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
|  | @ -83,7 +84,8 @@ func CreateRepository(user *User, repoName, desc string, private bool) (*Reposit | |||
| 
 | ||||
| 	if _, err = session.Insert(repo); err != nil { | ||||
| 		if err2 := os.RemoveAll(f); err2 != nil { | ||||
| 			log.Error("delete repo directory %s/%s failed", user.Name, repoName) | ||||
| 			return nil, errors.New(fmt.Sprintf( | ||||
| 				"delete repo directory %s/%s failed", user.Name, repoName)) | ||||
| 		} | ||||
| 		session.Rollback() | ||||
| 		return nil, err | ||||
|  | @ -97,7 +99,8 @@ func CreateRepository(user *User, repoName, desc string, private bool) (*Reposit | |||
| 	} | ||||
| 	if _, err = session.Insert(&access); err != nil { | ||||
| 		if err2 := os.RemoveAll(f); err2 != nil { | ||||
| 			log.Error("delete repo directory %s/%s failed", user.Name, repoName) | ||||
| 			return nil, errors.New(fmt.Sprintf( | ||||
| 				"delete repo directory %s/%s failed", user.Name, repoName)) | ||||
| 		} | ||||
| 		session.Rollback() | ||||
| 		return nil, err | ||||
|  | @ -105,7 +108,8 @@ func CreateRepository(user *User, repoName, desc string, private bool) (*Reposit | |||
| 
 | ||||
| 	if _, err = session.Exec("update user set num_repos = num_repos + 1 where id = ?", user.Id); err != nil { | ||||
| 		if err2 := os.RemoveAll(f); err2 != nil { | ||||
| 			log.Error("delete repo directory %s/%s failed", user.Name, repoName) | ||||
| 			return nil, errors.New(fmt.Sprintf( | ||||
| 				"delete repo directory %s/%s failed", user.Name, repoName)) | ||||
| 		} | ||||
| 		session.Rollback() | ||||
| 		return nil, err | ||||
|  | @ -113,7 +117,8 @@ func CreateRepository(user *User, repoName, desc string, private bool) (*Reposit | |||
| 
 | ||||
| 	if err = session.Commit(); err != nil { | ||||
| 		if err2 := os.RemoveAll(f); err2 != nil { | ||||
| 			log.Error("delete repo directory %s/%s failed", user.Name, repoName) | ||||
| 			return nil, errors.New(fmt.Sprintf( | ||||
| 				"delete repo directory %s/%s failed", user.Name, repoName)) | ||||
| 		} | ||||
| 		session.Rollback() | ||||
| 		return nil, err | ||||
|  | @ -121,6 +126,14 @@ func CreateRepository(user *User, repoName, desc string, private bool) (*Reposit | |||
| 	return repo, nil | ||||
| } | ||||
| 
 | ||||
| // InitRepository initializes README and .gitignore if needed.
 | ||||
| func InitRepository(repo *Repository, initReadme bool, repoLang string) error { | ||||
| 	// README.
 | ||||
| 
 | ||||
| 	// .gitignore
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // GetRepositories returns the list of repositories of given user.
 | ||||
| func GetRepositories(user *User) ([]Repository, error) { | ||||
| 	repos := make([]Repository, 0, 10) | ||||
|  |  | |||
							
								
								
									
										55
									
								
								modules/auth/setting.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								modules/auth/setting.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | |||
| // Copyright 2014 The Gogs Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package auth | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/codegangsta/martini" | ||||
| 
 | ||||
| 	"github.com/gogits/binding" | ||||
| 
 | ||||
| 	"github.com/gogits/gogs/modules/base" | ||||
| 	"github.com/gogits/gogs/modules/log" | ||||
| ) | ||||
| 
 | ||||
| type AddSSHKeyForm struct { | ||||
| 	KeyName    string `form:"keyname" binding:"Required"` | ||||
| 	KeyContent string `form:"key_content" binding:"Required"` | ||||
| } | ||||
| 
 | ||||
| func (f *AddSSHKeyForm) Name(field string) string { | ||||
| 	names := map[string]string{ | ||||
| 		"KeyName":    "SSH key name", | ||||
| 		"KeyContent": "SSH key content", | ||||
| 	} | ||||
| 	return names[field] | ||||
| } | ||||
| 
 | ||||
| func (f *AddSSHKeyForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | ||||
| 	data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | ||||
| 	AssignForm(f, data) | ||||
| 
 | ||||
| 	if req.Method == "GET" || errors.Count() == 0 { | ||||
| 		if req.Method == "POST" && | ||||
| 			(len(f.KeyContent) < 100 || !strings.HasPrefix(f.KeyContent, "ssh-rsa")) { | ||||
| 			data["HasError"] = true | ||||
| 			data["ErrorMsg"] = "SSH key content is not valid" | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	data["HasError"] = true | ||||
| 	if len(errors.Overall) > 0 { | ||||
| 		for _, err := range errors.Overall { | ||||
| 			log.Error("AddSSHKeyForm.Validate: %v", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	validate(errors, data, f) | ||||
| } | ||||
|  | @ -44,16 +44,14 @@ func Create(form auth.CreateRepoForm, req *http.Request, r render.Render, data b | |||
| 	} | ||||
| 	fmt.Println(models.RepoPath(user.Name, form.RepoName)) | ||||
| 	if err == nil { | ||||
| 		if _, err = models.CreateRepository(user, | ||||
| 		if repo, err := models.CreateRepository(user, | ||||
| 			form.RepoName, form.Description, form.Visibility == "private"); err == nil { | ||||
| 			// Initialize README.
 | ||||
| 			if form.InitReadme == "true" { | ||||
| 				// TODO
 | ||||
| 			err = models.InitRepository(repo, form.InitReadme == "true", form.Language) | ||||
| 			if err == nil { | ||||
| 				data["RepoName"] = user.Name + "/" + form.RepoName | ||||
| 				r.HTML(200, "repo/created", data) | ||||
| 				return | ||||
| 			} | ||||
| 			// TODO: init .gitignore file
 | ||||
| 			data["RepoName"] = user.Name + "/" + form.RepoName | ||||
| 			r.HTML(200, "repo/created", data) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,14 +5,16 @@ | |||
| package user | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"strconv" | ||||
| 
 | ||||
| 	"github.com/martini-contrib/render" | ||||
| 	"github.com/martini-contrib/sessions" | ||||
| 
 | ||||
| 	"github.com/gogits/gogs/models" | ||||
| 	"github.com/gogits/gogs/modules/auth" | ||||
| 	"github.com/gogits/gogs/modules/base" | ||||
| 	"github.com/gogits/gogs/modules/log" | ||||
| 	"github.com/martini-contrib/render" | ||||
| 	"github.com/martini-contrib/sessions" | ||||
| 	"net/http" | ||||
| 	"strconv" | ||||
| ) | ||||
| 
 | ||||
| func Setting(r render.Render, data base.TmplData, session sessions.Session) { | ||||
|  | @ -21,9 +23,12 @@ func Setting(r render.Render, data base.TmplData, session sessions.Session) { | |||
| 	r.HTML(200, "user/setting", data) | ||||
| } | ||||
| 
 | ||||
| func SettingSSHKeys(r render.Render, data base.TmplData, req *http.Request, session sessions.Session) { | ||||
| 	// del ssh ky
 | ||||
| func SettingSSHKeys(form auth.AddSSHKeyForm, r render.Render, data base.TmplData, req *http.Request, session sessions.Session) { | ||||
| 	data["Title"] = "SSH Keys" | ||||
| 
 | ||||
| 	// Delete SSH key.
 | ||||
| 	if req.Method == "DELETE" || req.FormValue("_method") == "DELETE" { | ||||
| 		println(1) | ||||
| 		id, err := strconv.ParseInt(req.FormValue("id"), 10, 64) | ||||
| 		if err != nil { | ||||
| 			data["ErrorMsg"] = err | ||||
|  | @ -38,8 +43,8 @@ func SettingSSHKeys(r render.Render, data base.TmplData, req *http.Request, sess | |||
| 			Id:      id, | ||||
| 			OwnerId: auth.SignedInId(session), | ||||
| 		} | ||||
| 		err = models.DeletePublicKey(k) | ||||
| 		if err != nil { | ||||
| 
 | ||||
| 		if err = models.DeletePublicKey(k); err != nil { | ||||
| 			data["ErrorMsg"] = err | ||||
| 			log.Error("ssh.DelPublicKey: %v", err) | ||||
| 			r.JSON(200, map[string]interface{}{ | ||||
|  | @ -51,16 +56,21 @@ func SettingSSHKeys(r render.Render, data base.TmplData, req *http.Request, sess | |||
| 				"ok": true, | ||||
| 			}) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	// add ssh key
 | ||||
| 
 | ||||
| 	// Add new SSH key.
 | ||||
| 	if req.Method == "POST" { | ||||
| 		k := &models.PublicKey{OwnerId: auth.SignedInId(session), | ||||
| 			Name:    req.FormValue("keyname"), | ||||
| 			Content: req.FormValue("key_content"), | ||||
| 		if hasErr, ok := data["HasError"]; ok && hasErr.(bool) { | ||||
| 			r.HTML(200, "user/publickey", data) | ||||
| 			return | ||||
| 		} | ||||
| 		err := models.AddPublicKey(k) | ||||
| 		if err != nil { | ||||
| 
 | ||||
| 		k := &models.PublicKey{OwnerId: auth.SignedInId(session), | ||||
| 			Name:    form.KeyName, | ||||
| 			Content: form.KeyContent, | ||||
| 		} | ||||
| 
 | ||||
| 		if err := models.AddPublicKey(k); err != nil { | ||||
| 			data["ErrorMsg"] = err | ||||
| 			log.Error("ssh.AddPublicKey: %v", err) | ||||
| 			r.HTML(200, "base/error", data) | ||||
|  | @ -69,7 +79,8 @@ func SettingSSHKeys(r render.Render, data base.TmplData, req *http.Request, sess | |||
| 			data["AddSSHKeySuccess"] = true | ||||
| 		} | ||||
| 	} | ||||
| 	// get keys
 | ||||
| 
 | ||||
| 	// List existed SSH keys.
 | ||||
| 	keys, err := models.ListPublicKey(auth.SignedInId(session)) | ||||
| 	if err != nil { | ||||
| 		data["ErrorMsg"] = err | ||||
|  | @ -78,8 +89,6 @@ func SettingSSHKeys(r render.Render, data base.TmplData, req *http.Request, sess | |||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// set to template
 | ||||
| 	data["Title"] = "SSH Keys" | ||||
| 	data["PageIsUserSetting"] = true | ||||
| 	data["Keys"] = keys | ||||
| 	r.HTML(200, "user/publickey", data) | ||||
|  |  | |||
|  | @ -17,28 +17,6 @@ import ( | |||
| 	"github.com/gogits/gogs/modules/log" | ||||
| ) | ||||
| 
 | ||||
| func AddPublicKey(req *http.Request, data base.TmplData, r render.Render, session sessions.Session) { | ||||
| 	data["Title"] = "Add Public Key" | ||||
| 
 | ||||
| 	if req.Method == "GET" { | ||||
| 		r.HTML(200, "user/publickey_add", data) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	k := &models.PublicKey{OwnerId: auth.SignedInId(session), | ||||
| 		Name:    req.FormValue("keyname"), | ||||
| 		Content: req.FormValue("key_content"), | ||||
| 	} | ||||
| 	err := models.AddPublicKey(k) | ||||
| 	if err != nil { | ||||
| 		data["ErrorMsg"] = err | ||||
| 		log.Error("ssh.AddPublicKey: %v", err) | ||||
| 		r.HTML(200, "base/error", data) | ||||
| 	} else { | ||||
| 		r.HTML(200, "user/publickey_added", data) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func DelPublicKey(req *http.Request, data base.TmplData, r render.Render, session sessions.Session) { | ||||
| 	data["Title"] = "Del Public Key" | ||||
| 
 | ||||
|  | @ -78,18 +56,3 @@ func DelPublicKey(req *http.Request, data base.TmplData, r render.Render, sessio | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func ListPublicKey(req *http.Request, data base.TmplData, r render.Render, session sessions.Session) { | ||||
| 	data["Title"] = "Public Keys" | ||||
| 
 | ||||
| 	keys, err := models.ListPublicKey(auth.SignedInId(session)) | ||||
| 	if err != nil { | ||||
| 		data["ErrorMsg"] = err | ||||
| 		log.Error("ssh.ListPublicKey: %v", err) | ||||
| 		r.HTML(200, "base/error", data) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	data["Keys"] = keys | ||||
| 	r.HTML(200, "user/publickey_list", data) | ||||
| } | ||||
|  |  | |||
|  | @ -12,10 +12,11 @@ | |||
|             <li class="list-group-item"><a href="#">Kill Myself</a></li> | ||||
|         </ul> | ||||
|     </div> | ||||
| 
 | ||||
|     <div id="gogs-user-setting-container" class="col-md-9"> | ||||
|         <div id="gogs-ssh-keys"> | ||||
|             <h4>SSH Keys</h4>{{if .AddSSHKeySuccess}} | ||||
|             <p class="alert alert-success">New SSH Key is added !</p>{{end}} | ||||
|             <p class="alert alert-success">New SSH Key has been added !</p>{{else if .HasError}}<p class="alert alert-danger">{{.ErrorMsg}}</p>{{end}} | ||||
|             <ul id="gogs-ssh-keys-list" class="list-group"> | ||||
|                 <li class="list-group-item"><span class="name">SSH Key's name</span></li>{{range .Keys}} | ||||
|                 <li class="list-group-item"> | ||||
|  | @ -34,6 +35,7 @@ | |||
|                             <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> | ||||
|                             <h4 class="modal-title" id="myModalLabel">Add SSH Key</h4> | ||||
|                         </div> | ||||
| 
 | ||||
|                         <div class="modal-body"> | ||||
|                             <div class="form-group"> | ||||
|                                 <label class="col-md-3 control-label">The name of key<strong class="text-danger">*</strong></label> | ||||
|  | @ -41,6 +43,7 @@ | |||
|                                     <input name="keyname" class="form-control" placeholder="Type your preferred name" required="required"> | ||||
|                                 </div> | ||||
|                             </div> | ||||
| 
 | ||||
|                             <div class="form-group"> | ||||
|                                 <label class="col-md-3 control-label">SSH Key<strong class="text-danger">*</strong></label> | ||||
|                                 <div class="col-md-8"> | ||||
|  | @ -48,6 +51,7 @@ | |||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
| 
 | ||||
|                         <div class="modal-footer"> | ||||
|                             <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> | ||||
|                             <button type="submit" class="btn btn-primary">Save SSH Key</button> | ||||
|  | @ -55,7 +59,7 @@ | |||
|                     </form> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <p><strong>Need help?</strong> Check out our guide to <a href="https://help.github.com/articles/generating-ssh-keys" target="_blank">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/" target="_blank">common SSH Problems</a></p> | ||||
|             <p><strong>Need help?</strong> Check out the guide to <a href="https://help.github.com/articles/generating-ssh-keys" target="_blank">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/" target="_blank">common SSH Problems</a></p> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
|  |  | |||
|  | @ -5,14 +5,14 @@ | |||
| 		<div class="form-group"> | ||||
| 			<label class="col-md-4 control-label">Name of this public key: </label> | ||||
| 			<div class="col-md-3"> | ||||
| 				<input name="keyname" class="form-control" placeholder="Type your preferred name"> | ||||
| 				<input name="keyname" class="form-control" placeholder="Type your preferred name" value="{{.KeyName}}"> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 
 | ||||
| 		<div class="form-group"> | ||||
| 			<label class="col-md-4 control-label">Paste your key here: </label> | ||||
| 			<div class="col-md-3"> | ||||
| 				<textarea name="key_content" cols="30" rows="10" class="form-control"></textarea> | ||||
| 				<textarea name="key_content" cols="30" rows="10" class="form-control">{{.KeyContent}}</textarea> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ | |||
|             <li class="list-group-item"><a href="#">Notifications</a></li> | ||||
|             <li class="list-group-item"><a href="/user/setting/ssh/">SSH Keys</a></li> | ||||
|             <li class="list-group-item"><a href="#">Security</a></li> | ||||
|             <li class="list-group-item"><a href="#">Kill myself</a></li> | ||||
|             <li class="list-group-item"><a href="#">Kill Myself</a></li> | ||||
|         </ul> | ||||
|     </div> | ||||
|     <div id="gogs-user-setting-container" class="col-md-9"> | ||||
|  |  | |||
							
								
								
									
										7
									
								
								web.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								web.go
									
									
									
									
									
								
							|  | @ -65,14 +65,11 @@ func runWeb(*cli.Context) { | |||
| 	m.Any("/user/sign_up", auth.SignOutRequire(), binding.BindIgnErr(auth.RegisterForm{}), user.SignUp) | ||||
| 	m.Any("/user/delete", auth.SignInRequire(true), user.Delete) | ||||
| 
 | ||||
| 	m.Any("/user/setting",auth.SignInRequire(true),user.Setting) | ||||
| 	m.Any("/user/setting/ssh",auth.SignInRequire(true),user.SettingSSHKeys) | ||||
| 	m.Any("/user/setting", auth.SignInRequire(true), user.Setting) | ||||
| 	m.Any("/user/setting/ssh", auth.SignInRequire(true), binding.BindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys) | ||||
| 
 | ||||
| 	m.Get("/user/:username", auth.SignInRequire(false), user.Profile) | ||||
| 
 | ||||
| 	//m.Any("/user/publickey/add", auth.SignInRequire(true), user.AddPublicKey)
 | ||||
| 	//m.Any("/user/publickey/list", auth.SignInRequire(true), user.ListPublicKey)
 | ||||
| 
 | ||||
| 	m.Any("/repo/create", auth.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create) | ||||
| 	m.Any("/repo/delete", auth.SignInRequire(true), repo.Delete) | ||||
| 	m.Any("/repo/list", auth.SignInRequire(false), repo.List) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue