Skip to content

Commit 926bdf1

Browse files
authored
release v0.5.4 from PR #
release v0.5.4 from PR #
2 parents dbc2d84 + 2d07d53 commit 926bdf1

File tree

452 files changed

+14387
-115982
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

452 files changed

+14387
-115982
lines changed

.editorconfig

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,30 @@ tab_width = 2
3535
indent_style = space
3636
tab_width = 2
3737

38+
39+
# Recommended settings for Markdown files in IntelliJ when publishing to GitBook
40+
# These settings assume Markdown is soft-wrapped visually at 100 columns,
41+
# with no hard wraps inserted by the IDE or formatter.
42+
43+
[*.md]
44+
45+
# Show visual guide at 100 characters in IntelliJ
46+
# Set in: Preferences → Editor → Code Style → Markdown → Right margin (columns)
47+
# (This value is visual only; it does not cause hard wrapping)
48+
# Suggested value: 100
49+
50+
# Enable soft wrap in IntelliJ
51+
# Set in: Preferences → Editor → General → Soft Wraps
52+
# Add pattern: *.md
53+
54+
# Prevent IntelliJ from inserting line breaks when reformatting
55+
# Set in: Preferences → Editor → Code Style → Markdown → Wrapping and Braces
56+
# Disable "Wrap on typing" and any force wrap rules
57+
58+
max_line_length = off
59+
60+
61+
3862
# TODO: use intellij specific controls?? can't find explicit docs on them exactly
3963
#ij_hcl-terraform_keep_line_breaks = true
4064
#ij_hcl_keep_line_breaks = true

.github/workflows/ci-bundles.yaml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
branches:
1212
- 'main'
1313
- 'rc-*'
14+
workflow_dispatch:
1415

1516
jobs:
1617
bundle:
@@ -35,7 +36,7 @@ jobs:
3536
mvn clean -f pom.xml
3637
mvn package install -f "gateway-core/pom.xml" -Dmaven.test.skip=true
3738
mvn package install -f "core/pom.xml" -Dmaven.test.skip=true
38-
mvn package -f "impl/${{ matrix.implementation }}/pom.xml" -Pdistribution
39+
mvn package -Pdistribution -f "impl/${{ matrix.implementation }}/pom.xml"
3940
- name: Verify license artifacts are in the uber jar
4041
working-directory: java/impl/${{ matrix.implementation }}
4142
run: |
@@ -64,3 +65,21 @@ jobs:
6465
}
6566

6667
echo "✅ License artifacts verified in $JAR_FILE"
68+
- name: Configure AWS credentials via OIDC
69+
if: matrix.implementation == 'aws'
70+
uses: aws-actions/configure-aws-credentials@v4
71+
with:
72+
role-to-assume: arn:aws:iam::908404960471:role/GithubActionCIAgent
73+
aws-region: us-west-2
74+
- name: Upload uber-jar to S3
75+
if: matrix.implementation == 'aws'
76+
working-directory: java/impl/aws/target/
77+
env:
78+
AWS_REGION: us-west-2
79+
S3_BUCKET: psoxy-public-artifacts
80+
run: |
81+
# uber-jar should be something like: psoxy-aws-{VERSION}.jar
82+
JAR_FILE=$(find . -name "*.jar" | head -n1)
83+
echo "Uploading $JAR_FILE to s3://$S3_BUCKET/"
84+
85+
aws s3 cp "$JAR_FILE" "s3://$S3_BUCKET/" --region "$AWS_REGION"

.vscode/eclipse-java-google-style.xml

Lines changed: 337 additions & 0 deletions
Large diffs are not rendered by default.

.vscode/settings.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"java.configuration.updateBuildConfiguration": "interactive",
3+
"java.compile.nullAnalysis.mode": "automatic",
4+
"java.format.settings.url": ".vscode/eclipse-java-google-style.xml",
5+
"java.format.settings.profile": "GoogleStyle",
6+
"editor.formatOnSave": false,
7+
"editor.formatOnPaste": false,
8+
"editor.formatOnType": false,
9+
"java.format.enabled": false,
10+
"java.format.onType.enabled": false,
11+
"java.format.onSave.enabled": false
12+
}

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ Changes to be including in future/planned release notes will be added here.
77

88
## Next
99

