mirror of
https://github.com/fleetdm/fleet
synced 2026-05-15 13:08:42 +00:00
_Note - currently feature flagged. Build frontend with `ALLOW_CONDITIONAL_ACCESS=true NODE_ENV=development yarn run webpack --progress --watch` to enable this feature. Also, all of this functionality depends on the new `config.license.managed_cloud` being true, so you'll need to mock that data somehow. [This branch](https://github.com/fleetdm/fleet/tree/27043-fake-data) has the appropriate fake data for testing_ ## For #27043, #27864 ### Build front end for Fleet's integration with Microsoft Entra, allowing conditional preventtion of single sign-on for hosts failing any policies on a team #### Trigger the integration  #### Triggered, but configuration still not verified <img width="1348" alt="√ not-verified-return-to-prefilled-form" src="https://github.com/user-attachments/assets/44d0c21f-2554-40a8-9158-d1107cff2d09" /> #### Verified, short and long tenant ids:  #### Verified –> Deleted  #### Enable for policies of a team  #### Activities <img width="886" alt="√ activities" src="https://github.com/user-attachments/assets/d21e6185-c2f2-40b2-9c69-9b92fab58766" /> #### Unavailable for self-hosted Fleet instances:  #### Premium only  - [x] Changes file added for user-visible changes in `changes/` - [x] Added/updated automated tests - [x] A detailed QA plan exists on the associated ticket (if it isn't there, work with the product group's QA engineer to add it) - [ ] Manual QA for all new/changed functionality --------- Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
158 lines
4.4 KiB
TypeScript
158 lines
4.4 KiB
TypeScript
export type IIntegrationType = "jira" | "zendesk";
|
||
export interface IJiraIntegration {
|
||
url: string;
|
||
username: string;
|
||
api_token: string;
|
||
project_key: string;
|
||
enable_failing_policies?: boolean;
|
||
enable_software_vulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IZendeskIntegration {
|
||
url: string;
|
||
email: string;
|
||
api_token: string;
|
||
group_id: number;
|
||
enable_failing_policies?: boolean;
|
||
enable_software_vulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface ICertificatesIntegrationNDES {
|
||
url: string;
|
||
admin_url: string;
|
||
username: string;
|
||
password: string;
|
||
}
|
||
|
||
export interface ICertificatesIntegrationDigicert {
|
||
name: string;
|
||
url: string;
|
||
api_token: string;
|
||
profile_id: string;
|
||
certificate_common_name: string;
|
||
certificate_user_principal_names: string[] | null;
|
||
certificate_seat_id: string;
|
||
}
|
||
|
||
export interface ICertificatesIntegrationCustomSCEP {
|
||
name: string;
|
||
url: string;
|
||
challenge: string;
|
||
}
|
||
|
||
export const isNDESCertIntegration = (
|
||
integration: ICertificateIntegration
|
||
): integration is ICertificatesIntegrationNDES => {
|
||
return (
|
||
"admin_url" in integration &&
|
||
"username" in integration &&
|
||
"password" in integration
|
||
);
|
||
};
|
||
|
||
export const isDigicertCertIntegration = (
|
||
integration: ICertificateIntegration
|
||
): integration is ICertificatesIntegrationDigicert => {
|
||
return (
|
||
"profile_id" in integration &&
|
||
"certificate_common_name" in integration &&
|
||
"certificate_user_principal_names" in integration &&
|
||
"certificate_seat_id" in integration
|
||
);
|
||
};
|
||
|
||
export const isCustomSCEPCertIntegration = (
|
||
integration: ICertificateIntegration
|
||
): integration is ICertificatesIntegrationCustomSCEP => {
|
||
return (
|
||
"name" in integration && "url" in integration && "challenge" in integration
|
||
);
|
||
};
|
||
|
||
export type ICertificateAuthorityType = "ndes" | "digicert" | "custom";
|
||
|
||
/** all the types of certificate integrations */
|
||
export type ICertificateIntegration =
|
||
| ICertificatesIntegrationNDES
|
||
| ICertificatesIntegrationDigicert
|
||
| ICertificatesIntegrationCustomSCEP;
|
||
|
||
export interface IIntegration {
|
||
url: string;
|
||
username?: string;
|
||
email?: string;
|
||
api_token: string;
|
||
project_key?: string;
|
||
group_id?: number;
|
||
enable_failing_policies?: boolean;
|
||
enable_software_vulnerabilities?: boolean;
|
||
originalIndex?: number;
|
||
type?: IIntegrationType;
|
||
tableIndex?: number;
|
||
dropdownIndex?: number;
|
||
name?: string;
|
||
}
|
||
|
||
export interface IIntegrationFormData {
|
||
url: string;
|
||
username?: string;
|
||
email?: string;
|
||
apiToken: string;
|
||
projectKey?: string;
|
||
groupId?: number;
|
||
enableSoftwareVulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IIntegrationTableData extends IIntegrationFormData {
|
||
originalIndex: number;
|
||
type: IIntegrationType;
|
||
tableIndex?: number;
|
||
name: string;
|
||
}
|
||
|
||
export interface IIntegrationFormErrors {
|
||
url?: string | null;
|
||
email?: string | null;
|
||
username?: string | null;
|
||
apiToken?: string | null;
|
||
groupId?: number | null;
|
||
projectKey?: string | null;
|
||
enableSoftwareVulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IGlobalCalendarIntegration {
|
||
domain: string;
|
||
api_key_json: string;
|
||
}
|
||
|
||
interface ITeamCalendarSettings {
|
||
enable_calendar_events: boolean;
|
||
webhook_url: string;
|
||
}
|
||
|
||
// zendesk and jira fields are coupled – if one is present, the other needs to be present. If
|
||
// one is present and the other is null/missing, the other will be nullified. google_calendar is
|
||
// separated – it can be present without the other 2 without nullifying them.
|
||
// TODO: Update these types to reflect this.
|
||
|
||
export interface IZendeskJiraIntegrations {
|
||
zendesk: IZendeskIntegration[];
|
||
jira: IJiraIntegration[];
|
||
}
|
||
|
||
// reality is that IZendeskJiraIntegrations are optional – should be something like `extends
|
||
// Partial<IZendeskJiraIntegrations>`, but that leads to a mess of types to resolve.
|
||
export interface IGlobalIntegrations extends IZendeskJiraIntegrations {
|
||
google_calendar?: IGlobalCalendarIntegration[] | null;
|
||
ndes_scep_proxy?: ICertificatesIntegrationNDES | null;
|
||
digicert?: ICertificatesIntegrationDigicert[];
|
||
custom_scep_proxy?: ICertificatesIntegrationCustomSCEP[];
|
||
// whether or not conditional access is enabled for "No team"
|
||
conditional_access_enabled?: boolean;
|
||
}
|
||
|
||
export interface ITeamIntegrations extends IZendeskJiraIntegrations {
|
||
google_calendar?: ITeamCalendarSettings | null;
|
||
// whether or not conditional access is enabled for each team other than "No team" (see `IGlobalIntegrations.conditional_access_enabled`)
|
||
conditional_access_enabled?: boolean;
|
||
}
|