fleet/frontend/interfaces/integration.ts
jacobshandling f58519914b
UI: Conditional access - Microsoft Entra (#27982)
_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

![trigger](https://github.com/user-attachments/assets/4578568a-f64a-4390-83d9-fbec751d4b14)

#### 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:

![ezgif-75f82492180d28](https://github.com/user-attachments/assets/015f3605-81e8-463a-be74-07bab99d9724)

#### Verified –> Deleted
![√ verified - delete -
deleted](https://github.com/user-attachments/assets/44b8ba70-49c9-43e7-be54-8474756a5b50)

#### Enable for policies of a team
![√
enable-for-team](https://github.com/user-attachments/assets/9454b0da-059d-4991-a3ff-14e74257a3a7)

#### Activities
<img width="886" alt="√ activities"
src="https://github.com/user-attachments/assets/d21e6185-c2f2-40b2-9c69-9b92fab58766"
/>

#### Unavailable for self-hosted Fleet instances:

![no-access-self-hosted](https://github.com/user-attachments/assets/56213522-b721-472f-9174-c8dac0df61f3)

#### Premium only
![√
premium-only](https://github.com/user-attachments/assets/97373960-6b38-458b-be37-4c3868469182)


- [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>
2025-04-15 13:55:07 -07:00

158 lines
4.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}