10+
## [0.5.4](https://github.com/Worklytics/psoxy/release/tag/v0.5.4)
11+
- `Slack Analytics`: added new connector for supporting fetching Slack Analytics data, through `api/admin.analytics.getFile` endpoint
12+
- Side Outputs: added support; see [docs/configuration/side-outputs.md](docs/configuration/side-outputs.md) for details
13+
- Supported async responses; see [docs/configuration/async-responses.md](docs/configuration/async-api-data.md) for details
14+
- added `windsurf` connector in **alpha**; see [docs/sources/windsurf/README.md](docs/connectors/windsurf/README.md)
15+
- added `cursor` connector in **alpha**; see [docs/sources/cursor/README.md](docs/connectors/cursor/README.md)
16+
1017
## [0.5.3](https://github.com/Worklytics/psoxy/release/tag/v0.5.3)
1118
- `aws` - removed `ssm:GetParameterVersion` perm from policies; not a thing
1219
- support for Side Outputs in `gcp` and `aws` modules; see [docs/configuration/side-outputs.md](docs/configuration/side-outputs.md) for details
@@ -408,4 +415,4 @@ Upgrade Notes:
408415
- eg, `PSOXY_SHARED` and `PSOXY_GCAL`, to allow IAM policies such as "read `PSOXY_SHARED*`" and
409416
"read+write `PSOXY_GCAL*`" (if shared secrets have common prefix with connector secrets,
410417
then wildcard policy to read shared also grants read of secrets across all connectors)
411-
- keys/salts per value kind (PII, item id, etc)
418+
- keys/salts per value kind (PII, item id, etc)

docs/.prettierrc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
{
2-
"proseWrap": "always",
3-
"printWidth": 100
2+
"proseWrap": "never",
3+
"tabWidth": 4,
4+
"useTabs": true,
5+
"endOfLine": "lf"
46
}

docs/README.md

Lines changed: 93 additions & 190 deletions
Large diffs are not rendered by default.

docs/SUMMARY.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,13 @@
5757
* [Jira Data Center](sources/atlassian/jira/jira-server.md)
5858
* [Dropbox](sources/dropbox-business/README.md)
5959
* [GitHub](sources/github/README.md)
60-
* [Github Copilot](sources/github/copilot/README.md)
60+
* [GitHub Copilot](sources/github/copilot/README.md)
6161
* [GitHub Enterprise Server](sources/github/enterprise-server/README.md)
62-
* [Github Enterprise Cloud](sources/github/github/README.md)
63-
* [Github Non Enterprise Cloud](sources/github/github-non-enterprise/README.md)
62+
* [GitHub Enterprise Cloud](sources/github/github/README.md)
63+
* [GitHub Non Enterprise Cloud](sources/github/github-non-enterprise/README.md)
6464
* [Google Workspace](sources/google-workspace/README.md)
65-
* [API Call Examples](sources/google-workspace/example-api-calls.md)
65+
* [Gemini in Workspace Apps](sources/google-workspace/gemini-in-workspace-apps/README.md)
66+
* [Gemini Usage](sources/google-workspace/gemini-usage-bulk/README.md)
6667
* [Gmail](sources/google-workspace/gmail/README.md)
6768
* [Google Calendar](sources/google-workspace/calendar/README.md)
6869
* [Google Chat](sources/google-workspace/google-chat/README.md)
@@ -80,10 +81,10 @@
8081
* [Miro](sources/miro/README.md)
8182
* [Miro AI Bulk](sources/miro/miro-ai-bulk/README.md)
8283
* [Salesforce](sources/salesforce/README.md)
83-
* [Slack Discovery API](sources/slack/README.md)
84+
* [Slack](sources/slack/README.md)
8485
* [Slack AI Bulk](sources/slack/slack-ai-bulk/README.md)
85-
* [Slack Discovery API](sources/slack/slack-discovery-api/README.md)
86-
* [Slack Discovery Bulk](sources/slack/slack-discovery-bulk/README.md)
86+
* [Slack Bulk Exports](sources/slack/slack-discovery-bulk/README.md)
87+
* [Slack via Discovery API](sources/slack/slack-discovery-api/README.md)
8788
* [Zoom](sources/zoom/README.md)
8889
* [API Call Examples](sources/zoom/example-api-calls.md)
8990

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,28 @@
11
# API Mode Authentication and Authorization
22

