github.com/kvattikuti/drone@v0.2.1-0.20140603034306-d400229a327a/pkg/handler/admin.go (about) 1 package handler 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/url" 7 "strconv" 8 "time" 9 10 "github.com/dchest/authcookie" 11 "github.com/drone/drone/pkg/database" 12 "github.com/drone/drone/pkg/mail" 13 . "github.com/drone/drone/pkg/model" 14 ) 15 16 // Display a list of ALL users in the system 17 func AdminUserList(w http.ResponseWriter, r *http.Request, u *User) error { 18 users, err := database.ListUsers() 19 if err != nil { 20 return err 21 } 22 23 data := struct { 24 User *User 25 Users []*User 26 }{u, users} 27 28 return RenderTemplate(w, "admin_users.html", &data) 29 } 30 31 // Invite a user to join the system 32 func AdminUserAdd(w http.ResponseWriter, r *http.Request, u *User) error { 33 return RenderTemplate(w, "admin_users_add.html", &struct{ User *User }{u}) 34 } 35 36 func UserInvite(w http.ResponseWriter, r *http.Request) error { 37 // generate the password reset token 38 email := r.FormValue("email") 39 token := authcookie.New(email, time.Now().Add(12*time.Hour), secret) 40 41 // get settings 42 hostname := database.SettingsMust().URL().String() 43 emailEnabled := database.SettingsMust().SmtpServer != "" 44 45 if !emailEnabled { 46 // Email is not enabled, so must let the user know the signup link 47 link := fmt.Sprintf("%v/register?token=%v", hostname, token) 48 return RenderText(w, link, http.StatusOK) 49 } 50 51 // send data to template 52 data := struct { 53 Host string 54 Email string 55 Token string 56 }{hostname, email, token} 57 58 // send the email message async 59 go mail.SendActivation(email, data) 60 61 return RenderText(w, http.StatusText(http.StatusOK), http.StatusOK) 62 } 63 64 // Invite a user to join the system 65 func AdminUserInvite(w http.ResponseWriter, r *http.Request, u *User) error { 66 return UserInvite(w, r) 67 } 68 69 // Form to edit a user 70 func AdminUserEdit(w http.ResponseWriter, r *http.Request, u *User) error { 71 idstr := r.FormValue("id") 72 id, err := strconv.Atoi(idstr) 73 if err != nil { 74 return err 75 } 76 77 // get the user from the database 78 user, err := database.GetUser(int64(id)) 79 if err != nil { 80 return err 81 } 82 83 data := struct { 84 User *User 85 EditUser *User 86 }{u, user} 87 88 return RenderTemplate(w, "admin_users_edit.html", &data) 89 } 90 91 func AdminUserUpdate(w http.ResponseWriter, r *http.Request, u *User) error { 92 // get the ID from the URL parameter 93 idstr := r.FormValue("id") 94 id, err := strconv.Atoi(idstr) 95 if err != nil { 96 return err 97 } 98 99 // get the user from the database 100 user, err := database.GetUser(int64(id)) 101 if err != nil { 102 return err 103 } 104 105 // update if user is administrator or not 106 switch r.FormValue("Admin") { 107 case "true": 108 user.Admin = true 109 case "false": 110 user.Admin = false 111 } 112 113 // saving user 114 if err := database.SaveUser(user); err != nil { 115 return err 116 } 117 118 return RenderText(w, http.StatusText(http.StatusOK), http.StatusOK) 119 } 120 121 func AdminUserDelete(w http.ResponseWriter, r *http.Request, u *User) error { 122 // get the ID from the URL parameter 123 idstr := r.FormValue("id") 124 id, err := strconv.Atoi(idstr) 125 if err != nil { 126 return err 127 } 128 129 // cannot delete self 130 if u.ID == int64(id) { 131 return RenderForbidden(w) 132 } 133 134 // delete the user 135 if err := database.DeleteUser(int64(id)); err != nil { 136 return err 137 } 138 139 http.Redirect(w, r, "/account/admin/users", http.StatusSeeOther) 140 return nil 141 } 142 143 // Return an HTML form for the User to update the site settings. 144 func AdminSettings(w http.ResponseWriter, r *http.Request, u *User) error { 145 // get settings from database 146 settings := database.SettingsMust() 147 148 data := struct { 149 User *User 150 Settings *Settings 151 }{u, settings} 152 153 return RenderTemplate(w, "admin_settings.html", &data) 154 } 155 156 func AdminSettingsUpdate(w http.ResponseWriter, r *http.Request, u *User) error { 157 // get settings from database 158 settings := database.SettingsMust() 159 160 // update smtp settings 161 settings.Domain = r.FormValue("Domain") 162 settings.Scheme = r.FormValue("Scheme") 163 164 // update bitbucket settings 165 settings.BitbucketKey = r.FormValue("BitbucketKey") 166 settings.BitbucketSecret = r.FormValue("BitbucketSecret") 167 168 // update github settings 169 settings.GitHubKey = r.FormValue("GitHubKey") 170 settings.GitHubSecret = r.FormValue("GitHubSecret") 171 settings.GitHubDomain = r.FormValue("GitHubDomain") 172 settings.GitHubApiUrl = r.FormValue("GitHubApiUrl") 173 174 // update gitlab settings 175 settings.GitlabApiUrl = r.FormValue("GitlabApiUrl") 176 glUrl, err := url.Parse(settings.GitlabApiUrl) 177 if err != nil { 178 return RenderError(w, err, http.StatusBadRequest) 179 } 180 settings.GitlabDomain = glUrl.Host 181 182 // update smtp settings 183 settings.SmtpServer = r.FormValue("SmtpServer") 184 settings.SmtpPort = r.FormValue("SmtpPort") 185 settings.SmtpAddress = r.FormValue("SmtpAddress") 186 settings.SmtpUsername = r.FormValue("SmtpUsername") 187 settings.SmtpPassword = r.FormValue("SmtpPassword") 188 189 settings.OpenInvitations = (r.FormValue("OpenInvitations") == "on") 190 191 // validate user input 192 if err := settings.Validate(); err != nil { 193 return RenderError(w, err, http.StatusBadRequest) 194 } 195 196 // persist changes 197 if err := database.SaveSettings(settings); err != nil { 198 return RenderError(w, err, http.StatusBadRequest) 199 } 200 201 // make sure the mail package is updated with the 202 // latest client information. 203 //mail.SetClient(&mail.SMTPClient{ 204 // Host: settings.SmtpServer, 205 // Port: settings.SmtpPort, 206 // User: settings.SmtpUsername, 207 // Pass: settings.SmtpPassword, 208 // From: settings.SmtpAddress, 209 //}) 210 211 return RenderText(w, http.StatusText(http.StatusOK), http.StatusOK) 212 } 213 214 func Install(w http.ResponseWriter, r *http.Request) error { 215 // we can only perform the inital installation if no 216 // users exist in the system 217 if users, err := database.ListUsers(); err != nil { 218 return RenderError(w, err, http.StatusBadRequest) 219 } else if len(users) != 0 { 220 // if users exist in the systsem 221 // we should render a NotFound page 222 return RenderNotFound(w) 223 } 224 225 return RenderTemplate(w, "install.html", true) 226 } 227 228 func InstallPost(w http.ResponseWriter, r *http.Request) error { 229 // we can only perform the inital installation if no 230 // users exist in the system 231 if users, err := database.ListUsers(); err != nil { 232 return RenderError(w, err, http.StatusBadRequest) 233 } else if len(users) != 0 { 234 // if users exist in the systsem 235 // we should render a NotFound page 236 return RenderNotFound(w) 237 } 238 239 // set the email and name 240 user := NewUser(r.FormValue("name"), r.FormValue("email")) 241 user.Admin = true 242 243 // set the new password 244 if err := user.SetPassword(r.FormValue("password")); err != nil { 245 return RenderError(w, err, http.StatusBadRequest) 246 } 247 248 // verify fields are correct 249 if err := user.Validate(); err != nil { 250 return RenderError(w, err, http.StatusBadRequest) 251 } 252 253 // save to the database 254 if err := database.SaveUser(user); err != nil { 255 return RenderError(w, err, http.StatusBadRequest) 256 } 257 258 // update settings 259 settings := Settings{} 260 settings.Domain = r.FormValue("Domain") 261 settings.Scheme = r.FormValue("Scheme") 262 settings.GitHubApiUrl = "https://api.github.com" 263 settings.GitHubDomain = "github.com" 264 settings.GitlabApiUrl = "https://gitlab.com" 265 settings.GitlabDomain = "gitlab.com" 266 database.SaveSettings(&settings) 267 268 // add the user to the session object 269 // so that he/she is loggedin 270 SetCookie(w, r, "_sess", user.Email) 271 272 // send the user to the settings page 273 // to complete the configuration. 274 http.Redirect(w, r, "/account/admin/settings", http.StatusSeeOther) 275 return nil 276 }