/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
export class TssStatusData {
    tokenManagementEnabled: boolean;
    maximumLifetimeText: string;
    maximumLifetimeSeconds: number;
    lifespanInputEnabled: boolean;
    impersonationEnabled: boolean;
    configuredTssBackend: string;
    allowedTssForTokengen: boolean;
    actualTssBackend: string;
}

export class TokenResultData {
    accessToken: string;
    accessPasscode: string;
    expiry: string;
    user: string;
    homepageURL: string;
    targetURL: string;
}

export interface TokenData {
    access_token: string;
    target_url: string;
    homepage_url: string;
    expires_in: number;
    passcode: string;
 }

 export interface TokenRequestParams {
    lifespanInputEnabled: boolean;
    comment: string;
    impersonation: string;
    lifespanDays: number;
    lifespanHours: number;
    lifespanMins: number;
 }

export class SessionInformation {
    user: string;
    logoutUrl: string;
    logoutPageUrl: string;
    globalLgoutPageUrl: string;
    canSeeAllTokens: boolean;
    currentKnoxSsoCookieTokenId: string;
    bannerText: string;
}
