mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-03-29 05:41:46 +02:00
88 lines
2.4 KiB
TypeScript
88 lines
2.4 KiB
TypeScript
import type { PluginDefinition } from '@yaakapp/api';
|
|
|
|
import { ntlm } from 'httpntlm';
|
|
|
|
export const plugin: PluginDefinition = {
|
|
authentication: {
|
|
name: 'windows',
|
|
label: 'NTLM Auth',
|
|
shortLabel: 'NTLM',
|
|
args: [
|
|
{
|
|
type: 'banner',
|
|
color: 'info',
|
|
inputs: [
|
|
{
|
|
type: 'markdown',
|
|
content:
|
|
'NTLM is still in beta. Please submit any issues to [Feedback](https://yaak.app/feedback).',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
type: 'text',
|
|
name: 'username',
|
|
label: 'Username',
|
|
optional: true,
|
|
},
|
|
{
|
|
type: 'text',
|
|
name: 'password',
|
|
label: 'Password',
|
|
optional: true,
|
|
password: true,
|
|
},
|
|
{
|
|
type: 'accordion',
|
|
label: 'Advanced',
|
|
inputs: [
|
|
{ name: 'domain', label: 'Domain', type: 'text', optional: true },
|
|
{ name: 'workstation', label: 'Workstation', type: 'text', optional: true },
|
|
],
|
|
},
|
|
],
|
|
async onApply(ctx, { values, method, url }) {
|
|
const username = values.username ? String(values.username) : undefined;
|
|
const password = values.password ? String(values.password) : undefined;
|
|
const domain = values.domain ? String(values.domain) : undefined;
|
|
const workstation = values.workstation ? String(values.workstation) : undefined;
|
|
|
|
const options = {
|
|
url,
|
|
username,
|
|
password,
|
|
workstation,
|
|
domain,
|
|
};
|
|
|
|
const type1 = ntlm.createType1Message(options);
|
|
|
|
const negotiateResponse = await ctx.httpRequest.send({
|
|
httpRequest: {
|
|
method,
|
|
url,
|
|
headers: [
|
|
{ name: 'Authorization', value: type1 },
|
|
{ name: 'Connection', value: 'keep-alive' },
|
|
],
|
|
},
|
|
});
|
|
|
|
const wwwAuthenticateHeader = negotiateResponse.headers.find(
|
|
(h) => h.name.toLowerCase() === 'www-authenticate',
|
|
);
|
|
|
|
if (!wwwAuthenticateHeader?.value) {
|
|
throw new Error('Unable to find www-authenticate response header for NTLM');
|
|
}
|
|
|
|
const type2 = ntlm.parseType2Message(wwwAuthenticateHeader.value, (err: Error | null) => {
|
|
if (err != null) throw err;
|
|
});
|
|
const type3 = ntlm.createType3Message(type2, options);
|
|
|
|
return { setHeaders: [{ name: 'Authorization', value: type3 }] };
|
|
},
|
|
},
|
|
};
|