2014-03-10 12:54:52 +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-05-06 00:21:43 +04:00
"strings"
2014-03-11 04:48:58 +04:00
2014-03-10 12:54:52 +04:00
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
2014-03-15 17:17:16 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-03-10 12:54:52 +04:00
)
2014-06-23 07:11:12 +04:00
const (
SETTING base . TplName = "user/setting"
SOCIAL base . TplName = "user/social"
PASSWORD base . TplName = "user/password"
PUBLICKEY base . TplName = "user/publickey"
NOTIFICATION base . TplName = "user/notification"
SECURITY base . TplName = "user/security"
)
2014-04-11 00:36:50 +04:00
func Setting ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Setting"
ctx . Data [ "PageIsUserSetting" ] = true
ctx . Data [ "IsUserPageSetting" ] = true
ctx . Data [ "Owner" ] = ctx . User
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , SETTING )
2014-04-11 00:36:50 +04:00
}
func SettingPost ( ctx * middleware . Context , form auth . UpdateProfileForm ) {
2014-03-15 18:34:33 +04:00
ctx . Data [ "Title" ] = "Setting"
2014-05-06 00:21:43 +04:00
ctx . Data [ "PageIsUserSetting" ] = true
ctx . Data [ "IsUserPageSetting" ] = true
2014-03-13 11:39:18 +04:00
2014-04-11 00:36:50 +04:00
if ctx . HasError ( ) {
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , SETTING )
2014-03-13 11:44:56 +04:00
return
2014-03-13 11:39:18 +04:00
}
2014-05-24 23:28:31 +04:00
ctx . Data [ "Owner" ] = ctx . User
2014-04-04 00:33:27 +04:00
// Check if user name has been changed.
2014-05-24 23:28:31 +04:00
if ctx . User . Name != form . UserName {
2014-04-04 00:33:27 +04:00
isExist , err := models . IsUserExist ( form . UserName )
if err != nil {
2014-04-11 00:36:50 +04:00
ctx . Handle ( 500 , "user.Setting(update: check existence)" , err )
2014-04-04 00:33:27 +04:00
return
} else if isExist {
ctx . RenderWithErr ( "User name has been taken." , "user/setting" , & form )
return
2014-05-24 23:28:31 +04:00
} else if err = models . ChangeUserName ( ctx . User , form . UserName ) ; err != nil {
2014-04-11 00:36:50 +04:00
ctx . Handle ( 500 , "user.Setting(change user name)" , err )
2014-04-04 00:33:27 +04:00
return
}
2014-05-24 23:28:31 +04:00
log . Trace ( "%s User name changed: %s -> %s" , ctx . Req . RequestURI , ctx . User . Name , form . UserName )
2014-04-04 00:33:27 +04:00
2014-05-24 23:28:31 +04:00
ctx . User . Name = form . UserName
2014-03-13 11:39:18 +04:00
}
2014-05-24 23:28:31 +04:00
ctx . User . FullName = form . FullName
ctx . User . Email = form . Email
ctx . User . Website = form . Website
ctx . User . Location = form . Location
ctx . User . Avatar = base . EncodeMd5 ( form . Avatar )
ctx . User . AvatarEmail = form . Avatar
if err := models . UpdateUser ( ctx . User ) ; err != nil {
2014-04-11 00:36:50 +04:00
ctx . Handle ( 500 , "setting.Setting" , err )
2014-03-13 11:39:18 +04:00
return
}
2014-03-19 12:48:45 +04:00
log . Trace ( "%s User setting updated: %s" , ctx . Req . RequestURI , ctx . User . LowerName )
2014-04-11 00:36:50 +04:00
ctx . Flash . Success ( "Your profile has been successfully updated." )
2014-04-24 22:50:24 +04:00
ctx . Redirect ( "/user/settings" )
2014-03-10 12:54:52 +04:00
}
2014-04-14 05:00:12 +04:00
func SettingSocial ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Social Account"
ctx . Data [ "PageIsUserSetting" ] = true
ctx . Data [ "IsUserPageSettingSocial" ] = true
2014-05-06 00:21:43 +04:00
// Unbind social account.
remove , _ := base . StrTo ( ctx . Query ( "remove" ) ) . Int64 ( )
if remove > 0 {
if err := models . DeleteOauth2ById ( remove ) ; err != nil {
ctx . Handle ( 500 , "user.SettingSocial(DeleteOauth2ById)" , err )
return
}
ctx . Flash . Success ( "OAuth2 has been unbinded." )
ctx . Redirect ( "/user/settings/social" )
return
}
2014-05-24 23:28:31 +04:00
var err error
ctx . Data [ "Socials" ] , err = models . GetOauthByUserId ( ctx . User . Id )
2014-04-14 05:00:12 +04:00
if err != nil {
2014-05-06 00:21:43 +04:00
ctx . Handle ( 500 , "user.SettingSocial(GetOauthByUserId)" , err )
2014-04-14 05:00:12 +04:00
return
}
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , SOCIAL )
2014-04-14 05:00:12 +04:00
}
2014-04-11 02:09:57 +04:00
func SettingPassword ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Password"
ctx . Data [ "PageIsUserSetting" ] = true
ctx . Data [ "IsUserPageSettingPasswd" ] = true
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , PASSWORD )
2014-04-11 02:09:57 +04:00
}
func SettingPasswordPost ( ctx * middleware . Context , form auth . UpdatePasswdForm ) {
2014-03-15 18:34:33 +04:00
ctx . Data [ "Title" ] = "Password"
ctx . Data [ "PageIsUserSetting" ] = true
2014-03-19 02:31:54 +04:00
ctx . Data [ "IsUserPageSettingPasswd" ] = true
2014-03-14 07:24:08 +04:00
2014-04-11 02:09:57 +04:00
if ctx . HasError ( ) {
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , PASSWORD )
2014-03-14 09:12:07 +04:00
return
}
2014-03-13 12:06:35 +04:00
2014-04-11 02:09:57 +04:00
tmpUser := & models . User {
Passwd : form . OldPasswd ,
2014-05-24 23:28:31 +04:00
Salt : ctx . User . Salt ,
2014-04-11 02:09:57 +04:00
}
tmpUser . EncodePasswd ( )
2014-05-24 23:28:31 +04:00
if ctx . User . Passwd != tmpUser . Passwd {
2014-05-06 00:21:43 +04:00
ctx . Flash . Error ( "Old password is not correct." )
2014-03-13 12:06:35 +04:00
} else if form . NewPasswd != form . RetypePasswd {
2014-05-06 00:21:43 +04:00
ctx . Flash . Error ( "New password and re-type password are not same." )
2014-03-13 12:06:35 +04:00
} else {
2014-05-24 23:28:31 +04:00
ctx . User . Passwd = form . NewPasswd
ctx . User . Salt = models . GetUserSalt ( )
ctx . User . EncodePasswd ( )
if err := models . UpdateUser ( ctx . User ) ; err != nil {
2014-03-15 17:17:16 +04:00
ctx . Handle ( 200 , "setting.SettingPassword" , err )
2014-03-13 12:06:35 +04:00
return
}
2014-04-11 02:09:57 +04:00
log . Trace ( "%s User password updated: %s" , ctx . Req . RequestURI , ctx . User . LowerName )
ctx . Flash . Success ( "Password is changed successfully. You can now sign in via new password." )
2014-03-13 12:06:35 +04:00
}
2014-04-24 22:50:24 +04:00
ctx . Redirect ( "/user/settings/password" )
2014-03-13 12:06:35 +04:00
}
2014-03-15 18:34:33 +04:00
func SettingSSHKeys ( ctx * middleware . Context , form auth . AddSSHKeyForm ) {
ctx . Data [ "Title" ] = "SSH Keys"
2014-05-06 00:21:43 +04:00
ctx . Data [ "PageIsUserSetting" ] = true
ctx . Data [ "IsUserPageSettingSSH" ] = true
2014-03-11 04:48:58 +04:00
// Delete SSH key.
2014-03-15 18:34:33 +04:00
if ctx . Req . Method == "DELETE" || ctx . Query ( "_method" ) == "DELETE" {
2014-05-06 00:21:43 +04:00
id , err := base . StrTo ( ctx . Query ( "id" ) ) . Int64 ( )
2014-03-10 17:12:49 +04:00
if err != nil {
log . Error ( "ssh.DelPublicKey: %v" , err )
2014-03-19 17:57:55 +04:00
ctx . JSON ( 200 , map [ string ] interface { } {
2014-03-10 17:12:49 +04:00
"ok" : false ,
"err" : err . Error ( ) ,
} )
return
}
2014-03-11 04:48:58 +04:00
2014-05-07 00:28:52 +04:00
if err = models . DeletePublicKey ( & models . PublicKey { Id : id } ) ; err != nil {
2014-03-10 17:12:49 +04:00
log . Error ( "ssh.DelPublicKey: %v" , err )
2014-03-19 17:57:55 +04:00
ctx . JSON ( 200 , map [ string ] interface { } {
2014-03-10 17:12:49 +04:00
"ok" : false ,
"err" : err . Error ( ) ,
} )
} else {
2014-03-19 12:48:45 +04:00
log . Trace ( "%s User SSH key deleted: %s" , ctx . Req . RequestURI , ctx . User . LowerName )
2014-03-19 17:57:55 +04:00
ctx . JSON ( 200 , map [ string ] interface { } {
2014-03-10 17:12:49 +04:00
"ok" : true ,
} )
}
2014-03-11 07:41:38 +04:00
return
2014-03-10 17:12:49 +04:00
}
2014-03-11 04:48:58 +04:00
2014-05-24 23:28:31 +04:00
var err error
2014-05-06 00:21:43 +04:00
// List existed SSH keys.
2014-05-24 23:28:31 +04:00
ctx . Data [ "Keys" ] , err = models . ListPublicKey ( ctx . User . Id )
2014-05-06 00:21:43 +04:00
if err != nil {
ctx . Handle ( 500 , "ssh.ListPublicKey" , err )
return
}
2014-03-11 04:48:58 +04:00
// Add new SSH key.
2014-03-15 18:34:33 +04:00
if ctx . Req . Method == "POST" {
2014-04-14 05:00:12 +04:00
if ctx . HasError ( ) {
2014-03-20 15:50:26 +04:00
ctx . HTML ( 200 , "user/publickey" )
2014-03-11 04:48:58 +04:00
return
}
2014-05-06 00:21:43 +04:00
if len ( form . KeyContent ) < 100 || ! strings . HasPrefix ( form . KeyContent , "ssh-rsa" ) {
ctx . Flash . Error ( "SSH key content is not valid." )
ctx . Redirect ( "/user/settings/ssh" )
return
}
2014-04-28 01:01:39 +04:00
k := & models . PublicKey {
OwnerId : ctx . User . Id ,
2014-03-11 04:48:58 +04:00
Name : form . KeyName ,
Content : form . KeyContent ,
2014-03-10 12:54:52 +04:00
}
2014-03-11 04:48:58 +04:00
if err := models . AddPublicKey ( k ) ; err != nil {
2014-03-16 14:25:16 +04:00
if err . Error ( ) == models . ErrKeyAlreadyExist . Error ( ) {
ctx . RenderWithErr ( "Public key name has been used" , "user/publickey" , & form )
return
}
2014-04-14 05:00:12 +04:00
ctx . Handle ( 500 , "ssh.AddPublicKey" , err )
2014-03-10 12:54:52 +04:00
return
} else {
2014-04-14 05:00:12 +04:00
log . Trace ( "%s User SSH key added: %s" , ctx . Req . RequestURI , ctx . User . LowerName )
ctx . Flash . Success ( "New SSH Key has been added!" )
2014-04-24 22:50:24 +04:00
ctx . Redirect ( "/user/settings/ssh" )
2014-04-14 05:00:12 +04:00
return
2014-03-10 12:54:52 +04:00
}
}
2014-03-11 04:48:58 +04:00
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , PUBLICKEY )
2014-03-10 12:54:52 +04:00
}
2014-03-14 13:12:28 +04:00
2014-03-15 18:34:33 +04:00
func SettingNotification ( ctx * middleware . Context ) {
2014-03-19 02:31:54 +04:00
// TODO: user setting notification
2014-03-15 18:34:33 +04:00
ctx . Data [ "Title" ] = "Notification"
ctx . Data [ "PageIsUserSetting" ] = true
2014-03-19 02:31:54 +04:00
ctx . Data [ "IsUserPageSettingNotify" ] = true
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , NOTIFICATION )
2014-03-14 13:12:28 +04:00
}
2014-03-15 18:34:33 +04:00
func SettingSecurity ( ctx * middleware . Context ) {
2014-03-19 02:31:54 +04:00
// TODO: user setting security
2014-03-15 18:34:33 +04:00
ctx . Data [ "Title" ] = "Security"
ctx . Data [ "PageIsUserSetting" ] = true
2014-03-19 02:31:54 +04:00
ctx . Data [ "IsUserPageSettingSecurity" ] = true
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , SECURITY )
2014-03-14 13:12:28 +04:00
}