@ -8,7 +8,6 @@ package auth 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					import  (  
					 
					 
					 
					import  (  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						"fmt"   
					 
					 
					 
						"fmt"   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						"net/http"   
					 
					 
					 
						"net/http"   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						"reflect"   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						"regexp"   
					 
					 
					 
						"regexp"   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						"strings"   
					 
					 
					 
						"strings"   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -21,75 +20,22 @@ import ( 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						"code.gitea.io/gitea/modules/web/middleware"   
					 
					 
					 
						"code.gitea.io/gitea/modules/web/middleware"   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					)  
					 
					 
					 
					)  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// authMethods contains the list of authentication plugins in the order they are expected to be
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// executed.
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					//
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// The OAuth2 plugin is expected to be executed first, as it must ignore the user id stored
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// in the session (if there is a user id stored in session other plugins might return the user
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// object for that id).
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					//
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// The Session plugin is expected to be executed second, in order to skip authentication
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// for users that have already signed in.
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					var  authMethods  =  [ ] Method {  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						& OAuth2 { } ,   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						& Basic { } ,   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						& Session { } ,   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// The purpose of the following three function variables is to let the linter know that
  
					 
					 
					 
					// The purpose of the following three function variables is to let the linter know that
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// those functions are not dead code and are actually being used
  
					 
					 
					 
					// those functions are not dead code and are actually being used
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					var  (  
					 
					 
					 
					var  (  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						_  =  handleSignIn   
					 
					 
					 
						_  =  handleSignIn   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					)  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// Methods returns the instances of all registered methods
  
					 
					 
					 
						// SharedSession the session auth should only be used by web, but now both web and API/v1
   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					func  Methods ( )  [ ] Method  {  
					 
					 
					 
						// will use it. We can remove this after Web removed dependent API/v1
   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
						return  authMethods   
					 
					 
					 
						SharedSession  =  & Session { }   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					)  
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// Register adds the specified instance to the list of available methods
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					func  Register ( method  Method )  {  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						authMethods  =  append ( authMethods ,  method )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// Init should be called exactly once when the application starts to allow plugins
  
					 
					 
					 
					// Init should be called exactly once when the application starts to allow plugins
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// to allocate necessary resources
  
					 
					 
					 
					// to allocate necessary resources
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					func  Init ( )  {  
					 
					 
					 
					func  Init ( )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						if  setting . Service . EnableReverseProxyAuth  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							Register ( & ReverseProxy { } )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						specialInit ( )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						for  _ ,  method  :=  range  Methods ( )  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							initializable ,  ok  :=  method . ( Initializable )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  ! ok  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								continue   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							err  :=  initializable . Init ( )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								log . Error ( "Could not initialize '%s' auth method, error: %s" ,  reflect . TypeOf ( method ) . String ( ) ,  err )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						webauthn . Init ( )   
					 
					 
					 
						webauthn . Init ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// Free should be called exactly once when the application is terminating to allow Auth plugins
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// to release necessary resources
  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					func  Free ( )  {  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						for  _ ,  method  :=  range  Methods ( )  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							freeable ,  ok  :=  method . ( Freeable )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  ! ok  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								continue   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							err  :=  freeable . Free ( )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								log . Error ( "Could not free '%s' auth method, error: %s" ,  reflect . TypeOf ( method ) . String ( ) ,  err )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// isAttachmentDownload check if request is a file download (GET) with URL to an attachment
  
					 
					 
					 
					// isAttachmentDownload check if request is a file download (GET) with URL to an attachment
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					func  isAttachmentDownload ( req  * http . Request )  bool  {  
					 
					 
					 
					func  isAttachmentDownload ( req  * http . Request )  bool  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						return  strings . HasPrefix ( req . URL . Path ,  "/attachments/" )  &&  req . Method  ==  "GET"   
					 
					 
					 
						return  strings . HasPrefix ( req . URL . Path ,  "/attachments/" )  &&  req . Method  ==  "GET"