diff --git a/packages/shared/hooks/useAttemptNext.ts b/packages/shared/hooks/useAttemptNext.ts index 6f7b24e72..f347a10c8 100644 --- a/packages/shared/hooks/useAttemptNext.ts +++ b/packages/shared/hooks/useAttemptNext.ts @@ -57,3 +57,5 @@ export type Attempt = { }; type Callback = (fn?: any) => Promise; + +export type State = ReturnType; diff --git a/packages/teleport/src/Main/Main.tsx b/packages/teleport/src/Main/Main.tsx index 45ae4eed7..123c6b08a 100644 --- a/packages/teleport/src/Main/Main.tsx +++ b/packages/teleport/src/Main/Main.tsx @@ -73,24 +73,24 @@ export function Main(props: State) { - + {$features} - + ); } -const VerticalSplit = styled.div` +export const StyledMain = styled.div` width: 100%; height: 100%; display: flex; flex: 1; position: absolute; - min-width: 900px; + min-width: 1000px; `; const HorizontalSplit = styled.div` @@ -98,6 +98,9 @@ const HorizontalSplit = styled.div` flex-direction: column; width: 100%; height: 100%; + + // Allows shrinking beyond content size on flexed childrens. + min-width: 0; `; const StyledIndicator = styled(HorizontalSplit)` diff --git a/packages/teleport/src/Main/index.ts b/packages/teleport/src/Main/index.ts index eb3e563ae..3d47650d1 100644 --- a/packages/teleport/src/Main/index.ts +++ b/packages/teleport/src/Main/index.ts @@ -15,6 +15,7 @@ limitations under the License. */ import { hot } from 'react-hot-loader/root'; -import Main from './Main'; +import Main, { StyledMain } from './Main'; +export { StyledMain }; export default hot(Main); diff --git a/packages/teleport/src/config.ts b/packages/teleport/src/config.ts index ca517dd2e..8c83e841d 100644 --- a/packages/teleport/src/config.ts +++ b/packages/teleport/src/config.ts @@ -81,7 +81,7 @@ const cfg = { clusterEventsPath: `/v1/webapi/sites/:clusterId/events/search?from=:start?&to=:end?&limit=:limit?`, scp: '/v1/webapi/sites/:clusterId/nodes/:serverId/:login/scp?location=:location&filename=:filename', - renewTokenPath: '/v1/webapi/sessions/renew/:requestId?', + renewTokenPath: '/v1/webapi/sessions/renew', resetPasswordTokenPath: '/v1/webapi/users/password/token', sessionPath: '/v1/webapi/sessions', userContextPath: '/v1/webapi/sites/:clusterId/context', @@ -266,8 +266,8 @@ const cfg = { }); }, - getRenewTokenUrl(requestId?: string) { - return generatePath(cfg.api.renewTokenPath, { requestId }); + getRenewTokenUrl() { + return cfg.api.renewTokenPath; }, getGithubConnectorsUrl(name?: string) { diff --git a/packages/teleport/src/services/localStorage/localStorage.ts b/packages/teleport/src/services/localStorage/localStorage.ts index d75d22006..85908fd16 100644 --- a/packages/teleport/src/services/localStorage/localStorage.ts +++ b/packages/teleport/src/services/localStorage/localStorage.ts @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { BearerToken, KeysEnum } from './types'; +import { BearerToken } from 'teleport/services/session'; +import { KeysEnum } from './types'; const storage = { clear() { diff --git a/packages/teleport/src/services/localStorage/types.ts b/packages/teleport/src/services/localStorage/types.ts index b56b8468d..ee952c8ba 100644 --- a/packages/teleport/src/services/localStorage/types.ts +++ b/packages/teleport/src/services/localStorage/types.ts @@ -17,16 +17,5 @@ limitations under the License. export const KeysEnum = { TOKEN: 'grv_teleport_token', TOKEN_RENEW: 'grv_teleport_token_renew', + RELOAD_TABS: 'grv_reload_tabs', }; - -export class BearerToken { - accessToken: string; - expiresIn: string; - created: number; - - constructor(json) { - this.accessToken = json.token; - this.expiresIn = json.expires_in; - this.created = new Date().getTime(); - } -} diff --git a/packages/teleport/src/services/session/index.ts b/packages/teleport/src/services/session/index.ts index 29d876e86..d80137b05 100644 --- a/packages/teleport/src/services/session/index.ts +++ b/packages/teleport/src/services/session/index.ts @@ -15,4 +15,6 @@ */ import session from './session'; + +export * from './types'; export default session; diff --git a/packages/teleport/src/services/session/makeSession.ts b/packages/teleport/src/services/session/makeSession.ts new file mode 100644 index 000000000..5f89d47b2 --- /dev/null +++ b/packages/teleport/src/services/session/makeSession.ts @@ -0,0 +1,31 @@ +/** + * Copyright 2021 Gravitational, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Session, BearerToken } from './types'; + +export function makeSession(json: any): Session { + return { + token: makeBearerToken(json), + expires: json.sessionExpires, + }; +} + +export function makeBearerToken(json: any): BearerToken { + return { + accessToken: json.token, + expiresIn: json.expires_in, + created: new Date().getTime(), + }; +} diff --git a/packages/teleport/src/services/session/session.ts b/packages/teleport/src/services/session/session.ts index 63c886570..aab794889 100644 --- a/packages/teleport/src/services/session/session.ts +++ b/packages/teleport/src/services/session/session.ts @@ -18,14 +18,13 @@ import Logger from 'shared/libs/logger'; import cfg from 'teleport/config'; import history from 'teleport/services/history'; import api from 'teleport/services/api'; -import localStorage, { - KeysEnum, - BearerToken, -} from 'teleport/services/localStorage'; +import localStorage, { KeysEnum } from 'teleport/services/localStorage'; +import { makeSession, makeBearerToken } from './makeSession'; +import { RenewSessionRequest } from './types'; // Time to determine when to renew session which is // when expiry time of token is less than 3 minutes. -const RENEW_TOKEN_TIME = 180 * 1000 +const RENEW_TOKEN_TIME = 180 * 1000; const TOKEN_CHECKER_INTERVAL = 15 * 1000; // every 15 sec const logger = Logger.create('services/session'); @@ -68,8 +67,10 @@ const session = { } }, - renewSession(requestId: string) { - return this._renewToken(requestId); + // renewSession renews session and returns the + // absolute time the new session expires. + renewSession(req: RenewSessionRequest): Promise { + return this._renewToken(req); }, isValid() { @@ -104,7 +105,7 @@ const session = { el.parentNode.removeChild(el); const decoded = window.atob(el.content); const json = JSON.parse(decoded); - return new BearerToken(json); + return makeBearerToken(json); }, _shouldRenewToken() { @@ -119,21 +120,21 @@ const session = { return this._timeLeft() < RENEW_TOKEN_TIME; }, - _renewToken(requestId?: string) { + _renewToken(req: RenewSessionRequest) { this._setAndBroadcastIsRenewing(true); return api - .post(cfg.getRenewTokenUrl(requestId)) - .then(this._receiveBearerToken.bind(this)) + .post(cfg.getRenewTokenUrl(), req) + .then(res => { + const session = makeSession(res); + localStorage.setBearerToken(session.token); + + return session.expires; + }) .finally(() => { this._setAndBroadcastIsRenewing(false); }); }, - _receiveBearerToken(json) { - const token = new BearerToken(json); - localStorage.setBearerToken(token); - }, - _setAndBroadcastIsRenewing(value) { this._setIsRenewing(value); localStorage.broadcast(KeysEnum.TOKEN_RENEW, value); diff --git a/packages/teleport/src/services/session/types.ts b/packages/teleport/src/services/session/types.ts new file mode 100644 index 000000000..70018888c --- /dev/null +++ b/packages/teleport/src/services/session/types.ts @@ -0,0 +1,15 @@ +export type RenewSessionRequest = { + requestId?: string; + switchback?: boolean; +}; + +export type BearerToken = { + accessToken: string; + expiresIn: string; + created: number; +}; + +export type Session = { + token: BearerToken; + expires: Date; +}; diff --git a/packages/webapps.e b/packages/webapps.e index ce9070104..524031067 160000 --- a/packages/webapps.e +++ b/packages/webapps.e @@ -1 +1 @@ -Subproject commit ce907010419f32b759d4f9a96c38215e4e45bec2 +Subproject commit 524031067f8d541cebe34f16b67ef354500ec6b1