@knpkv/atlassian-common 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +31 -0
  3. package/dist/cli-auth/AtlassianCliAuth.d.ts +102 -0
  4. package/dist/cli-auth/AtlassianCliAuth.d.ts.map +1 -0
  5. package/dist/cli-auth/AtlassianCliAuth.js +298 -0
  6. package/dist/cli-auth/AtlassianCliAuth.js.map +1 -0
  7. package/dist/cli-auth/index.d.ts +13 -0
  8. package/dist/cli-auth/index.d.ts.map +1 -0
  9. package/dist/cli-auth/index.js +13 -0
  10. package/dist/cli-auth/index.js.map +1 -0
  11. package/dist/cli-auth/internal/NodeLayers.d.ts +5 -0
  12. package/dist/cli-auth/internal/NodeLayers.d.ts.map +1 -0
  13. package/dist/cli-auth/internal/NodeLayers.js +17 -0
  14. package/dist/cli-auth/internal/NodeLayers.js.map +1 -0
  15. package/dist/cli-auth/internal/oauthServer.d.ts +54 -0
  16. package/dist/cli-auth/internal/oauthServer.d.ts.map +1 -0
  17. package/dist/cli-auth/internal/oauthServer.js +94 -0
  18. package/dist/cli-auth/internal/oauthServer.js.map +1 -0
  19. package/dist/cli-auth/openBrowser.d.ts +16 -0
  20. package/dist/cli-auth/openBrowser.d.ts.map +1 -0
  21. package/dist/cli-auth/openBrowser.js +30 -0
  22. package/dist/cli-auth/openBrowser.js.map +1 -0
  23. package/package.json +5 -1
  24. package/src/cli-auth/AtlassianCliAuth.ts +530 -0
  25. package/src/cli-auth/index.ts +18 -0
  26. package/src/cli-auth/internal/NodeLayers.ts +25 -0
  27. package/src/cli-auth/internal/oauthServer.ts +168 -0
  28. package/src/cli-auth/openBrowser.ts +47 -0
  29. package/test/cliAuth.guardrails.test.ts +76 -0
  30. package/test/cliAuth.login.test.ts +319 -0
  31. package/test/cliAuth.oauthServer.test.ts +276 -0
  32. package/test/cliAuth.openBrowser.test.ts +70 -0
  33. package/test/cliAuth.refresh.test.ts +304 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Local HTTP callback server for OAuth2 authorization code capture.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **Scope-owned lifecycle**: {@link startCallbackServer} returns a `codePromise`
