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 (
"fmt"
2014-02-19 23:49:08 +04:00
"html/template"
2014-02-19 13:50:53 +04:00
"net/http"
2014-04-16 04:01:20 +04:00
"os"
2014-02-19 13:50:53 +04:00
"github.com/codegangsta/cli"
2014-03-30 20:11:28 +04:00
"github.com/go-martini/martini"
2014-04-06 21:00:20 +04:00
qlog "github.com/qiniu/log"
2014-02-19 13:50:53 +04:00
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"
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-05 10:42:52 +04:00
"github.com/gogits/gogs/modules/middleware/binding"
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-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-05-05 08:55:17 +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 ,
2014-03-13 10:09:36 +04:00
Flags : [ ] cli . Flag { } ,
2014-02-19 13:50:53 +04:00
}
2014-03-19 13:31:38 +04:00
func newMartini ( ) * martini . ClassicMartini {
r := martini . NewRouter ( )
m := martini . New ( )
m . Use ( middleware . Logger ( ) )
m . Use ( martini . Recovery ( ) )
2014-05-06 21:47:47 +04:00
m . Use ( martini . Static ( "public" , martini . StaticOptions { SkipLogging : ! base . DisableRouterLog } ) )
2014-03-19 13:31:38 +04:00
m . MapTo ( r , ( * martini . Routes ) ( nil ) )
m . Action ( r . Handle )
return & martini . ClassicMartini { m , r }
}
2014-02-19 13:50:53 +04:00
func runWeb ( * cli . Context ) {
2014-03-30 01:50:51 +04:00
routers . GlobalInit ( )
2014-02-19 13:50:53 +04:00
2014-03-19 13:31:38 +04:00
m := newMartini ( )
2014-02-19 13:50:53 +04:00
2014-03-08 02:08:21 +04:00
// Middlewares.
2014-05-05 21:08:01 +04:00
m . Use ( middleware . Renderer ( middleware . RenderOptions {
Funcs : [ ] template . FuncMap { base . TemplateFuncs } ,
IndentJSON : true ,
} ) )
2014-03-15 15:01:50 +04:00
m . Use ( middleware . InitContext ( ) )
2014-03-22 21:44:02 +04:00
reqSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true } )
ignSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : base . Service . RequireSignInView } )
2014-04-16 12:12:31 +04:00
ignSignInAndCsrf := middleware . Toggle ( & middleware . ToggleOptions { DisableCsrf : true } )
2014-04-14 09:57:25 +04:00
2014-03-22 21:44:02 +04:00
reqSignOut := middleware . Toggle ( & middleware . ToggleOptions { SignOutRequire : true } )
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-04-11 00:36:50 +04:00
m . Get ( "/install" , bindIgnErr ( auth . InstallForm { } ) , routers . Install )
m . Post ( "/install" , bindIgnErr ( auth . InstallForm { } ) , routers . InstallPost )
2014-03-18 17:58:58 +04:00
m . Get ( "/issues" , reqSignIn , user . Issues )
m . Get ( "/pulls" , reqSignIn , user . Pulls )
m . Get ( "/stars" , reqSignIn , user . Stars )
2014-03-23 00:00:46 +04:00
m . Get ( "/help" , routers . Help )
2014-03-29 18:01:52 +04:00
m . Group ( "/api/v1" , func ( r martini . Router ) {
2014-05-01 07:48:01 +04:00
// Miscellaneous.
2014-05-05 21:08:01 +04:00
r . Post ( "/markdown" , bindIgnErr ( apiv1 . MarkdownForm { } ) , v1 . Markdown )
r . Post ( "/markdown/raw" , v1 . MarkdownRaw )
2014-05-01 07:48:01 +04:00
// Users.
r . Get ( "/users/search" , v1 . SearchUser )
2014-05-05 21:08:01 +04:00
r . Any ( "**" , func ( ctx * middleware . Context ) {
ctx . JSON ( 404 , & base . ApiJsonErr { "Not Found" , v1 . DOC_URL } )
} )
2014-03-29 18:01:52 +04:00
} )
2014-03-23 00:00:46 +04:00
2014-03-26 17:26:31 +04:00
avt := avatar . CacheServer ( "public/img/avatar/" , "public/img/avatar_default.jpg" )
2014-04-16 04:01:20 +04:00
os . MkdirAll ( "public/img/avatar/" , os . ModePerm )
2014-03-26 17:26:31 +04:00
m . Get ( "/avatar/:hash" , avt . ServeHTTP )
2014-03-23 18:40:35 +04:00
2014-03-23 00:00:46 +04:00
m . Group ( "/user" , func ( r martini . Router ) {
2014-05-06 00:21:43 +04:00
r . Get ( "/login" , user . SignIn )
2014-04-11 00:36:50 +04:00
r . Post ( "/login" , bindIgnErr ( auth . LogInForm { } ) , user . SignInPost )
2014-04-12 19:19:17 +04:00
r . Get ( "/login/:name" , user . SocialSignIn )
2014-04-11 00:36:50 +04:00
r . Get ( "/sign_up" , user . SignUp )
r . Post ( "/sign_up" , bindIgnErr ( auth . RegisterForm { } ) , user . SignUpPost )
r . Get ( "/reset_password" , user . ResetPasswd )
r . Post ( "/reset_password" , user . ResetPasswdPost )
2014-03-23 00:00:46 +04:00
} , reqSignOut )
m . Group ( "/user" , func ( r martini . Router ) {
2014-04-11 00:36:50 +04:00
r . Get ( "/delete" , user . Delete )
r . Post ( "/delete" , user . DeletePost )
2014-04-23 23:30:18 +04:00
r . Get ( "/settings" , user . Setting )
r . Post ( "/settings" , bindIgnErr ( auth . UpdateProfileForm { } ) , user . SettingPost )
2014-03-23 00:00:46 +04:00
} , reqSignIn )
m . Group ( "/user" , func ( r martini . Router ) {
2014-05-05 10:42:52 +04:00
r . Get ( "/feeds" , binding . Bind ( auth . FeedsForm { } ) , user . Feeds )
2014-04-18 20:12:10 +04:00
r . Any ( "/activate" , user . Activate )
2014-04-13 04:35:35 +04:00
r . Get ( "/email2user" , user . Email2User )
2014-04-11 02:09:57 +04:00
r . Get ( "/forget_password" , user . ForgotPasswd )
r . Post ( "/forget_password" , user . ForgotPasswdPost )
2014-04-19 05:14:35 +04:00
r . Get ( "/logout" , user . SignOut )
2014-03-23 00:00:46 +04:00
} )
2014-04-23 23:30:18 +04:00
m . Group ( "/user/settings" , func ( r martini . Router ) {
2014-04-14 05:00:12 +04:00
r . Get ( "/social" , user . SettingSocial )
2014-04-11 02:09:57 +04:00
r . Get ( "/password" , user . SettingPassword )
r . Post ( "/password" , bindIgnErr ( auth . UpdatePasswdForm { } ) , user . SettingPasswordPost )
2014-04-11 00:36:50 +04:00
r . Any ( "/ssh" , bindIgnErr ( auth . AddSSHKeyForm { } ) , user . SettingSSHKeys )
2014-04-11 02:09:57 +04:00
r . Get ( "/notification" , user . SettingNotification )
r . Get ( "/security" , user . SettingSecurity )
2014-03-23 00:00:46 +04:00
} , reqSignIn )
2014-03-10 12:54:52 +04:00
2014-03-18 17:58:58 +04:00
m . Get ( "/user/:username" , ignSignIn , user . Profile )
2014-03-08 02:08:21 +04:00
2014-04-11 02:09:57 +04:00
m . Group ( "/repo" , func ( r martini . Router ) {
2014-05-06 03:58:13 +04:00
r . Get ( "/create" , repo . Create )
2014-05-01 13:44:22 +04:00
r . Post ( "/create" , bindIgnErr ( auth . CreateRepoForm { } ) , repo . CreatePost )
r . Get ( "/migrate" , repo . Migrate )
r . Post ( "/migrate" , bindIgnErr ( auth . MigrateRepoForm { } ) , repo . MigratePost )
2014-04-11 02:09:57 +04:00
} , reqSignIn )
2014-03-13 10:08:49 +04:00
2014-03-22 21:44:02 +04:00
adminReq := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true , AdminRequire : true } )
m . Get ( "/admin" , adminReq , admin . Dashboard )
2014-03-23 00:00:46 +04:00
m . Group ( "/admin" , func ( r martini . Router ) {
r . Get ( "/users" , admin . Users )
r . Get ( "/repos" , admin . Repositories )
r . Get ( "/config" , admin . Config )
2014-05-03 06:48:14 +04:00
r . Get ( "/auths" , admin . Auths )
2014-03-23 00:00:46 +04:00
} , adminReq )
m . Group ( "/admin/users" , func ( r martini . Router ) {
2014-04-11 02:09:57 +04:00
r . Get ( "/new" , admin . NewUser )
r . Post ( "/new" , bindIgnErr ( auth . RegisterForm { } ) , admin . NewUserPost )
r . Get ( "/:userid" , admin . EditUser )
r . Post ( "/:userid" , bindIgnErr ( auth . AdminEditUserForm { } ) , admin . EditUserPost )
r . Get ( "/:userid/delete" , admin . DeleteUser )
2014-03-23 00:00:46 +04:00
} , adminReq )
2014-05-03 06:48:14 +04:00
m . Group ( "/admin/auths" , func ( r martini . Router ) {
r . Get ( "/new" , admin . NewAuthSource )
r . Post ( "/new" , bindIgnErr ( auth . AuthenticationForm { } ) , admin . NewAuthSourcePost )
r . Get ( "/:authid" , admin . EditAuthSource )
2014-05-05 12:40:25 +04:00
r . Post ( "/:authid" , bindIgnErr ( auth . AuthenticationForm { } ) , admin . EditAuthSourcePost )
2014-05-03 06:48:14 +04:00
r . Get ( "/:authid/delete" , admin . DeleteAuthSource )
} , adminReq )
2014-03-27 19:37:33 +04:00
if martini . Env == martini . Dev {
m . Get ( "/template/**" , dev . TemplatePreview )
}
2014-05-06 05:36:08 +04:00
reqOwner := middleware . RequireOwner ( )
2014-05-06 03:58:13 +04:00
2014-03-23 00:00:46 +04:00
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
2014-04-13 04:35:35 +04:00
r . Get ( "/settings" , repo . Setting )
2014-05-06 03:58:13 +04:00
r . Post ( "/settings" , bindIgnErr ( auth . RepoSettingForm { } ) , repo . SettingPost )
2014-05-01 19:32:12 +04:00
r . Get ( "/settings/collaboration" , repo . Collaboration )
r . Post ( "/settings/collaboration" , repo . CollaborationPost )
2014-05-06 05:36:08 +04:00
r . Get ( "/settings/hooks" , repo . WebHooks )
2014-05-05 08:55:17 +04:00
r . Get ( "/settings/hooks/add" , repo . WebHooksAdd )
2014-05-06 04:52:25 +04:00
r . Post ( "/settings/hooks/add" , bindIgnErr ( auth . NewWebhookForm { } ) , repo . WebHooksAddPost )
2014-05-06 05:36:08 +04:00
r . Get ( "/settings/hooks/:id" , repo . WebHooksEdit )
r . Post ( "/settings/hooks/:id" , bindIgnErr ( auth . NewWebhookForm { } ) , repo . WebHooksEditPost )
} , reqSignIn , middleware . RepoAssignment ( true ) , reqOwner )
2014-05-06 03:58:13 +04:00
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
2014-05-07 00:28:52 +04:00
r . Get ( "/action/:action" , repo . Action )
2014-04-11 02:09:57 +04:00
r . Get ( "/issues/new" , repo . CreateIssue )
r . Post ( "/issues/new" , bindIgnErr ( auth . CreateIssueForm { } ) , repo . CreateIssuePost )
2014-04-11 00:36:50 +04:00
r . Post ( "/issues/:index" , bindIgnErr ( auth . CreateIssueForm { } ) , repo . UpdateIssue )
2014-05-11 21:46:36 +04:00
r . Post ( "/issues/:index/assignee" , repo . UpdateAssignee )
2014-05-14 18:55:36 +04:00
r . Post ( "/issues/:index/milestone" , repo . UpdateIssueMilestone )
2014-05-07 17:01:00 +04:00
r . Get ( "/issues/milestones" , repo . Milestones )
2014-05-12 22:06:42 +04:00
r . Get ( "/issues/milestones/new" , repo . NewMilestone )
r . Post ( "/issues/milestones/new" , bindIgnErr ( auth . CreateMilestoneForm { } ) , repo . NewMilestonePost )
2014-05-13 21:28:21 +04:00
r . Get ( "/issues/milestones/:index/edit" , repo . UpdateMilestone )
r . Post ( "/issues/milestones/:index/edit" , bindIgnErr ( auth . CreateMilestoneForm { } ) , repo . UpdateMilestonePost )
2014-05-14 03:46:48 +04:00
r . Get ( "/issues/milestones/:index/:action" , repo . UpdateMilestone )
2014-03-26 20:31:01 +04:00
r . Post ( "/comment/:action" , repo . Comment )
2014-04-14 09:57:25 +04:00
r . Get ( "/releases/new" , repo . ReleasesNew )
2014-03-23 00:00:46 +04:00
} , reqSignIn , middleware . RepoAssignment ( true ) )
2014-03-30 06:06:53 +04:00
2014-04-14 09:57:25 +04:00
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
r . Post ( "/releases/new" , bindIgnErr ( auth . NewReleaseForm { } ) , repo . ReleasesNewPost )
} , reqSignIn , middleware . RepoAssignment ( true , true ) )
2014-03-23 00:00:46 +04:00
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
r . Get ( "/issues" , repo . Issues )
2014-03-24 03:09:11 +04:00
r . Get ( "/issues/:index" , repo . ViewIssue )
2014-03-23 00:00:46 +04:00
r . Get ( "/pulls" , repo . Pulls )
r . Get ( "/branches" , repo . Branches )
2014-03-30 09:30:17 +04:00
} , ignSignIn , middleware . RepoAssignment ( true ) )
m . Group ( "/:username/:reponame" , func ( r martini . Router ) {
2014-03-23 00:00:46 +04:00
r . Get ( "/src/:branchname" , repo . Single )
r . Get ( "/src/:branchname/**" , repo . Single )
2014-03-24 19:56:32 +04:00
r . Get ( "/raw/:branchname/**" , repo . SingleDownload )
2014-03-23 00:00:46 +04:00
r . Get ( "/commits/:branchname" , repo . Commits )
2014-04-12 03:44:13 +04:00
r . Get ( "/commits/:branchname/search" , repo . SearchCommits )
2014-05-13 04:22:35 +04:00
r . Get ( "/commits/:branchname/**" , repo . FileHistory )
2014-03-30 09:30:17 +04:00
r . Get ( "/commit/:branchname" , repo . Diff )
r . Get ( "/commit/:branchname/**" , repo . Diff )
2014-04-14 09:57:25 +04:00
r . Get ( "/releases" , repo . Releases )
2014-04-15 20:27:29 +04:00
r . Get ( "/archive/:branchname/:reponame.zip" , repo . ZipDownload )
2014-03-30 09:30:17 +04:00
} , ignSignIn , middleware . RepoAssignment ( true , true ) )
2014-03-23 00:00:46 +04:00
m . Group ( "/:username" , func ( r martini . Router ) {
2014-03-30 09:30:17 +04:00
r . Get ( "/:reponame" , middleware . RepoAssignment ( true , true , true ) , repo . Single )
2014-04-12 05:47:39 +04:00
r . Any ( "/:reponame/**" , repo . Http )
2014-04-10 18:12:32 +04:00
} , ignSignInAndCsrf )
2014-03-21 20:48:26 +04:00
2014-03-23 14:27:01 +04:00
// Not found handler.
2014-03-23 09:48:01 +04:00
m . NotFound ( routers . NotFound )
2014-04-05 11:17:57 +04:00
protocol := base . Cfg . MustValue ( "server" , "PROTOCOL" , "http" )
2014-02-19 13:50:53 +04:00
listenAddr := fmt . Sprintf ( "%s:%s" ,
2014-05-05 12:40:25 +04:00
base . Cfg . MustValue ( "server" , "HTTP_ADDR" , "0.0.0.0" ) ,
2014-03-08 02:22:15 +04:00
base . Cfg . MustValue ( "server" , "HTTP_PORT" , "3000" ) )
2014-04-05 11:17:57 +04:00
if protocol == "http" {
log . Info ( "Listen: http://%s" , listenAddr )
if err := http . ListenAndServe ( listenAddr , m ) ; err != nil {
2014-04-06 21:00:20 +04:00
qlog . Error ( err . Error ( ) )
2014-04-05 11:17:57 +04:00
}
} else if protocol == "https" {
log . Info ( "Listen: https://%s" , listenAddr )
if err := http . ListenAndServeTLS ( listenAddr , base . Cfg . MustValue ( "server" , "CERT_FILE" ) ,
base . Cfg . MustValue ( "server" , "KEY_FILE" ) , m ) ; err != nil {
2014-04-06 21:00:20 +04:00
qlog . Error ( err . Error ( ) )
2014-04-05 11:17:57 +04:00
}
2014-03-18 17:58:58 +04:00
}
2014-05-02 02:53:41 +04:00
qlog . Fatalf ( "Invalid protocol: %s" , protocol )
2014-02-19 13:50:53 +04:00
}