diff --git a/remote/github/github.go b/remote/github/github.go index a4cdb3dc4..55b2cc12e 100644 --- a/remote/github/github.go +++ b/remote/github/github.go @@ -105,7 +105,7 @@ type client struct { // Login authenticates the session and returns the remote user details. func (c *client) Login(res http.ResponseWriter, req *http.Request) (*model.User, error) { - config := c.newConfig(httputil.GetURL(req)) + config := c.newConfig(req) // get the OAuth errors if err := req.FormValue("error"); err != "" { @@ -348,7 +348,16 @@ func (c *client) newContext() context.Context { } // helper function to return the GitHub oauth2 config -func (c *client) newConfig(redirect string) *oauth2.Config { +func (c *client) newConfig(req *http.Request) *oauth2.Config { + var redirect string + + intendedURL := req.URL.Query()["url"] + if len(intendedURL) > 0 { + redirect = fmt.Sprintf("%s/authorize?url=%s", httputil.GetURL(req), intendedURL[0]) + } else { + redirect = fmt.Sprintf("%s/authorize", httputil.GetURL(req)) + } + return &oauth2.Config{ ClientID: c.Client, ClientSecret: c.Secret, @@ -357,7 +366,7 @@ func (c *client) newConfig(redirect string) *oauth2.Config { AuthURL: fmt.Sprintf("%s/login/oauth/authorize", c.URL), TokenURL: fmt.Sprintf("%s/login/oauth/access_token", c.URL), }, - RedirectURL: fmt.Sprintf("%s/authorize", redirect), + RedirectURL: redirect, } } diff --git a/server/login.go b/server/login.go index c6354036f..a401a2981 100644 --- a/server/login.go +++ b/server/login.go @@ -38,7 +38,12 @@ func HandleLogin(c *gin.Context) { if err := r.FormValue("error"); err != "" { http.Redirect(w, r, "/login/error?code="+err, 303) } else { - http.Redirect(w, r, "/authorize", 303) + intendedURL := r.URL.Query()["url"] + if len(intendedURL) > 0 { + http.Redirect(w, r, "/authorize?url="+intendedURL[0], 303) + } else { + http.Redirect(w, r, "/authorize", 303) + } } } @@ -136,8 +141,13 @@ func HandleAuth(c *gin.Context) { } httputil.SetCookie(c.Writer, c.Request, "user_sess", tokenstr) - c.Redirect(303, "/") + intendedURL := c.Request.URL.Query()["url"] + if len(intendedURL) > 0 { + c.Redirect(303, intendedURL[0]) + } else { + c.Redirect(303, "/") + } } func GetLogout(c *gin.Context) { diff --git a/vendor/github.com/laszlocph/drone-ui/dist/dist_gen.go b/vendor/github.com/laszlocph/drone-ui/dist/dist_gen.go index cd5992367..4de9e336c 100644 --- a/vendor/github.com/laszlocph/drone-ui/dist/dist_gen.go +++ b/vendor/github.com/laszlocph/drone-ui/dist/dist_gen.go @@ -136,20 +136,20 @@ func MustLookup(path string) []byte { // Index of all files var files = map[string]file{ - "/static/bundle.ed8654564546820f8c42.js": { + "/static/bundle.480b85f6565049deaf65.js": { data: file0, FileInfo: &fileInfo{ - name: "bundle.ed8654564546820f8c42.js", - size: 370027, - modTime: time.Unix(1561462765, 0), + name: "bundle.480b85f6565049deaf65.js", + size: 365978, + modTime: time.Unix(1561616274, 0), }, }, - "/static/vendor.eeeab6d65a2d5969abed.js": { + "/static/vendor.907b87d9e4314446514b.js": { data: file1, FileInfo: &fileInfo{ - name: "vendor.eeeab6d65a2d5969abed.js", - size: 272277, - modTime: time.Unix(1561462765, 0), + name: "vendor.907b87d9e4314446514b.js", + size: 272274, + modTime: time.Unix(1561616274, 0), }, }, "/favicon.png": { @@ -157,7 +157,7 @@ var files = map[string]file{ FileInfo: &fileInfo{ name: "favicon.png", size: 1374, - modTime: time.Unix(1561462764, 0), + modTime: time.Unix(1561616274, 0), }, }, "/index.html": { @@ -165,7 +165,7 @@ var files = map[string]file{ FileInfo: &fileInfo{ name: "index.html", size: 388, - modTime: time.Unix(1561462764, 0), + modTime: time.Unix(1561616274, 0), }, }, } @@ -174,7 +174,7 @@ var files = map[string]file{ // embedded files. // -// /static/bundle.ed8654564546820f8c42.js +// /static/bundle.480b85f6565049deaf65.js var file0 = []byte(`webpackJsonp([0],[ /* 0 */, /* 1 */, @@ -307,7 +307,7 @@ var singleton = null; var singletonCounter = 0; var stylesInsertedAtTop = []; -var fixUrls = __webpack_require__(415); +var fixUrls = __webpack_require__(419); module.exports = function(list, options) { if (typeof DEBUG !== "undefined" && DEBUG) { @@ -917,19 +917,19 @@ var repositorySlug = exports.repositorySlug = function repositorySlug(owner, nam exports.__esModule = true; exports.TimelapseIcon = exports.TagIcon = exports.SyncIcon = exports.StarIcon = exports.ScheduleIcon = exports.RemoveIcon = exports.RefreshIcon = exports.PlayIcon = exports.PauseIcon = exports.MergeIcon = exports.MenuIcon = exports.LinkIcon = exports.LaunchIcon = exports.ExpandIcon = exports.DeployIcon = exports.CommitIcon = exports.ClockIcon = exports.CloseIcon = exports.CheckIcon = exports.BranchIcon = exports.BackIcon = undefined; -var _back = __webpack_require__(451); +var _back = __webpack_require__(448); var _back2 = _interopRequireDefault(_back); -var _branch = __webpack_require__(452); +var _branch = __webpack_require__(449); var _branch2 = _interopRequireDefault(_branch); -var _check = __webpack_require__(453); +var _check = __webpack_require__(450); var _check2 = _interopRequireDefault(_check); -var _clock = __webpack_require__(454); +var _clock = __webpack_require__(451); var _clock2 = _interopRequireDefault(_clock); @@ -937,23 +937,23 @@ var _close = __webpack_require__(126); var _close2 = _interopRequireDefault(_close); -var _commit = __webpack_require__(455); +var _commit = __webpack_require__(452); var _commit2 = _interopRequireDefault(_commit); -var _deploy = __webpack_require__(456); +var _deploy = __webpack_require__(453); var _deploy2 = _interopRequireDefault(_deploy); -var _expand = __webpack_require__(457); +var _expand = __webpack_require__(454); var _expand2 = _interopRequireDefault(_expand); -var _launch = __webpack_require__(458); +var _launch = __webpack_require__(455); var _launch2 = _interopRequireDefault(_launch); -var _link = __webpack_require__(459); +var _link = __webpack_require__(456); var _link2 = _interopRequireDefault(_link); @@ -961,15 +961,15 @@ var _menu = __webpack_require__(187); var _menu2 = _interopRequireDefault(_menu); -var _merge = __webpack_require__(460); +var _merge = __webpack_require__(457); var _merge2 = _interopRequireDefault(_merge); -var _pause = __webpack_require__(461); +var _pause = __webpack_require__(458); var _pause2 = _interopRequireDefault(_pause); -var _play = __webpack_require__(462); +var _play = __webpack_require__(459); var _play2 = _interopRequireDefault(_play); @@ -977,27 +977,27 @@ var _refresh = __webpack_require__(189); var _refresh2 = _interopRequireDefault(_refresh); -var _remove = __webpack_require__(463); +var _remove = __webpack_require__(460); var _remove2 = _interopRequireDefault(_remove); -var _schedule = __webpack_require__(464); +var _schedule = __webpack_require__(461); var _schedule2 = _interopRequireDefault(_schedule); -var _star = __webpack_require__(465); +var _star = __webpack_require__(462); var _star2 = _interopRequireDefault(_star); -var _sync = __webpack_require__(466); +var _sync = __webpack_require__(463); var _sync2 = _interopRequireDefault(_sync); -var _tag = __webpack_require__(467); +var _tag = __webpack_require__(464); var _tag2 = _interopRequireDefault(_tag); -var _timelapse = __webpack_require__(468); +var _timelapse = __webpack_require__(465); var _timelapse2 = _interopRequireDefault(_timelapse); @@ -1120,7 +1120,7 @@ var _classnames2 = _interopRequireDefault(_classnames); var _status = __webpack_require__(87); -var _status2 = __webpack_require__(449); +var _status2 = __webpack_require__(446); var _status3 = _interopRequireDefault(_status2); @@ -1378,11 +1378,11 @@ var _reactTimeago = __webpack_require__(190); var _reactTimeago2 = _interopRequireDefault(_reactTimeago); -var _duration = __webpack_require__(471); +var _duration = __webpack_require__(468); var _duration2 = _interopRequireDefault(_duration); -var _build_time = __webpack_require__(472); +var _build_time = __webpack_require__(469); var _build_time2 = _interopRequireDefault(_build_time); @@ -1655,7 +1655,7 @@ var _react2 = _interopRequireDefault(_react); var _index = __webpack_require__(40); -var _breadcrumb = __webpack_require__(525); +var _breadcrumb = __webpack_require__(522); var _breadcrumb2 = _interopRequireDefault(_breadcrumb); @@ -2056,7 +2056,7 @@ var _index = __webpack_require__(40); var _events = __webpack_require__(192); -var _build_event = __webpack_require__(511); +var _build_event = __webpack_require__(508); var _build_event2 = _interopRequireDefault(_build_event); @@ -2166,7 +2166,7 @@ var _reactRouterDom = __webpack_require__(27); var _higherOrder = __webpack_require__(16); -var _sync = __webpack_require__(533); +var _sync = __webpack_require__(530); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } @@ -2197,7 +2197,7 @@ var RedirectRoot = (_dec = (0, _higherOrder.branch)(binding), _dec(_class = func var user = nextProps.user; if (!user && window) { - window.location.href = "/login"; + window.location.href = "/login?url=" + window.location.href; } }; @@ -2237,7 +2237,7 @@ var _propTypes = __webpack_require__(12); var _propTypes2 = _interopRequireDefault(_propTypes); -var _menu = __webpack_require__(538); +var _menu = __webpack_require__(535); var _menu2 = _interopRequireDefault(_menu); @@ -2613,11 +2613,11 @@ var _inject = __webpack_require__(22); var _screens = __webpack_require__(411); -var _titles = __webpack_require__(423); +var _titles = __webpack_require__(420); var _titles2 = _interopRequireDefault(_titles); -var _layout = __webpack_require__(444); +var _layout = __webpack_require__(441); var _layout2 = _interopRequireDefault(_layout); @@ -2629,7 +2629,7 @@ var _feed = __webpack_require__(188); var _reactRouterDom = __webpack_require__(27); -var _drone = __webpack_require__(582); +var _drone = __webpack_require__(579); var _drone2 = _interopRequireDefault(_drone); @@ -2669,7 +2669,6 @@ var App = function (_Component) { _reactRouterDom.Switch, null, _react2["default"].createElement(_reactRouterDom.Route, { path: "/", exact: true, component: _redirect2["default"] }), - _react2["default"].createElement(_reactRouterDom.Route, { path: "/login/form", exact: true, component: _screens.LoginForm }), _react2["default"].createElement(_reactRouterDom.Route, { path: "/login/error", exact: true, component: _screens.LoginError }), _react2["default"].createElement(_reactRouterDom.Route, { path: "/", exact: false, component: _layout2["default"] }) ) @@ -2813,19 +2812,14 @@ exports["default"] = _droneJs2["default"].fromWindow(); exports.__esModule = true; -exports.LoginError = exports.LoginForm = undefined; +exports.LoginError = undefined; -var _form = __webpack_require__(412); - -var _form2 = _interopRequireDefault(_form); - -var _error = __webpack_require__(416); +var _error = __webpack_require__(412); var _error2 = _interopRequireDefault(_error); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -exports.LoginForm = _form2["default"]; exports.LoginError = _error2["default"]; /***/ }), @@ -2841,46 +2835,129 @@ var _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); -var _index = __webpack_require__(413); +var _queryString = __webpack_require__(172); + +var _queryString2 = _interopRequireDefault(_queryString); + +var _report = __webpack_require__(416); + +var _report2 = _interopRequireDefault(_report); + +var _index = __webpack_require__(417); var _index2 = _interopRequireDefault(_index); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -var LoginForm = function LoginForm(props) { - return _react2["default"].createElement( - "div", - { className: _index2["default"].login }, - _react2["default"].createElement( - "form", - { method: "post", action: "/authorize" }, - _react2["default"].createElement( - "p", - null, - "Login with your version control system username and password." - ), - _react2["default"].createElement("input", { - placeholder: "Username", - name: "username", - type: "text", - spellCheck: "false" - }), - _react2["default"].createElement("input", { placeholder: "Password", name: "password", type: "password" }), - _react2["default"].createElement("input", { value: "Login", type: "submit" }) - ) - ); -}; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -exports["default"] = LoginForm; +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var DEFAULT_ERROR = "The system failed to process your Login request."; + +var Error = function (_Component) { + _inherits(Error, _Component); + + function Error() { + _classCallCheck(this, Error); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } + + Error.prototype.render = function render() { + var parsed = _queryString2["default"].parse(window.location.search); + var error = DEFAULT_ERROR; + + switch (parsed.code || parsed.error) { + case "oauth_error": + break; + case "access_denied": + break; + } + + return _react2["default"].createElement( + "div", + { className: _index2["default"].root }, + _react2["default"].createElement( + "div", + { className: _index2["default"].alert }, + _react2["default"].createElement( + "div", + null, + _react2["default"].createElement(_report2["default"], null) + ), + _react2["default"].createElement( + "div", + null, + error + ) + ) + ); + }; + + return Error; +}(_react.Component); + +exports["default"] = Error; /***/ }), -/* 413 */ +/* 413 */, +/* 414 */, +/* 415 */, +/* 416 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; +exports["default"] = undefined; + +var _react = __webpack_require__(1); + +var _react2 = _interopRequireDefault(_react); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ReportIcon = function (_Component) { + _inherits(ReportIcon, _Component); + + function ReportIcon() { + _classCallCheck(this, ReportIcon); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } + + ReportIcon.prototype.render = function render() { + return _react2["default"].createElement( + "svg", + { className: this.props.className, viewBox: "0 0 24 24" }, + _react2["default"].createElement("path", { d: "M15.73 3H8.27L3 8.27v7.46L8.27 21h7.46L21 15.73V8.27L15.73 3zM12 17.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2V7h2v6z" }), + _react2["default"].createElement("path", { d: "M0 0h24v24H0z", fill: "none" }) + ); + }; + + return ReportIcon; +}(_react.Component); + +exports["default"] = ReportIcon; + +/***/ }), +/* 417 */ /***/ (function(module, exports, __webpack_require__) { // style-loader: Adds some css to the DOM by adding a