diff --git a/docs/sources/microsoft-365/entra-id/entra-id.yaml b/docs/sources/microsoft-365/entra-id/entra-id.yaml index fe73087d2..eba4c45dd 100644 --- a/docs/sources/microsoft-365/entra-id/entra-id.yaml +++ b/docs/sources/microsoft-365/entra-id/entra-id.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -44,6 +47,8 @@ endpoints: - "$..identities[*].issuerAssignedId" encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -76,6 +81,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids.yaml b/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids.yaml index cfaab6058..836364ddd 100644 --- a/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids.yaml +++ b/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -49,6 +52,8 @@ endpoints: includeReversible: true encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -81,6 +86,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids_no-orig.yaml b/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids_no-orig.yaml index 94734da6e..9dcca4400 100644 --- a/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids_no-orig.yaml +++ b/docs/sources/microsoft-365/entra-id/entra-id_no-app-ids_no-orig.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -49,6 +52,8 @@ endpoints: includeReversible: true encoding: "URL_SAFE_TOKEN" - pathRegex: "^/(v1.0|beta)/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -85,6 +90,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/msft-copilot/msft-copilot.yaml b/docs/sources/microsoft-365/msft-copilot/msft-copilot.yaml index 5921567c9..1edf4b806 100644 --- a/docs/sources/microsoft-365/msft-copilot/msft-copilot.yaml +++ b/docs/sources/microsoft-365/msft-copilot/msft-copilot.yaml @@ -45,6 +45,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/msft-copilot/msft-copilot_no-userIds.yaml b/docs/sources/microsoft-365/msft-copilot/msft-copilot_no-userIds.yaml index 08b91558a..2096bd866 100644 --- a/docs/sources/microsoft-365/msft-copilot/msft-copilot_no-userIds.yaml +++ b/docs/sources/microsoft-365/msft-copilot/msft-copilot_no-userIds.yaml @@ -51,6 +51,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/msft-onedrive/msft-onedrive.yaml b/docs/sources/microsoft-365/msft-onedrive/msft-onedrive.yaml index dce090785..aa123d831 100644 --- a/docs/sources/microsoft-365/msft-onedrive/msft-onedrive.yaml +++ b/docs/sources/microsoft-365/msft-onedrive/msft-onedrive.yaml @@ -1,179 +1,184 @@ --- endpoints: - - pathTemplate: "/v1.0/drives/{driveId}/activities" - allowedQueryParams: - - "$expand" - - "$skiptoken" - transforms: - - ! - jsonPaths: - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/ItemActivity" - - pathTemplate: "/v1.0/drives/{driveId}/items/{itemId}/activities" - allowedQueryParams: - - "$expand" - - "$skiptoken" - transforms: - - ! - jsonPaths: - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/ItemActivity" - - pathTemplate: "/v1.0/drives/{driveId}/root/delta" - allowedQueryParams: - - "token" - - "$select" - - "$expand" - - "$top" - transforms: - - ! - jsonPaths: - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/DriveItem" - - pathTemplate: "/v1.0/groups" - allowedQueryParams: - - "$top" - - "$select" - - "$skiptoken" - - "$orderby" - - "$count" - transforms: - - ! - jsonPaths: - - "$..mail" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/GraphGroup" - - pathTemplate: "/v1.0/groups/{groupId}/drives" - allowedQueryParams: - - "$select" - - "$skiptoken" - - "$top" - - "$orderby" - - "$expand" - transforms: - - ! - jsonPaths: - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/Drive" - - pathTemplate: "/v1.0/users" - allowedQueryParams: - - "$top" - - "$select" - - "$skiptoken" - - "$orderby" - - "$count" - transforms: - - ! - jsonPaths: - - "$..employeeId" - - "$..mail" - - "$..otherMails[*]" - encoding: "URL_SAFE_TOKEN" - - ! - jsonPaths: - - "$..proxyAddresses[*]" - regex: "(?i)^smtp:(.*)$" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/GraphUser" - - pathTemplate: "/v1.0/users/{userId}/drives" - allowedQueryParams: - - "$select" - - "$skiptoken" - - "$top" - - "$orderby" - - "$expand" - transforms: - - ! - jsonPaths: - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/Drive" +- pathTemplate: "/v1.0/drives/{driveId}/activities" + allowedQueryParams: + - "$expand" + - "$skiptoken" + transforms: + - ! + jsonPaths: + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/ItemActivity" +- pathTemplate: "/v1.0/drives/{driveId}/items/{itemId}/activities" + allowedQueryParams: + - "$expand" + - "$skiptoken" + transforms: + - ! + jsonPaths: + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/ItemActivity" +- pathTemplate: "/v1.0/drives/{driveId}/root/delta" + allowedQueryParams: + - "token" + - "$select" + - "$expand" + - "$top" + transforms: + - ! + jsonPaths: + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/DriveItem" +- pathTemplate: "/v1.0/groups" + allowedQueryParams: + - "$top" + - "$select" + - "$skiptoken" + - "$orderby" + - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" + transforms: + - ! + jsonPaths: + - "$..mail" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/GraphGroup" +- pathTemplate: "/v1.0/groups/{groupId}/drives" + allowedQueryParams: + - "$select" + - "$skiptoken" + - "$top" + - "$orderby" + - "$expand" + transforms: + - ! + jsonPaths: + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/Drive" +- pathTemplate: "/v1.0/users" + allowedQueryParams: + - "$top" + - "$select" + - "$skiptoken" + - "$orderby" + - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" + transforms: + - ! + jsonPaths: + - "$..employeeId" + - "$..mail" + - "$..otherMails[*]" + encoding: "URL_SAFE_TOKEN" + - ! + jsonPaths: + - "$..proxyAddresses[*]" + regex: "(?i)^smtp:(.*)$" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/GraphUser" +- pathTemplate: "/v1.0/users/{userId}/drives" + allowedQueryParams: + - "$select" + - "$skiptoken" + - "$top" + - "$orderby" + - "$expand" + transforms: + - ! + jsonPaths: + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/Drive" definitions: ActivityItemRef: type: "object" diff --git a/docs/sources/microsoft-365/msft-onedrive/msft-onedrive_no-app-ids.yaml b/docs/sources/microsoft-365/msft-onedrive/msft-onedrive_no-app-ids.yaml index ef53010e8..70f44cc9d 100644 --- a/docs/sources/microsoft-365/msft-onedrive/msft-onedrive_no-app-ids.yaml +++ b/docs/sources/microsoft-365/msft-onedrive/msft-onedrive_no-app-ids.yaml @@ -1,185 +1,190 @@ --- endpoints: - - pathTemplate: "/v1.0/drives/{driveId}/activities" - allowedQueryParams: - - "$expand" - - "$skiptoken" - transforms: - - ! - jsonPaths: - - "$..user.id" - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/ItemActivity" - - pathTemplate: "/v1.0/drives/{driveId}/items/{itemId}/activities" - allowedQueryParams: - - "$expand" - - "$skiptoken" - transforms: - - ! - jsonPaths: - - "$..user.id" - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/ItemActivity" - - pathTemplate: "/v1.0/drives/{driveId}/root/delta" - allowedQueryParams: - - "token" - - "$select" - - "$expand" - - "$top" - transforms: - - ! - jsonPaths: - - "$..user.id" - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/DriveItem" - - pathTemplate: "/v1.0/groups" - allowedQueryParams: - - "$top" - - "$select" - - "$skiptoken" - - "$orderby" - - "$count" - transforms: - - ! - jsonPaths: - - "$..mail" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/GraphGroup" - - pathTemplate: "/v1.0/groups/{groupId}/drives" - allowedQueryParams: - - "$select" - - "$skiptoken" - - "$top" - - "$orderby" - - "$expand" - transforms: - - ! - jsonPaths: - - "$..user.id" - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/Drive" - - pathTemplate: "/v1.0/users" - allowedQueryParams: - - "$top" - - "$select" - - "$skiptoken" - - "$orderby" - - "$count" - transforms: - - ! - jsonPaths: - - "$..id" - - "$..employeeId" - - "$..mail" - - "$..otherMails[*]" - encoding: "URL_SAFE_TOKEN" - - ! - jsonPaths: - - "$..proxyAddresses[*]" - regex: "(?i)^smtp:(.*)$" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/GraphUser" - - pathTemplate: "/v1.0/users/{userId}/drives" - allowedQueryParams: - - "$select" - - "$skiptoken" - - "$top" - - "$orderby" - - "$expand" - transforms: - - ! - jsonPaths: - - "$..user.id" - - "$..user.email" - encoding: "URL_SAFE_TOKEN" - responseSchema: - type: "object" - properties: - '@microsoft.graph.hasMoreData': - type: "boolean" - '@odata.deltaLink': - type: "string" - '@odata.nextLink': - type: "string" - value: - type: "array" - items: - $ref: "#/definitions/Drive" +- pathTemplate: "/v1.0/drives/{driveId}/activities" + allowedQueryParams: + - "$expand" + - "$skiptoken" + transforms: + - ! + jsonPaths: + - "$..user.id" + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/ItemActivity" +- pathTemplate: "/v1.0/drives/{driveId}/items/{itemId}/activities" + allowedQueryParams: + - "$expand" + - "$skiptoken" + transforms: + - ! + jsonPaths: + - "$..user.id" + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/ItemActivity" +- pathTemplate: "/v1.0/drives/{driveId}/root/delta" + allowedQueryParams: + - "token" + - "$select" + - "$expand" + - "$top" + transforms: + - ! + jsonPaths: + - "$..user.id" + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/DriveItem" +- pathTemplate: "/v1.0/groups" + allowedQueryParams: + - "$top" + - "$select" + - "$skiptoken" + - "$orderby" + - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" + transforms: + - ! + jsonPaths: + - "$..mail" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/GraphGroup" +- pathTemplate: "/v1.0/groups/{groupId}/drives" + allowedQueryParams: + - "$select" + - "$skiptoken" + - "$top" + - "$orderby" + - "$expand" + transforms: + - ! + jsonPaths: + - "$..user.id" + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/Drive" +- pathTemplate: "/v1.0/users" + allowedQueryParams: + - "$top" + - "$select" + - "$skiptoken" + - "$orderby" + - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" + transforms: + - ! + jsonPaths: + - "$..id" + - "$..employeeId" + - "$..mail" + - "$..otherMails[*]" + encoding: "URL_SAFE_TOKEN" + - ! + jsonPaths: + - "$..proxyAddresses[*]" + regex: "(?i)^smtp:(.*)$" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/GraphUser" +- pathTemplate: "/v1.0/users/{userId}/drives" + allowedQueryParams: + - "$select" + - "$skiptoken" + - "$top" + - "$orderby" + - "$expand" + transforms: + - ! + jsonPaths: + - "$..user.id" + - "$..user.email" + encoding: "URL_SAFE_TOKEN" + responseSchema: + type: "object" + properties: + '@microsoft.graph.hasMoreData': + type: "boolean" + '@odata.deltaLink': + type: "string" + '@odata.nextLink': + type: "string" + value: + type: "array" + items: + $ref: "#/definitions/Drive" definitions: ActivityItemRef: type: "object" diff --git a/docs/sources/microsoft-365/msft-teams/msft-teams.yaml b/docs/sources/microsoft-365/msft-teams/msft-teams.yaml index 5d47af554..d9842d4c6 100644 --- a/docs/sources/microsoft-365/msft-teams/msft-teams.yaml +++ b/docs/sources/microsoft-365/msft-teams/msft-teams.yaml @@ -37,6 +37,8 @@ endpoints: - "$filter" - "$orderby" - "$expand" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -285,6 +287,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/msft-teams/msft-teams_no-userIds.yaml b/docs/sources/microsoft-365/msft-teams/msft-teams_no-userIds.yaml index 38cbc7334..37e410db9 100644 --- a/docs/sources/microsoft-365/msft-teams/msft-teams_no-userIds.yaml +++ b/docs/sources/microsoft-365/msft-teams/msft-teams_no-userIds.yaml @@ -40,6 +40,8 @@ endpoints: - "$..['@odata.type']" - "$..['@odata.count']" - pathRegex: "^/v1.0/users(/p~[a-zA-Z0-9_-]+?)?[^/]*/chats(\\?.*)?" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -340,6 +342,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/outlook-cal/outlook-cal.yaml b/docs/sources/microsoft-365/outlook-cal/outlook-cal.yaml index 3e0bbaa52..d8be8bfb0 100644 --- a/docs/sources/microsoft-365/outlook-cal/outlook-cal.yaml +++ b/docs/sources/microsoft-365/outlook-cal/outlook-cal.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -44,6 +47,8 @@ endpoints: - "$..identities[*].issuerAssignedId" encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -76,6 +81,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids.yaml b/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids.yaml index 596dccf20..e6763c3a9 100644 --- a/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids.yaml +++ b/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -49,6 +52,8 @@ endpoints: includeReversible: true encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -81,6 +86,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids_no-groups.yaml b/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids_no-groups.yaml index af0e69e6b..e664cb4a3 100644 --- a/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids_no-groups.yaml +++ b/docs/sources/microsoft-365/outlook-cal/outlook-cal_no-app-ids_no-groups.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/outlook-mail/outlook-mail.yaml b/docs/sources/microsoft-365/outlook-mail/outlook-mail.yaml index 6b46e8a89..e0b149339 100644 --- a/docs/sources/microsoft-365/outlook-mail/outlook-mail.yaml +++ b/docs/sources/microsoft-365/outlook-mail/outlook-mail.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -44,6 +47,8 @@ endpoints: - "$..identities[*].issuerAssignedId" encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -76,6 +81,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -135,6 +142,8 @@ endpoints: - "$..emailAddress.address" encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/users/[^/]*/mailFolders(/SentItems|\\('SentItems'\\))/messages.*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids.yaml b/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids.yaml index 02a61163c..7da282bf9 100644 --- a/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids.yaml +++ b/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -49,6 +52,8 @@ endpoints: includeReversible: true encoding: "URL_SAFE_TOKEN" - pathRegex: "^/v1.0/groups/?[^/]*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -81,6 +86,8 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -155,6 +162,8 @@ endpoints: - "$..['@odata.context']" - pathRegex: "^/v1.0/users(/p~[a-zA-Z0-9_-]+?)?[^/]*/mailFolders(/SentItems|\\('SentItems'\\\ ))/messages.*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids_no-groups.yaml b/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids_no-groups.yaml index b8a5a4a5b..6d51e8de8 100644 --- a/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids_no-groups.yaml +++ b/docs/sources/microsoft-365/outlook-mail/outlook-mail_no-app-ids_no-groups.yaml @@ -7,6 +7,9 @@ endpoints: - "$skiptoken" - "$orderBy" - "$count" + - "$filter" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: @@ -82,6 +85,8 @@ endpoints: - "$..['@odata.context']" - pathRegex: "^/v1.0/users(/p~[a-zA-Z0-9_-]+?)?[^/]*/mailFolders(/SentItems|\\('SentItems'\\\ ))/messages.*" + allowedRequestHeaders: + - "ConsistencyLevel" transforms: - ! jsonPaths: diff --git a/java/core/src/main/java/co/worklytics/psoxy/rules/msft/PrebuiltSanitizerRules.java b/java/core/src/main/java/co/worklytics/psoxy/rules/msft/PrebuiltSanitizerRules.java index c78025e06..b7e644b00 100644 --- a/java/core/src/main/java/co/worklytics/psoxy/rules/msft/PrebuiltSanitizerRules.java +++ b/java/core/src/main/java/co/worklytics/psoxy/rules/msft/PrebuiltSanitizerRules.java @@ -15,11 +15,15 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; public class PrebuiltSanitizerRules { + // required by Graph API for `$filter`/`$search`/`$count` "advanced query" support on directory listings + static final Set CONSISTENCY_LEVEL_HEADER = Set.of("ConsistencyLevel"); + static final Transform.Tokenize TOKENIZE_ODATA_LINKS = Transform.Tokenize.builder() .jsonPath("$.['@odata.nextLink', '@odata.prevLink', 'sessions@odata.nextLink']") .regex("^https://graph.microsoft.com/v1.0/users/([a-zA-Z0-9_-]+)/.*$") @@ -85,18 +89,21 @@ public class PrebuiltSanitizerRules { ); static final Endpoint ENTRA_ID_USERS = Endpoint.builder() .pathRegex(ENTRA_ID_REGEX_USERS) - .allowedQueryParams(List.of("$top", "$select", "$skiptoken", "$orderBy", "$count")) + .allowedQueryParams(List.of("$top", "$select", "$skiptoken", "$orderBy", "$count", "$filter")) + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transforms(USER_TRANSFORMS) .build(); static final Endpoint ENTRA_ID_USERS_NO_APP_IDS = Endpoint.builder() .pathRegex(ENTRA_ID_REGEX_USERS_BY_PSEUDO) - .allowedQueryParams(List.of("$top", "$select", "$skiptoken", "$orderBy", "$count")) + .allowedQueryParams(List.of("$top", "$select", "$skiptoken", "$orderBy", "$count", "$filter")) + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transforms(USER_TRANSFORMS) .build(); static final Endpoint ENTRA_ID_GROUPS = Endpoint.builder() .pathRegex("^/v1.0/groups/?[^/]*") + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transform(PSEUDONYMIZE_PROXY_ADDRESSES) .transform(Transform.Redact.builder() .jsonPath("$..owners") @@ -123,6 +130,7 @@ public class PrebuiltSanitizerRules { static final Endpoint ENTRA_ID_GROUP_MEMBERS = Endpoint.builder() .pathRegex(ENTRA_ID_REGEX_GROUP_MEMBERS) .allowedQueryParams(List.of("$top", "$select", "$skiptoken", "$orderBy", "$count")) + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transforms(USER_TRANSFORMS) .build(); @@ -190,6 +198,7 @@ public class PrebuiltSanitizerRules { .build(), Endpoint.builder() .pathRegex(OUTLOOK_MAIL_PATH_REGEX_SENT_MESSAGES) + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transform(Transform.Redact.builder() .jsonPath("$..subject") .jsonPath("$..body") @@ -230,6 +239,7 @@ public class PrebuiltSanitizerRules { .build(), Endpoint.builder() .pathRegex(ENTRA_ID_REGEX_USERS_BY_PSEUDO + "/mailFolders(/SentItems|\\('SentItems'\\))/messages.*") + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transform(Transform.Redact.builder() .jsonPath("$..subject") .jsonPath("$..body") @@ -464,6 +474,7 @@ public class PrebuiltSanitizerRules { static final Endpoint MS_TEAMS_USERS_CHATS = Endpoint.builder() .pathTemplate(MS_TEAMS_PATH_TEMPLATES_USERS_CHATS) .allowedQueryParams(List.of("$select", "$top", "$skiptoken", "$filter", "$orderby", "$expand")) + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transform(MS_TEAMS_TEAMS_DEFAULT_PSEUDONYMIZE) .transform(MS_TEAMS_TEAMS_REDACT) .build(); @@ -583,6 +594,7 @@ public class PrebuiltSanitizerRules { .build()))) .endpoint(Endpoint.builder() .pathRegex(ENTRA_ID_REGEX_USERS_BY_PSEUDO + "/chats(\\?.*)?") + .allowedRequestHeaders(CONSISTENCY_LEVEL_HEADER) .transforms(Arrays.asList(MS_TEAMS_TEAMS_DEFAULT_PSEUDONYMIZE, // id of the chat may contain MSFT user GUIDS Transform.Tokenize.builder() diff --git a/java/core/src/test/java/co/worklytics/psoxy/rules/msft/EntraIDTests.java b/java/core/src/test/java/co/worklytics/psoxy/rules/msft/EntraIDTests.java index 393f617a8..c11392d46 100644 --- a/java/core/src/test/java/co/worklytics/psoxy/rules/msft/EntraIDTests.java +++ b/java/core/src/test/java/co/worklytics/psoxy/rules/msft/EntraIDTests.java @@ -100,8 +100,21 @@ void users_select(String endpoint) { @Test void users_filter() { - String endpoint = "https://graph.microsoft.com/v1.0/users?$filter=accountEnabled eq true"; - assertUrlBlocked(endpoint); + String jsonString = asJson(ENTRA_ID_API_EXAMPLES_PATH, "users.json"); + + // $filter, as used to partition user enumeration across parallel jobs by userPrincipalName prefix + String endpoint = "https://graph.microsoft.com/v1.0/users?$filter=startswith(userPrincipalName,'a')"; + + Collection PII = Arrays.asList( + "john@worklytics.onmicrosoft.com", + "Paul Allen" + ); + assertNotSanitized(jsonString, PII); + + String sanitized = this.sanitize(endpoint, jsonString); + + assertPseudonymized(sanitized, "john@worklytics.onmicrosoft.com"); + assertRedacted(sanitized, "Paul Allen"); } @Test diff --git a/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDriveTests.java b/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDriveTests.java index 21c69cd5d..130bc550b 100644 --- a/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDriveTests.java +++ b/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDriveTests.java @@ -33,6 +33,8 @@ public Stream getExamples() { // /v1.0/users - no query params, and with all allowed query params InvocationExample.of(baseEndpoint + "/users", "users.json"), InvocationExample.of(baseEndpoint + "/users?$top=999&$select=id,mail,employeeId,otherMails,proxyAddresses&$skiptoken=abcXYZ123&$orderby=id&$count=true", "users.json"), + // /v1.0/users - $filter, as used to partition user enumeration across parallel jobs by userPrincipalName prefix + InvocationExample.of(baseEndpoint + "/users?$filter=startswith(userPrincipalName,'a')&$top=999&$select=id,mail,employeeId,otherMails,proxyAddresses", "users.json"), // /v1.0/groups - no query params, and with all allowed query params InvocationExample.of(baseEndpoint + "/groups", "groups.json"), InvocationExample.of(baseEndpoint + "/groups?$top=999&$select=id,mail&$skiptoken=abcXYZ123&$orderby=id&$count=true", "groups.json"), diff --git a/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDrive_NoAppIds_Tests.java b/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDrive_NoAppIds_Tests.java index c8988bb30..2f40c9f4d 100644 --- a/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDrive_NoAppIds_Tests.java +++ b/java/core/src/test/java/co/worklytics/psoxy/rules/msft/OneDrive_NoAppIds_Tests.java @@ -35,6 +35,8 @@ public Stream getExamples() { // /v1.0/users - no query params, and with all allowed query params InvocationExample.of(baseEndpoint + "/users", "users.json"), InvocationExample.of(baseEndpoint + "/users?$top=999&$select=id,mail,employeeId,otherMails,proxyAddresses&$skiptoken=abcXYZ123&$orderby=id&$count=true", "users.json"), + // /v1.0/users - $filter, as used to partition user enumeration across parallel jobs by userPrincipalName prefix + InvocationExample.of(baseEndpoint + "/users?$filter=startswith(userPrincipalName,'a')&$top=999&$select=id,mail,employeeId,otherMails,proxyAddresses", "users.json"), // /v1.0/groups - no query params, and with all allowed query params InvocationExample.of(baseEndpoint + "/groups", "groups.json"), InvocationExample.of(baseEndpoint + "/groups?$top=999&$select=id,mail&$skiptoken=abcXYZ123&$orderby=id&$count=true", "groups.json"),