Merge main into proxy branch (formatting and docs)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Gregory Schier
2026-03-13 12:09:59 -07:00
parent 3c4035097a
commit 7314aedc71
712 changed files with 13408 additions and 13322 deletions

View File

@@ -1,26 +1,26 @@
import crypto from 'node:crypto';
import type { Context, GetHttpAuthenticationConfigRequest, PluginDefinition } from '@yaakapp/api';
import OAuth from 'oauth-1.0a';
import crypto from "node:crypto";
import type { Context, GetHttpAuthenticationConfigRequest, PluginDefinition } from "@yaakapp/api";
import OAuth from "oauth-1.0a";
const signatures = {
HMAC_SHA1: 'HMAC-SHA1',
HMAC_SHA256: 'HMAC-SHA256',
HMAC_SHA512: 'HMAC-SHA512',
RSA_SHA1: 'RSA-SHA1',
RSA_SHA256: 'RSA-SHA256',
RSA_SHA512: 'RSA-SHA512',
PLAINTEXT: 'PLAINTEXT',
HMAC_SHA1: "HMAC-SHA1",
HMAC_SHA256: "HMAC-SHA256",
HMAC_SHA512: "HMAC-SHA512",
RSA_SHA1: "RSA-SHA1",
RSA_SHA256: "RSA-SHA256",
RSA_SHA512: "RSA-SHA512",
PLAINTEXT: "PLAINTEXT",
} as const;
const defaultSig = signatures.HMAC_SHA1;
const pkSigs = Object.values(signatures).filter((k) => k.startsWith('RSA-'));
const pkSigs = Object.values(signatures).filter((k) => k.startsWith("RSA-"));
const nonPkSigs = Object.values(signatures).filter((k) => !pkSigs.includes(k));
type SigMethod = (typeof signatures)[keyof typeof signatures];
function hiddenIfNot(
sigMethod: SigMethod[],
...other: ((values: GetHttpAuthenticationConfigRequest['values']) => boolean)[]
...other: ((values: GetHttpAuthenticationConfigRequest["values"]) => boolean)[]
) {
return (_ctx: Context, { values }: GetHttpAuthenticationConfigRequest) => {
const hasGrantType = sigMethod.find((t) => t === String(values.signatureMethod ?? defaultSig));
@@ -32,78 +32,78 @@ function hiddenIfNot(
export const plugin: PluginDefinition = {
authentication: {
name: 'oauth1',
label: 'OAuth 1.0',
shortLabel: 'OAuth 1',
name: "oauth1",
label: "OAuth 1.0",
shortLabel: "OAuth 1",
args: [
{
type: 'banner',
color: 'info',
type: "banner",
color: "info",
inputs: [
{
type: 'markdown',
type: "markdown",
content:
'OAuth 1.0 is still in beta. Please submit any issues to [Feedback](https://yaak.app/feedback).',
"OAuth 1.0 is still in beta. Please submit any issues to [Feedback](https://yaak.app/feedback).",
},
],
},
{
name: 'signatureMethod',
label: 'Signature Method',
type: 'select',
name: "signatureMethod",
label: "Signature Method",
type: "select",
defaultValue: defaultSig,
options: Object.values(signatures).map((v) => ({ label: v, value: v })),
},
{ name: 'consumerKey', label: 'Consumer Key', type: 'text', password: true, optional: true },
{ name: "consumerKey", label: "Consumer Key", type: "text", password: true, optional: true },
{
name: 'consumerSecret',
label: 'Consumer Secret',
type: 'text',
name: "consumerSecret",
label: "Consumer Secret",
type: "text",
password: true,
optional: true,
},
{
name: 'tokenKey',
label: 'Access Token',
type: 'text',
name: "tokenKey",
label: "Access Token",
type: "text",
password: true,
optional: true,
},
{
name: 'tokenSecret',
label: 'Token Secret',
type: 'text',
name: "tokenSecret",
label: "Token Secret",
type: "text",
password: true,
optional: true,
dynamic: hiddenIfNot(nonPkSigs),
},
{
name: 'privateKey',
label: 'Private Key (RSA-SHA1)',
type: 'text',
name: "privateKey",
label: "Private Key (RSA-SHA1)",
type: "text",
multiLine: true,
optional: true,
password: true,
placeholder:
'-----BEGIN RSA PRIVATE KEY-----\nPrivate key in PEM format\n-----END RSA PRIVATE KEY-----',
"-----BEGIN RSA PRIVATE KEY-----\nPrivate key in PEM format\n-----END RSA PRIVATE KEY-----",
dynamic: hiddenIfNot(pkSigs),
},
{
type: 'accordion',
label: 'Advanced',
type: "accordion",
label: "Advanced",
inputs: [
{ name: 'callback', label: 'Callback Url', type: 'text', optional: true },
{ name: 'verifier', label: 'Verifier', type: 'text', optional: true, password: true },
{ name: 'timestamp', label: 'Timestamp', type: 'text', optional: true },
{ name: 'nonce', label: 'Nonce', type: 'text', optional: true },
{ name: "callback", label: "Callback Url", type: "text", optional: true },
{ name: "verifier", label: "Verifier", type: "text", optional: true, password: true },
{ name: "timestamp", label: "Timestamp", type: "text", optional: true },
{ name: "nonce", label: "Nonce", type: "text", optional: true },
{
name: 'version',
label: 'OAuth Version',
type: 'text',
name: "version",
label: "OAuth Version",
type: "text",
optional: true,
defaultValue: '1.0',
defaultValue: "1.0",
},
{ name: 'realm', label: 'Realm', type: 'text', optional: true },
{ name: "realm", label: "Realm", type: "text", optional: true },
],
},
],
@@ -115,12 +115,12 @@ export const plugin: PluginDefinition = {
setHeaders?: { name: string; value: string }[];
setQueryParameters?: { name: string; value: string }[];
} {
const consumerKey = String(values.consumerKey || '');
const consumerSecret = String(values.consumerSecret || '');
const consumerKey = String(values.consumerKey || "");
const consumerSecret = String(values.consumerSecret || "");
const signatureMethod = String(values.signatureMethod || signatures.HMAC_SHA1) as SigMethod;
const version = String(values.version || '1.0');
const realm = String(values.realm || '') || undefined;
const version = String(values.version || "1.0");
const realm = String(values.realm || "") || undefined;
const oauth = new OAuth({
consumer: { key: consumerKey, secret: consumerSecret },
@@ -131,13 +131,13 @@ export const plugin: PluginDefinition = {
});
if (pkSigs.includes(signatureMethod)) {
oauth.getSigningKey = (tokenSecret?: string) => tokenSecret || '';
oauth.getSigningKey = (tokenSecret?: string) => tokenSecret || "";
}
const requestUrl = new URL(url);
// Base request options passed to oauth-1.0a
const requestData: Omit<OAuth.RequestOptions, 'data'> & {
const requestData: Omit<OAuth.RequestOptions, "data"> & {
data: Record<string, string | string[]>;
} = {
method,
@@ -148,7 +148,7 @@ export const plugin: PluginDefinition = {
// (1) Include existing query params in signature base string
for (const key of requestUrl.searchParams.keys()) {
if (key.startsWith('oauth_')) continue;
if (key.startsWith("oauth_")) continue;
const all = requestUrl.searchParams.getAll(key);
const first = all[0];
if (first == null) continue;
@@ -165,8 +165,8 @@ export const plugin: PluginDefinition = {
if (pkSigs.includes(signatureMethod)) {
token = {
key: String(values.tokenKey || ''),
secret: String(values.privateKey || ''),
key: String(values.tokenKey || ""),
secret: String(values.privateKey || ""),
};
} else if (values.tokenKey && values.tokenSecret) {
token = { key: String(values.tokenKey), secret: String(values.tokenSecret) };
@@ -176,7 +176,7 @@ export const plugin: PluginDefinition = {
const authParams = oauth.authorize(requestData, token as OAuth.Token | undefined);
const { Authorization } = oauth.toHeader(authParams);
return { setHeaders: [{ name: 'Authorization', value: Authorization }] };
return { setHeaders: [{ name: "Authorization", value: Authorization }] };
},
},
};
@@ -185,26 +185,26 @@ function hashFunction(signatureMethod: SigMethod) {
switch (signatureMethod) {
case signatures.HMAC_SHA1:
return (base: string, key: string) =>
crypto.createHmac('sha1', key).update(base).digest('base64');
crypto.createHmac("sha1", key).update(base).digest("base64");
case signatures.HMAC_SHA256:
return (base: string, key: string) =>
crypto.createHmac('sha256', key).update(base).digest('base64');
crypto.createHmac("sha256", key).update(base).digest("base64");
case signatures.HMAC_SHA512:
return (base: string, key: string) =>
crypto.createHmac('sha512', key).update(base).digest('base64');
crypto.createHmac("sha512", key).update(base).digest("base64");
case signatures.RSA_SHA1:
return (base: string, privateKey: string) =>
crypto.createSign('RSA-SHA1').update(base).sign(privateKey, 'base64');
crypto.createSign("RSA-SHA1").update(base).sign(privateKey, "base64");
case signatures.RSA_SHA256:
return (base: string, privateKey: string) =>
crypto.createSign('RSA-SHA256').update(base).sign(privateKey, 'base64');
crypto.createSign("RSA-SHA256").update(base).sign(privateKey, "base64");
case signatures.RSA_SHA512:
return (base: string, privateKey: string) =>
crypto.createSign('RSA-SHA512').update(base).sign(privateKey, 'base64');
crypto.createSign("RSA-SHA512").update(base).sign(privateKey, "base64");
case signatures.PLAINTEXT:
return (base: string) => base;
default:
return (base: string, key: string) =>
crypto.createHmac('sha1', key).update(base).digest('base64');
crypto.createHmac("sha1", key).update(base).digest("base64");
}
}