一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
702 行
36 KiB
JSON
702 行
36 KiB
JSON
{
|
|
"issue": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"repository_url": "https://api.github.com/repos/laurent22/joplin",
|
|
"labels_url": "https://api.github.com/repos/laurent22/joplin/issues/11865/labels{/name}",
|
|
"comments_url": "https://api.github.com/repos/laurent22/joplin/issues/11865/comments",
|
|
"events_url": "https://api.github.com/repos/laurent22/joplin/issues/11865/events",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865",
|
|
"id": 2865709635,
|
|
"node_id": "PR_kwDOBLftOs6L3-PD",
|
|
"number": 11865,
|
|
"title": "All: Add SAML support",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"labels": [],
|
|
"state": "open",
|
|
"locked": false,
|
|
"assignee": null,
|
|
"assignees": [],
|
|
"milestone": null,
|
|
"comments": 12,
|
|
"created_at": "2025-02-20T10:16:34Z",
|
|
"updated_at": "2025-04-25T10:46:33Z",
|
|
"closed_at": null,
|
|
"author_association": "FIRST_TIME_CONTRIBUTOR",
|
|
"active_lock_reason": null,
|
|
"draft": false,
|
|
"pull_request": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/pulls/11865",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865",
|
|
"diff_url": "https://github.com/laurent22/joplin/pull/11865.diff",
|
|
"patch_url": "https://github.com/laurent22/joplin/pull/11865.patch",
|
|
"merged_at": null
|
|
},
|
|
"body": "This PR adds SAML support to Joplin.\r\n\r\n# Server\r\nBased on the [`samlify`](https://www.npmjs.com/package/samlify) library that provides the SAML logic flow for Joplin Server.\r\n\r\nThis adds the following environment variables used as configuration parameters to Joplin Server :\r\n- `SAML_ENABLED`: If set to `true`, enables SAML support.\r\n- `DISABLE_BUILTIN_LOGIN_FLOW`: If set to `true`, all auth requests MUST go though SAML. Users can't log-in using Joplin-specific credentials and/or LDAP.\r\n- `SAML_IDP_CONFIG_FILE`: Should be a path to an XML file containing the metadata for the Identity Provider (IDP).\r\n- `SAML_SP_CONFIG_FILE`: Should be a path to an XML file containing the metadata for the Service Provider (SP, in this case Joplin).\r\n- `SAML_ORGANIZATION_DISPLAY_NAME`: Name of the organization, as shown on the log-in screen. Optional.\r\n\r\nThe XML files are standard SAML IDP/SP metadata that should be created by the identity solution.\r\n\r\n# Clients\r\nAs for the clients themselves, no additional libraries are needed, since the actual log-in process is happening in a web browser, outside of Joplin itself.\r\n\r\nIt also adds a new sync target, based on the one for Joplin Server: \"Joplin Server (Beta, SAML)\". We kept \"Beta\" in the name for this since the main Joplin Server target itself is currently considered as such.\r\n\r\n> [!IMPORTANT]\r\n> The log-in flow uses a callback to a `joplin://` URL, and thus requires that only one instance of Joplin is running at any given time. This is important for the desktop client, since the single instance lock is not enforced in the `dev` environment.\r\n\r\n## Log-in flow\r\nThe log-in process differs slightly if started from within a client or within the server web interface.\r\n\r\n```mermaid\r\n graph TB;\r\n 12([From the server web interface]) --> 13[The user clicks 'Sign-in using your organization account']\r\n\r\n 13 --> 5\r\n\r\n 0([From a client]) --> 1\r\n\r\n 1[The user chooses the SAML sync target] --> 2[They enter the server's address]\r\n 2 --> 3[They click 'Sign-in using your organization account']\r\n 3 --> 4[The Joplin client opens the default web browser to an URL pointing to Joplin Server]\r\n 4 --> 5[Joplin Server reads its configuration and redirects the browser to the Identity Provider sign-in page]\r\n 5 --> 6[The user signs-in]\r\n 6 --> 7[The Identity Provider generates and signs a SAML payload, and redirects the browser to Joplin Server]\r\n 7 --> 8[Joplin Server validates the payload signature]\r\n\r\n 8 -- Client --- 9[If the signature is valid, Joplin Server creates a new token for this user]\r\n 9 --> 10[Using a joplin:// URL, the browser calls back into the client, with the new token]\r\n\r\n 8 -- Server web interface --- 11[If the signature is valid, a new session is created]\r\n```\r\n\r\n# Testing and development\r\nFor development purposes, we used [`saml-idp`](https://www.npmjs.com/package/saml-idp) as the Identity Provider, as it allows to quickly create new users on the fly and is simple to set up. After generating the keypair (look at the `saml-idp` documentation to see how), just running `npx saml-idp --acsUrl 'http://localhost:22300/api/saml' --audience http://localhost:22300 --issuer 'saml-idp'` is enough to get a test Identity Provider running, assuming that Joplin Server is running on `localhost:22300`.\r\n\r\nSince `saml-idp` does not support generating SP metadata, here is a sample configuration for the Service Provider part :\r\n```xml\r\n<?xml version=\"1.0\"?>\r\n<md:EntityDescriptor xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\"\r\n validUntil=\"2024-12-15T08:05:25Z\"\r\n cacheDuration=\"PT604800S\"\r\n entityID=\"Joplin\">\r\n <md:SPSSODescriptor AuthnRequestsSigned=\"false\" WantAssertionsSigned=\"false\" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol\">\r\n <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>\r\n <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\"\r\n Location=\"http://localhost:22300/api/saml\"\r\n index=\"1\" />\r\n </md:SPSSODescriptor>\r\n</md:EntityDescriptor>\r\n```",
|
|
"closed_by": null,
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/11865/reactions",
|
|
"total_count": 2,
|
|
"+1": 1,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 1,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"timeline_url": "https://api.github.com/repos/laurent22/joplin/issues/11865/timeline",
|
|
"performed_via_github_app": null,
|
|
"state_reason": null
|
|
},
|
|
"comments": [
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2671054761",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2671054761",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2671054761,
|
|
"node_id": "IC_kwDOBLftOs6fNQ-p",
|
|
"user": {
|
|
"login": "github-actions[bot]",
|
|
"id": 41898282,
|
|
"node_id": "MDM6Qm90NDE4OTgyODI=",
|
|
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
|
|
"html_url": "https://github.com/apps/github-actions",
|
|
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
|
|
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
|
|
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
|
|
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
|
|
"type": "Bot",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-02-20T10:16:50Z",
|
|
"updated_at": "2025-04-10T09:25:10Z",
|
|
"author_association": "CONTRIBUTOR",
|
|
"body": "****CLA Assistant Lite bot**** All contributors have signed the CLA ✍️ ✅",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2671054761/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": {
|
|
"id": 15368,
|
|
"client_id": "Iv1.05c79e9ad1f6bdfa",
|
|
"slug": "github-actions",
|
|
"node_id": "MDM6QXBwMTUzNjg=",
|
|
"owner": {
|
|
"login": "github",
|
|
"id": 9919,
|
|
"node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/github",
|
|
"html_url": "https://github.com/github",
|
|
"followers_url": "https://api.github.com/users/github/followers",
|
|
"following_url": "https://api.github.com/users/github/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/github/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/github/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/github/orgs",
|
|
"repos_url": "https://api.github.com/users/github/repos",
|
|
"events_url": "https://api.github.com/users/github/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/github/received_events",
|
|
"type": "Organization",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"name": "GitHub Actions",
|
|
"description": "Automate your workflow from idea to production",
|
|
"external_url": "https://help.github.com/en/actions",
|
|
"html_url": "https://github.com/apps/github-actions",
|
|
"created_at": "2018-07-30T09:30:17Z",
|
|
"updated_at": "2025-03-07T16:35:00Z",
|
|
"permissions": {
|
|
"actions": "write",
|
|
"administration": "read",
|
|
"attestations": "write",
|
|
"checks": "write",
|
|
"contents": "write",
|
|
"deployments": "write",
|
|
"discussions": "write",
|
|
"issues": "write",
|
|
"merge_queues": "write",
|
|
"metadata": "read",
|
|
"models": "read",
|
|
"packages": "write",
|
|
"pages": "write",
|
|
"pull_requests": "write",
|
|
"repository_hooks": "write",
|
|
"repository_projects": "write",
|
|
"security_events": "write",
|
|
"statuses": "write",
|
|
"vulnerability_alerts": "read"
|
|
},
|
|
"events": [
|
|
"branch_protection_rule",
|
|
"check_run",
|
|
"check_suite",
|
|
"create",
|
|
"delete",
|
|
"deployment",
|
|
"deployment_status",
|
|
"discussion",
|
|
"discussion_comment",
|
|
"fork",
|
|
"gollum",
|
|
"issues",
|
|
"issue_comment",
|
|
"label",
|
|
"merge_group",
|
|
"milestone",
|
|
"page_build",
|
|
"project",
|
|
"project_card",
|
|
"project_column",
|
|
"public",
|
|
"pull_request",
|
|
"pull_request_review",
|
|
"pull_request_review_comment",
|
|
"push",
|
|
"registry_package",
|
|
"release",
|
|
"repository",
|
|
"repository_dispatch",
|
|
"status",
|
|
"watch",
|
|
"workflow_dispatch",
|
|
"workflow_run"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2671105647",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2671105647",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2671105647,
|
|
"node_id": "IC_kwDOBLftOs6fNdZv",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-02-20T10:37:57Z",
|
|
"updated_at": "2025-02-20T10:37:57Z",
|
|
"author_association": "NONE",
|
|
"body": "I have read the CLA Document and I hereby sign the CLA",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2671105647/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2672001760",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2672001760",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2672001760,
|
|
"node_id": "IC_kwDOBLftOs6fQ4Lg",
|
|
"user": {
|
|
"login": "laurent22",
|
|
"id": 1285584,
|
|
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/laurent22",
|
|
"html_url": "https://github.com/laurent22",
|
|
"followers_url": "https://api.github.com/users/laurent22/followers",
|
|
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
|
"repos_url": "https://api.github.com/users/laurent22/repos",
|
|
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-02-20T16:23:25Z",
|
|
"updated_at": "2025-02-20T16:23:25Z",
|
|
"author_association": "OWNER",
|
|
"body": "Thanks for creating this pull request! At the moment it has some issues related to the linter, which you should be able to fix by running `yarn linter ./` from the root. Would you mind fixing this so that CI passes? As it's a large PR it might take a while before we can review it but as a first step it would help if it doesn't have any CI error",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2672001760/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2673979256",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2673979256",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2673979256,
|
|
"node_id": "IC_kwDOBLftOs6fYa94",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-02-21T09:03:47Z",
|
|
"updated_at": "2025-02-21T09:03:47Z",
|
|
"author_association": "NONE",
|
|
"body": "I fixed the issues related to the linter.\r\n\r\nHowever, the server image does not build since the XML schema validator ([`@authenio/samlify-xsd-schema-validator`](https://www.npmjs.com/package/@authenio/samlify-xsd-schema-validator)) has a dependency on a Java environment that is missing in the CI. If needed I can replace this dependency with something else since `samlify` supports several validators, but this validator is the one recommended in the [`samlify` README file](https://github.com/tngan/samlify/blob/master/README.md#installation), so I hope this is not an issue?",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2673979256/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2674212623",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2674212623",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2674212623,
|
|
"node_id": "IC_kwDOBLftOs6fZT8P",
|
|
"user": {
|
|
"login": "laurent22",
|
|
"id": 1285584,
|
|
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/laurent22",
|
|
"html_url": "https://github.com/laurent22",
|
|
"followers_url": "https://api.github.com/users/laurent22/followers",
|
|
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
|
"repos_url": "https://api.github.com/users/laurent22/repos",
|
|
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-02-21T10:46:59Z",
|
|
"updated_at": "2025-02-21T10:46:59Z",
|
|
"author_association": "OWNER",
|
|
"body": "Hmm, if it's just to validate an XML schema I guess it's not worth adding a Java dependency? From their doc it looks like there's a TypeScript package too?",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2674212623/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2674568915",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2674568915",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2674568915,
|
|
"node_id": "IC_kwDOBLftOs6faq7T",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-02-21T13:34:08Z",
|
|
"updated_at": "2025-02-21T13:34:08Z",
|
|
"author_association": "NONE",
|
|
"body": "I got rid of the Java dependency, and replaced the schema validator with `@authenio/samlify-xmllint-wasm`, which doesn't require any native code. This allows the server image to build.",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2674568915/reactions",
|
|
"total_count": 2,
|
|
"+1": 1,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 1
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2754863975",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2754863975",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2754863975,
|
|
"node_id": "IC_kwDOBLftOs6kM-Nn",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-03-26T15:37:38Z",
|
|
"updated_at": "2025-03-26T15:37:38Z",
|
|
"author_association": "NONE",
|
|
"body": "Sorry to bump this, but is there any update about this?",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2754863975/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2755452083",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2755452083",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2755452083,
|
|
"node_id": "IC_kwDOBLftOs6kPNyz",
|
|
"user": {
|
|
"login": "laurent22",
|
|
"id": 1285584,
|
|
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/laurent22",
|
|
"html_url": "https://github.com/laurent22",
|
|
"followers_url": "https://api.github.com/users/laurent22/followers",
|
|
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
|
"repos_url": "https://api.github.com/users/laurent22/repos",
|
|
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-03-26T18:51:00Z",
|
|
"updated_at": "2025-03-26T18:51:00Z",
|
|
"author_association": "OWNER",
|
|
"body": "Hello, sorry for the lack of feedback yet. As this is a large pull request I will need more time to review it.\r\n\r\nThe fact that it is deeply integrated to both the server and apps mean there will be maintenance concerns since unlike for example a sync target that works independently, the new code will have to be maintained by us probably over time. I don't assume it's possible to make things a bit more modular? i.e. most of the code in new files, and a few integration points here and there;",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2755452083/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2758443099",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2758443099",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2758443099,
|
|
"node_id": "IC_kwDOBLftOs6kaoBb",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-03-27T15:18:20Z",
|
|
"updated_at": "2025-03-27T15:18:20Z",
|
|
"author_association": "NONE",
|
|
"body": "I don't think I can make the code more modular than it currently is. I refactored it a bit to help with your review (mostly by adding comments, but also by doing a bit of cleanup), and merged the current `dev` branch into mine. The only conflict I got was on a dictionary file, and after testing everything was still working as intended (on the SAML side, at least), so even if it's only one limited example it seems rather positive.\r\n\r\nThe new SAML sync target extends the base Joplin Server one, so on this topic I think I made things more modular than they were before by allowing the sync target to provide a session to `JoplinServerApi`, in addition to the regular login/password combo.\r\n\r\nUnfortunately since the SAML login process relies on a web browser, I didn't have a choice but to rely on a callback from a web page which means that I needed to use the `x-callback-url` scheme, and thus I had to add a new command that can be called externally (which means modifying part of the existing code). I don't think I can do this in a different way other than using a webview within the apps, and doing this would defeat part of the security benefit that comes with SAML. Furthermore, doing it that way would need even more code in the clients to handle this, so I think the current approach is the best one.\r\n\r\nAnd on the server, I had to modify `UserModel` since the only way to authenticate before was with a username and a password. This was required since the response from the Identity Provider is trusted (and we don't have the password anyways), and we need to create new users dynamically if they are not already known by the server. I also had to modify the `/login` route to add redirects as needed. Otherwise, the other modifications should be rather minor, and most of the actual SAML-related logic is within `routes/api/login.ts` and `utils/saml.ts`, which are new files.\r\n\r\nIf you have any tips about making this better, feel free to tell me so I can implement them.",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2758443099/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2759472335",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2759472335",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2759472335,
|
|
"node_id": "IC_kwDOBLftOs6kejTP",
|
|
"user": {
|
|
"login": "laurent22",
|
|
"id": 1285584,
|
|
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/laurent22",
|
|
"html_url": "https://github.com/laurent22",
|
|
"followers_url": "https://api.github.com/users/laurent22/followers",
|
|
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
|
"repos_url": "https://api.github.com/users/laurent22/repos",
|
|
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-03-27T21:03:53Z",
|
|
"updated_at": "2025-03-27T21:03:53Z",
|
|
"author_association": "OWNER",
|
|
"body": "Thank you for the detailed explanation, it does help. I also need to go back to your top post and check the diagram again so I understand things at a higher level before diving into the code review. I will try to do that as soon as possible and will get back to you.",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2759472335/reactions",
|
|
"total_count": 2,
|
|
"+1": 2,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2792054280",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2792054280",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2792054280,
|
|
"node_id": "IC_kwDOBLftOs6ma14I",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-04-10T08:59:09Z",
|
|
"updated_at": "2025-04-10T08:59:09Z",
|
|
"author_association": "NONE",
|
|
"body": "I updated my branch with your feedback. I removed the use of `x-callback-url` in favor of a code-based authentication flow, like the way Dropbox works. I did it that way to keep the same experience between the desktop and mobile clients.\r\n\r\nThis required additional modifications to the server side of things to handle auth codes (mostly `UserModel.ts` and `api/login.ts`). I also added a new task that runs every 15 minutes that removes expired auth codes from the database.\r\n\r\nOn the clients, the removal of the `x-callback-url` based flow makes things a bit cleaner. I added a new screen dedicated to opening the login page and entering an auth code. I made it modular (it's not specific to SAML), so it's possible to port the Dropbox login screen to it in the future.\r\n\r\nThis is tested on desktop (Windows 10) and mobile (both Android and iOS).",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2792054280/reactions",
|
|
"total_count": 1,
|
|
"+1": 1,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
},
|
|
{
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2830070749",
|
|
"html_url": "https://github.com/laurent22/joplin/pull/11865#issuecomment-2830070749",
|
|
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11865",
|
|
"id": 2830070749,
|
|
"node_id": "IC_kwDOBLftOs6or3Pd",
|
|
"user": {
|
|
"login": "ttcchhmm",
|
|
"id": 60962195,
|
|
"node_id": "MDQ6VXNlcjYwOTYyMTk1",
|
|
"avatar_url": "https://avatars.githubusercontent.com/u/60962195?v=4",
|
|
"gravatar_id": "",
|
|
"url": "https://api.github.com/users/ttcchhmm",
|
|
"html_url": "https://github.com/ttcchhmm",
|
|
"followers_url": "https://api.github.com/users/ttcchhmm/followers",
|
|
"following_url": "https://api.github.com/users/ttcchhmm/following{/other_user}",
|
|
"gists_url": "https://api.github.com/users/ttcchhmm/gists{/gist_id}",
|
|
"starred_url": "https://api.github.com/users/ttcchhmm/starred{/owner}{/repo}",
|
|
"subscriptions_url": "https://api.github.com/users/ttcchhmm/subscriptions",
|
|
"organizations_url": "https://api.github.com/users/ttcchhmm/orgs",
|
|
"repos_url": "https://api.github.com/users/ttcchhmm/repos",
|
|
"events_url": "https://api.github.com/users/ttcchhmm/events{/privacy}",
|
|
"received_events_url": "https://api.github.com/users/ttcchhmm/received_events",
|
|
"type": "User",
|
|
"user_view_type": "public",
|
|
"site_admin": false
|
|
},
|
|
"created_at": "2025-04-25T10:46:33Z",
|
|
"updated_at": "2025-04-25T10:46:33Z",
|
|
"author_association": "NONE",
|
|
"body": "Do I have to do something to fix the CLA CI job? I did sign the CLA when I started this pull request, so this should pass.",
|
|
"reactions": {
|
|
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2830070749/reactions",
|
|
"total_count": 0,
|
|
"+1": 0,
|
|
"-1": 0,
|
|
"laugh": 0,
|
|
"hooray": 0,
|
|
"confused": 0,
|
|
"heart": 0,
|
|
"rocket": 0,
|
|
"eyes": 0
|
|
},
|
|
"performed_via_github_app": null
|
|
}
|
|
]
|
|
} |