2014-02-19 13:50:53 +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.
2014-05-02 05:21:46 +04:00
package cmd
2014-02-19 13:50:53 +04:00
import (
2014-12-11 13:14:41 +03:00
"crypto/tls"
2014-02-19 13:50:53 +04:00
"fmt"
2014-02-19 23:49:08 +04:00
"html/template"
2014-05-28 08:06:31 +04:00
"io/ioutil"
2014-02-19 13:50:53 +04:00
"net/http"
2014-11-04 04:46:53 +03:00
"net/http/fcgi"
2014-04-16 04:01:20 +04:00
"os"
2014-05-26 04:11:25 +04:00
"path"
2014-09-29 13:38:46 +04:00
"strings"
2014-02-19 13:50:53 +04:00
2014-07-26 08:24:27 +04:00
"github.com/Unknwon/macaron"
2014-02-19 13:50:53 +04:00
"github.com/codegangsta/cli"
2015-08-06 18:03:04 +03:00
"github.com/go-xorm/xorm"
2014-10-15 19:19:20 +04:00
"github.com/macaron-contrib/binding"
2014-08-01 01:25:34 +04:00
"github.com/macaron-contrib/cache"
"github.com/macaron-contrib/captcha"
"github.com/macaron-contrib/csrf"
2014-07-26 08:24:27 +04:00
"github.com/macaron-contrib/i18n"
2014-11-29 05:20:13 +03:00
"github.com/macaron-contrib/oauth2"
2014-07-26 08:24:27 +04:00
"github.com/macaron-contrib/session"
2014-08-07 01:21:24 +04:00
"github.com/macaron-contrib/toolbox"
2015-08-06 18:03:04 +03:00
"github.com/mcuadros/go-version"
2015-01-02 15:14:43 +03:00
"gopkg.in/ini.v1"
2014-02-19 13:50:53 +04:00
2014-12-13 04:30:32 +03:00
api "github.com/gogits/go-gogs-client"
2014-08-07 01:21:24 +04:00
"github.com/gogits/gogs/models"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/auth"
2014-05-05 21:08:01 +04:00
"github.com/gogits/gogs/modules/auth/apiv1"
2014-03-23 14:13:23 +04:00
"github.com/gogits/gogs/modules/avatar"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/base"
2015-03-18 13:37:44 +03:00
"github.com/gogits/gogs/modules/bindata"
2014-03-08 02:22:15 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-15 15:01:50 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-05-26 04:11:25 +04:00
"github.com/gogits/gogs/modules/setting"
2014-02-19 13:50:53 +04:00
"github.com/gogits/gogs/routers"
2014-03-20 15:50:26 +04:00
"github.com/gogits/gogs/routers/admin"
2014-03-29 18:01:52 +04:00
"github.com/gogits/gogs/routers/api/v1"
2014-03-19 20:50:44 +04:00
"github.com/gogits/gogs/routers/dev"
2014-07-26 10:28:04 +04:00
"github.com/gogits/gogs/routers/org"
2014-02-20 06:45:43 +04:00
"github.com/gogits/gogs/routers/repo"
2014-02-19 13:50:53 +04:00
"github.com/gogits/gogs/routers/user"
)
var CmdWeb = cli . Command {
Name : "web" ,
2014-05-02 05:21:46 +04:00
Usage : "Start Gogs web server" ,
2014-08-30 17:12:53 +04:00
Description : ` Gogs web server is the only thing you need to run ,
2014-03-24 15:36:38 +04:00
and it takes care of all the other things for you ` ,
2014-02-19 13:50:53 +04:00
Action : runWeb ,
2015-02-01 20:41:03 +03:00
Flags : [ ] cli . Flag {
cli . StringFlag { "port, p" , "3000" , "Temporary port number to prevent conflict" , "" } ,
2015-02-09 05:26:14 +03:00
cli . StringFlag { "config, c" , "custom/conf/app.ini" , "Custom configuration file path" , "" } ,
2015-02-01 20:41:03 +03:00
} ,
2014-02-19 13:50:53 +04:00
}
2014-12-15 09:49:59 +03:00
type VerChecker struct {
ImportPath string
Version func ( ) string
Expected string
}
2014-08-24 17:09:05 +04:00
// checkVersion checks if binary matches the version of templates files.
2014-05-26 04:57:01 +04:00
func checkVersion ( ) {
2014-09-28 09:38:25 +04:00
// Templates.
2015-08-02 06:36:18 +03:00
data , err := ioutil . ReadFile ( setting . StaticRootPath + "/templates/.VERSION" )
2014-05-26 04:57:01 +04:00
if err != nil {
2014-07-26 08:24:27 +04:00
log . Fatal ( 4 , "Fail to read 'templates/.VERSION': %v" , err )
2014-05-26 04:57:01 +04:00
}
if string ( data ) != setting . AppVer {
2014-07-26 08:24:27 +04:00
log . Fatal ( 4 , "Binary and template file version does not match, did you forget to recompile?" )
2014-05-26 04:57:01 +04:00
}
2014-09-28 09:38:25 +04:00
2014-10-07 03:12:52 +04:00
// Check dependency version.
2014-12-15 09:49:59 +03:00
checkers := [ ] VerChecker {
2015-08-06 18:03:04 +03:00
{ "github.com/go-xorm/xorm" , func ( ) string { return xorm . Version } , "0.4.3.0806" } ,
2015-03-18 08:29:54 +03:00
{ "github.com/Unknwon/macaron" , macaron . Version , "0.5.4" } ,
2015-07-24 16:02:49 +03:00
{ "github.com/macaron-contrib/binding" , binding . Version , "0.1.0" } ,
2015-01-17 10:17:53 +03:00
{ "github.com/macaron-contrib/cache" , cache . Version , "0.0.7" } ,
2015-02-05 03:14:09 +03:00
{ "github.com/macaron-contrib/csrf" , csrf . Version , "0.0.3" } ,
2015-03-18 13:37:44 +03:00
{ "github.com/macaron-contrib/i18n" , i18n . Version , "0.0.7" } ,
2015-01-17 10:17:53 +03:00
{ "github.com/macaron-contrib/session" , session . Version , "0.1.6" } ,
2015-07-28 13:01:27 +03:00
{ "gopkg.in/ini.v1" , ini . Version , "1.3.4" } ,
2014-10-10 14:15:27 +04:00
}
2014-12-15 09:49:59 +03:00
for _ , c := range checkers {
2015-08-06 18:03:04 +03:00
if ! version . Compare ( c . Version ( ) , c . Expected , ">=" ) {
log . Fatal ( 4 , "Package '%s' version is too old(%s -> %s), did you forget to update?" , c . ImportPath , c . Version ( ) , c . Expected )
2014-12-15 09:49:59 +03:00
}
2014-09-28 09:38:25 +04:00
}
2014-05-26 04:57:01 +04:00
}
2014-07-26 08:24:27 +04:00
// newMacaron initializes Macaron instance.
func newMacaron ( ) * macaron . Macaron {
m := macaron . New ( )
2015-07-31 10:03:30 +03:00
if ! setting . DisableRouterLog {
m . Use ( macaron . Logger ( ) )
}
2014-07-26 08:24:27 +04:00
m . Use ( macaron . Recovery ( ) )
2014-10-14 02:04:07 +04:00
if setting . EnableGzip {
m . Use ( macaron . Gziper ( ) )
}
2014-11-16 08:06:09 +03:00
if setting . Protocol == setting . FCGI {
m . SetURLPrefix ( setting . AppSubUrl )
}
2014-09-16 01:23:58 +04:00
m . Use ( macaron . Static (
path . Join ( setting . StaticRootPath , "public" ) ,
2014-07-26 08:24:27 +04:00
macaron . StaticOptions {
2015-07-31 10:03:30 +03:00
SkipLogging : setting . DisableRouterLog ,
2014-07-26 08:24:27 +04:00
} ,
) )
2014-11-21 18:58:08 +03:00
m . Use ( macaron . Static (
setting . AvatarUploadPath ,
macaron . StaticOptions {
Prefix : "avatars" ,
2015-07-31 10:03:30 +03:00
SkipLogging : setting . DisableRouterLog ,
2014-11-21 18:58:08 +03:00
} ,
) )
2014-07-26 08:24:27 +04:00
m . Use ( macaron . Renderer ( macaron . RenderOptions {
Directory : path . Join ( setting . StaticRootPath , "templates" ) ,
Funcs : [ ] template . FuncMap { base . TemplateFuncs } ,
IndentJSON : macaron . Env != macaron . PROD ,
} ) )
2015-03-18 13:37:44 +03:00
localeNames , err := bindata . AssetDir ( "conf/locale" )
if err != nil {
log . Fatal ( 4 , "Fail to list locale files: %v" , err )
}
localFiles := make ( map [ string ] [ ] byte )
for _ , name := range localeNames {
localFiles [ name ] = bindata . MustAsset ( "conf/locale/" + name )
}
2014-08-07 01:21:24 +04:00
m . Use ( i18n . I18n ( i18n . Options {
2014-10-10 02:35:09 +04:00
SubURL : setting . AppSubUrl ,
2015-03-18 13:37:44 +03:00
Files : localFiles ,
2014-10-10 02:35:09 +04:00
CustomDirectory : path . Join ( setting . CustomPath , "conf/locale" ) ,
Langs : setting . Langs ,
Names : setting . Names ,
Redirect : true ,
2014-07-26 08:24:27 +04:00
} ) )
2014-08-01 01:25:34 +04:00
m . Use ( cache . Cacher ( cache . Options {
2014-12-31 12:08:57 +03:00
Adapter : setting . CacheAdapter ,
AdapterConfig : setting . CacheConn ,
Interval : setting . CacheInternal ,
2014-08-01 01:25:34 +04:00
} ) )
2014-09-20 04:11:34 +04:00
m . Use ( captcha . Captchaer ( captcha . Options {
SubURL : setting . AppSubUrl ,
} ) )
2014-12-28 15:40:35 +03:00
m . Use ( session . Sessioner ( setting . SessionConfig ) )
2014-12-21 06:51:16 +03:00
m . Use ( csrf . Csrfer ( csrf . Options {
2014-09-21 20:22:50 +04:00
Secret : setting . SecretKey ,
SetCookie : true ,
Header : "X-Csrf-Token" ,
CookiePath : setting . AppSubUrl ,
2014-08-01 01:25:34 +04:00
} ) )
2014-08-07 01:21:24 +04:00
m . Use ( toolbox . Toolboxer ( m , toolbox . Options {
HealthCheckFuncs : [ ] * toolbox . HealthCheckFuncDesc {
& toolbox . HealthCheckFuncDesc {
Desc : "Database connection" ,
Func : models . Ping ,
} ,
} ,
} ) )
2014-11-29 05:20:13 +03:00
// OAuth 2.
2014-11-30 18:55:26 +03:00
if setting . OauthService != nil {
for _ , info := range setting . OauthService . OauthInfos {
m . Use ( oauth2 . NewOAuth2Provider ( info . Options , info . AuthUrl , info . TokenUrl ) )
}
2014-11-29 05:20:13 +03:00
}
2014-08-07 14:40:05 +04:00
m . Use ( middleware . Contexter ( ) )
2014-07-26 08:24:27 +04:00
return m
2014-03-19 13:31:38 +04:00
}
2015-02-01 20:41:03 +03:00
func runWeb ( ctx * cli . Context ) {
2015-02-05 13:12:37 +03:00
if ctx . IsSet ( "config" ) {
setting . CustomConf = ctx . String ( "config" )
}
2014-03-30 01:50:51 +04:00
routers . GlobalInit ( )
2015-02-15 01:01:33 +03:00
checkVersion ( )
2014-02-19 13:50:53 +04:00
2014-07-26 08:24:27 +04:00
m := newMacaron ( )
2014-03-15 15:01:50 +04:00
2014-03-22 21:44:02 +04:00
reqSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true } )
2014-05-26 04:11:25 +04:00
ignSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : setting . Service . RequireSignInView } )
2014-04-16 12:12:31 +04:00
ignSignInAndCsrf := middleware . Toggle ( & middleware . ToggleOptions { DisableCsrf : true } )
2014-03-22 21:44:02 +04:00
reqSignOut := middleware . Toggle ( & middleware . ToggleOptions { SignOutRequire : true } )
2014-11-13 20:57:00 +03:00
bind := binding . Bind
2014-05-05 10:42:52 +04:00
bindIgnErr := binding . BindIgnErr
2014-04-10 22:37:43 +04:00
2014-02-19 13:50:53 +04:00
// Routers.
2014-03-24 19:58:46 +04:00
m . Get ( "/" , ignSignIn , routers . Home )
2014-09-15 18:09:17 +04:00
m . Get ( "/explore" , ignSignIn , routers . Explore )
2015-02-01 20:41:03 +03:00
m . Combo ( "/install" , routers . InstallInit ) .
Get ( routers . Install ) .
Post ( bindIgnErr ( auth . InstallForm { } ) , routers . InstallPost )
2014-10-25 02:43:17 +04:00
m . Group ( "" , func ( ) {
m . Get ( "/pulls" , user . Pulls )
m . Get ( "/issues" , user . Issues )
2014-06-06 06:07:35 +04:00
} , reqSignIn )
2014-03-29 18:01:52 +04:00
2014-11-13 10:32:18 +03:00
// API.
2014-11-13 20:57:00 +03:00
// FIXME: custom form error response.
2014-10-25 02:43:17 +04:00
m . Group ( "/api" , func ( ) {
m . Group ( "/v1" , func ( ) {
2014-05-22 05:37:13 +04:00
// Miscellaneous.
2014-10-25 02:43:17 +04:00
m . Post ( "/markdown" , bindIgnErr ( apiv1 . MarkdownForm { } ) , v1 . Markdown )
m . Post ( "/markdown/raw" , v1 . MarkdownRaw )
2014-05-22 05:37:13 +04:00
// Users.
2014-10-25 02:43:17 +04:00
m . Group ( "/users" , func ( ) {
m . Get ( "/search" , v1 . SearchUsers )
2014-11-18 19:07:16 +03:00
m . Group ( "/:username" , func ( ) {
m . Get ( "" , v1 . GetUserInfo )
m . Group ( "/tokens" , func ( ) {
m . Combo ( "" ) . Get ( v1 . ListAccessTokens ) . Post ( bind ( v1 . CreateAccessTokenForm { } ) , v1 . CreateAccessToken )
} , middleware . ApiReqBasicAuth ( ) )
} )
2014-08-29 13:31:53 +04:00
} )
2014-07-12 08:55:19 +04:00
// Repositories.
2014-12-13 04:30:32 +03:00
m . Combo ( "/user/repos" , middleware . ApiReqToken ( ) ) . Get ( v1 . ListMyRepos ) . Post ( bind ( api . CreateRepoOption { } ) , v1 . CreateRepo )
m . Post ( "/org/:org/repos" , middleware . ApiReqToken ( ) , bind ( api . CreateRepoOption { } ) , v1 . CreateOrgRepo )
2014-10-25 02:43:17 +04:00
m . Group ( "/repos" , func ( ) {
m . Get ( "/search" , v1 . SearchRepos )
2014-12-13 04:30:32 +03:00
m . Post ( "/migrate" , bindIgnErr ( auth . MigrateRepoForm { } ) , v1 . MigrateRepo )
2014-11-13 10:32:18 +03:00
m . Group ( "/:username/:reponame" , func ( ) {
2014-12-13 04:30:32 +03:00
m . Combo ( "/hooks" ) . Get ( v1 . ListRepoHooks ) . Post ( bind ( api . CreateHookOption { } ) , v1 . CreateRepoHook )
m . Patch ( "/hooks/:id:int" , bind ( api . EditHookOption { } ) , v1 . EditRepoHook )
2014-11-17 05:32:26 +03:00
m . Get ( "/raw/*" , middleware . RepoRef ( ) , v1 . GetRepoRawFile )
2014-11-13 20:57:00 +03:00
} , middleware . ApiRepoAssignment ( ) , middleware . ApiReqToken ( ) )
2014-08-29 13:31:53 +04:00
} )
2014-05-22 05:37:13 +04:00
2014-10-25 02:43:17 +04:00
m . Any ( "/*" , func ( ctx * middleware . Context ) {
2015-02-22 17:49:25 +03:00
ctx . HandleAPI ( 404 , "Page not found" )
2014-05-22 05:37:13 +04:00
} )
2014-05-05 21:08:01 +04:00
} )
2015-07-15 14:17:57 +03:00
} , ignSignIn )
2014-03-23 00:00:46 +04:00
2014-11-13 10:32:18 +03:00
// User.
2014-10-25 02:43:17 +04:00
m . Group ( "/user" , func ( ) {
m . Get ( "/login" , user . SignIn )
m . Post ( "/login" , bindIgnErr ( auth . SignInForm { } ) , user . SignInPost )
2014-11-29 05:20:13 +03:00
m . Get ( "/info/:name" , user . SocialSignIn )
2014-10-25 02:43:17 +04:00
m . Get ( "/sign_up" , user . SignUp )
m . Post ( "/sign_up" , bindIgnErr ( auth . RegisterForm { } ) , user . SignUpPost )
m . Get ( "/reset_password" , user . ResetPasswd )
m . Post ( "/reset_password" , user . ResetPasswdPost )
2014-03-23 00:00:46 +04:00
} , reqSignOut )
2014-10-25 02:43:17 +04:00
m . Group ( "/user/settings" , func ( ) {
m . Get ( "" , user . Settings )
m . Post ( "" , bindIgnErr ( auth . UpdateProfileForm { } ) , user . SettingsPost )
2014-11-21 18:58:08 +03:00
m . Post ( "/avatar" , binding . MultipartForm ( auth . UploadAvatarForm { } ) , user . SettingsAvatar )
2014-12-17 18:42:54 +03:00
m . Get ( "/email" , user . SettingsEmails )
m . Post ( "/email" , bindIgnErr ( auth . AddEmailForm { } ) , user . SettingsEmailPost )
2014-10-25 02:43:17 +04:00
m . Get ( "/password" , user . SettingsPassword )
m . Post ( "/password" , bindIgnErr ( auth . ChangePasswordForm { } ) , user . SettingsPasswordPost )
m . Get ( "/ssh" , user . SettingsSSHKeys )
m . Post ( "/ssh" , bindIgnErr ( auth . AddSSHKeyForm { } ) , user . SettingsSSHKeysPost )
m . Get ( "/social" , user . SettingsSocial )
2014-11-12 14:48:50 +03:00
m . Combo ( "/applications" ) . Get ( user . SettingsApplications ) . Post ( bindIgnErr ( auth . NewAccessTokenForm { } ) , user . SettingsApplicationsPost )
2014-10-25 02:43:17 +04:00
m . Route ( "/delete" , "GET,POST" , user . SettingsDelete )
2014-03-23 00:00:46 +04:00
} , reqSignIn )
2014-10-25 02:43:17 +04:00
m . Group ( "/user" , func ( ) {
2014-07-26 08:24:27 +04:00
// r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds)
2014-10-25 02:43:17 +04:00
m . Any ( "/activate" , user . Activate )
2014-12-17 18:42:54 +03:00
m . Any ( "/activate_email" , user . ActivateEmail )
2014-10-25 02:43:17 +04:00
m . Get ( "/email2user" , user . Email2User )
m . Get ( "/forget_password" , user . ForgotPasswd )
m . Post ( "/forget_password" , user . ForgotPasswdPost )
m . Get ( "/logout" , user . SignOut )
2014-03-23 00:00:46 +04:00
} )
2014-03-10 12:54:52 +04:00
2014-08-01 01:25:34 +04:00
// Gravatar service.
avt := avatar . CacheServer ( "public/img/avatar/" , "public/img/avatar_default.jpg" )
os . MkdirAll ( "public/img/avatar/" , os . ModePerm )
m . Get ( "/avatar/:hash" , avt . ServeHTTP )
2014-03-08 02:08:21 +04:00
2014-03-22 21:44:02 +04:00
adminReq := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true , AdminRequire : true } )
2014-10-25 02:43:17 +04:00
m . Group ( "/admin" , func ( ) {
2014-08-29 16:50:43 +04:00
m . Get ( "" , adminReq , admin . Dashboard )
2014-10-25 02:43:17 +04:00
m . Get ( "/config" , admin . Config )
m . Get ( "/monitor" , admin . Monitor )
m . Group ( "/users" , func ( ) {
m . Get ( "" , admin . Users )
m . Get ( "/new" , admin . NewUser )
m . Post ( "/new" , bindIgnErr ( auth . RegisterForm { } ) , admin . NewUserPost )
m . Get ( "/:userid" , admin . EditUser )
m . Post ( "/:userid" , bindIgnErr ( auth . AdminEditUserForm { } ) , admin . EditUserPost )
m . Post ( "/:userid/delete" , admin . DeleteUser )
2014-08-29 16:50:43 +04:00
} )
2014-10-25 02:43:17 +04:00
m . Group ( "/orgs" , func ( ) {
m . Get ( "" , admin . Organizations )
2014-08-29 16:50:43 +04:00
} )
2014-10-25 02:43:17 +04:00
m . Group ( "/repos" , func ( ) {
m . Get ( "" , admin . Repositories )
2014-08-29 16:50:43 +04:00
} )
2014-10-25 02:43:17 +04:00
m . Group ( "/auths" , func ( ) {
m . Get ( "" , admin . Authentications )
m . Get ( "/new" , admin . NewAuthSource )
m . Post ( "/new" , bindIgnErr ( auth . AuthenticationForm { } ) , admin . NewAuthSourcePost )
m . Get ( "/:authid" , admin . EditAuthSource )
m . Post ( "/:authid" , bindIgnErr ( auth . AuthenticationForm { } ) , admin . EditAuthSourcePost )
m . Post ( "/:authid/delete" , admin . DeleteAuthSource )
2014-08-29 16:50:43 +04:00
} )
2014-10-09 02:29:18 +04:00
2014-10-25 02:43:17 +04:00
m . Group ( "/notices" , func ( ) {
m . Get ( "" , admin . Notices )
m . Get ( "/:id:int/delete" , admin . DeleteNotice )
2014-10-09 02:29:18 +04:00
} )
2014-05-03 06:48:14 +04:00
} , adminReq )
2014-07-12 08:55:19 +04:00
m . Get ( "/:username" , ignSignIn , user . Profile )
2014-07-26 08:24:27 +04:00
if macaron . Env == macaron . DEV {
2014-08-01 01:25:34 +04:00
m . Get ( "/template/*" , dev . TemplatePreview )
2014-03-27 19:37:33 +04:00
}
2015-08-03 12:42:09 +03:00
reqRepoAdmin := middleware . RequireRepoAdmin ( )
2014-07-26 10:28:04 +04:00
2014-11-06 07:30:04 +03:00
// Organization.
2014-10-25 02:43:17 +04:00
m . Group ( "/org" , func ( ) {
m . Get ( "/create" , org . Create )
m . Post ( "/create" , bindIgnErr ( auth . CreateOrgForm { } ) , org . CreatePost )
m . Group ( "/:org" , func ( ) {
m . Get ( "/dashboard" , user . Dashboard )
m . Get ( "/members" , org . Members )
m . Get ( "/members/action/:action" , org . MembersAction )
m . Get ( "/teams" , org . Teams )
m . Get ( "/teams/:team" , org . TeamMembers )
m . Get ( "/teams/:team/repositories" , org . TeamRepositories )
m . Get ( "/teams/:team/action/:action" , org . TeamsAction )
m . Get ( "/teams/:team/action/repo/:action" , org . TeamsRepoAction )
2014-08-14 10:12:21 +04:00
} , middleware . OrgAssignment ( true , true ) )
2014-07-26 10:28:04 +04:00
2014-10-25 02:43:17 +04:00
m . Group ( "/:org" , func ( ) {
m . Get ( "/teams/new" , org . NewTeam )
m . Post ( "/teams/new" , bindIgnErr ( auth . CreateTeamForm { } ) , org . NewTeamPost )
m . Get ( "/teams/:team/edit" , org . EditTeam )
m . Post ( "/teams/:team/edit" , bindIgnErr ( auth . CreateTeamForm { } ) , org . EditTeamPost )
m . Post ( "/teams/:team/delete" , org . DeleteTeam )
m . Group ( "/settings" , func ( ) {
m . Get ( "" , org . Settings )
m . Post ( "" , bindIgnErr ( auth . UpdateOrgSettingForm { } ) , org . SettingsPost )
m . Get ( "/hooks" , org . SettingsHooks )
m . Get ( "/hooks/new" , repo . WebHooksNew )
m . Post ( "/hooks/gogs/new" , bindIgnErr ( auth . NewWebhookForm { } ) , repo . WebHooksNewPost )
m . Post ( "/hooks/slack/new" , bindIgnErr ( auth . NewSlackHookForm { } ) , repo . SlackHooksNewPost )
m . Get ( "/hooks/:id" , repo . WebHooksEdit )
m . Post ( "/hooks/gogs/:id" , bindIgnErr ( auth . NewWebhookForm { } ) , repo . WebHooksEditPost )
m . Post ( "/hooks/slack/:id" , bindIgnErr ( auth . NewSlackHookForm { } ) , repo . SlackHooksEditPost )
m . Route ( "/delete" , "GET,POST" , org . SettingsDelete )
2014-08-14 10:12:21 +04:00
} )
2014-08-15 14:29:41 +04:00
2014-10-25 02:43:17 +04:00
m . Route ( "/invitations/new" , "GET,POST" , org . Invitation )
2014-08-16 12:21:17 +04:00
} , middleware . OrgAssignment ( true , true , true ) )
2014-07-26 10:28:04 +04:00
} , reqSignIn )
2014-10-25 02:43:17 +04:00
m . Group ( "/org" , func ( ) {
m . Get ( "/:org" , org . Home )
2015-03-24 00:58:52 +03:00
} , ignSignIn , middleware . OrgAssignment ( true ) )
2014-07-26 10:28:04 +04:00
2014-11-06 07:30:04 +03:00
// Repository.
2014-10-25 02:43:17 +04:00
m . Group ( "/repo" , func ( ) {
m . Get ( "/create" , repo . Create )
m . Post ( "/create" , bindIgnErr ( auth . CreateRepoForm { } ) , repo . CreatePost )
m . Get ( "/migrate" , repo . Migrate )
m . Post ( "/migrate" , bindIgnErr ( auth . MigrateRepoForm { } ) , repo . MigratePost )
2014-11-06 07:30:04 +03:00
m . Get ( "/fork" , repo . Fork )
m . Post ( "/fork" , bindIgnErr ( auth . CreateRepoForm { } ) , repo . ForkPost )
2014-07-27 07:53:16 +04:00
} , reqSignIn )
2014-10-25 02:43:17 +04:00
m . Group ( "/:username/:reponame" , func ( ) {
m . Get ( "/settings" , repo . Settings )
m . Post ( "/settings" , bindIgnErr ( auth . RepoSettingForm { } ) , repo . SettingsPost )
m . Group ( "/settings" , func ( ) {
m . Route ( "/collaboration" , "GET,POST" , repo . SettingsCollaboration )
m . Get ( "/hooks" , repo . Webhooks )
m . Get ( "/hooks/new" , repo . WebHooksNew )
m . Post ( "/hooks/gogs/new" , bindIgnErr ( auth . NewWebhookForm { } ) , repo . WebHooksNewPost )
m . Post ( "/hooks/slack/new" , bindIgnErr ( auth . NewSlackHookForm { } ) , repo . SlackHooksNewPost )
m . Get ( "/hooks/:id" , repo . WebHooksEdit )
m . Post ( "/hooks/gogs/:id" , bindIgnErr ( auth . NewWebhookForm { } ) , repo . WebHooksEditPost )
m . Post ( "/hooks/slack/:id" , bindIgnErr ( auth . NewSlackHookForm { } ) , repo . SlackHooksEditPost )
m . Group ( "/hooks/git" , func ( ) {
m . Get ( "" , repo . GitHooks )
m . Get ( "/:name" , repo . GitHooksEdit )
m . Post ( "/:name" , repo . GitHooksEditPost )
2014-10-07 01:50:00 +04:00
} , middleware . GitHookService ( ) )
2015-08-06 17:48:11 +03:00
m . Group ( "/keys" , func ( ) {
m . Combo ( "" ) . Get ( repo . SettingsDeployKeys ) .
Post ( bindIgnErr ( auth . AddSSHKeyForm { } ) , repo . SettingsDeployKeysPost )
m . Post ( "/delete" , repo . DeleteDeployKey )
} )
2014-07-26 10:28:04 +04:00
} )
2015-08-03 12:42:09 +03:00
} , reqSignIn , middleware . RepoAssignment ( true ) , reqRepoAdmin )
2014-07-26 10:28:04 +04:00
2014-10-25 02:43:17 +04:00
m . Group ( "/:username/:reponame" , func ( ) {
m . Get ( "/action/:action" , repo . Action )
m . Group ( "/issues" , func ( ) {
m . Get ( "/new" , repo . CreateIssue )
m . Post ( "/new" , bindIgnErr ( auth . CreateIssueForm { } ) , repo . CreateIssuePost )
m . Post ( "/:index" , bindIgnErr ( auth . CreateIssueForm { } ) , repo . UpdateIssue )
m . Post ( "/:index/label" , repo . UpdateIssueLabel )
m . Post ( "/:index/milestone" , repo . UpdateIssueMilestone )
m . Post ( "/:index/assignee" , repo . UpdateAssignee )
m . Get ( "/:index/attachment/:id" , repo . IssueGetAttachment )
2015-07-24 11:42:47 +03:00
} )
m . Group ( "/labels" , func ( ) {
m . Post ( "/new" , bindIgnErr ( auth . CreateLabelForm { } ) , repo . NewLabel )
m . Post ( "/edit" , bindIgnErr ( auth . CreateLabelForm { } ) , repo . UpdateLabel )
m . Post ( "/delete" , repo . DeleteLabel )
2015-08-03 12:42:09 +03:00
} , reqRepoAdmin )
2015-07-24 11:42:47 +03:00
m . Group ( "/milestones" , func ( ) {
m . Get ( "/new" , repo . NewMilestone )
m . Post ( "/new" , bindIgnErr ( auth . CreateMilestoneForm { } ) , repo . NewMilestonePost )
2015-08-06 18:25:35 +03:00
m . Get ( "/:id/edit" , repo . EditMilestone )
m . Post ( "/:id/edit" , bindIgnErr ( auth . CreateMilestoneForm { } ) , repo . EditMilestonePost )
m . Get ( "/:id/:action" , repo . ChangeMilestonStatus )
2015-08-05 15:23:08 +03:00
m . Post ( "/delete" , repo . DeleteMilestone )
2015-08-03 12:42:09 +03:00
} , reqRepoAdmin )
2014-07-26 10:28:04 +04:00
2014-10-25 02:43:17 +04:00
m . Post ( "/comment/:action" , repo . Comment )
2014-12-11 00:37:54 +03:00
m . Group ( "/releases" , func ( ) {
m . Get ( "/new" , repo . NewRelease )
m . Post ( "/new" , bindIgnErr ( auth . NewReleaseForm { } ) , repo . NewReleasePost )
m . Get ( "/edit/:tagname" , repo . EditRelease )
m . Post ( "/edit/:tagname" , bindIgnErr ( auth . EditReleaseForm { } ) , repo . EditReleasePost )
2015-08-03 12:42:09 +03:00
} , reqRepoAdmin , middleware . RepoRef ( ) )
2014-11-07 06:06:41 +03:00
} , reqSignIn , middleware . RepoAssignment ( true ) )
2014-07-26 10:28:04 +04:00
2014-10-25 02:43:17 +04:00
m . Group ( "/:username/:reponame" , func ( ) {
2014-12-11 00:37:54 +03:00
m . Get ( "/releases" , middleware . RepoRef ( ) , repo . Releases )
2015-07-24 16:02:49 +03:00
m . Get ( "/issues" , repo . RetrieveLabels , repo . Issues )
2014-10-25 02:43:17 +04:00
m . Get ( "/issues/:index" , repo . ViewIssue )
2015-07-24 16:02:49 +03:00
m . Get ( "/labels/" , repo . RetrieveLabels , repo . Labels )
2015-07-24 11:42:47 +03:00
m . Get ( "/milestones" , repo . Milestones )
2014-10-25 02:43:17 +04:00
m . Get ( "/pulls" , repo . Pulls )
m . Get ( "/branches" , repo . Branches )
m . Get ( "/archive/*" , repo . Download )
2014-11-17 18:07:34 +03:00
m . Get ( "/pulls2/" , repo . PullRequest2 )
2015-07-25 16:32:04 +03:00
m . Head ( "/hooks/trigger" , repo . TriggerHook )
2014-07-26 08:24:27 +04:00
2014-11-07 06:06:41 +03:00
m . Group ( "" , func ( ) {
m . Get ( "/src/*" , repo . Home )
m . Get ( "/raw/*" , repo . SingleDownload )
m . Get ( "/commits/*" , repo . RefCommits )
m . Get ( "/commit/*" , repo . Diff )
} , middleware . RepoRef ( ) )
2014-11-07 22:46:13 +03:00
2014-10-25 02:43:17 +04:00
m . Get ( "/compare/:before([a-z0-9]+)...:after([a-z0-9]+)" , repo . CompareDiff )
2014-11-07 06:06:41 +03:00
} , ignSignIn , middleware . RepoAssignment ( true ) )
2014-03-23 00:00:46 +04:00
2014-10-25 02:43:17 +04:00
m . Group ( "/:username" , func ( ) {
2015-07-31 09:25:12 +03:00
m . Group ( "/:reponame" , func ( ) {
m . Get ( "" , repo . Home )
m . Get ( ".git" , repo . Home )
} , ignSignIn , middleware . RepoAssignment ( true , true ) , middleware . RepoRef ( ) )
2014-10-25 02:43:17 +04:00
m . Any ( "/:reponame/*" , ignSignInAndCsrf , repo . Http )
2014-09-15 18:09:17 +04:00
} )
2014-03-21 20:48:26 +04:00
2014-09-22 03:39:10 +04:00
// robots.txt
m . Get ( "/robots.txt" , func ( ctx * middleware . Context ) {
if setting . HasRobotsTxt {
2015-03-18 08:29:54 +03:00
ctx . ServeFileContent ( path . Join ( setting . CustomPath , "robots.txt" ) )
2014-09-22 03:39:10 +04:00
} else {
ctx . Error ( 404 )
}
} )
2014-03-23 14:27:01 +04:00
// Not found handler.
2014-03-23 09:48:01 +04:00
m . NotFound ( routers . NotFound )
2015-02-01 20:41:03 +03:00
// Flag for port number in case first time run conflict.
if ctx . IsSet ( "port" ) {
setting . AppUrl = strings . Replace ( setting . AppUrl , setting . HttpPort , ctx . String ( "port" ) , 1 )
setting . HttpPort = ctx . String ( "port" )
}
2014-05-26 04:11:25 +04:00
var err error
listenAddr := fmt . Sprintf ( "%s:%s" , setting . HttpAddr , setting . HttpPort )
2014-09-20 04:11:34 +04:00
log . Info ( "Listen: %v://%s%s" , setting . Protocol , listenAddr , setting . AppSubUrl )
2014-05-26 04:11:25 +04:00
switch setting . Protocol {
case setting . HTTP :
err = http . ListenAndServe ( listenAddr , m )
case setting . HTTPS :
2014-12-12 02:55:09 +03:00
server := & http . Server { Addr : listenAddr , TLSConfig : & tls . Config { MinVersion : tls . VersionTLS10 } , Handler : m }
2014-12-11 13:14:41 +03:00
err = server . ListenAndServeTLS ( setting . CertFile , setting . KeyFile )
2014-11-04 04:46:53 +03:00
case setting . FCGI :
err = fcgi . Serve ( nil , m )
2014-05-26 04:11:25 +04:00
default :
2014-07-26 08:24:27 +04:00
log . Fatal ( 4 , "Invalid protocol: %s" , setting . Protocol )
2014-05-26 04:11:25 +04:00
}
if err != nil {
2014-07-26 08:24:27 +04:00
log . Fatal ( 4 , "Fail to start server: %v" , err )
2014-03-18 17:58:58 +04:00
}
2014-02-19 13:50:53 +04:00
}