2017-04-19 11:45:01 +08:00
// Copyright 2017 The Gitea 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 private includes all internal routes. The package name internal is ideal but Golang is not allowed, so we use private as package name instead.
package private
import (
2021-01-26 23:36:53 +08:00
"net/http"
"reflect"
2017-04-19 11:45:01 +08:00
"strings"
2021-01-26 23:36:53 +08:00
"code.gitea.io/gitea/modules/context"
2019-12-24 08:11:12 +08:00
"code.gitea.io/gitea/modules/log"
2019-12-26 19:29:45 +08:00
"code.gitea.io/gitea/modules/private"
2017-04-19 11:45:01 +08:00
"code.gitea.io/gitea/modules/setting"
2021-01-26 23:36:53 +08:00
"code.gitea.io/gitea/modules/web"
2017-05-04 13:42:02 +08:00
2021-01-26 23:36:53 +08:00
"gitea.com/go-chi/binding"
2017-04-19 11:45:01 +08:00
)
// CheckInternalToken check internal token is set
2021-01-26 23:36:53 +08:00
func CheckInternalToken ( next http . Handler ) http . Handler {
return http . HandlerFunc ( func ( w http . ResponseWriter , req * http . Request ) {
tokens := req . Header . Get ( "Authorization" )
2021-05-15 23:32:09 +08:00
fields := strings . SplitN ( tokens , " " , 2 )
2021-01-26 23:36:53 +08:00
if len ( fields ) != 2 || fields [ 0 ] != "Bearer" || fields [ 1 ] != setting . InternalToken {
log . Debug ( "Forbidden attempt to access internal url: Authorization header: %s" , tokens )
http . Error ( w , http . StatusText ( http . StatusForbidden ) , http . StatusForbidden )
} else {
next . ServeHTTP ( w , req )
}
} )
}
// bind binding an obj to a handler
func bind ( obj interface { } ) http . HandlerFunc {
var tp = reflect . TypeOf ( obj )
for tp . Kind ( ) == reflect . Ptr {
tp = tp . Elem ( )
2017-04-19 11:45:01 +08:00
}
2021-01-26 23:36:53 +08:00
return web . Wrap ( func ( ctx * context . PrivateContext ) {
var theObj = reflect . New ( tp ) . Interface ( ) // create a new form obj for every request but not use obj directly
binding . Bind ( ctx . Req , theObj )
web . SetForm ( ctx , theObj )
} )
2017-04-19 11:45:01 +08:00
}
2021-01-26 23:36:53 +08:00
// Routes registers all internal APIs routes to web application.
2017-04-19 11:45:01 +08:00
// These APIs will be invoked by internal commands for example `gitea serv` and etc.
2021-01-26 23:36:53 +08:00
func Routes ( ) * web . Route {
var r = web . NewRoute ( )
r . Use ( context . PrivateContexter ( ) )
r . Use ( CheckInternalToken )
r . Post ( "/ssh/authorized_keys" , AuthorizedPublicKeyByContent )
r . Post ( "/ssh/{id}/update/{repoid}" , UpdatePublicKeyInRepo )
2021-05-22 05:37:16 +08:00
r . Post ( "/ssh/log" , bind ( private . SSHLogOption { } ) , SSHLog )
2021-01-26 23:36:53 +08:00
r . Post ( "/hook/pre-receive/{owner}/{repo}" , bind ( private . HookOptions { } ) , HookPreReceive )
r . Post ( "/hook/post-receive/{owner}/{repo}" , bind ( private . HookOptions { } ) , HookPostReceive )
2021-07-28 17:42:56 +08:00
r . Post ( "/hook/proc-receive/{owner}/{repo}" , bind ( private . HookOptions { } ) , HookProcReceive )
2021-01-26 23:36:53 +08:00
r . Post ( "/hook/set-default-branch/{owner}/{repo}/{branch}" , SetDefaultBranch )
r . Get ( "/serv/none/{keyid}" , ServNoCommand )
r . Get ( "/serv/command/{keyid}/{owner}/{repo}" , ServCommand )
r . Post ( "/manager/shutdown" , Shutdown )
r . Post ( "/manager/restart" , Restart )
r . Post ( "/manager/flush-queues" , bind ( private . FlushOptions { } ) , FlushQueues )
r . Post ( "/manager/pause-logging" , PauseLogging )
r . Post ( "/manager/resume-logging" , ResumeLogging )
r . Post ( "/manager/release-and-reopen-logging" , ReleaseReopenLogging )
r . Post ( "/manager/add-logger" , bind ( private . LoggerOptions { } ) , AddLogger )
r . Post ( "/manager/remove-logger/{group}/{name}" , RemoveLogger )
r . Post ( "/mail/send" , SendEmail )
2021-05-10 15:57:45 +08:00
r . Post ( "/restore_repo" , RestoreRepo )
2021-01-26 23:36:53 +08:00
return r
2017-04-19 11:45:01 +08:00
}