3-
There are two connection legs to consider with regard to authentication and authorization in API
4-
mode:
3+
There are two connection legs to consider with regard to authentication and authorization in API mode:
54
1. between Worklytics and the proxy (your host cloud)
65
2. between the proxy and the data source API
76

8-
Eg, Worklytics initiates an API request to the proxy (1); which, after validating the request,
9-
forwards it to the data source API on behalf of Worklytics (2), adding its additional authentication
10-
information.
7+
Eg, Worklytics initiates an API request to the proxy (1); which, after validating the request, forwards it to the data source API on behalf of Worklytics (2), adding its additional authentication information.
118

129
## Worklytics to Proxy (1)
1310

14-
Worklytics is **authorized** to access your proxy instance via an Identity and Access Management (IAM)
15-
policy which you must configure in your host platform. The exact details vary by cloud provider:
11+
Worklytics is **authorized** to access your proxy instance via an Identity and Access Management (IAM) policy which you must configure in your host platform. The exact details vary by cloud provider:
1612
- [AWS](aws/authentication-authorization.md)
1713
- [GCP](gcp/authentication-authorization.md)
1814

19-
Worklytics **authenticates** in all cases via Workload Identity Federation; as your Worklytics tenant is
20-
running natively in the cloud, it can leverage the cloud provider's native IAM service to establish
21-
identity which can be asserted to other services in the cloud.
15+
Worklytics **authenticates** in all cases via Workload Identity Federation; as your Worklytics tenant is running natively in the cloud, it can leverage the cloud provider's native IAM service to establish identity which can be asserted to other services in the cloud.
2216

2317
## Proxy to Data Source API (2)
2418

