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  }