7
+ * (Deferred). The server validates the CSRF `state` parameter, resolves the
8
+ * Deferred with the authorization code, and stops when its enclosing scope closes.
9
+ * - **Port auto-discovery**: Tries default port 8585, increments on conflict up to 8594.
10
+ * - **Ready before return**: the handler is installed before the port is handed back,
11
+ * so the caller never advertises a callback URL nothing answers.
12
+ *
13
+ * @internal
14
+ */
15
+ import * as Context from "effect/Context";
16
+ import * as Deferred from "effect/Deferred";
17
+ import * as Effect from "effect/Effect";
18
+ import { HttpRouter, HttpServer, HttpServerRequest, HttpServerResponse } from "effect/http";
19
+ import * as Layer from "effect/Layer";
20
+ import { NetAddress } from "effect/net";
21
+ import * as Schema from "effect/Schema";
22
+ import * as Scope from "effect/Scope";
23
+ import { OAuthError } from "../../auth/OAuthErrors.js";
24
+ const DEFAULT_PORT = 8585;
25
+ const MAX_PORT = 8594;
26
+ export const callbackServerListenOptions = (port) => ({
27
+ host: "localhost",
28
+ port
29
+ });
30
+ export const callbackUrl = (port) => `http://localhost:${port}/callback`;
31
+ export class HttpServerFactoryTag extends Context.Service()("@knpkv/atlassian-common/cli-auth/HttpServerFactory") {
32
+ }
33
+ /** Builds a {@link HttpServerFactoryTag} layer from a per-attempt server layer. */
34
+ export const makeHttpServerFactory = (createLayerFn) => Layer.succeed(HttpServerFactoryTag, {
35
+ createServerLayer: createLayerFn
36
+ });
37
+ const AddressInUseCause = Schema.Struct({
38
+ code: Schema.Literal("EADDRINUSE")
39
+ });
40
+ const isAddressInUse = (error) => Schema.is(AddressInUseCause)(error.cause);
41
+ const page = (heading, body) => HttpServerResponse.html(`<html><body><h1>${heading}</h1><p>${body}</p></body></html>`);
42
+ /**
43
+ * Start a local HTTP server to receive the OAuth callback for `expectedState`.
44
+ *
45
+ * Fails with one `OAuthError` (step `authorize`) when no port in range can be
46
+ * bound; the server stops when the enclosing scope closes.
47
+ */
48
+ export const startCallbackServer = (expectedState) => Effect.gen(function* () {
49
+ const factory = yield* HttpServerFactoryTag;
50
+ const deferred = yield* Deferred.make();
51
+ const scope = yield* Effect.scope;
52
+ // Map to OAuthError once, outside the retry, so a run of occupied ports
53
+ // does not nest one OAuthError inside another.
54
+ const buildServer = (port) => Layer.build(factory.createServerLayer(callbackServerListenOptions(port))).pipe(Scope.provide(scope), Effect.map((context) => Context.get(context, HttpServer.HttpServer)), Effect.catchIf((error) => isAddressInUse(error) && port < MAX_PORT, () => buildServer(port + 1)));
55
+ const server = yield* buildServer(DEFAULT_PORT).pipe(Effect.mapError((cause) => new OAuthError({ step: "authorize", cause })));
56
+ if (!NetAddress.isInetAddress(server.address)) {
57
+ return yield* new OAuthError({ step: "authorize", cause: "OAuth callback server must listen on a TCP port" });
58
+ }
59
+ const port = server.address.port;
60
+ const router = yield* HttpRouter.make;
61
+ yield* router.add("GET", "/callback", Effect.gen(function* () {
62
+ const req = yield* HttpServerRequest.HttpServerRequest;
63
+ const url = new URL(req.url, callbackUrl(port));
64
+ const code = url.searchParams.get("code");
65
+ const state = url.searchParams.get("state");
66
+ const error = url.searchParams.get("error");
67
+ const errorDescription = url.searchParams.get("error_description");
68
+ if (state !== expectedState) {
69
+ return page("Security Error", "State verification failed.").pipe(HttpServerResponse.setStatus(403));
70
+ }
71
+ if (error !== null && error !== "") {
72
+ // An empty description is no description: report the error code instead.
73
+ yield* Deferred.fail(deferred, new OAuthError({
74
+ step: "authorize",
75
+ cause: errorDescription === null || errorDescription === "" ? error : errorDescription
76
+ }));
77
+ return page("Authorization Failed", "You can close this window.");
78
+ }
79
+ if (code === null || code === "") {
80
+ yield* Deferred.fail(deferred, new OAuthError({ step: "authorize", cause: "No authorization code received" }));
81
+ return page("Error", "No authorization code received.");
82
+ }
83
+ yield* Deferred.succeed(deferred, code);
84
+ return page("Success!", "You can close this window and return to the terminal.");
85
+ }));
86
+ // Installs the handler in this scope and returns; a failure to install
87
+ // surfaces here rather than leaving the caller waiting on a dead server.
88
+ yield* HttpServer.serveEffect(router.asHttpEffect()).pipe(Effect.provideService(HttpServer.HttpServer, server));
89
+ return {
90
+ codePromise: Deferred.await(deferred),
91
+ port
92
+ };
93
+ });
94
+ //# sourceMappingURL=oauthServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthServer.js","sourceRoot":"","sources":["../../../src/cli-auth/internal/oauthServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type * as PlatformError from "effect/PlatformError";
3
+ import { ChildProcessSpawner } from "effect/process";
4
+ declare const BrowserOpenError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
5
+ readonly _tag: "BrowserOpenError";
6
+ } & Readonly<A>;
7
+ /** A launcher ran but reported failure (for example `xdg-open` with no browser on a headless host). */
8
+ export declare class BrowserOpenError extends BrowserOpenError_base<{
9
+ readonly command: string;
10
+ readonly exitCode: number;
11
+ }> {
12
+ }
13
+ /** Open `url` in the user's browser. */
14
+ export declare const openBrowser: (url: string) => Effect.Effect<void, BrowserOpenError | PlatformError.PlatformError, ChildProcessSpawner.ChildProcessSpawner>;
15
+ export {};
16
+ //# sourceMappingURL=openBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openBrowser.d.ts","sourceRoot":"","sources":["../../src/cli-auth/openBrowser.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;;;;AAElE,uGAAuG;AACvG,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,CAAC;CAAG;AAoBL,wCAAwC;AACxC,eAAO,MAAM,WAAW,QACjB,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAAC,aAAa,EAAE,mBAAmB,CAAC,mBAAmB,CAI3G,CAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Cross-platform browser launcher backed by Effect child process services.
3
+ *
4
+ * Tries `open`, then `xdg-open`, then `rundll32.exe`, stopping at the first that
5
+ * exits 0. A launcher that is missing or exits non-zero falls through to the next;
6
+ * when none succeeds the last failure is reported, typed, so the caller decides
7
+ * whether a browser that never opened is fatal.
8
+ *
9
+ * @module
10
+ */
11
+ import * as Data from "effect/Data";
12
+ import * as Effect from "effect/Effect";
13
+ import { ChildProcess, ChildProcessSpawner } from "effect/process";
14
+ /** A launcher ran but reported failure (for example `xdg-open` with no browser on a headless host). */
15
+ export class BrowserOpenError extends Data.TaggedError("BrowserOpenError") {
16
+ }
17
+ const run = (command, args) => Effect.gen(function* () {
18
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
19
+ const exitCode = yield* spawner.exitCode(ChildProcess.make(command, args, {
20
+ stdin: "ignore",
21
+ stdout: "ignore",
22
+ stderr: "ignore"
23
+ }));
24
+ if (exitCode !== 0) {
25
+ return yield* new BrowserOpenError({ command, exitCode });
26
+ }
27
+ });
28
+ /** Open `url` in the user's browser. */
29
+ export const openBrowser = (url) => run("open", [url]).pipe(Effect.catch(() => run("xdg-open", [url])), Effect.catch(() => run("rundll32.exe", ["url.dll,FileProtocolHandler", url])));
30
+ //# sourceMappingURL=openBrowser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openBrowser.js","sourceRoot":"","sources":["../../src/cli-auth/openBrowser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAElE,uGAAuG;AACvG,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAGvE;CAAG;AAEL,MAAM,GAAG,GAAG,CACV,OAAe,EACf,IAA2B,EACmF,EAAE,CAChH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAA;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CACtC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;QAC/B,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;KACjB,CAAC,CACH,CAAA;IACD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,CAAC,IAAI,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAAW,EACmG,EAAE,CAChH,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACrB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC,CAC9E,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/atlassian-common",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Shared utilities for Atlassian tools (AST, serializers, auth, config)",
5
5
  "license": "MIT",
6
6
  "author": "knpkv",
@@ -42,6 +42,10 @@
42
42
  "import": "./dist/auth/index.js",
43
43
  "types": "./dist/auth/index.d.ts"
44
44
  },
45
+ "./cli-auth": {
46
+ "import": "./dist/cli-auth/index.js",
47
+ "types": "./dist/cli-auth/index.d.ts"
48
+ },
45
49
  "./config": {
46
50
  "import": "./dist/config/index.js",
47
51
  "types": "./dist/config/index.d.ts"