25-
Although exact details vary by data source, most utilize some form of [OAuth 2.0](https://oauth.net/2/)
26-
for authorization and authentication.
19+
Although exact details vary by data source, most utilize some form of [OAuth 2.0](https://oauth.net/2/) for authorization and authentication.
2720

28-
A data source admin (eg, a Google Workspace admin) must **authorize** the proxy to access the data
29-
source via the data source's admin console. This typically involves creating a new OAuth 2.0 client
30-
and granting that client a set of [oauth scopes](https://oauth.net/2/scope/) required to support the
31-
API calls that will be made on behalf of Worklytics. A detailed list of scopes required for each
32-
data source is specified in the documentation of each connector.
21+
A data source admin (eg, a Google Workspace admin) must **authorize** the proxy to access the data source via the data source's admin console. This typically involves creating a new OAuth 2.0 client and granting that client a set of [oauth scopes](https://oauth.net/2/scope/) required to support the API calls that will be made on behalf of Worklytics. A detailed list of scopes required for each data source is specified in the documentation of each connector.
3322

3423
See https://docs.worklytics.co/psoxy#supported-data-sources
3524

36-
The proxy **authenticates** itself for calls to the data source using one of the supported OAuth 2.0
37-
mechanisms, see [https://oauth.net/2/client-authentication/]. Most commonly, these are [Client Credentials](https://oauth.net/2/grant-types/client-credentials/)
38-
or [Workload Identity Federation](https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation).
25+
The proxy **authenticates** itself for calls to the data source using one of the supported OAuth 2.0 mechanisms, see [https://oauth.net/2/client-authentication/]. Most commonly, these are [Client Credentials](https://oauth.net/2/grant-types/client-credentials/) or [Workload Identity Federation](https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation).
3926

4027
In particular, a quick overview for common sources:
4128
- Microsoft 365 sources authenticate via Workload Identity Federation
@@ -46,8 +33,4 @@ In particular, a quick overview for common sources:
4633
- Salesforce authenticates via Client Credentials (a Salesforce App client id + secret)
4734
- Zoom authenticates via Client Credentials (a Zoom App client id + secret)
4835

49-
In all cases relying on secrets (a key, client secret, token, etc) to authenticate, these values
50-
are stored in the secret store implementation of your Host cloud provider (eg, GCP Secret Manager)
51-
and **never** passed to or accessed by Worklytics. Worklytics has no means to directly connect to
52-
any of your data sources.
53-
36+
In all cases relying on secrets (a key, client secret, token, etc) to authenticate, these values are stored in the secret store implementation of your Host cloud provider (eg, GCP Secret Manager) and **never** passed to or accessed by Worklytics. Worklytics has no means to directly connect to any of your data sources.
Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,30 @@
11
# Authentication and Authorization in AWS Deployments of Psoxy
22

3-
This page provides an overview of how Psoxy authenticates and confirms authorization of clients
4-
(Worklytics tenants).
3+
This page provides an overview of how Psoxy authenticates and confirms authorization of clients (Worklytics tenants).
54

6-
For general overview of how Psoxy is authorized to access data sources, and authenticates when
7-
making API calls to those sources, see [API Mode Authentication and Authorization](../authentication-authorization.md).
5+
For general overview of how Psoxy is authorized to access data sources, and authenticates when making API calls to those sources, see [API Mode Authentication and Authorization](../authentication-authorization.md).
86

97
## Authentication
108

11-
Each Worklytics tenant operates as a unique GCP service account within Google Cloud. GCP issues an
12-
identity token for this service account to processes running in the tenant, which the tenant then
13-
uses to authenticate against AWS.
9+
Each Worklytics tenant operates as a unique GCP service account within Google Cloud. GCP issues an identity token for this service account to processes running in the tenant, which the tenant then uses to authenticate against AWS.
1410

15-
This is [OIDC](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html) based
16-
identity federation (aka "web identity federation" or "workload identity federation").
11+
This is [OIDC](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html) based identity federation (aka "web identity federation" or "workload identity federation").
1712

18-
No secrets or keys need to be exchanged between Worklytics and your AWS instance. The integrity of
19-
the authentication is provided by the signature of the identity token provided by GCP, which AWS
20-
verifies against Google's public certificates.
21-
22-
AWS provides an overview of the specific GCP Case:
23-
[Access AWS using a Google Cloud Platform native workload identity](https://aws.amazon.com/blogs/security/access-aws-using-a-google-cloud-platform-native-workload-identity/)
13+
No secrets or keys need to be exchanged between Worklytics and your AWS instance. The integrity of the authentication is provided by the signature of the identity token provided by GCP, which AWS verifies against Google's public certificates.
2414

15+
AWS provides an overview of the specific GCP Case: [Access AWS using a Google Cloud Platform native workload identity](https://aws.amazon.com/blogs/security/access-aws-using-a-google-cloud-platform-native-workload-identity/)
2516

2617
Annotating the diagram for the above case, with specific components for Worklytics-->Proxy case:
2718

2819
![gcp-to-aws-workload-identity.png](gcp-to-aws-workload-identity.png)
2920

30-
In the above, the AWS resource you're allowing access to is AWS IAM role, which your Worklytics tenant
31-
assumes and then can access S3 or invoke Lambda function.
21+
In the above, the AWS resource you're allowing access to is AWS IAM role, which your Worklytics tenant assumes and then can access S3 or invoke Lambda function.
3222

3323
## Authorization
3424

35-
Within your AWS account, you create an IAM role, with a role assumption policy that allows your
36-
Worklytics tenant's GCP Service Account (identified by a numeric ID you obtain from the Worklytics
37-
portal) to assume the role.
25+
Within your AWS account, you create an IAM role, with a role assumption policy that allows your Worklytics tenant's GCP Service Account (identified by a numeric ID you obtain from the Worklytics portal) to assume the role.
3826

39-
This assumption policy will have a statement similar to the following, where the value of the `aud`
40-
claim is the numeric ID of your Worklytics tenant's GCP Service Account:
27+
This assumption policy will have a statement similar to the following, where the value of the `aud` claim is the numeric ID of your Worklytics tenant's GCP Service Account:
4128

4229
```json
4330
{
@@ -54,9 +41,6 @@ claim is the numeric ID of your Worklytics tenant's GCP Service Account:
5441
}
5542
```
5643

57-
Colloquially, this allows a web identity federated from `accounts.google.com` where Google has
58-
asserted the claim that `aud` == `12345678901234567890123456789` to assume the role.
44+
Colloquially, this allows a web identity federated from `accounts.google.com` where Google has asserted the claim that `aud` == `12345678901234567890123456789` to assume the role.
5945

60-
Then you use this AWS IAM role as the principal in AWS IAM policies you define to authorize to
61-
invoke your proxy instances via their function URLs (API connectors) or to read from their sanitized
62-
output buckets (bulk data connectors)
46+
Then you use this AWS IAM role as the principal in AWS IAM policies you define to authorize to invoke your proxy instances via their function URLs (API connectors) or to read from their sanitized output buckets (bulk data connectors)

0 commit comments

Comments
 (0)