Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SolidOS Auth Upgrade #38

Closed
41 tasks done
jaxoncreed opened this issue Aug 4, 2021 · 90 comments
Closed
41 tasks done

SolidOS Auth Upgrade #38

jaxoncreed opened this issue Aug 4, 2021 · 90 comments
Assignees

Comments

@jaxoncreed
Copy link
Contributor

jaxoncreed commented Aug 4, 2021

This ticket Represents Sub-Project 1 of the SolidOS Auth upgrade:

See #38 (comment) for the official announcement of the completion of this project.

  • solid-client-authn-js-browser is integrated in SolidOS
  • Login header has a new UI for selecting the issuer
  • All tests are updated to work with the new login
  • Solid Test Suite passes (Does the test suite even touch this code? I don't think so)
  • Login to ESS on SolidOS Hosted from NSS
  • Login to NSS on SolidOS Hosted from NSS
  • Login to CSS on SolidOS Hosted from NSS
  • Login to ESS on SolidOS Hosted from Data Kitchen (ESS broker crashes when you have a file:// redirect)
  • Login to NSS on SolidOS Hosted from Data Kitchen
  • Login to CSS on SolidOS Hosted from Data Kitchen (CSS IdP rejects file:// redirects)
  • Login to ESS on SolidOS Hosted as a separate webpage
  • Login to NSS on SolidOS Hosted as a separate webpage
  • Login to CSS on SolidOS Hosted as a separate webpage
  • Refreshing the page does not log the user out
  • Problem to note: NSS handles a failed requests with a separate webpage. It should instead send a data browser.
  • Problem to note: Anything in an iframe (Dokeli) cannot get access to the credentials and will not be allowed
  • Problem to note: any hash (like #me) is removed upon redirect. This could be accounted for either in Solid-Client-Authn-JS or inside the data browser
  • Problem to note: Alain gets ReferenceError: TextEncoder is not defined with node v16.5, v14.17 or v12.19 on a windows WSL1 to build.
  • Problem to note: logout do not really log you out until you refresh the page.
  • Problem to note: switching users doesn't work
  • Problem to note: Redirects will always go to the same page you've redirected from. This problem is known here: handleIncomingRedirect restore all query parameters but shouldn't inrupt/solid-client-authn-js#1473. Solution: Save the current url and navigate to that upon refresh.
  • Node-Solid-Server fails against the test suite due to 412 statuses
  • Problem to note: In some cases (Ask Timea for the cases) the logout button fails to load. She believes the problem is here: https://github.com/solid/solid-ui/blob/auth-upgrade/src/authn/authn.ts#L1152
  • Log in to one place and log into another see if there are problems
  • List inrupt.net and inrupt.com on login ui
  • Home page is not displaying
  • Test other panes like dokeli
    • activitystreams-pane
    • chat-pane
    • contacts-pane (There are also build problems on this one)
    • folder-pane
    • issue-pane
    • money-pane
    • source-pane
    • dokie.li (no way to deal with this outside of not using an iFrame)
  • Figure out what the types should be on the rdflib
  • Upgrade all references to authSession to things like currentUser
  • Logout from NSS problem with cookies
  • Solidweb too many redirects (Unable to replicate. This probably can be solved by clearing cookies on solidweb.org)
  • Upgrade NSS tests to work with that cookie
  • Deploy

The following libraries are linter and test fixes that should be merged in first:

Auth Upgrade includes the following libraries:

@jaxoncreed jaxoncreed self-assigned this Aug 4, 2021
@bourgeoa
Copy link
Contributor

bourgeoa commented Aug 5, 2021

@jaxoncreed Can I help. I have all access rights including nom publish.

solid/test-suite may be added to your steps ? It is used in NSS CI

I saw your PR's and tried to run solid/solidos lerna beginning step by step on https://alice.localhost:8443

How do you want me to report this ?

@jaxoncreed
Copy link
Contributor Author

@bourgeoa Reporting here is fine. I haven't completed the tests yet. They'll need to be updated for this new login.

@jeff-zucker
Copy link
Collaborator

@jaxoncreed - What's the best way to test this all? My guess - pull latest solidos, pull your newest mashlib, solid-ui, solid-logic into their respective workspaces under solidos, then build mashlib. If there's an easier or way, please let me know. :-)

@bourgeoa
Copy link
Contributor

bourgeoa commented Aug 6, 2021

@jeff-zucker

My guess - pull latest solidos, pull your newest mashlib, solid-ui, solid-logic into their respective workspaces under solidos, then build mashlib.

you must add solid-panes.
I just build all and there is one error in building solid-panes

src/dashboard/dashboardPane.ts:19:11 - error TS2339: Property 'solidAuthClient' does not exist on type '{ checkUser: <T>(setUserCallback?: ((me: NamedNode | null) => T) | undefined) => Promise<NamedNode | T | null>; currentUser: () => NamedNode | null; ... 18 more ...; authSession: any; }'.

19     authn.solidAuthClient.trackSession(async (session: SolidSession) => {
             ~~~~~~~~~~~~~~~


Found 1 error

I passed that by replacing with authn['solidAuthClient].trackSession(async (session: SolidSession) => {

Build now passes including mashlib
NSS test has 3 errors, but is running.
I'am able to log and use dataBrowser except dashbord

manager.js:506 Uncaught (in promise) TypeError: Cannot read property 'trackSession' of undefined

The above hack is not the solution

@jeff-zucker
Copy link
Collaborator

jeff-zucker commented Aug 6, 2021

With some help from @bourgeoa, I got the lerna links set and am now able to build the new versions of solid-logic and solid-ui but when I try to build solid-panes, even after the fix Alain showed above, I get these two errors :

src/index.ts:35:13 - error TS2345: Argument of type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-logic/lib/index").SolidLogic' is not assignable to parameter of type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-panes/node_modules/solid-logic/lib/index").SolidLogic'.
  The types of 'chat.profile' are incompatible between these types.
    Type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-logic/lib/profile/ProfileLogic").ProfileLogic' is not assignable to type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-panes/node_modules/solid-logic/lib/profile/ProfileLogic").ProfileLogic'.
      Types have separate declarations of a private property 'findStorage'.

35             UI.solidLogicSingleton
               ~~~~~~~~~~~~~~~~~~~~~~

src/outline/context.ts:18:7 - error TS2322: Type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-panes/node_modules/solid-logic/lib/index").SolidLogic' is not assignable to type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-logic/lib/index").SolidLogic'.
  Types of property 'store' are incompatible.
    Property 'slice' is missing in type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-panes/node_modules/solid-logic/lib/index").LiveStore' but required in type 'import("/home/jeff/Dropbox/Web/solid/solidos/workspaces/solid-logic/lib/index").LiveStore'.

18       logic
         ~~~~~

  ../solid-logic/lib/index.d.ts:23:5
    23     slice: any;
           ~~~~~
    'slice' is declared here.
  ../solid-ui/node_modules/pane-registry/index.d.ts:36:3
    36   logic: SolidLogic
         ~~~~~
    The expected type comes from property 'logic' which is declared here on type 'DataBrowserSession'


@jaxoncreed
Copy link
Contributor Author

Also note that I have not completed all the tasks yet so there will be errors.

@jeff-zucker
Copy link
Collaborator

Okay, no problem, let me know when things are ready to test or if there's errors I might be able to help track down (typescript is not my forte).

@bourgeoa
Copy link
Contributor

bourgeoa commented Aug 7, 2021

@jeff-zucker
Copy link
Collaborator

jeff-zucker commented Aug 12, 2021

I built your latest PRs and ran mashlib in Data-Kitchen. I can login to NSS. With modifications, I can read local containers and resources in the same window. More testing ahead, but looks good so far. Great work!

@jaxoncreed
Copy link
Contributor Author

Thanks @jeff-zucker . What modifications did you need?

@jeff-zucker
Copy link
Collaborator

I'll post a list of them when I'm further along. Basically, I need to have fetcher do a context-sensitive fetch so that it uses solid-client-authn-browser for http(s):// fetches and solid-rest for serverless file-system file:/// fetches. Then I need to make sure that when looking at local files we don't demand a login and use $SolidTestEnvironment.username instead (but only for file fetches) , that will allow us to get a user's local profile and preferenes from local files without calling login. Then various similar things with currentUser so that it treats local file user differently from logged in user but handles both in the same databrowser instance. I am making things as generic as possible so, for example if someone later adds a dropbox:// fetch in their app, it will be picked up and used as a context-sensitve fetch within SolidOS.

If the above doesn't make sense, or there are better ways, let me know.

@jeff-zucker
Copy link
Collaborator

@jaxoncreed - Great work, thanks! I got your mashlib working with CSS by using the config in community-server-recipes/mashlib, putting a modified version of browse.html in the CSS root folder and having it point to the location of mashilib.min.js and mash.css.

I will create another branch of Data-Kitchen with my non-server and server versions. Sorry about the mixup, I should have committed my versions two years ago when I began working on them.

Please ping me if there's anything I can do to help.

@bourgeoa
Copy link
Contributor

@jaxoncreed just updated to latest following today's meeting and noticed that :

  • logout do not really log you out until you refresh the page. (I was able to edit and save permissions using the sharing-pane after logout)
    I'm using chrome.
  • I still have solid-ui "git run test" errors ReferenceError: TextEncoder is not defined with node v16.5, v14.17 or v12.19
    I'm using windows WSL1 to build.

@jaxoncreed
Copy link
Contributor Author

@jeff-zucker Thanks for checking that out
@bourgeoa Okay. I'll look into both of those.

@bourgeoa
Copy link
Contributor

@jaxoncreed
3 non related points.

@bourgeoa
Copy link
Contributor

@jaxoncreed
I have published [email protected]. this is today's auth-upgrade branch.
Locally I still have ReferenceError: TextEncoder is not defined in solid-ui. I did not try on github.com

@jeff-zucker
Copy link
Collaborator

@jaxoncreed and @bourgeoa - I will have a few small modifications to solid-ui to accomodate Data-Kitchen. How should I submit them. As PR's against the auth-upgrade branch?

@bourgeoa
Copy link
Contributor

Sorry I don't know.

@jaxoncreed
Copy link
Contributor Author

@jeff-zucker Yeah a PR against this branch would be perfect.

@jeff-zucker
Copy link
Collaborator

jeff-zucker commented Aug 22, 2021

@jaxoncreed - When unauthorized to view a private Dokeli resource, Dokeli offers the old login/register buttons. They work! In other words, They work in the sense that they popup and redirect to the dokeli iframe and make it accessible - you see the formerly forbidden content in the iframe. But the login does not authorize you for anything but that resource. try to write in the container and I'm asked for login!

This is all with pulls from your latest auth-upgrade.

@AJamesPhillips
Copy link

AJamesPhillips commented Aug 23, 2021

Following on from this issue on solid-client-authn-js, if you're at a page (page A) in your application and log in then log out, if you then change to a different page (page B; and perhaps you get a "401 - you need to sign in") and then log in. The redirect will be to the first page (page A), not the new page (page B).

@jaxoncreed 1. I don't want to scope creep your excellent work here. 2. You may already know about this. 3. It may already be fixed as part of the work to fix the previously linked to issue.

@jaxoncreed
Copy link
Contributor Author

@AJamesPhillips Yep, I patched that issue recently. I save the URL to localstorage before doing the refresh and then restore it after the refresh.

@timea-solid
Copy link
Member

timea-solid commented Aug 24, 2021

Today I could build the latest auth branch for solid-logic, solid-ui and solid-panes. Remark: solid-logic needs to have rdflib changed to v 2.2.7 (otherwise there are build problems in ui and panes). I also found out that the code starting on line https://github.com/solid/solid-logic/blob/cdb87bca4fc06ee07f0756e9d7f0bb75e605cfff/src/index.ts#L25 with the explicit functions is not needed any more if solid-logic rdflib is upgraded to 2.2.7.
I can still confirm "ReferenceError: TextEncoder is not defined" happens on solid-ui when running test. (even with rdflib v2.2.7 in logic)

@jaxoncreed
Copy link
Contributor Author

@theRealImy I'll look into the TextEncoder problem today.

@timea-solid
Copy link
Member

A proposed 'ReferenceError: TextEncoder is not defined' solution: https://github.com/solid/solid-ui/pull/425

@jeff-zucker
Copy link
Collaborator

@jaxoncreed - I have created documentation for the changes Data-Kitchen and similar apps need in SolidOS at Using Private resources in SolidOS. There are other places in the code where I need to make similar changes to the one in dashboard pane based on the reasoning in that doc.

Note the docs use slightly different property names than the code in my PRs, I intend to fix the code to match the more sensible naming in the documentation. I'd like to chat briefly before making those changes, please ping me in the chat at your convenience.

@jaxoncreed
Copy link
Contributor Author

@jeff-zucker @bourgeoa @theRealImy Thanks for your help. I should've fixed a good number of the bugs. Let me know if you've encountered anymore.

If not, I think we can get to merging and deploying!

@jeff-zucker
Copy link
Collaborator

jeff-zucker commented Aug 27, 2021

@jaxoncreed - I really do need to talk to you about #38 (comment). Also logout of NSS is quite broken in Data Kitchen, and possibly elsewhere, please see my detailed notes.

@jeff-zucker
Copy link
Collaborator

This is after logging out and then refreshing the page :

nss-logout

@jaxoncreed
Copy link
Contributor Author

@bourgeoa okay I pushed an update to SolidUI that should fix it.

@bourgeoa
Copy link
Contributor

@jaxoncreed
No improvement exactly same problems on https://localhost:8443 multiuser
Do you want me to build the full stack on npm. It will not improve
Below is what I did.

I tried it throughfully taking all auth-upgrade branches :

  • solidos with lerna
  • npm run add
  • changed each repo to : auth-upgarde branch, followed by npm install
  • link all repos : npx lerna link --force-replace
  • checked that solid-ui your latest was linked to all repos
  • npm run build repos in order
    -- solid-ui,
    -- pane-registry, source-pane, folder-pane, meeting-pane, chat-pane, issue-pane
    -- solid-panes
    -- mashlib
    -- node-solid-server
  • run NSS as multiuser : bin/solid-test start --config-file ../config-alain.json

Nothing has improved. Same problem as before. redone twice to be sure I did not miss something

This is the config-alain.json I use :

{
  "root": "../solid/data",
  "port": "8443",
  "serverUri": "https://localhost:8443",
  "webid": true,
  "mount": "/",
  "configPath": "./config",
  "dbPath": "../solid/.db",
  "sslKey": "../solid/privkey.pem",
  "sslCert": "../solid/fullchain.pem",
  "multiuser": true,
  "corsProxy": "/proxy",
  "server": {
    "name": "",
    "description": "",
    "logo": ""
  },
  "enforceToc": true,
  "disablePasswordChecks": false,
  "tocUri": "https://your-toc",
  "supportEmail": "Your support email address"
}

@jaxoncreed
Copy link
Contributor Author

jaxoncreed commented Sep 14, 2021

@bourgeoa Huh, that's weird. I still think there might be some build problems here, as it looks like some code is missing from the mashlib.min.js deployed on https://solidcommunity.net:8443

For example, if I search for the string loginIssuer on the mashlib.min.js page (https://jackson.solidcommunity.net:8443/mashlib.min.js) there are no results. But, loginIssuer is included in the most recent code (here https://github.com/solid/solid-ui/blob/a2a92e21f273a70010e43cfebb4ea97127aee642/src/authn/authn.ts#L991 and here https://github.com/solid/solid-ui/blob/a2a92e21f273a70010e43cfebb4ea97127aee642/src/authn/authn.ts#L1248). As this is a hard-coded string, the minifier shouldn't change it, so there should be two instances of the string loginIssuer inside the deployed code. I've built mashlib locally (by running npm run build in solidos/workspaces/mashlib after linking the repos) and found two instances inside solidos/workspaces/mashlib/dist/mashlib.min.js:
image

@bourgeoa
Copy link
Contributor

@jaxoncreed as I wrote above, I did not install NSS with the mashlib build out of your new solid-ui on the test server https://solid community.net:8443

Just locally and had the same logout problem as indicated by @jeff-zucker.

@jaxoncreed
Copy link
Contributor Author

Oh sorry, I missed the fact that you did that locally.

Does your local deployment contain two instances of loginIssuer in mashlib.min.js?

@jeff-zucker
Copy link
Collaborator

@jaxoncreed, @bourgeoa. I did a git pull, npm ci, npm run build on mashlib @1.7.5-alpha-3-98ed3958 and there are zero occurrences of loginIssuer in mashlib.js.

@bourgeoa
Copy link
Contributor

@jaxoncreed Yes there are 2 instances of loginIssuer in mashlib.min.js

I also tried :

    if (isLogoutRequest(req)) {
      debug.authentication(`Logout session for ${userId} from ${origin}`)
      delete req.session.userId
      req.session.save = (done) => done()

The debug was displayed when logout
No improvement on the logout problem

@jaxoncreed
Copy link
Contributor Author

I'm having trouble recreating the bug, @bourgeoa . Could you upload the current version to the test server so I can check it out? Thanks

@bourgeoa
Copy link
Contributor

@jaxoncreed done. New version installed on https://solidcommunity.net:8443

@jeff-zucker
Copy link
Collaborator

@bourgeoa , @jaxoncreed unfortunately, same behavior on logout. I'm not sure it makes any difference, but @jaxoncreed, logout is never called from your logout button directly, it is called from the drop-down user menu of the solid-ui-header which calls _authn.authSession.logout().

@bourgeoa
Copy link
Contributor

@jaxoncreed
I remember we used to have this message when logout,

const message = Your WebID was ${me}. It has been forgotten.
https://github.com/solid/solid-ui/blob/63112618771350db0a2e4007838805fa37b84506/src/authn/authn.ts#L1187

it looks like the logout event is not received

@jaxoncreed
Copy link
Contributor Author

@jeff-zucker @bourgeoa Both of those are fine. Long story short, logout is being triggered in both instances. The alert text will display only when you use the logout button, not the dropdown (so the logout event is being received even if you don't see the alert).

It doesn't seem like the problem is in mashlib. Whenever I logout I see that the /logout route is called on NSS.
image
That means the problem must be in clearing the user from the session on NSS. And @bourgeoa you confirmed that the debug message here debug.authentication("Logout session for ${userId} from ${origin}") is being displayed right? So I'm at a loss as to what is going on. Everything is working fine on my local machine.

Is there any way I can get closer to the test server to experiment around? @bourgeoa I can send you my public key.

@SharonStrats
Copy link

SharonStrats commented Sep 18, 2021

What I think might be happening is that there is no refresh happening or it's a bit flaky in some panes when you log out. So if you are looking at a source pane file while logged in and you click log out the page/file you are looking at remains. But if you hit refresh to refresh the page you no longer can view it. I witnessed this happening the first time I clicked logout, but afterwards it seems to be refreshing the page now when I click logout. However, after clicking logout and having my pane refresh (no longer able to view my file in source pane). I was able to go to my public folder and click on sharing and I was indeed able to change the sharing. This happened right now on solidcommunity.net:8443 with a new login I created. I don't have any experience with the sharing pane, but will see if I can find it.

solid-panes/src/sharing/sharingPane.ts still researching but it doesn't call currentUser(). I don't know yet if it should, but it definitely doesn't.

@SharonStrats
Copy link

SharonStrats commented Sep 18, 2021

Okay this is my last test for today because my findings are inconsistent. Better to discuss perhaps.
These are my steps:

  1. login and go to public folder click on sharing, click on set sharing (see sharing)
  2. logout - page refreshes (see public folder with a green +)
  3. click on sharing icon again
    Findings: on my local solidos setup all auth-upgrade branches pulled (solid-ui, solid-panes, mashlib, node-solid-server) this will not show me anything besides title "Sharing for folder public" and in my console I have a 401 error requesting access control information. However, in the current copy of solidcommunity.net:8443 I see all sharing as if I am logged in and can modify it.

@bourgeoa
Copy link
Contributor

bourgeoa commented Sep 18, 2021

@jaxoncreed see my comments on gitter private

@timea-solid
Copy link
Member

timea-solid commented Sep 20, 2021

Today, I checked on the steps Sharon reported above on the test server and I get 401 as reported and ACL reading problems.
Screenshot 2021-09-20 at 11 10 50
and then I login again and get 403 and same ACL access issue.
Screenshot 2021-09-20 at 11 13 17

@bourgeoa
Copy link
Contributor

@theRealImy I went to your pod and was surprised by the result, so I went to the server to understand your results.
Your example is a bit complex using a folder with an index.ttl content, in your case contacts.
Simple example folder with a text or turtle resource would be easier.

@bourgeoa
Copy link
Contributor

@jaxoncreed

@jaxoncreed Yes there are 2 instances of loginIssuer in mashlib.min.js

I also tried :

    if (isLogoutRequest(req)) {
      debug.authentication(`Logout session for ${userId} from ${origin}`)
      delete req.session.userId
      req.session.save = (done) => done()

The debug was displayed when logout
No improvement on the logout problem

I think I misread the debug message : userId is undefined

Logout session for undefined from https://alain.localhost:8443

So your code do not do anything.
I tried to delete Session, sessions or sessionId or sessionStorage with absolutely no change.

Here is a display of req when isLogoutRequest(req) is called :

  solid:authentication <ref *2> IncomingMessage {
  solid:authentication   _readableState: ReadableState {
  solid:authentication     objectMode: false,
  solid:authentication     highWaterMark: 16384,
  solid:authentication     buffer: BufferList { head: null, tail: null, length: 0 },
  solid:authentication     length: 0,
  solid:authentication     pipes: [],
  solid:authentication     flowing: null,
  solid:authentication     ended: true,
  solid:authentication     endEmitted: false,
  solid:authentication     reading: false,
  solid:authentication     sync: true,
  solid:authentication     needReadable: false,
  solid:authentication     emittedReadable: false,
  solid:authentication     readableListening: false,
  solid:authentication     resumeScheduled: false,
  solid:authentication     errorEmitted: false,
  solid:authentication     emitClose: true,
  solid:authentication     autoDestroy: false,
  solid:authentication     destroyed: false,
  solid:authentication     errored: null,
  solid:authentication     closed: false,
  solid:authentication     closeEmitted: false,
  solid:authentication     defaultEncoding: 'utf8',
  solid:authentication     awaitDrainWriters: null,
  solid:authentication     multiAwaitDrain: false,
  solid:authentication     readingMore: true,
  solid:authentication     decoder: null,
  solid:authentication     encoding: null,
  solid:authentication     [Symbol(kPaused)]: null
  solid:authentication   },
  solid:authentication   _events: [Object: null prototype] { end: [Function: clearRequestTimeout] },
  solid:authentication   _eventsCount: 1,
  solid:authentication   _maxListeners: undefined,
  solid:authentication   socket: <ref *1> TLSSocket {
  solid:authentication     _tlsOptions: {
  solid:authentication       secureContext: [SecureContext],
  solid:authentication       isServer: true,
  solid:authentication       server: [Server],
  solid:authentication       requestCert: false,
  solid:authentication       rejectUnauthorized: false,
  solid:authentication       handshakeTimeout: 120000,
  solid:authentication       ALPNProtocols: <Buffer 08 68 74 74 70 2f 31 2e 31>,
  solid:authentication       SNICallback: [Function: SNICallback],
  solid:authentication       enableTrace: undefined,
  solid:authentication       pauseOnConnect: false,
  solid:authentication       pskCallback: undefined,
  solid:authentication       pskIdentityHint: undefined
  solid:authentication     },
  solid:authentication     _secureEstablished: true,
  solid:authentication     _securePending: false,
  solid:authentication     _newSessionPending: false,
  solid:authentication     _controlReleased: true,
  solid:authentication     secureConnecting: false,
  solid:authentication     _SNICallback: null,
  solid:authentication     servername: 'localhost',
  solid:authentication     alpnProtocol: 'http/1.1',
  solid:authentication     authorized: false,
  solid:authentication     authorizationError: null,
  solid:authentication     encrypted: true,
  solid:authentication     _events: [Object: null prototype] {
  solid:authentication       close: [Array],
  solid:authentication       end: [Array],
  solid:authentication       newListener: [Function: keylogNewListener],
  solid:authentication       secure: [Function: onServerSocketSecure],
  solid:authentication       _tlsError: [Function: onSocketTLSError],
  solid:authentication       timeout: [Function: socketOnTimeout],
  solid:authentication       data: [Function: bound socketOnData],
  solid:authentication       error: [Function: socketOnError],
  solid:authentication       drain: [Function: bound socketOnDrain],
  solid:authentication       resume: [Function: onSocketResume],
  solid:authentication       pause: [Function: onSocketPause]
  solid:authentication     },
  solid:authentication     _eventsCount: 11,
  solid:authentication     connecting: false,
  solid:authentication     _hadError: false,
  solid:authentication     _parent: Socket {
  solid:authentication       connecting: false,
  solid:authentication       _hadError: false,
  solid:authentication       _parent: null,
  solid:authentication       _host: null,
  solid:authentication       _readableState: [ReadableState],
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 3,
  solid:authentication       _maxListeners: undefined,
  solid:authentication       _writableState: [WritableState],
  solid:authentication       allowHalfOpen: false,
  solid:authentication       _sockname: null,
  solid:authentication       _pendingData: null,
  solid:authentication       _pendingEncoding: '',
  solid:authentication       server: [Server],
  solid:authentication       _server: [Server],
  solid:authentication       [Symbol(async_id_symbol)]: 1507,
  solid:authentication       [Symbol(kHandle)]: [TCP],
  solid:authentication       [Symbol(kSetNoDelay)]: false,
  solid:authentication       [Symbol(lastWriteQueueSize)]: 0,
  solid:authentication       [Symbol(timeout)]: null,
  solid:authentication       [Symbol(kBuffer)]: null,
  solid:authentication       [Symbol(kBufferCb)]: null,
  solid:authentication       [Symbol(kBufferGen)]: null,
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(kBytesRead)]: 0,
  solid:authentication       [Symbol(kBytesWritten)]: 0
  solid:authentication     },
  solid:authentication     _host: null,
  solid:authentication     _readableState: ReadableState {
  solid:authentication       objectMode: false,
  solid:authentication       highWaterMark: 16384,
  solid:authentication       buffer: BufferList { head: null, tail: null, length: 0 },
  solid:authentication       length: 0,
  solid:authentication       pipes: [],
  solid:authentication       flowing: true,
  solid:authentication       ended: false,
  solid:authentication       endEmitted: false,
  solid:authentication       reading: true,
  solid:authentication       sync: false,
  solid:authentication       needReadable: true,
  solid:authentication       emittedReadable: false,
  solid:authentication       readableListening: false,
  solid:authentication       resumeScheduled: false,
  solid:authentication       errorEmitted: false,
  solid:authentication       emitClose: false,
  solid:authentication       autoDestroy: false,
  solid:authentication       destroyed: false,
  solid:authentication       errored: null,
  solid:authentication       closed: false,
  solid:authentication       closeEmitted: false,
  solid:authentication       defaultEncoding: 'utf8',
  solid:authentication       awaitDrainWriters: null,
  solid:authentication       multiAwaitDrain: false,
  solid:authentication       readingMore: false,
  solid:authentication       decoder: null,
  solid:authentication       encoding: null,
  solid:authentication       [Symbol(kPaused)]: false
  solid:authentication     },
  solid:authentication     _maxListeners: undefined,
  solid:authentication     _writableState: WritableState {
  solid:authentication       objectMode: false,
  solid:authentication       highWaterMark: 16384,
  solid:authentication       finalCalled: false,
  solid:authentication       needDrain: false,
  solid:authentication       ending: false,
  solid:authentication       ended: false,
  solid:authentication       finished: false,
  solid:authentication       destroyed: false,
  solid:authentication       decodeStrings: false,
  solid:authentication       defaultEncoding: 'utf8',
  solid:authentication       length: 0,
  solid:authentication       writing: false,
  solid:authentication       corked: 0,
  solid:authentication       sync: false,
  solid:authentication       bufferProcessing: false,
  solid:authentication       onwrite: [Function: bound onwrite],
  solid:authentication       writecb: null,
  solid:authentication       writelen: 0,
  solid:authentication       afterWriteTickInfo: null,
  solid:authentication       buffered: [],
  solid:authentication       bufferedIndex: 0,
  solid:authentication       allBuffers: true,
  solid:authentication       allNoop: true,
  solid:authentication       pendingcb: 0,
  solid:authentication       prefinished: false,
  solid:authentication       errorEmitted: false,
  solid:authentication       emitClose: false,
  solid:authentication       autoDestroy: false,
  solid:authentication       errored: null,
  solid:authentication       closed: false,
  solid:authentication       closeEmitted: false
  solid:authentication     },
  solid:authentication     allowHalfOpen: false,
  solid:authentication     _sockname: null,
  solid:authentication     _pendingData: null,
  solid:authentication     _pendingEncoding: '',
  solid:authentication     server: Server {
  solid:authentication       _contexts: [],
  solid:authentication       requestCert: false,
  solid:authentication       rejectUnauthorized: false,
  solid:authentication       ALPNProtocols: <Buffer 08 68 74 74 70 2f 31 2e 31>,
  solid:authentication       pfx: undefined,
  solid:authentication       key: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 52 49 56 41 54 45 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 49 49 45 76 77 49 42 41 44 41 4e 42 67 6b 71 68 6b 69 47 39 77 ... 1658 more bytes>,
  solid:authentication       passphrase: undefined,
  solid:authentication       cert: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d 2d 2d 0a 4d 49 49 44 6a 54 43 43 41 6e 57 67 41 77 49 42 41 67 49 55 57 4d ... 1244 more bytes>,
  solid:authentication       clientCertEngine: undefined,
  solid:authentication       ca: undefined,
  solid:authentication       minVersion: undefined,
  solid:authentication       maxVersion: undefined,
  solid:authentication       secureProtocol: undefined,
  solid:authentication       crl: undefined,
  solid:authentication       sigalgs: undefined,
  solid:authentication       ciphers: undefined,
  solid:authentication       ecdhCurve: undefined,
  solid:authentication       dhparam: undefined,
  solid:authentication       honorCipherOrder: true,
  solid:authentication       secureOptions: undefined,
  solid:authentication       sessionIdContext: 'c272bd64f23a929c0a6f1c94bc4dbc8e',
  solid:authentication       privateKeyIdentifier: undefined,
  solid:authentication       privateKeyEngine: undefined,
  solid:authentication       _sharedCreds: [SecureContext],
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 7,
  solid:authentication       _maxListeners: undefined,
  solid:authentication       _connections: 1,
  solid:authentication       _handle: [TCP],
  solid:authentication       _usingWorkers: false,
  solid:authentication       _workers: [],
  solid:authentication       _unref: false,
  solid:authentication       allowHalfOpen: false,
  solid:authentication       pauseOnConnect: false,
  solid:authentication       httpAllowHalfOpen: false,
  solid:authentication       timeout: 0,
  solid:authentication       keepAliveTimeout: 5000,
  solid:authentication       maxHeadersCount: null,
  solid:authentication       headersTimeout: 60000,
  solid:authentication       requestTimeout: 0,
  solid:authentication       _connectionKey: '6::::8443',
  solid:authentication       [Symbol(IncomingMessage)]: [Function: IncomingMessage],
  solid:authentication       [Symbol(ServerResponse)]: [Function: ServerResponse],
  solid:authentication       [Symbol(handshake-timeout)]: 120000,
  solid:authentication       [Symbol(snicallback)]: undefined,
  solid:authentication       [Symbol(pskcallback)]: undefined,
  solid:authentication       [Symbol(pskidentityhint)]: undefined,
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(async_id_symbol)]: 10,
  solid:authentication       [Symbol(enableTrace)]: undefined
  solid:authentication     },
  solid:authentication     _server: null,
  solid:authentication     ssl: TLSWrap {
  solid:authentication       _parent: [TCP],
  solid:authentication       _parentWrap: [Socket],
  solid:authentication       _secureContext: [SecureContext],
  solid:authentication       reading: true,
  solid:authentication       onkeylog: [Function: onkeylog],
  solid:authentication       onhandshakestart: [Function: onhandshakestart],
  solid:authentication       onhandshakedone: [Function: onhandshakedone],
  solid:authentication       onclienthello: [Function: loadSession],
  solid:authentication       oncertcb: [Function: loadSNI],
  solid:authentication       onnewsession: [Function: onnewsession],
  solid:authentication       lastHandshakeTime: 1784879,
  solid:authentication       handshakes: 0,
  solid:authentication       onerror: [Function: onerror],
  solid:authentication       _consumed: true,
  solid:authentication       [Symbol(owner_symbol)]: [Circular *1]
  solid:authentication     },
  solid:authentication     _requestCert: false,
  solid:authentication     _rejectUnauthorized: false,
  solid:authentication     timeout: 0,
  solid:authentication     parser: HTTPParser {
  solid:authentication       '0': [Function: bound setRequestTimeout],
  solid:authentication       '1': [Function: parserOnHeaders],
  solid:authentication       '2': [Function: parserOnHeadersComplete],
  solid:authentication       '3': [Function: parserOnBody],
  solid:authentication       '4': [Function: parserOnMessageComplete],
  solid:authentication       '5': [Function: bound onParserExecute],
  solid:authentication       '6': [Function: bound onParserTimeout],
  solid:authentication       _headers: [],
  solid:authentication       _url: '',
  solid:authentication       socket: [Circular *1],
  solid:authentication       incoming: [Circular *2],
  solid:authentication       outgoing: null,
  solid:authentication       maxHeaderPairs: 2000,
  solid:authentication       _consumed: true,
  solid:authentication       onIncoming: [Function: bound parserOnIncoming],
  solid:authentication       [Symbol(resource_symbol)]: [HTTPServerAsyncResource]
  solid:authentication     },
  solid:authentication     on: [Function: socketListenerWrap],
  solid:authentication     addListener: [Function: socketListenerWrap],
  solid:authentication     prependListener: [Function: socketListenerWrap],
  solid:authentication     _paused: false,
  solid:authentication     _httpMessage: ServerResponse {
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 1,
  solid:authentication       _maxListeners: undefined,
  solid:authentication       outputData: [],
  solid:authentication       outputSize: 0,
  solid:authentication       writable: true,
  solid:authentication       destroyed: false,
  solid:authentication       _last: false,
  solid:authentication       chunkedEncoding: false,
  solid:authentication       shouldKeepAlive: true,
  solid:authentication       _defaultKeepAlive: true,
  solid:authentication       useChunkedEncodingByDefault: true,
  solid:authentication       sendDate: true,
  solid:authentication       _removedConnection: false,
  solid:authentication       _removedContLen: false,
  solid:authentication       _removedTE: false,
  solid:authentication       _contentLength: null,
  solid:authentication       _hasBody: true,
  solid:authentication       _trailer: '',
  solid:authentication       finished: false,
  solid:authentication       _headerSent: false,
  solid:authentication       socket: [Circular *1],
  solid:authentication       _header: null,
  solid:authentication       _keepAliveTimeout: 5000,
  solid:authentication       _onPendingData: [Function: bound updateOutgoingData],
  solid:authentication       _sent100: false,
  solid:authentication       _expect_continue: false,
  solid:authentication       req: [Circular *2],
  solid:authentication       locals: [Object: null prototype] {},
  solid:authentication       writeHead: [Function: writeHead],
  solid:authentication       end: [Function: end],
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(kNeedDrain)]: false,
  solid:authentication       [Symbol(corked)]: 0,
  solid:authentication       [Symbol(kOutHeaders)]: [Object: null prototype]
  solid:authentication     },
  solid:authentication     [Symbol(res)]: TLSWrap {
  solid:authentication       _parent: [TCP],
  solid:authentication       _parentWrap: [Socket],
  solid:authentication       _secureContext: [SecureContext],
  solid:authentication       reading: true,
  solid:authentication       onkeylog: [Function: onkeylog],
  solid:authentication       onhandshakestart: [Function: onhandshakestart],
  solid:authentication       onhandshakedone: [Function: onhandshakedone],
  solid:authentication       onclienthello: [Function: loadSession],
  solid:authentication       oncertcb: [Function: loadSNI],
  solid:authentication       onnewsession: [Function: onnewsession],
  solid:authentication       lastHandshakeTime: 1784879,
  solid:authentication       handshakes: 0,
  solid:authentication       onerror: [Function: onerror],
  solid:authentication       _consumed: true,
  solid:authentication       [Symbol(owner_symbol)]: [Circular *1]
  solid:authentication     },
  solid:authentication     [Symbol(verified)]: false,
  solid:authentication     [Symbol(pendingSession)]: null,
  solid:authentication     [Symbol(async_id_symbol)]: 1508,
  solid:authentication     [Symbol(kHandle)]: TLSWrap {
  solid:authentication       _parent: [TCP],
  solid:authentication       _parentWrap: [Socket],
  solid:authentication       _secureContext: [SecureContext],
  solid:authentication       reading: true,
  solid:authentication       onkeylog: [Function: onkeylog],
  solid:authentication       onhandshakestart: [Function: onhandshakestart],
  solid:authentication       onhandshakedone: [Function: onhandshakedone],
  solid:authentication       onclienthello: [Function: loadSession],
  solid:authentication       oncertcb: [Function: loadSNI],
  solid:authentication       onnewsession: [Function: onnewsession],
  solid:authentication       lastHandshakeTime: 1784879,
  solid:authentication       handshakes: 0,
  solid:authentication       onerror: [Function: onerror],
  solid:authentication       _consumed: true,
  solid:authentication       [Symbol(owner_symbol)]: [Circular *1]
  solid:authentication     },
  solid:authentication     [Symbol(kSetNoDelay)]: false,
  solid:authentication     [Symbol(lastWriteQueueSize)]: 0,
  solid:authentication     [Symbol(timeout)]: Timeout {
  solid:authentication       _idleTimeout: -1,
  solid:authentication       _idlePrev: null,
  solid:authentication       _idleNext: null,
  solid:authentication       _idleStart: 1784884,
  solid:authentication       _onTimeout: null,
  solid:authentication       _timerArgs: undefined,
  solid:authentication       _repeat: null,
  solid:authentication       _destroyed: true,
  solid:authentication       [Symbol(refed)]: false,
  solid:authentication       [Symbol(kHasPrimitive)]: false,
  solid:authentication       [Symbol(asyncId)]: 1521,
  solid:authentication       [Symbol(triggerId)]: 1518
  solid:authentication     },
  solid:authentication     [Symbol(kBuffer)]: null,
  solid:authentication     [Symbol(kBufferCb)]: null,
  solid:authentication     [Symbol(kBufferGen)]: null,
  solid:authentication     [Symbol(kCapture)]: false,
  solid:authentication     [Symbol(kBytesRead)]: 0,
  solid:authentication     [Symbol(kBytesWritten)]: 0,
  solid:authentication     [Symbol(error-emitted)]: false,
  solid:authentication     [Symbol(RequestTimeout)]: undefined
  solid:authentication   },
  solid:authentication   httpVersionMajor: 1,
  solid:authentication   httpVersionMinor: 1,
  solid:authentication   httpVersion: '1.1',
  solid:authentication   complete: true,
  solid:authentication   headers: {
  solid:authentication     host: 'localhost:8443',
  solid:authentication     connection: 'keep-alive',
  solid:authentication     'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
  solid:authentication     'sec-ch-ua-mobile': '?0',
  solid:authentication     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
  solid:authentication     'sec-ch-ua-platform': '"Windows"',
  solid:authentication     accept: '*/*',
  solid:authentication     origin: 'https://alain.localhost:8443',
  solid:authentication     'sec-fetch-site': 'cross-site',
  solid:authentication     'sec-fetch-mode': 'cors',
  solid:authentication     'sec-fetch-dest': 'empty',
  solid:authentication     referer: 'https://alain.localhost:8443/',
  solid:authentication     'accept-encoding': 'gzip, deflate, br',
  solid:authentication     'accept-language': 'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7'
  solid:authentication   },
  solid:authentication   rawHeaders: [
  solid:authentication     'Host',
  solid:authentication     'localhost:8443',
  solid:authentication     'Connection',
  solid:authentication     'keep-alive',
  solid:authentication     'sec-ch-ua',
  solid:authentication     '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
  solid:authentication     'sec-ch-ua-mobile',
  solid:authentication     '?0',
  solid:authentication     'User-Agent',
  solid:authentication     'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
  solid:authentication     'sec-ch-ua-platform',
  solid:authentication     '"Windows"',
  solid:authentication     'Accept',
  solid:authentication     '*/*',
  solid:authentication     'Origin',
  solid:authentication     'https://alain.localhost:8443',
  solid:authentication     'Sec-Fetch-Site',
  solid:authentication     'cross-site',
  solid:authentication     'Sec-Fetch-Mode',
  solid:authentication     'cors',
  solid:authentication     'Sec-Fetch-Dest',
  solid:authentication     'empty',
  solid:authentication     'Referer',
  solid:authentication     'https://alain.localhost:8443/',
  solid:authentication     'Accept-Encoding',
  solid:authentication     'gzip, deflate, br',
  solid:authentication     'Accept-Language',
  solid:authentication     'fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7'
  solid:authentication   ],
  solid:authentication   trailers: {},
  solid:authentication   rawTrailers: [],
  solid:authentication   aborted: false,
  solid:authentication   upgrade: false,
  solid:authentication   url: '/logout',
  solid:authentication   method: 'GET',
  solid:authentication   statusCode: null,
  solid:authentication   statusMessage: null,
  solid:authentication   client: <ref *1> TLSSocket {
  solid:authentication     _tlsOptions: {
  solid:authentication       secureContext: [SecureContext],
  solid:authentication       isServer: true,
  solid:authentication       server: [Server],
  solid:authentication       requestCert: false,
  solid:authentication       rejectUnauthorized: false,
  solid:authentication       handshakeTimeout: 120000,
  solid:authentication       ALPNProtocols: <Buffer 08 68 74 74 70 2f 31 2e 31>,
  solid:authentication       SNICallback: [Function: SNICallback],
  solid:authentication       enableTrace: undefined,
  solid:authentication       pauseOnConnect: false,
  solid:authentication       pskCallback: undefined,
  solid:authentication       pskIdentityHint: undefined
  solid:authentication     },
  solid:authentication     _secureEstablished: true,
  solid:authentication     _securePending: false,
  solid:authentication     _newSessionPending: false,
  solid:authentication     _controlReleased: true,
  solid:authentication     secureConnecting: false,
  solid:authentication     _SNICallback: null,
  solid:authentication     servername: 'localhost',
  solid:authentication     alpnProtocol: 'http/1.1',
  solid:authentication     authorized: false,
  solid:authentication     authorizationError: null,
  solid:authentication     encrypted: true,
  solid:authentication     _events: [Object: null prototype] {
  solid:authentication       close: [Array],
  solid:authentication       end: [Array],
  solid:authentication       newListener: [Function: keylogNewListener],
  solid:authentication       secure: [Function: onServerSocketSecure],
  solid:authentication       _tlsError: [Function: onSocketTLSError],
  solid:authentication       timeout: [Function: socketOnTimeout],
  solid:authentication       data: [Function: bound socketOnData],
  solid:authentication       error: [Function: socketOnError],
  solid:authentication       drain: [Function: bound socketOnDrain],
  solid:authentication       resume: [Function: onSocketResume],
  solid:authentication       pause: [Function: onSocketPause]
  solid:authentication     },
  solid:authentication     _eventsCount: 11,
  solid:authentication     connecting: false,
  solid:authentication     _hadError: false,
  solid:authentication     _parent: Socket {
  solid:authentication       connecting: false,
  solid:authentication       _hadError: false,
  solid:authentication       _parent: null,
  solid:authentication       _host: null,
  solid:authentication       _readableState: [ReadableState],
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 3,
  solid:authentication       _maxListeners: undefined,
  solid:authentication       _writableState: [WritableState],
  solid:authentication       allowHalfOpen: false,
  solid:authentication       _sockname: null,
  solid:authentication       _pendingData: null,
  solid:authentication       _pendingEncoding: '',
  solid:authentication       server: [Server],
  solid:authentication       _server: [Server],
  solid:authentication       [Symbol(async_id_symbol)]: 1507,
  solid:authentication       [Symbol(kHandle)]: [TCP],
  solid:authentication       [Symbol(kSetNoDelay)]: false,
  solid:authentication       [Symbol(lastWriteQueueSize)]: 0,
  solid:authentication       [Symbol(timeout)]: null,
  solid:authentication       [Symbol(kBuffer)]: null,
  solid:authentication       [Symbol(kBufferCb)]: null,
  solid:authentication       [Symbol(kBufferGen)]: null,
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(kBytesRead)]: 0,
  solid:authentication       [Symbol(kBytesWritten)]: 0
  solid:authentication     },
  solid:authentication     _host: null,
  solid:authentication     _readableState: ReadableState {
  solid:authentication       objectMode: false,
  solid:authentication       highWaterMark: 16384,
  solid:authentication       buffer: BufferList { head: null, tail: null, length: 0 },
  solid:authentication       length: 0,
  solid:authentication       pipes: [],
  solid:authentication       flowing: true,
  solid:authentication       ended: false,
  solid:authentication       endEmitted: false,
  solid:authentication       reading: true,
  solid:authentication       sync: false,
  solid:authentication       needReadable: true,
  solid:authentication       emittedReadable: false,
  solid:authentication       readableListening: false,
  solid:authentication       resumeScheduled: false,
  solid:authentication       errorEmitted: false,
  solid:authentication       emitClose: false,
  solid:authentication       autoDestroy: false,
  solid:authentication       destroyed: false,
  solid:authentication       errored: null,
  solid:authentication       closed: false,
  solid:authentication       closeEmitted: false,
  solid:authentication       defaultEncoding: 'utf8',
  solid:authentication       awaitDrainWriters: null,
  solid:authentication       multiAwaitDrain: false,
  solid:authentication       readingMore: false,
  solid:authentication       decoder: null,
  solid:authentication       encoding: null,
  solid:authentication       [Symbol(kPaused)]: false
  solid:authentication     },
  solid:authentication     _maxListeners: undefined,
  solid:authentication     _writableState: WritableState {
  solid:authentication       objectMode: false,
  solid:authentication       highWaterMark: 16384,
  solid:authentication       finalCalled: false,
  solid:authentication       needDrain: false,
  solid:authentication       ending: false,
  solid:authentication       ended: false,
  solid:authentication       finished: false,
  solid:authentication       destroyed: false,
  solid:authentication       decodeStrings: false,
  solid:authentication       defaultEncoding: 'utf8',
  solid:authentication       length: 0,
  solid:authentication       writing: false,
  solid:authentication       corked: 0,
  solid:authentication       sync: false,
  solid:authentication       bufferProcessing: false,
  solid:authentication       onwrite: [Function: bound onwrite],
  solid:authentication       writecb: null,
  solid:authentication       writelen: 0,
  solid:authentication       afterWriteTickInfo: null,
  solid:authentication       buffered: [],
  solid:authentication       bufferedIndex: 0,
  solid:authentication       allBuffers: true,
  solid:authentication       allNoop: true,
  solid:authentication       pendingcb: 0,
  solid:authentication       prefinished: false,
  solid:authentication       errorEmitted: false,
  solid:authentication       emitClose: false,
  solid:authentication       autoDestroy: false,
  solid:authentication       errored: null,
  solid:authentication       closed: false,
  solid:authentication       closeEmitted: false
  solid:authentication     },
  solid:authentication     allowHalfOpen: false,
  solid:authentication     _sockname: null,
  solid:authentication     _pendingData: null,
  solid:authentication     _pendingEncoding: '',
  solid:authentication     server: Server {
  solid:authentication       _contexts: [],
  solid:authentication       requestCert: false,
  solid:authentication       rejectUnauthorized: false,
  solid:authentication       ALPNProtocols: <Buffer 08 68 74 74 70 2f 31 2e 31>,
  solid:authentication       pfx: undefined,
  solid:authentication       key: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 52 49 56 41 54 45 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 49 49 45 76 77 49 42 41 44 41 4e 42 67 6b 71 68 6b 69 47 39 77 ... 1658 more bytes>,
  solid:authentication       passphrase: undefined,
  solid:authentication       cert: <Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d 2d 2d 0a 4d 49 49 44 6a 54 43 43 41 6e 57 67 41 77 49 42 41 67 49 55 57 4d ... 1244 more bytes>,
  solid:authentication       clientCertEngine: undefined,
  solid:authentication       ca: undefined,
  solid:authentication       minVersion: undefined,
  solid:authentication       maxVersion: undefined,
  solid:authentication       secureProtocol: undefined,
  solid:authentication       crl: undefined,
  solid:authentication       sigalgs: undefined,
  solid:authentication       ciphers: undefined,
  solid:authentication       ecdhCurve: undefined,
  solid:authentication       dhparam: undefined,
  solid:authentication       honorCipherOrder: true,
  solid:authentication       secureOptions: undefined,
  solid:authentication       sessionIdContext: 'c272bd64f23a929c0a6f1c94bc4dbc8e',
  solid:authentication       privateKeyIdentifier: undefined,
  solid:authentication       privateKeyEngine: undefined,
  solid:authentication       _sharedCreds: [SecureContext],
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 7,
  solid:authentication       _maxListeners: undefined,
  solid:authentication       _connections: 1,
  solid:authentication       _handle: [TCP],
  solid:authentication       _usingWorkers: false,
  solid:authentication       _workers: [],
  solid:authentication       _unref: false,
  solid:authentication       allowHalfOpen: false,
  solid:authentication       pauseOnConnect: false,
  solid:authentication       httpAllowHalfOpen: false,
  solid:authentication       timeout: 0,
  solid:authentication       keepAliveTimeout: 5000,
  solid:authentication       maxHeadersCount: null,
  solid:authentication       headersTimeout: 60000,
  solid:authentication       requestTimeout: 0,
  solid:authentication       _connectionKey: '6::::8443',
  solid:authentication       [Symbol(IncomingMessage)]: [Function: IncomingMessage],
  solid:authentication       [Symbol(ServerResponse)]: [Function: ServerResponse],
  solid:authentication       [Symbol(handshake-timeout)]: 120000,
  solid:authentication       [Symbol(snicallback)]: undefined,
  solid:authentication       [Symbol(pskcallback)]: undefined,
  solid:authentication       [Symbol(pskidentityhint)]: undefined,
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(async_id_symbol)]: 10,
  solid:authentication       [Symbol(enableTrace)]: undefined
  solid:authentication     },
  solid:authentication     _server: null,
  solid:authentication     ssl: TLSWrap {
  solid:authentication       _parent: [TCP],
  solid:authentication       _parentWrap: [Socket],
  solid:authentication       _secureContext: [SecureContext],
  solid:authentication       reading: true,
  solid:authentication       onkeylog: [Function: onkeylog],
  solid:authentication       onhandshakestart: [Function: onhandshakestart],
  solid:authentication       onhandshakedone: [Function: onhandshakedone],
  solid:authentication       onclienthello: [Function: loadSession],
  solid:authentication       oncertcb: [Function: loadSNI],
  solid:authentication       onnewsession: [Function: onnewsession],
  solid:authentication       lastHandshakeTime: 1784879,
  solid:authentication       handshakes: 0,
  solid:authentication       onerror: [Function: onerror],
  solid:authentication       _consumed: true,
  solid:authentication       [Symbol(owner_symbol)]: [Circular *1]
  solid:authentication     },
  solid:authentication     _requestCert: false,
  solid:authentication     _rejectUnauthorized: false,
  solid:authentication     timeout: 0,
  solid:authentication     parser: HTTPParser {
  solid:authentication       '0': [Function: bound setRequestTimeout],
  solid:authentication       '1': [Function: parserOnHeaders],
  solid:authentication       '2': [Function: parserOnHeadersComplete],
  solid:authentication       '3': [Function: parserOnBody],
  solid:authentication       '4': [Function: parserOnMessageComplete],
  solid:authentication       '5': [Function: bound onParserExecute],
  solid:authentication       '6': [Function: bound onParserTimeout],
  solid:authentication       _headers: [],
  solid:authentication       _url: '',
  solid:authentication       socket: [Circular *1],
  solid:authentication       incoming: [Circular *2],
  solid:authentication       outgoing: null,
  solid:authentication       maxHeaderPairs: 2000,
  solid:authentication       _consumed: true,
  solid:authentication       onIncoming: [Function: bound parserOnIncoming],
  solid:authentication       [Symbol(resource_symbol)]: [HTTPServerAsyncResource]
  solid:authentication     },
  solid:authentication     on: [Function: socketListenerWrap],
  solid:authentication     addListener: [Function: socketListenerWrap],
  solid:authentication     prependListener: [Function: socketListenerWrap],
  solid:authentication     _paused: false,
  solid:authentication     _httpMessage: ServerResponse {
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 1,
  solid:authentication       _maxListeners: undefined,
  solid:authentication       outputData: [],
  solid:authentication       outputSize: 0,
  solid:authentication       writable: true,
  solid:authentication       destroyed: false,
  solid:authentication       _last: false,
  solid:authentication       chunkedEncoding: false,
  solid:authentication       shouldKeepAlive: true,
  solid:authentication       _defaultKeepAlive: true,
  solid:authentication       useChunkedEncodingByDefault: true,
  solid:authentication       sendDate: true,
  solid:authentication       _removedConnection: false,
  solid:authentication       _removedContLen: false,
  solid:authentication       _removedTE: false,
  solid:authentication       _contentLength: null,
  solid:authentication       _hasBody: true,
  solid:authentication       _trailer: '',
  solid:authentication       finished: false,
  solid:authentication       _headerSent: false,
  solid:authentication       socket: [Circular *1],
  solid:authentication       _header: null,
  solid:authentication       _keepAliveTimeout: 5000,
  solid:authentication       _onPendingData: [Function: bound updateOutgoingData],
  solid:authentication       _sent100: false,
  solid:authentication       _expect_continue: false,
  solid:authentication       req: [Circular *2],
  solid:authentication       locals: [Object: null prototype] {},
  solid:authentication       writeHead: [Function: writeHead],
  solid:authentication       end: [Function: end],
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(kNeedDrain)]: false,
  solid:authentication       [Symbol(corked)]: 0,
  solid:authentication       [Symbol(kOutHeaders)]: [Object: null prototype]
  solid:authentication     },
  solid:authentication     [Symbol(res)]: TLSWrap {
  solid:authentication       _parent: [TCP],
  solid:authentication       _parentWrap: [Socket],
  solid:authentication       _secureContext: [SecureContext],
  solid:authentication       reading: true,
  solid:authentication       onkeylog: [Function: onkeylog],
  solid:authentication       onhandshakestart: [Function: onhandshakestart],
  solid:authentication       onhandshakedone: [Function: onhandshakedone],
  solid:authentication       onclienthello: [Function: loadSession],
  solid:authentication       oncertcb: [Function: loadSNI],
  solid:authentication       onnewsession: [Function: onnewsession],
  solid:authentication       lastHandshakeTime: 1784879,
  solid:authentication       handshakes: 0,
  solid:authentication       onerror: [Function: onerror],
  solid:authentication       _consumed: true,
  solid:authentication       [Symbol(owner_symbol)]: [Circular *1]
  solid:authentication     },
  solid:authentication     [Symbol(verified)]: false,
  solid:authentication     [Symbol(pendingSession)]: null,
  solid:authentication     [Symbol(async_id_symbol)]: 1508,
  solid:authentication     [Symbol(kHandle)]: TLSWrap {
  solid:authentication       _parent: [TCP],
  solid:authentication       _parentWrap: [Socket],
  solid:authentication       _secureContext: [SecureContext],
  solid:authentication       reading: true,
  solid:authentication       onkeylog: [Function: onkeylog],
  solid:authentication       onhandshakestart: [Function: onhandshakestart],
  solid:authentication       onhandshakedone: [Function: onhandshakedone],
  solid:authentication       onclienthello: [Function: loadSession],
  solid:authentication       oncertcb: [Function: loadSNI],
  solid:authentication       onnewsession: [Function: onnewsession],
  solid:authentication       lastHandshakeTime: 1784879,
  solid:authentication       handshakes: 0,
  solid:authentication       onerror: [Function: onerror],
  solid:authentication       _consumed: true,
  solid:authentication       [Symbol(owner_symbol)]: [Circular *1]
  solid:authentication     },
  solid:authentication     [Symbol(kSetNoDelay)]: false,
  solid:authentication     [Symbol(lastWriteQueueSize)]: 0,
  solid:authentication     [Symbol(timeout)]: Timeout {
  solid:authentication       _idleTimeout: -1,
  solid:authentication       _idlePrev: null,
  solid:authentication       _idleNext: null,
  solid:authentication       _idleStart: 1784884,
  solid:authentication       _onTimeout: null,
  solid:authentication       _timerArgs: undefined,
  solid:authentication       _repeat: null,
  solid:authentication       _destroyed: true,
  solid:authentication       [Symbol(refed)]: false,
  solid:authentication       [Symbol(kHasPrimitive)]: false,
  solid:authentication       [Symbol(asyncId)]: 1521,
  solid:authentication       [Symbol(triggerId)]: 1518
  solid:authentication     },
  solid:authentication     [Symbol(kBuffer)]: null,
  solid:authentication     [Symbol(kBufferCb)]: null,
  solid:authentication     [Symbol(kBufferGen)]: null,
  solid:authentication     [Symbol(kCapture)]: false,
  solid:authentication     [Symbol(kBytesRead)]: 0,
  solid:authentication     [Symbol(kBytesWritten)]: 0,
  solid:authentication     [Symbol(error-emitted)]: false,
  solid:authentication     [Symbol(RequestTimeout)]: undefined
  solid:authentication   },
  solid:authentication   _consuming: false,
  solid:authentication   _dumped: false,
  solid:authentication   next: [Function: next],
  solid:authentication   baseUrl: '',
  solid:authentication   originalUrl: '/logout',
  solid:authentication   _parsedUrl: Url {
  solid:authentication     protocol: null,
  solid:authentication     slashes: null,
  solid:authentication     auth: null,
  solid:authentication     host: null,
  solid:authentication     port: null,
  solid:authentication     hostname: null,
  solid:authentication     hash: null,
  solid:authentication     search: null,
  solid:authentication     query: null,
  solid:authentication     pathname: '/logout',
  solid:authentication     path: '/logout',
  solid:authentication     href: '/logout',
  solid:authentication     _raw: '/logout'
  solid:authentication   },
  solid:authentication   params: {},
  solid:authentication   query: {},
  solid:authentication   res: <ref *3> ServerResponse {
  solid:authentication     _events: [Object: null prototype] { finish: [Function: bound resOnFinish] },
  solid:authentication     _eventsCount: 1,
  solid:authentication     _maxListeners: undefined,
  solid:authentication     outputData: [],
  solid:authentication     outputSize: 0,
  solid:authentication     writable: true,
  solid:authentication     destroyed: false,
  solid:authentication     _last: false,
  solid:authentication     chunkedEncoding: false,
  solid:authentication     shouldKeepAlive: true,
  solid:authentication     _defaultKeepAlive: true,
  solid:authentication     useChunkedEncodingByDefault: true,
  solid:authentication     sendDate: true,
  solid:authentication     _removedConnection: false,
  solid:authentication     _removedContLen: false,
  solid:authentication     _removedTE: false,
  solid:authentication     _contentLength: null,
  solid:authentication     _hasBody: true,
  solid:authentication     _trailer: '',
  solid:authentication     finished: false,
  solid:authentication     _headerSent: false,
  solid:authentication     socket: <ref *1> TLSSocket {
  solid:authentication       _tlsOptions: [Object],
  solid:authentication       _secureEstablished: true,
  solid:authentication       _securePending: false,
  solid:authentication       _newSessionPending: false,
  solid:authentication       _controlReleased: true,
  solid:authentication       secureConnecting: false,
  solid:authentication       _SNICallback: null,
  solid:authentication       servername: 'localhost',
  solid:authentication       alpnProtocol: 'http/1.1',
  solid:authentication       authorized: false,
  solid:authentication       authorizationError: null,
  solid:authentication       encrypted: true,
  solid:authentication       _events: [Object: null prototype],
  solid:authentication       _eventsCount: 11,
  solid:authentication       connecting: false,
  solid:authentication       _hadError: false,
  solid:authentication       _parent: [Socket],
  solid:authentication       _host: null,
  solid:authentication       _readableState: [ReadableState],
  solid:authentication       _maxListeners: undefined,
  solid:authentication       _writableState: [WritableState],
  solid:authentication       allowHalfOpen: false,
  solid:authentication       _sockname: null,
  solid:authentication       _pendingData: null,
  solid:authentication       _pendingEncoding: '',
  solid:authentication       server: [Server],
  solid:authentication       _server: null,
  solid:authentication       ssl: [TLSWrap],
  solid:authentication       _requestCert: false,
  solid:authentication       _rejectUnauthorized: false,
  solid:authentication       timeout: 0,
  solid:authentication       parser: [HTTPParser],
  solid:authentication       on: [Function: socketListenerWrap],
  solid:authentication       addListener: [Function: socketListenerWrap],
  solid:authentication       prependListener: [Function: socketListenerWrap],
  solid:authentication       _paused: false,
  solid:authentication       _httpMessage: [Circular *3],
  solid:authentication       [Symbol(res)]: [TLSWrap],
  solid:authentication       [Symbol(verified)]: false,
  solid:authentication       [Symbol(pendingSession)]: null,
  solid:authentication       [Symbol(async_id_symbol)]: 1508,
  solid:authentication       [Symbol(kHandle)]: [TLSWrap],
  solid:authentication       [Symbol(kSetNoDelay)]: false,
  solid:authentication       [Symbol(lastWriteQueueSize)]: 0,
  solid:authentication       [Symbol(timeout)]: Timeout {
  solid:authentication         _idleTimeout: -1,
  solid:authentication         _idlePrev: null,
  solid:authentication         _idleNext: null,
  solid:authentication         _idleStart: 1784884,
  solid:authentication         _onTimeout: null,
  solid:authentication         _timerArgs: undefined,
  solid:authentication         _repeat: null,
  solid:authentication         _destroyed: true,
  solid:authentication         [Symbol(refed)]: false,
  solid:authentication         [Symbol(kHasPrimitive)]: false,
  solid:authentication         [Symbol(asyncId)]: 1521,
  solid:authentication         [Symbol(triggerId)]: 1518
  solid:authentication       },
  solid:authentication       [Symbol(kBuffer)]: null,
  solid:authentication       [Symbol(kBufferCb)]: null,
  solid:authentication       [Symbol(kBufferGen)]: null,
  solid:authentication       [Symbol(kCapture)]: false,
  solid:authentication       [Symbol(kBytesRead)]: 0,
  solid:authentication       [Symbol(kBytesWritten)]: 0,
  solid:authentication       [Symbol(error-emitted)]: false,
  solid:authentication       [Symbol(RequestTimeout)]: undefined
  solid:authentication     },
  solid:authentication     _header: null,
  solid:authentication     _keepAliveTimeout: 5000,
  solid:authentication     _onPendingData: [Function: bound updateOutgoingData],
  solid:authentication     _sent100: false,
  solid:authentication     _expect_continue: false,
  solid:authentication     req: [Circular *2],
  solid:authentication     locals: [Object: null prototype] {},
  solid:authentication     writeHead: [Function: writeHead],
  solid:authentication     end: [Function: end],
  solid:authentication     [Symbol(kCapture)]: false,
  solid:authentication     [Symbol(kNeedDrain)]: false,
  solid:authentication     [Symbol(corked)]: 0,
  solid:authentication     [Symbol(kOutHeaders)]: [Object: null prototype] {
  solid:authentication       'x-powered-by': [Array],
  solid:authentication       'access-control-allow-origin': [Array],
  solid:authentication       vary: [Array],
  solid:authentication       'access-control-allow-credentials': [Array],
  solid:authentication       'access-control-expose-headers': [Array],
  solid:authentication       allow: [Array]
  solid:authentication     }
  solid:authentication   },
  solid:authentication   _parsedOriginalUrl: Url {
  solid:authentication     protocol: null,
  solid:authentication     slashes: null,
  solid:authentication     auth: null,
  solid:authentication     host: null,
  solid:authentication     port: null,
  solid:authentication     hostname: null,
  solid:authentication     hash: null,
  solid:authentication     search: null,
  solid:authentication     query: null,
  solid:authentication     pathname: '/logout',
  solid:authentication     path: '/logout',
  solid:authentication     href: '/logout',
  solid:authentication     _raw: '/logout'
  solid:authentication   },
  solid:authentication   sessionStore: MemoryStore {
  solid:authentication     _events: [Object: null prototype] {
  solid:authentication       disconnect: [Function: ondisconnect],
  solid:authentication       connect: [Function: onconnect]
  solid:authentication     },
  solid:authentication     _eventsCount: 2,
  solid:authentication     _maxListeners: undefined,
  solid:authentication     sessions: [Object: null prototype] {
  solid:authentication       'cfg-C8UTRDQlJ3odcv_4Gk50YrGT8CGk': '{"cookie":{"originalMaxAge":86400000,"expires":"2021-09-21T13:24:41.620Z","secure":true,"httpOnly":true,"domain":null,"path":"/"},"userId":"https://alain.localhost:8443/profile/card#me","subject":{"_id":"https://alain.localhost:8443/profile/card#me"},"consentedOrigins":["https://alain.localhost:8443"]}',
  solid:authentication       iZtsr_Xj_N6YdhxLdBJ9pvDrqRqZK6SX: '{"cookie":{"originalMaxAge":86400000,"expires":"2021-09-21T13:24:42.621Z","secure":true,"httpOnly":true,"domain":null,"path":"/"},"userId":"https://alain.localhost:8443/profile/card#me"}',
  solid:authentication       lw5TItuFFMAiVnPIkB5QkpNmnxjQGaJo: '{"cookie":{"originalMaxAge":86400000,"expires":"2021-09-21T13:24:43.141Z","secure":true,"httpOnly":true,"domain":null,"path":"/"},"userId":"https://alain.localhost:8443/profile/card#me"}'
  solid:authentication     },
  solid:authentication     generate: [Function (anonymous)],
  solid:authentication     [Symbol(kCapture)]: false
  solid:authentication   },
  solid:authentication   sessionID: 'TXUf9qbLz0hWBb3z6EvVaEHuybLAeHfj',
  solid:authentication   session: Session {
  solid:authentication     cookie: {
  solid:authentication       path: '/',
  solid:authentication       _expires: 2021-09-21T13:53:55.174Z,
  solid:authentication       originalMaxAge: 86400000,
  solid:authentication       httpOnly: true,
  solid:authentication       secure: true,
  solid:authentication       domain: null
  solid:authentication     }
  solid:authentication   },
  solid:authentication   [Symbol(kCapture)]: false,
  solid:authentication   [Symbol(RequestTimeout)]: undefined
  solid:authentication } +1ms

@bourgeoa
Copy link
Contributor

@jaxoncreed
There is something weird with the cookie. He is never removed because there is not only one cookie but two cookies.

To reproduce using chrome open the dev panel and look at Application>Storage>Cookies
I can see 2 cookies and logout only delete the second cookie.

  • The first login add one cookie, but when you logout it appears for an instant a second one that is the one deleted.
  • if you login again a second cookie is created and you can really see 2 cookies. Then logout out and only that second cookie is removed.

If you manually delete the remaining cookie after logout everything is ok. The problem is resolved.

@jaxoncreed
Copy link
Contributor Author

The cookie staying around is fine. The important thing is that the UserID is deleted server side.

@bourgeoa
Copy link
Contributor

@jaxoncreed the userId is recreated before any action on the reloaded page.
Could that be the problem ?

@bourgeoa
Copy link
Contributor

bourgeoa commented Sep 21, 2021

@jaxoncreed

  1. logging with localhost:8433. The domain of the 2 cookies are : (I am on https://alain.localhost:8443)
  • localhost:8443
  • alain.localhost:8443

And when logout it is always the localhost:8443 cookie that is removed (even if I manually delete it before logout)
UserId is then recreated by looking at the domain cookie which is alain.localhost:8443, so are still logged in

  1. logging with pod.inrupt.com
    there are 5 cookies created and they are all removed with logout

  2. It looks like solid-oidc logout with dpop do not delete all related cookies. (I don't know where the remove cookies id done)

@bourgeoa
Copy link
Contributor

@jaxoncreed

I was able to fully logout following these steps :

  1. login from https://bourgeoa.solidcommunity.net:8443
  2. then logout from the same url
  3. and after set url to : https://bourgeoa.solidcommunity.net:8443/logout

Then everything is ok all cookies are deleted and you are effectively logged out.
If you try only 1. and 2. you stay logged in.

@jaxoncreed
Copy link
Contributor Author

Turns out the problem was forgetting to include the credentials option on the logout fetch. Makes sense that this only shows up in production. So, I've updated solid-ui to fix that. We should be good for logout now @bourgeoa if you want to redeploy with the newest version of solid-ui.

@bourgeoa
Copy link
Contributor

@jaxoncreed

Turns out the problem was forgetting to include the credentials option on the logout fetch. Makes sense that this only shows up in production. So, I've updated solid-ui to fix that. We should be good for logout now @bourgeoa if you want to redeploy with the newest version of solid-ui.

I don't see the PR

@jeff-zucker
Copy link
Collaborator

The official announcement of this issue on the forum :

Major updates to SolidOS, NSS, and solidcommunity.net

Please note : If you have a pod on solidcommunity.net, be sure to read the impact on users section below.

After months of work, a new SolidOS is about to be released. SolidOS, the Solid operating system, comes in four flavors :

SolidOS, in all of its flavors, provides pod navigation and management tools; semantic views of all data; productivity apps like notepads, and task-mangers; and collaboration apps like chat apps and meeting schedulers. All features have the aim of supporting the core Solid vision - user control, freedom from vendor lock-in, and re-usability of data.

This release is focused on security and it makes the code stack Solid-OIDC specification compliant. All code using solid-auth-client was replaced by code using @inrupt/solid-client-authn. The release also includes improvements to handling of Javascript, JSON-LD, and a variety of bug-fixes and UI improvements. See this list of upgrade issues for details. For reference : the releases are SolidOS v1.7.7 and NSS (Node solid-server) v5.6.12.

The release impacts users of solidcommunity.net, developers using the SolidOS software stack, and pod providers who use NSS.

Impact on users

Owners of Pods on solidcommunity.net with an index.html file located in the root of their Pod (ex: https://user.solidcommunity.net/index.html) : your first page on the Pod will change. Previously the index.html file was provisioned with a login button which will no longer work due to the authentication library upgrade. Upon release, we will be running a server script to rename all existing index.html files in the root of Pods to index_1.html. If you wish to get your index.html back, you can remove any login code and buttons from the document and then rename it back to index.html. Unfortunately, there is currently no easy way to provide a login button on a pod root index page.

Impact on developers

Developers who use the SolidOS stack (mashlib, solid-panes, solid-ui, solid-logic, rdflib) should be aware that these libraries have all switched to using Inrupt's solid-client-authn instead of solid-auth-client.

Impact on Pod providers

As mentioned above under impacts on users, index.html pages with login buttons will no longer work. You should contact us to get a script to rename these files and warn your users before installing the new NSS.

Join our team!

The changes in SolidOS, NSS, and solidcommunity.net are the work of an active open source team led by Sir Tim Berners-Lee. The open source team actively welcomes collaborators. Please
visit our project pod or our GitHub repo for more information. For any concerns, issues or suggestions chat with the SolidOS team in the gitter chatroom or create a git issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants