@ -38,7 +38,6 @@ import ( 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"golang.org/x/crypto/scrypt"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"golang.org/x/crypto/ssh"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"xorm.io/builder"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"xorm.io/xorm"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// UserType defines the user type
  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1071,8 +1070,7 @@ func deleteBeans(e Engine, beans ...interface{}) (err error) { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						return  nil   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// FIXME: need some kind of mechanism to record failure. HINT: system notice
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					func  deleteUser ( e  * xorm . Session ,  u  * User )  error  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					func  deleteUser ( e  Engine ,  u  * User )  error  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// Note: A user owns any repository or belongs to any organization
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//	cannot perform delete operation.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1151,12 +1149,30 @@ func deleteUser(e *xorm.Session, u *User) error { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  fmt . Errorf ( "deleteBeans: %v" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  setting . Service . UserDeleteWithCommentsMaxDays  !=  0  &&   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							u . CreatedUnix . AsTime ( ) . Add ( time . Duration ( setting . Service . UserDeleteWithCommentsMaxDays ) * 24 * time . Hour ) . After ( time . Now ( ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							if  err  =  deleteBeans ( e ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								& Comment { PosterID :  u . ID } ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								return  fmt . Errorf ( "deleteBeans: %v" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  setting . Service . UserDeleteWithCommentsMaxTime  !=  0  &&   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							u . CreatedUnix . AsTime ( ) . Add ( setting . Service . UserDeleteWithCommentsMaxTime ) . After ( time . Now ( ) )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							// Delete Comments
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							const  batchSize  =  50   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							for  start  :=  0 ;  ;  start  +=  batchSize  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								comments  :=  make ( [ ] * Comment ,  0 ,  batchSize )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  err  =  e . Where ( "type=? AND poster_id=?" ,  CommentTypeComment ,  u . ID ) . Limit ( batchSize ,  start ) . Find ( & comments ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  err   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  len ( comments )  ==  0  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									break   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								for  _ ,  comment  :=  range  comments  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  err  =  deleteComment ( e ,  comment ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  err   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							// Delete Reactions
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							if  err  =  deleteReaction ( e ,  & ReactionOptions { Doer :  u } ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								return  err   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1195,18 +1211,21 @@ func deleteUser(e *xorm.Session, u *User) error { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  fmt . Errorf ( "Delete: %v" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// FIXME: system notice
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// Note: There are something just cannot be roll back,
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//	so just keep error logs of those operations.
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						path  :=  UserPath ( u . Name )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  :=  util . RemoveAll ( path ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  fmt . Errorf ( "Failed to RemoveAll %s: %v" ,  path ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  =  util . RemoveAll ( path ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							err  =  fmt . Errorf ( "Failed to RemoveAll %s: %v" ,  path ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							_  =  createNotice ( e ,  NoticeTask ,  fmt . Sprintf ( "delete user '%s': %v" ,  u . Name ,  err ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  err   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  len ( u . Avatar )  >  0  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							avatarPath  :=  u . CustomAvatarRelativePath ( )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							if  err  :=  storage . Avatars . Delete ( avatarPath ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								return  fmt . Errorf ( "Failed to remove %s: %v" ,  avatarPath ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							if  err  =  storage . Avatars . Delete ( avatarPath ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								err  =  fmt . Errorf ( "Failed to remove %s: %v" ,  avatarPath ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								_  =  createNotice ( e ,  NoticeTask ,  fmt . Sprintf ( "delete user '%s': %v" ,  u . Name ,  err ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								return  err   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}