2014-02-18 03:38:50 +04:00
// 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 user
import (
2014-03-15 13:30:59 +04:00
"fmt"
2014-03-19 12:48:45 +04:00
"strings"
2014-02-18 03:38:50 +04:00
2014-03-08 02:08:21 +04:00
"github.com/codegangsta/martini"
2014-02-18 03:38:50 +04:00
"github.com/gogits/gogs/models"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
2014-03-19 12:48:45 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-19 18:46:48 +04:00
"github.com/gogits/gogs/modules/mailer"
2014-03-15 15:01:50 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-02-18 03:38:50 +04:00
)
2014-03-15 17:17:16 +04:00
func Dashboard ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Dashboard"
ctx . Data [ "PageIsUserDashboard" ] = true
repos , err := models . GetRepositories ( & models . User { Id : ctx . User . Id } )
2014-03-11 10:17:05 +04:00
if err != nil {
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "user.Dashboard" , err )
2014-03-11 10:17:05 +04:00
return
}
2014-03-15 17:17:16 +04:00
ctx . Data [ "MyRepos" ] = repos
2014-03-15 13:30:59 +04:00
2014-03-15 17:17:16 +04:00
feeds , err := models . GetFeeds ( ctx . User . Id , 0 , false )
2014-03-15 13:30:59 +04:00
if err != nil {
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "user.Dashboard" , err )
2014-03-15 13:30:59 +04:00
return
}
2014-03-15 17:17:16 +04:00
ctx . Data [ "Feeds" ] = feeds
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/dashboard" )
2014-03-06 17:33:17 +04:00
}
2014-03-15 15:01:50 +04:00
func Profile ( ctx * middleware . Context , params martini . Params ) {
ctx . Data [ "Title" ] = "Profile"
2014-03-06 22:18:19 +04:00
// TODO: Need to check view self or others.
2014-03-08 02:08:21 +04:00
user , err := models . GetUserByName ( params [ "username" ] )
if err != nil {
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "user.Profile" , err )
2014-03-08 02:08:21 +04:00
return
}
2014-03-15 15:01:50 +04:00
ctx . Data [ "Owner" ] = user
2014-03-15 11:28:06 +04:00
2014-03-15 15:01:50 +04:00
tab := ctx . Query ( "tab" )
ctx . Data [ "TabName" ] = tab
2014-03-15 11:28:06 +04:00
switch tab {
case "activity" :
feeds , err := models . GetFeeds ( user . Id , 0 , true )
if err != nil {
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "user.Profile" , err )
2014-03-15 11:28:06 +04:00
return
}
2014-03-15 15:01:50 +04:00
ctx . Data [ "Feeds" ] = feeds
2014-03-15 11:28:06 +04:00
default :
2014-03-15 20:13:45 +04:00
repos , err := models . GetRepositories ( user )
if err != nil {
ctx . Handle ( 200 , "user.Profile" , err )
return
}
ctx . Data [ "Repos" ] = repos
2014-03-15 08:50:51 +04:00
}
2014-03-15 11:28:06 +04:00
2014-03-19 18:25:27 +04:00
ctx . Data [ "PageIsUserProfile" ] = true
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/profile" )
2014-03-02 17:47:55 +04:00
}
2014-03-15 18:34:33 +04:00
func SignIn ( ctx * middleware . Context , form auth . LogInForm ) {
2014-03-15 17:17:16 +04:00
ctx . Data [ "Title" ] = "Log In"
2014-03-06 20:42:14 +04:00
2014-03-15 17:17:16 +04:00
if ctx . Req . Method == "GET" {
2014-03-23 00:40:09 +04:00
// Check auto-login.
userName := ctx . GetCookie ( base . CookieUserName )
if len ( userName ) == 0 {
ctx . HTML ( 200 , "user/signin" )
return
}
isSucceed := false
defer func ( ) {
if ! isSucceed {
log . Trace ( "%s auto-login cookie cleared: %s" , ctx . Req . RequestURI , userName )
ctx . SetCookie ( base . CookieUserName , "" , - 1 )
ctx . SetCookie ( base . CookieRememberName , "" , - 1 )
}
} ( )
user , err := models . GetUserByName ( userName )
if err != nil {
ctx . HTML ( 200 , "user/signin" )
return
}
secret := base . EncodeMd5 ( user . Rands + user . Passwd )
value , _ := ctx . GetSecureCookie ( secret , base . CookieRememberName )
if value != user . Name {
ctx . HTML ( 200 , "user/signin" )
return
}
isSucceed = true
ctx . Session . Set ( "userId" , user . Id )
ctx . Session . Set ( "userName" , user . Name )
ctx . Redirect ( "/" )
2014-03-06 20:42:14 +04:00
return
}
2014-03-15 17:17:16 +04:00
if hasErr , ok := ctx . Data [ "HasError" ] ; ok && hasErr . ( bool ) {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/signin" )
2014-03-06 20:42:14 +04:00
return
}
user , err := models . LoginUserPlain ( form . UserName , form . Password )
if err != nil {
2014-03-22 16:49:53 +04:00
if err == models . ErrUserNotExist {
2014-03-23 00:40:09 +04:00
log . Trace ( "%s Log in failed: %s/%s" , ctx . Req . RequestURI , form . UserName , form . Password )
2014-03-15 18:52:14 +04:00
ctx . RenderWithErr ( "Username or password is not correct" , "user/signin" , & form )
2014-03-03 16:35:44 +04:00
return
}
2014-03-06 20:42:14 +04:00
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "user.SignIn" , err )
2014-03-06 20:42:14 +04:00
return
2014-03-02 11:31:06 +04:00
}
2014-03-06 20:42:14 +04:00
2014-03-23 00:40:09 +04:00
if form . Remember == "on" {
secret := base . EncodeMd5 ( user . Rands + user . Passwd )
days := 86400 * base . LogInRememberDays
ctx . SetCookie ( base . CookieUserName , user . Name , days )
ctx . SetSecureCookie ( secret , base . CookieRememberName , user . Name , days )
}
2014-03-15 18:34:33 +04:00
ctx . Session . Set ( "userId" , user . Id )
ctx . Session . Set ( "userName" , user . Name )
2014-03-19 17:57:55 +04:00
ctx . Redirect ( "/" )
2014-02-18 03:38:50 +04:00
}
2014-03-19 17:57:55 +04:00
func SignOut ( ctx * middleware . Context ) {
ctx . Session . Delete ( "userId" )
ctx . Session . Delete ( "userName" )
ctx . Redirect ( "/" )
2014-03-06 22:18:19 +04:00
}
2014-03-15 18:34:33 +04:00
func SignUp ( ctx * middleware . Context , form auth . RegisterForm ) {
ctx . Data [ "Title" ] = "Sign Up"
ctx . Data [ "PageIsSignUp" ] = true
2014-03-06 11:21:44 +04:00
2014-03-21 09:09:22 +04:00
if base . Service . DisenableRegisteration {
ctx . Data [ "DisenableRegisteration" ] = true
ctx . HTML ( 200 , "user/signup" )
return
}
2014-03-15 18:34:33 +04:00
if ctx . Req . Method == "GET" {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/signup" )
2014-02-18 03:38:50 +04:00
return
}
2014-03-06 20:10:35 +04:00
if form . Password != form . RetypePasswd {
2014-03-15 18:34:33 +04:00
ctx . Data [ "HasError" ] = true
ctx . Data [ "Err_Password" ] = true
ctx . Data [ "Err_RetypePasswd" ] = true
ctx . Data [ "ErrorMsg" ] = "Password and re-type password are not same"
auth . AssignForm ( form , ctx . Data )
2014-03-06 20:10:35 +04:00
}
2014-03-15 18:52:14 +04:00
if ctx . HasError ( ) {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/signup" )
2014-03-06 11:21:44 +04:00
return
2014-02-19 02:31:16 +04:00
}
2014-03-04 04:03:08 +04:00
2014-03-06 11:21:44 +04:00
u := & models . User {
2014-03-19 15:21:23 +04:00
Name : form . UserName ,
Email : form . Email ,
Passwd : form . Password ,
2014-03-19 16:27:27 +04:00
IsActive : ! base . Service . RegisterEmailConfirm ,
2014-02-19 02:31:16 +04:00
}
2014-03-06 11:21:44 +04:00
2014-03-19 16:27:27 +04:00
var err error
if u , err = models . RegisterUser ( u ) ; err != nil {
2014-03-20 19:41:24 +04:00
switch err {
case models . ErrUserAlreadyExist :
2014-03-15 18:52:14 +04:00
ctx . RenderWithErr ( "Username has been already taken" , "user/signup" , & form )
2014-03-20 19:41:24 +04:00
case models . ErrEmailAlreadyUsed :
2014-03-15 18:52:14 +04:00
ctx . RenderWithErr ( "E-mail address has been already used" , "user/signup" , & form )
2014-03-20 19:41:24 +04:00
case models . ErrUserNameIllegal :
ctx . RenderWithErr ( models . ErrRepoNameIllegal . Error ( ) , "user/signup" , & form )
2014-03-06 20:10:35 +04:00
default :
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "user.SignUp" , err )
2014-03-06 11:21:44 +04:00
}
2014-02-19 02:31:16 +04:00
return
}
2014-03-19 12:48:45 +04:00
log . Trace ( "%s User created: %s" , ctx . Req . RequestURI , strings . ToLower ( form . UserName ) )
2014-03-19 16:27:27 +04:00
// Send confirmation e-mail.
2014-03-20 16:02:14 +04:00
if base . Service . RegisterEmailConfirm && u . Id > 1 {
2014-03-19 18:46:48 +04:00
mailer . SendRegisterMail ( ctx . Render , u )
ctx . Data [ "IsSendRegisterMail" ] = true
ctx . Data [ "Email" ] = u . Email
ctx . Data [ "Hours" ] = base . Service . ActiveCodeLives / 60
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/active" )
2014-03-21 18:09:57 +04:00
if err = ctx . Cache . Put ( "MailResendLimit_" + u . LowerName , u . LowerName , 180 ) ; err != nil {
log . Error ( "Set cache(MailResendLimit) fail: %v" , err )
}
2014-03-19 18:46:48 +04:00
return
2014-03-19 16:27:27 +04:00
}
2014-03-19 17:57:55 +04:00
ctx . Redirect ( "/user/login" )
2014-02-18 03:38:50 +04:00
}
2014-02-19 22:13:02 +04:00
2014-03-15 18:34:33 +04:00
func Delete ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Delete Account"
2014-03-19 02:31:54 +04:00
ctx . Data [ "PageIsUserSetting" ] = true
ctx . Data [ "IsUserPageSettingDelete" ] = true
2014-03-08 02:08:21 +04:00
2014-03-15 18:34:33 +04:00
if ctx . Req . Method == "GET" {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/delete" )
2014-02-20 06:45:43 +04:00
return
}
2014-03-16 18:35:25 +04:00
tmpUser := models . User { Passwd : ctx . Query ( "password" ) }
tmpUser . EncodePasswd ( )
if len ( tmpUser . Passwd ) == 0 || tmpUser . Passwd != ctx . User . Passwd {
2014-03-15 18:34:33 +04:00
ctx . Data [ "HasError" ] = true
2014-03-16 18:35:25 +04:00
ctx . Data [ "ErrorMsg" ] = "Password is not correct. Make sure you are owner of this account."
2014-03-16 17:07:50 +04:00
} else {
if err := models . DeleteUser ( ctx . User ) ; err != nil {
ctx . Data [ "HasError" ] = true
switch err {
case models . ErrUserOwnRepos :
ctx . Data [ "ErrorMsg" ] = "Your account still have ownership of repository, you have to delete or transfer them first."
default :
ctx . Handle ( 200 , "user.Delete" , err )
return
}
} else {
2014-03-19 17:57:55 +04:00
ctx . Redirect ( "/" )
2014-03-11 19:40:47 +04:00
return
}
}
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/delete" )
2014-02-19 22:13:02 +04:00
}
2014-03-13 09:14:43 +04:00
2014-03-15 13:30:59 +04:00
const (
2014-03-19 02:31:54 +04:00
TPL_FEED = ` < i class = "icon fa fa-%s" > < / i >
2014-03-15 13:30:59 +04:00
< div class = "info" > < span class = "meta" > % s < / span > < br > % s < / div > `
)
2014-03-15 18:34:33 +04:00
func Feeds ( ctx * middleware . Context , form auth . FeedsForm ) {
2014-03-15 13:30:59 +04:00
actions , err := models . GetFeeds ( form . UserId , form . Page * 20 , false )
2014-03-13 09:14:43 +04:00
if err != nil {
2014-03-19 17:57:55 +04:00
ctx . JSON ( 500 , err )
2014-03-13 09:14:43 +04:00
}
2014-03-15 13:30:59 +04:00
feeds := make ( [ ] string , len ( actions ) )
for i := range actions {
2014-03-19 02:31:54 +04:00
feeds [ i ] = fmt . Sprintf ( TPL_FEED , base . ActionIcon ( actions [ i ] . OpType ) ,
2014-03-16 20:07:35 +04:00
base . TimeSince ( actions [ i ] . Created ) , base . ActionDesc ( actions [ i ] , ctx . User . AvatarLink ( ) ) )
2014-03-15 13:30:59 +04:00
}
2014-03-19 17:57:55 +04:00
ctx . JSON ( 200 , & feeds )
2014-03-13 09:14:43 +04:00
}
2014-03-16 11:41:22 +04:00
2014-03-19 02:31:54 +04:00
func Issues ( ctx * middleware . Context ) {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/issues" )
2014-03-16 11:41:22 +04:00
}
2014-03-19 02:31:54 +04:00
func Pulls ( ctx * middleware . Context ) {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/pulls" )
2014-03-16 11:41:22 +04:00
}
2014-03-19 02:31:54 +04:00
func Stars ( ctx * middleware . Context ) {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/stars" )
2014-03-16 11:41:22 +04:00
}
2014-03-19 17:24:02 +04:00
func Activate ( ctx * middleware . Context ) {
code := ctx . Query ( "code" )
if len ( code ) == 0 {
ctx . Data [ "IsActivatePage" ] = true
2014-03-20 11:24:17 +04:00
if ctx . User . IsActive {
ctx . Error ( 404 )
return
}
2014-03-19 17:24:02 +04:00
// Resend confirmation e-mail.
if base . Service . RegisterEmailConfirm {
2014-03-21 18:09:57 +04:00
if ctx . Cache . IsExist ( "MailResendLimit_" + ctx . User . LowerName ) {
ctx . Data [ "ResendLimited" ] = true
} else {
ctx . Data [ "Hours" ] = base . Service . ActiveCodeLives / 60
mailer . SendActiveMail ( ctx . Render , ctx . User )
}
2014-03-19 17:24:02 +04:00
} else {
ctx . Data [ "ServiceNotEnabled" ] = true
}
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/active" )
2014-03-19 17:24:02 +04:00
return
}
2014-03-19 20:50:44 +04:00
// Verify code.
if user := models . VerifyUserActiveCode ( code ) ; user != nil {
user . IsActive = true
user . Rands = models . GetUserSalt ( )
models . UpdateUser ( user )
2014-03-20 05:05:48 +04:00
log . Trace ( "%s User activated: %s" , ctx . Req . RequestURI , user . LowerName )
2014-03-19 20:50:44 +04:00
ctx . Session . Set ( "userId" , user . Id )
ctx . Session . Set ( "userName" , user . Name )
ctx . Redirect ( "/" , 302 )
return
}
ctx . Data [ "IsActivateFailed" ] = true
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/active" )
2014-03-19 17:24:02 +04:00
}