From fef4a3080123b1df58c94d1cc2f10b30ef4301ba Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Sun, 31 Aug 2014 18:50:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/wide.go | 35 ++++++++++++++-- conf/wide.json | 13 +++--- data/user_repos/daniel/src | 1 - file/files.go | 2 +- main.go | 9 ++++- user/users.go | 83 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 129 insertions(+), 14 deletions(-) delete mode 160000 data/user_repos/daniel/src create mode 100644 user/users.go diff --git a/conf/wide.go b/conf/wide.go index 61221ba..dd700e0 100644 --- a/conf/wide.go +++ b/conf/wide.go @@ -12,8 +12,9 @@ import ( "strings" ) -type user struct { - Name string +type User struct { + Name string + Password string } type conf struct { @@ -28,12 +29,35 @@ type conf struct { RuntimeMode string Repos string UserRepos string - Users []user + Users []User } var Wide conf +var rawWide conf -func init() { +func Save() bool { + // 可变部分 + rawWide.Users = Wide.Users + + // 原始配置文件内容 + bytes, err := json.MarshalIndent(rawWide, "", " ") + + if nil != err { + glog.Error(err) + + return false + } + + if err = ioutil.WriteFile("conf/wide.json", bytes, 0644); nil != err { + glog.Error(err) + + return false + } + + return true +} + +func Load() { bytes, _ := ioutil.ReadFile("conf/wide.json") err := json.Unmarshal(bytes, &Wide) @@ -43,6 +67,9 @@ func init() { os.Exit(-1) } + // 保存未经变量替换处理的原始配置文件,用于写回时 + json.Unmarshal(bytes, &rawWide) + ip, err := util.Net.LocalIP() if err != nil { glog.Error(err) diff --git a/conf/wide.json b/conf/wide.json index af4f9d6..c2f3259 100644 --- a/conf/wide.json +++ b/conf/wide.json @@ -10,9 +10,10 @@ "RuntimeMode": "dev", "Repos": "{pwd}/data/repos/src", "UserRepos": "{pwd}/data/user_repos/{user}/src", - "Users": [{ - "Name": "daniel" - }, { - "Name": "vanessa" - }] -} + "Users": [ + { + "Name": "admin", + "Password": "admin" + } + ] +} \ No newline at end of file diff --git a/data/user_repos/daniel/src b/data/user_repos/daniel/src deleted file mode 160000 index 5ce2532..0000000 --- a/data/user_repos/daniel/src +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5ce253230630fedff4a65ef2fc6d5ae7bebfe6fa diff --git a/file/files.go b/file/files.go index 383252e..6ee34ce 100644 --- a/file/files.go +++ b/file/files.go @@ -16,7 +16,7 @@ import ( func GetFiles(w http.ResponseWriter, r *http.Request) { session, _ := user.Session.Get(r, "wide-session") - username := session.Values["name"].(string) + username := session.Values["username"].(string) userRepos := strings.Replace(conf.Wide.UserRepos, "{user}", username, -1) diff --git a/main.go b/main.go index b4b32c0..d28ccf6 100644 --- a/main.go +++ b/main.go @@ -21,11 +21,11 @@ func indexHandler(w http.ResponseWriter, r *http.Request) { session, _ := user.Session.Get(r, "wide-session") if session.IsNew { - // TODO: 以 daniel 作为用户登录 + // TODO: 以 admin 作为用户登录 name := conf.Wide.Users[0].Name glog.Infof("[%s] logged in", name) - session.Values["name"] = name + session.Values["username"] = name session.Values["id"] = strconv.Itoa(rand.Int()) } @@ -44,6 +44,8 @@ func indexHandler(w http.ResponseWriter, r *http.Request) { } func main() { + conf.Load() + http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) http.HandleFunc("/", indexHandler) @@ -65,6 +67,9 @@ func main() { http.HandleFunc("/autocomplete", editor.AutocompleteHandler) + http.HandleFunc("/user/new", user.AddUser) + http.HandleFunc("/user/repos/init", user.InitGitRepos) + glog.Infof("Wide is running [%s]", conf.Wide.Server) err := http.ListenAndServe(conf.Wide.Server, nil) diff --git a/user/users.go b/user/users.go new file mode 100644 index 0000000..3e8221d --- /dev/null +++ b/user/users.go @@ -0,0 +1,83 @@ +package user + +import ( + "encoding/json" + "github.com/b3log/wide/conf" + "github.com/golang/glog" + "net/http" + "strings" +) + +const ( + USER_EXISTS = "user exists" + USER_CREATED = "user created" + USER_CREATE_FAILED = "user create failed" +) + +func AddUser(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + + var args map[string]interface{} + + if err := decoder.Decode(&args); err != nil { + glog.Error(err) + http.Error(w, err.Error(), 500) + + return + } + + username := args["username"].(string) + password := args["password"].(string) + + data := map[string]interface{}{"succ": true} + + msg := addUser(username, password) + if USER_CREATED != msg { + data["succ"] = false + data["msg"] = msg + } + + ret, _ := json.Marshal(data) + w.Header().Set("Content-Type", "application/json") + w.Write(ret) +} + +func InitGitRepos(w http.ResponseWriter, r *http.Request) { + session, _ := Session.Get(r, "wide-session") + + username := session.Values["username"].(string) + userRepos := strings.Replace(conf.Wide.UserRepos, "{user}", username, -1) + + data := map[string]interface{}{"succ": true} + + // TODO: git clone + + glog.Infof("Git Cloned from [%s] to [%s]", conf.Wide.Repos, userRepos) + + ret, _ := json.Marshal(data) + w.Header().Set("Content-Type", "application/json") + w.Write(ret) +} + +func addUser(username, password string) string { + // TODO: https://github.com/b3log/wide/issues/23 + conf.Load() + + // XXX: 新建用户校验增强 + for _, user := range conf.Wide.Users { + if user.Name == username { + return USER_EXISTS + } + } + + newUser := conf.User{Name: username, Password: password} + conf.Wide.Users = append(conf.Wide.Users, newUser) + + if !conf.Save() { + return USER_CREATE_FAILED + } + + glog.Infof("Created a user [%s]", username) + + return USER_CREATED +}