diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..876d9ed --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,38 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch", + "type": "node", + "request": "launch", + "program": "${workspaceRoot}/src/tests/dynamicsTests.ts", + "stopOnEntry": false, + "args": [], + "cwd": "${workspaceRoot}", + "preLaunchTask": null, + "runtimeExecutable": null, + "runtimeArgs": [ + "--nolazy" + ], + "env": { + "NODE_ENV": "development" + }, + "console":"integratedTerminal", + "sourceMaps": true, + "outFiles": [ + "$(workspaceRoot)/bin/tests/dynamicsTests.js" + ] + }, + { + "name": "Attach", + "type": "node", + "request": "attach", + "port": 5858, + "address": "localhost", + "restart": false, + "sourceMaps": false, + "localRoot": "${workspaceRoot}", + "remoteRoot": null + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..2c099f5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "typescript", + "tsconfig": "tsconfig.json", + "problemMatcher": [ + "$tsc" + ], + "group": "build" + } + ] +} \ No newline at end of file diff --git a/lib/amd/more-xrm.d.ts b/lib/amd/more-xrm.d.ts index 3b5818c..6e9b01a 100644 --- a/lib/amd/more-xrm.d.ts +++ b/lib/amd/more-xrm.d.ts @@ -1,3 +1,4 @@ +/// declare module "Query/Query" { export interface DataQuery { Alias: any; @@ -20,6 +21,7 @@ declare module "Query/Query" { IsOuterJoin?: boolean; } export interface Query { + [key: string]: any; alias(attributeName: string, alias: string): Query; path(entityPath: string): Query; select(...attributeNames: string[]): Query; @@ -58,16 +60,31 @@ declare module "Query/QueryXml" { } declare module "Dynamics/DynamicsRequest" { import { Query } from "Query/Query"; - export function dynamicsQuery(query: Query, maxRowCount?: number, headers?: any): Promise; - export function dynamicsQueryUrl(dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; - export function dynamicsRequest(dynamicsEntitySetUrl: string, headers?: any): Promise; - export function dynamicsSave(entitySetName: string, data: any, id?: string, headers?: any): Promise; + export enum AuthenticationType { + Windows = 1, + OAuth = 2 + } + export class ConnectionOptions { + authType: AuthenticationType; + username?: string; + password?: string; + domain?: string; + workstation?: string; + accessToken?: string; + serverUrl: string; + webApiVersion: string; + } + export function dynamicsQuery(connectionOptions: ConnectionOptions, query: Query, maxRowCount?: number, headers?: any): Promise; + export function dynamicsQueryUrl(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; + export function dynamicsRequest(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, headers?: any): Promise; + export function dynamicsSave(connectionOptions: ConnectionOptions, entitySetName: string, data: any, id?: string, headers?: any): Promise; export function formatDynamicsResponse(data: any): any; } declare module "Dynamics/DynamicsBatch" { import { Query } from "Query/Query"; + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; export interface DynamicsBatch { - execute(): Promise; + execute(): Promise; request(query: Query, maxRowCount?: number): DynamicsBatch; requestAll(queries: Query[]): DynamicsBatch; requestAllUrls(urls: string[]): DynamicsBatch; @@ -75,14 +92,15 @@ declare module "Dynamics/DynamicsBatch" { createRelatedEntity(entitySetName: string, data: any, navigationPropertyName: string): void; }; } - export function dynamicsBatch(headers?: any): DynamicsBatch; - export function dynamicsBatchRequest(...url: string[]): Promise; - export function dynamicsBatchQuery(...query: Query[]): Promise; + export function dynamicsBatch(connectionOptions: ConnectionOptions, headers?: any): DynamicsBatch; + export function dynamicsBatchRequest(connectionOptions: ConnectionOptions, ...url: string[]): Promise; + export function dynamicsBatchQuery(connectionOptions: ConnectionOptions, ...query: Query[]): Promise; } declare module "Dynamics/Dynamics" { import { Query } from "Query/Query"; import { DynamicsBatch } from "Dynamics/DynamicsBatch"; - export const WebApiVersion = "v9.1"; + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; + export const DefaultWebApiVersion = "v9.1"; export const DefaultMaxRecords = 100; export const DynamicsHeaders: { 'OData-MaxVersion': string; @@ -99,7 +117,30 @@ declare module "Dynamics/Dynamics" { query(entityLogicalName: string, entitySetName: string): Query; save(entitySetName: string, data: any, id?: string): Promise; } - export default function dynamics(accessToken?: string): Dynamics; + export default function dynamics(connectionOptions?: ConnectionOptions): Dynamics; +} +declare module "Dynamics/Model/OrganizationMetadata" { + export interface OrganizationMetadata { + Id?: string; + UniqueName?: string; + UrlName?: string; + FriendlyName?: string; + State?: number; + Version?: string; + Uri?: string; + AppUri?: string; + LastUpdated?: Date; + } +} +declare module "Dynamics/DynamicsDiscovery" { + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; + import { OrganizationMetadata } from "Dynamics/Model/OrganizationMetadata"; + export type OrganizationMetadata = OrganizationMetadata; + export const DefaultDiscoveryApiVersion = "v9.1"; + export default function dynamicsDiscovery(connectionOptions?: ConnectionOptions): DynamicsDiscovery; + export interface DynamicsDiscovery { + discover(): Promise; + } } declare module "Dynamics/Model/EntityMetadata" { export interface EntityMetadata { @@ -144,6 +185,7 @@ declare module "Dynamics/Model/OptionSetMetadata" { } } declare module "Dynamics/DynamicsMetadata" { + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; import { AttributeMetadata, EntityAttributeMetadata, LookupAttributeMetadata } from "Dynamics/Model/AttributeMetadata"; import { EntityMetadata } from "Dynamics/Model/EntityMetadata"; import { OptionSetAttributeMetadata, OptionSetMetadata } from "Dynamics/Model/OptionSetMetadata"; @@ -152,7 +194,7 @@ declare module "Dynamics/DynamicsMetadata" { export type DynamicsOptionSetMetadata = OptionSetMetadata; export type DynamicsLookupAttributeMetadata = LookupAttributeMetadata; export type DynamicsOptionSetAttributeMetadata = OptionSetAttributeMetadata; - export default function dynamicsMetadata(accessToken?: string): DynamicsMetadata; + export default function dynamicsmetdata(connectionOptions?: ConnectionOptions): DynamicsMetadata; export function isLookupAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsLookupAttributeMetadata; export function isOptionSetAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsOptionSetAttributeMetadata; export interface DynamicsMetadata { @@ -163,6 +205,100 @@ declare module "Dynamics/DynamicsMetadata" { } type AnyAttributeMetadata = AttributeMetadata | LookupAttributeMetadata | OptionSetAttributeMetadata; } +declare module "ntlm/ntlm.flags" { + export enum NtlmFlags { + NEGOTIATE_UNICODE = 1, + NEGOTIATE_OEM = 2, + REQUEST_TARGET = 4, + NEGOTIATE_SIGN = 16, + NEGOTIATE_SEAL = 32, + NEGOTIATE_DATAGRAM_STYLE = 64, + NEGOTIATE_LM_KEY = 128, + NEGOTIATE_NETWARE = 256, + NEGOTIATE_NTLM_KEY = 512, + NEGOTIATE_ANONYMOUS = 2048, + NEGOTIATE_DOMAIN_SUPPLIED = 4096, + NEGOTIATE_WORKSTATION_SUPPLIED = 8192, + NEGOTIATE_LOCAL_CALL = 16384, + NEGOTIATE_ALWAYS_SIGN = 32768, + TARGET_TYPE_DOMAIN = 65536, + TARGET_TYPE_SERVER = 131072, + TARGET_TYPE_SHARE = 262144, + NEGOTIATE_NTLM2_KEY = 524288, + REQUEST_INIT_RESPONSE = 1048576, + REQUEST_ACCEPT_RESPONSE = 2097152, + REQUEST_NONNT_SESSION_KEY = 4194304, + NEGOTIATE_TARGET_INFO = 8388608, + NEGOTIATE_VERSION = 33554432, + NEGOTIATE_128 = 536870912, + NEGOTIATE_KEY_EXCHANGE = 1073741824, + NEGOTIATE_56 = -2147483648 + } +} +declare module "ntlm/ntlm.constants" { + export class NtlmConstants { + static readonly NTLM_SIGNATURE = "NTLMSSP\0"; + } +} +declare module "ntlm/type2.message" { + export class Type2Message { + raw: Buffer; + flags: number; + encoding: 'ascii' | 'ucs2'; + version: number; + challenge: Buffer; + targetName: string; + targetInfo: any; + constructor(buf: Buffer); + private readTargetName; + private parseTargetInfo; + } +} +declare module "ntlm/hash" { + import { Type2Message } from "ntlm/type2.message"; + export class Hash { + static createLMResponse(challenge: Buffer, lmhash: Buffer): Buffer; + static createLMHash(password: string): Buffer; + static calculateDES(key: Buffer, message: Buffer): Buffer; + static createNTLMResponse(challenge: Buffer, ntlmhash: Buffer): Buffer; + static createNTLMHash(password: string): Buffer; + static createNTLMv2Hash(ntlmhash: Buffer, username: string, authTargetName: string): Buffer; + static createLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string): Buffer; + static createNTLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createMIC(type1message: Buffer, type2message: Type2Message, type3message: Buffer, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string): Buffer; + static createRandomSessionKey(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createPseudoRandomValue(length: number): string; + static createTimestamp(): string; + } +} +declare module "ntlm/ntlm.message" { + export class NtlmMessage { + raw: Buffer; + constructor(buf: Buffer); + header(): string; + } +} +declare module "ntlm/interfaces/i.ntlm" { + import { Type2Message } from "ntlm/type2.message"; + import { NtlmMessage } from "ntlm/ntlm.message"; + export interface INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2Message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce: string | undefined, timestamp: string | undefined): NtlmMessage; + } +} +declare module "ntlm/ntlm" { + import { INtlm } from "ntlm/interfaces/i.ntlm"; + import { Type2Message } from "ntlm/type2.message"; + import { NtlmMessage } from "ntlm/ntlm.message"; + export default function ntlm(): INtlm; + export class Ntlm implements INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + private addVersionStruct; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce_override: string | undefined, timestamp_override: string | undefined): NtlmMessage; + } +} declare module "tests/dynamicsMetadataTests" { export function dynamicsMetadataRetrieveAll(): Promise; } diff --git a/lib/amd/more-xrm.js b/lib/amd/more-xrm.js index a4dc3f3..683a354 100644 --- a/lib/amd/more-xrm.js +++ b/lib/amd/more-xrm.js @@ -1,8 +1,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; @@ -77,7 +78,7 @@ define("Query/Query", ["require", "exports"], function (require, exports) { return this; } whereAny(any) { - var conditions = []; + let conditions = []; any((attributeName, operator, ...values) => { conditions.push({ AttributeName: attributeName, @@ -150,7 +151,7 @@ define("Query/QueryXml", ["require", "exports", "Query/Query"], function (requir } }); query.OrderBy.forEach(attribute => { - if (attribute.indexOf('_') == 0) { + if (attribute.indexOf('_') === 0) { xml.push(``); } else { @@ -227,16 +228,21 @@ define("Query/QueryXml", ["require", "exports", "Query/Query"], function (requir return xml.join('\n'); } function encodeValue(value) { - if (value === 0) + if (value === 0) { return '0'; - if (value === true) + } + if (value === true) { return 'true'; - if (value === false) + } + if (value === false) { return 'false'; - if (!value) + } + if (!value) { return ''; - if (typeof (value.toISOString) === 'function') + } + if (typeof (value.toISOString) === 'function') { return value.toISOString(); + } return xmlEncode(value.toString()); } function xmlEncode(text) { @@ -255,8 +261,9 @@ define("Query/QueryXml", ["require", "exports", "Query/Query"], function (requir return xmlString.replace(/\s*<[^>\/]*>[^<>]*<\/[^>]*>|\s*<.+?>|\s*[^<]+/g, //pattern to match nodes (angled brackets or text) function (m, i) { m = m.replace(/^\s+|\s+$/g, ""); //trim the match just in case - if (i < 38 && /^<[?]xml/.test(m)) - return m + "\n"; //if the match is a header, ignore it + if (i < 38 && /^<[?]xml/.test(m)) { + return m + "\n"; + } //if the match is a header, ignore it if (/^<[/]/.test(m)) //if the match is a closing tag { tabs = tabs.replace(indent, ""); //remove one indent from the store @@ -282,33 +289,54 @@ define("Query/QueryXml", ["require", "exports", "Query/Query"], function (requir }); } }); -define("Dynamics/DynamicsRequest", ["require", "exports", "Query/Query", "Query/QueryXml", "Dynamics/Dynamics"], function (require, exports, Query_2, QueryXml_1, Dynamics_1) { +define("Dynamics/DynamicsRequest", ["require", "exports", "Query/Query", "Query/QueryXml", "Dynamics/Dynamics", "httpntlm", "node-fetch"], function (require, exports, Query_2, QueryXml_1, Dynamics_1, httpntlm, node_fetch_1) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - function dynamicsQuery(query, maxRowCount, headers) { - const dataQuery = Query_2.GetRootQuery(query); - if (!dataQuery.EntityPath) { - throw new Error('dynamicsQuery requires a Query object with an EntityPath'); + var AuthenticationType; + (function (AuthenticationType) { + AuthenticationType[AuthenticationType["Windows"] = 1] = "Windows"; + AuthenticationType[AuthenticationType["OAuth"] = 2] = "OAuth"; + })(AuthenticationType = exports.AuthenticationType || (exports.AuthenticationType = {})); + class ConnectionOptions { + constructor() { + this.authType = AuthenticationType.OAuth; + this.serverUrl = ""; + this.webApiVersion = Dynamics_1.DefaultWebApiVersion; } - return dynamicsQueryUrl(`/api/data/${Dynamics_1.WebApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + } + exports.ConnectionOptions = ConnectionOptions; + function dynamicsQuery(connectionOptions, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const dataQuery = Query_2.GetRootQuery(query); + if (!dataQuery.EntityPath) { + throw new Error('dynamicsQuery requires a Query object with an EntityPath'); + } + return yield dynamicsQueryUrl(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + }); } exports.dynamicsQuery = dynamicsQuery; - function dynamicsQueryUrl(dynamicsEntitySetUrl, query, maxRowCount, headers) { - const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); - return request(`${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(QueryXml_1.default(query, maxRowCount))}`, 'GET', undefined, headers); + function dynamicsQueryUrl(connectionOptions, dynamicsEntitySetUrl, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); + return yield request(connectionOptions, `${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(QueryXml_1.default(query, maxRowCount))}`, 'GET', undefined, headers); + }); } exports.dynamicsQueryUrl = dynamicsQueryUrl; - function dynamicsRequest(dynamicsEntitySetUrl, headers) { - return request(dynamicsEntitySetUrl, 'GET', undefined, headers); + function dynamicsRequest(connectionOptions, dynamicsEntitySetUrl, headers) { + return __awaiter(this, void 0, void 0, function* () { + return yield request(connectionOptions, dynamicsEntitySetUrl, 'GET', undefined, headers); + }); } exports.dynamicsRequest = dynamicsRequest; - function dynamicsSave(entitySetName, data, id, headers) { - if (id) { - return request(`/api/data/${Dynamics_1.WebApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); - } - else { - return request(`/api/data/${Dynamics_1.WebApiVersion}/${entitySetName}()`, 'POST', data, headers); - } + function dynamicsSave(connectionOptions, entitySetName, data, id, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (id) { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); + } + else { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}()`, 'POST', data, headers); + } + }); } exports.dynamicsSave = dynamicsSave; function formatDynamicsResponse(data) { @@ -324,10 +352,10 @@ define("Dynamics/DynamicsRequest", ["require", "exports", "Query/Query", "Query/ } if (data) { for (var item of data) { - var row = {}; - for (var key in item) { + let row = {}; + for (let key in item) { var name = key; - if (name.indexOf('@odata') == 0) { + if (name.indexOf('@odata') === 0) { continue; } if (name.indexOf('transactioncurrencyid') > -1) { @@ -335,12 +363,12 @@ define("Dynamics/DynamicsRequest", ["require", "exports", "Query/Query", "Query/ } if (name.indexOf('@') > -1) { name = name.substring(0, name.indexOf('@')); - if (name.indexOf('_') == 0) { + if (name.indexOf('_') === 0) { name = name.slice(1, -6); } name += "_formatted"; } - else if (name.indexOf('_') == 0) { + else if (name.indexOf('_') === 0) { name = name.slice(1, -6); } if (name.indexOf('_x002e_') > -1) { @@ -361,55 +389,99 @@ define("Dynamics/DynamicsRequest", ["require", "exports", "Query/Query", "Query/ return items; } exports.formatDynamicsResponse = formatDynamicsResponse; - function request(url, method, body, headers) { - return fetch(url, { - method: method, - headers: Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders, headers), - body: body - }) - .then(response => response.json()) - .then(data => formatDynamicsResponse(data)); + function request(connectionOptions, url, method, body, headers) { + return __awaiter(this, void 0, void 0, function* () { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; + //TODO: fetch if we can. + if (connectionOptions.authType === AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm[method.toLowerCase()]({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: body, + headers: Object.assign(Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + const json = JSON.parse(res.body); + if (json.error) { + console.error(json.error.message); + reject(json.error.message); + } + else if (json.ExceptionMessage) { + console.error(json.ExceptionMessage); + reject(`The service call returned HTTP ${json.ErrorCode} - ${json.ExceptionMessage}`); + } + else { + resolve(formatDynamicsResponse(json)); + } + }); + }); + } + else { + return node_fetch_1.default(url, { + method: method, + headers: Object.assign(Object.assign({ 'Authorization': `Bearer ${connectionOptions.accessToken}`, 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders), headers), + body: body + }) + .then(response => response.json()) + .then(data => formatDynamicsResponse(data)); + } + }); } function trimId(id) { return (id || '').replace(/{|}/g, ''); } }); -define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/QueryXml", "Dynamics/Dynamics", "Dynamics/DynamicsRequest"], function (require, exports, Query_3, QueryXml_2, Dynamics_2, DynamicsRequest_1) { +define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/QueryXml", "Dynamics/Dynamics", "Dynamics/DynamicsRequest", "httpntlm", "node-fetch"], function (require, exports, Query_3, QueryXml_2, Dynamics_2, DynamicsRequest_1, httpntlm, node_fetch_2) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - function dynamicsBatch(headers) { - return new Batch(headers); + function dynamicsBatch(connectionOptions, headers) { + return new Batch(connectionOptions, headers); } exports.dynamicsBatch = dynamicsBatch; - function dynamicsBatchRequest(...url) { - const batch = new Batch(); + function dynamicsBatchRequest(connectionOptions, ...url) { + const batch = new Batch(connectionOptions); batch.requestAllUrls(url); return batch.execute(); } exports.dynamicsBatchRequest = dynamicsBatchRequest; - function dynamicsBatchQuery(...query) { - const batch = new Batch(); + function dynamicsBatchQuery(connectionOptions, ...query) { + const batch = new Batch(connectionOptions); batch.requestAll(query); return batch.execute(); } exports.dynamicsBatchQuery = dynamicsBatchQuery; class Batch { - constructor(headers) { + constructor(options, headers) { + this.options = options; this.headers = headers; + this.ConnectionOptions = options; this.Changes = []; this.RelatedChanges = []; } execute() { return __awaiter(this, void 0, void 0, function* () { - const results = yield Batch.requestBatch(`/api/data/${Dynamics_2.WebApiVersion}/$batch`, this.Changes, this.headers); + const results = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.Changes, this.headers); if (this.RelatedChanges.length > 0) { for (let change of this.RelatedChanges) { - let changeIndex = this.Changes.indexOf(change.relatedChange); - let relatedId = results[changeIndex]; - change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + if (change !== undefined && change.relatedChange) { + let changeIndex = this.Changes.indexOf(change.relatedChange); + let relatedId = results !== undefined ? results[changeIndex] : undefined; + change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + } } - const related = yield Batch.requestBatch(`/api/data/${Dynamics_2.WebApiVersion}/$batch`, this.RelatedChanges, this.headers); - return results.concat(related); + const related = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.RelatedChanges, this.headers); + return results !== undefined ? results.concat(related) : undefined; } else { return results; @@ -460,8 +532,9 @@ define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/Qu } createRelatedEntity(entitySetName, data, navigationPropertyName) { let lastChange = this.Changes[this.Changes.length - 1]; - if (!lastChange || lastChange.entityData == 'DELETE') + if (!lastChange || lastChange.entityData === 'DELETE') { throw new Error('createRelatedEntity relies on the previous change which was not found in the batch.'); + } if (lastChange.entityId) { data[`${navigationPropertyName}@odata.bind`] = `${lastChange.entitySetName}(${lastChange.entityId})`; this.Changes.push({ @@ -478,16 +551,42 @@ define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/Qu }); } } - static requestBatch(url, requests, headers) { + static requestBatch(connectionOptions, url, requests, headers) { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; const batchId = Batch.createId(); - return fetch(url, { - method: 'POST', - headers: Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, Dynamics_2.DynamicsHeaders, headers), - body: Batch.formatBatchRequest(batchId, requests) - }) - .then(response => Batch.formatBatchResponse(response.text())); - } - static formatBatchRequest(batchId, changes) { + if (connectionOptions.authType === DynamicsRequest_1.AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm.post({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: Batch.formatBatchRequest(connectionOptions, batchId, requests), + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, Dynamics_2.DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + resolve(Batch.formatBatchResponse(res.responseText)); + }); + }); + } + else { + return node_fetch_2.default(callUrl, { + method: 'POST', + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, 'Authorization': connectionOptions.accessToken }, Dynamics_2.DynamicsHeaders), headers), + body: Batch.formatBatchRequest(connectionOptions, batchId, requests) + }) + .then(response => Batch.formatBatchResponse(response.text())); + } + } + static formatBatchRequest(connectionOptions, batchId, changes) { let batchBody = []; let requestBody = []; let changeNumber = 1; @@ -502,7 +601,7 @@ define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/Qu requestBody.push('Content-Transfer-Encoding:binary'); requestBody.push(''); if (change.entitySetName) { - requestBody.push(`GET ${encodeURI(`/api/data/${Dynamics_2.WebApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); + requestBody.push(`GET ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); } else { requestBody.push(`GET ${encodeURI(change.entitySetQuery)} HTTP/1.1`); @@ -517,7 +616,7 @@ define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/Qu batchBody.push('Content-Transfer-Encoding:binary'); batchBody.push(`Content-ID: ${changeNumber++}`); batchBody.push(''); - batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${Dynamics_2.WebApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); + batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); batchBody.push('Content-Type: application/json;type=entry'); batchBody.push(''); batchBody.push(JSON.stringify(change.entityData)); @@ -563,38 +662,41 @@ define("Dynamics/DynamicsBatch", ["require", "exports", "Query/Query", "Query/Qu return 'id' + Math.random().toString(16).slice(2); } static trimId(id) { - return (id || '').replace(/{|}/g, ''); + if (id !== undefined) { + return (id || '').replace(/{|}/g, ''); + } + return undefined; } } }); define("Dynamics/Dynamics", ["require", "exports", "Query/Query", "Dynamics/DynamicsBatch", "Dynamics/DynamicsRequest"], function (require, exports, Query_4, DynamicsBatch_1, DynamicsRequest_2) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - exports.WebApiVersion = 'v9.1'; + exports.DefaultWebApiVersion = 'v9.1'; exports.DefaultMaxRecords = 100; exports.DynamicsHeaders = { 'OData-MaxVersion': '4.0', 'OData-Version': '4.0', 'Prefer': 'odata.include-annotations=OData.Community.Display.V1.FormattedValue' }; - function dynamics(accessToken) { - return new DynamicsClient(accessToken); + function dynamics(connectionOptions) { + return new DynamicsClient(connectionOptions); } exports.default = dynamics; class DynamicsClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } batch() { - return DynamicsBatch_1.dynamicsBatch(this.dynamicsHeaders); + return DynamicsBatch_1.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders); } fetch(query, maxRowCount = exports.DefaultMaxRecords) { - return DynamicsRequest_2.dynamicsQuery(query, maxRowCount, this.dynamicsHeaders); + return DynamicsRequest_2.dynamicsQuery(this.connectionOptions, query, maxRowCount, this.dynamicsHeaders); } optionset(entityName, attributeName) { - return DynamicsRequest_2.dynamicsRequest(`/api/data/${exports.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) + return DynamicsRequest_2.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) .then(attribute => (attribute.OptionSet || attribute.GlobalOptionSet).Options.map((option) => ({ label: (option.Label && option.Label.UserLocalizedLabel && option.Label.UserLocalizedLabel.Label), value: option.Value @@ -604,7 +706,33 @@ define("Dynamics/Dynamics", ["require", "exports", "Query/Query", "Dynamics/Dyna return Query_4.default(entityLogicalName).path(entitySetName); } save(entitySetName, data, id) { - return DynamicsRequest_2.dynamicsSave(entitySetName, data, id, this.dynamicsHeaders); + return DynamicsRequest_2.dynamicsSave(this.connectionOptions, entitySetName, data, id, this.dynamicsHeaders); + } + } +}); +define("Dynamics/Model/OrganizationMetadata", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); +}); +define("Dynamics/DynamicsDiscovery", ["require", "exports", "Dynamics/DynamicsRequest"], function (require, exports, DynamicsRequest_3) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DefaultDiscoveryApiVersion = 'v9.1'; + function dynamicsDiscovery(connectionOptions) { + return new DynamicsDiscoveryClient(connectionOptions); + } + exports.default = dynamicsDiscovery; + class DynamicsDiscoveryClient { + constructor(options) { + if (options) { + this.connectionOptions = options; + if (!options.webApiVersion) { + this.connectionOptions.webApiVersion = exports.DefaultDiscoveryApiVersion; + } + } + } + discover() { + return DynamicsRequest_3.dynamicsRequest(this.connectionOptions, `/api/discovery/${this.connectionOptions.webApiVersion}/Instances`, this.dynamicsHeaders); } } }); @@ -637,13 +765,13 @@ define("Dynamics/Model/OptionSetMetadata", ["require", "exports"], function (req "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); }); -define("Dynamics/DynamicsMetadata", ["require", "exports", "Dynamics/Dynamics", "Dynamics/DynamicsBatch", "Dynamics/DynamicsRequest"], function (require, exports, Dynamics_3, DynamicsBatch_2, DynamicsRequest_3) { +define("Dynamics/DynamicsMetadata", ["require", "exports", "Dynamics/DynamicsBatch", "Dynamics/DynamicsRequest"], function (require, exports, DynamicsBatch_2, DynamicsRequest_4) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - function dynamicsMetadata(accessToken) { - return new DynamicsMetadataClient(accessToken); + function dynamicsmetdata(connectionOptions) { + return new DynamicsMetadataClient(connectionOptions); } - exports.default = dynamicsMetadata; + exports.default = dynamicsmetdata; function isLookupAttribute(attribute) { return attribute.Type === 'Lookup' && attribute['LookupEntityName']; } @@ -687,31 +815,31 @@ define("Dynamics/DynamicsMetadata", ["require", "exports", "Dynamics/Dynamics", 'entityimage_timestamp' ]; class DynamicsMetadataClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } attributes(entityName) { - return DynamicsBatch_2.dynamicsBatch(this.dynamicsHeaders) + return DynamicsBatch_2.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.getMetadataUrls(entityName, false)) .execute() .then(data => this.flatten(data) - .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') != attribute.LogicalName.length - 4) + .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') !== attribute.LogicalName.length - 4) .map(DynamicsMetadataMapper.MapAttribute)); } entities() { - return DynamicsRequest_3.dynamicsRequest(`/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return DynamicsRequest_4.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(data => data .map(entity => DynamicsMetadataMapper.MapEntity(entity))); } entity(entityName) { - return DynamicsRequest_3.dynamicsRequest(`/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return DynamicsRequest_4.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(entity => this.attributes(entityName) .then(attributes => DynamicsMetadataMapper.MapEntity(entity, attributes))); } entityAttributes(...entityNames) { - return DynamicsBatch_2.dynamicsBatch(this.dynamicsHeaders) + return DynamicsBatch_2.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.flatten(entityNames.map(e => this.getMetadataUrls(e, true)))) .execute() .then(data => { @@ -723,7 +851,7 @@ define("Dynamics/DynamicsMetadata", ["require", "exports", "Dynamics/Dynamics", currentEntity = DynamicsMetadataMapper.MapEntity(item); entities.push(currentEntity); } - else if (item.LogicalName.indexOf('yomi') == -1 && item.LogicalName.indexOf('base') != item.LogicalName.length - 4) { + else if (item.LogicalName.indexOf('yomi') === -1 && item.LogicalName.indexOf('base') !== item.LogicalName.length - 4) { currentEntity.Attributes.push(DynamicsMetadataMapper.MapAttribute(item)); } } @@ -734,12 +862,12 @@ define("Dynamics/DynamicsMetadata", ["require", "exports", "Dynamics/Dynamics", const attributeTypeFilter = ExcludedAttributeTypeFilters.map(v => `AttributeType ne Microsoft.Dynamics.CRM.AttributeTypeCode'${v}'`).join(' and '); const attributeNameFilter = ExcludedAttributeNameFilters.map(v => `LogicalName ne '${v}'`).join(' and '); return [ - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` ].slice(includeEntity ? 0 : 1); } flatten(values) { @@ -783,6 +911,632 @@ define("Dynamics/DynamicsMetadata", ["require", "exports", "Dynamics/Dynamics", return attribute['OptionSet'] && Array.isArray(attribute['OptionSet'].Options); } }); +define("ntlm/ntlm.flags", ["require", "exports"], function (require, exports) { + 'use strict'; + Object.defineProperty(exports, "__esModule", { value: true }); + var NtlmFlags; + (function (NtlmFlags) { + /* Indicates that Unicode strings are supported for use in security buffer + data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_UNICODE"] = 1] = "NEGOTIATE_UNICODE"; + /* Indicates that OEM strings are supported for use in security buffer data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_OEM"] = 2] = "NEGOTIATE_OEM"; + /* Requests that the server's authentication realm be included in the Type 2 + message. */ + NtlmFlags[NtlmFlags["REQUEST_TARGET"] = 4] = "REQUEST_TARGET"; + /* unknown (1<<3) */ + /* Specifies that authenticated communication between the client and server + should carry a digital signature (message integrity). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SIGN"] = 16] = "NEGOTIATE_SIGN"; + /* Specifies that authenticated communication between the client and server + should be encrypted (message confidentiality). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SEAL"] = 32] = "NEGOTIATE_SEAL"; + /* Indicates that datagram authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DATAGRAM_STYLE"] = 64] = "NEGOTIATE_DATAGRAM_STYLE"; + /* Indicates that the LAN Manager session key should be used for signing and + sealing authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LM_KEY"] = 128] = "NEGOTIATE_LM_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["NEGOTIATE_NETWARE"] = 256] = "NEGOTIATE_NETWARE"; + /* Indicates that NTLM authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM_KEY"] = 512] = "NEGOTIATE_NTLM_KEY"; + /* unknown (1<<10) */ + /* Sent by the client in the Type 3 message to indicate that an anonymous + context has been established. This also affects the response fields. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ANONYMOUS"] = 2048] = "NEGOTIATE_ANONYMOUS"; + /* Sent by the client in the Type 1 message to indicate that a desired + authentication realm is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DOMAIN_SUPPLIED"] = 4096] = "NEGOTIATE_DOMAIN_SUPPLIED"; + /* Sent by the client in the Type 1 message to indicate that the client + workstation's name is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_WORKSTATION_SUPPLIED"] = 8192] = "NEGOTIATE_WORKSTATION_SUPPLIED"; + /* Sent by the server to indicate that the server and client are on the same + machine. Implies that the client may use a pre-established local security + context rather than responding to the challenge. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LOCAL_CALL"] = 16384] = "NEGOTIATE_LOCAL_CALL"; + /* Indicates that authenticated communication between the client and server + should be signed with a "dummy" signature. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ALWAYS_SIGN"] = 32768] = "NEGOTIATE_ALWAYS_SIGN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a domain. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_DOMAIN"] = 65536] = "TARGET_TYPE_DOMAIN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a server. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SERVER"] = 131072] = "TARGET_TYPE_SERVER"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a share. Presumably, this is for share-level + authentication. Usage is unclear. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SHARE"] = 262144] = "TARGET_TYPE_SHARE"; + /* Indicates that the NTLM2 signing and sealing scheme should be used for + protecting authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM2_KEY"] = 524288] = "NEGOTIATE_NTLM2_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_INIT_RESPONSE"] = 1048576] = "REQUEST_INIT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_ACCEPT_RESPONSE"] = 2097152] = "REQUEST_ACCEPT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_NONNT_SESSION_KEY"] = 4194304] = "REQUEST_NONNT_SESSION_KEY"; + /* Sent by the client in the Type 1 message to request Target info block from server. + Sent by the server in the Type 2 message to indicate that it is including a + Target Information block in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_TARGET_INFO"] = 8388608] = "NEGOTIATE_TARGET_INFO"; + /* unknown (1<24) */ + /* Indicates that the version info block is included in the message */ + NtlmFlags[NtlmFlags["NEGOTIATE_VERSION"] = 33554432] = "NEGOTIATE_VERSION"; + /* unknown (1<26) */ + /* unknown (1<27) */ + /* unknown (1<28) */ + /* Indicates that 128-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_128"] = 536870912] = "NEGOTIATE_128"; + /* Indicates that the client will provide an encrypted master key in + the "Session Key" field of the Type 3 message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_KEY_EXCHANGE"] = 1073741824] = "NEGOTIATE_KEY_EXCHANGE"; + /* Indicates that 56-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_56"] = -2147483648] = "NEGOTIATE_56"; + })(NtlmFlags = exports.NtlmFlags || (exports.NtlmFlags = {})); +}); +define("ntlm/ntlm.constants", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + class NtlmConstants { + } + exports.NtlmConstants = NtlmConstants; + NtlmConstants.NTLM_SIGNATURE = 'NTLMSSP\0'; +}); +define("ntlm/type2.message", ["require", "exports", "ntlm/ntlm.flags", "ntlm/ntlm.constants"], function (require, exports, ntlm_flags_1, ntlm_constants_1) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + class Type2Message { + constructor(buf) { + this.raw = buf; + //check signature + if (buf.toString('ascii', 0, ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length) !== ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE) { + throw new Error('Invalid message signature'); + } + //check message type + if (buf.readUInt32LE(ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length) !== 2) { + throw new Error('Invalid message type (no type 2)'); + } + //read flags + this.flags = buf.readUInt32LE(20); + this.encoding = (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_OEM) ? 'ascii' : 'ucs2'; + this.version = (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_NTLM2_KEY) ? 2 : 1; + this.challenge = buf.slice(24, 32); + //read target name + this.targetName = this.readTargetName(); + //read target info + if (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_TARGET_INFO) { + this.targetInfo = this.parseTargetInfo(); + } + } + readTargetName() { + let length = this.raw.readUInt16LE(12); + //skipping allocated space + let offset = this.raw.readUInt32LE(16); + if (length === 0) { + return ''; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + return this.raw.toString(this.encoding, offset, offset + length); + } + parseTargetInfo() { + let info = {}; + let length = this.raw.readUInt16LE(40); + //skipping allocated space + let offset = this.raw.readUInt32LE(44); + let targetInfoBuffer = Buffer.alloc(length); + this.raw.copy(targetInfoBuffer, 0, offset, offset + length); + if (length === 0) { + return info; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + let pos = offset; + while (pos < (offset + length)) { + let blockType = this.raw.readUInt16LE(pos); + pos += 2; + let blockLength = this.raw.readUInt16LE(pos); + pos += 2; + if (blockType === 0) { + //reached the terminator subblock + break; + } + let blockTypeStr; + let blockTypeOutput = 'string'; + switch (blockType) { + case 0x01: + blockTypeStr = 'SERVER'; + break; + case 0x02: + blockTypeStr = 'DOMAIN'; + break; + case 0x03: + blockTypeStr = 'FQDN'; + break; + case 0x04: + blockTypeStr = 'DNS'; + break; + case 0x05: + blockTypeStr = 'PARENT_DNS'; + break; + case 0x06: + blockTypeStr = 'FLAGS'; + blockTypeOutput = 'hex'; + break; + case 0x07: + blockTypeStr = 'SERVER_TIMESTAMP'; + blockTypeOutput = 'hex'; + break; + case 0x08: + blockTypeStr = 'SINGLE_HOST'; + blockTypeOutput = 'hex'; + break; + case 0x09: + blockTypeStr = 'TARGET_NAME'; + break; + case 0x0A: + blockTypeStr = 'CHANNEL_BINDING'; + blockTypeOutput = 'hex'; + break; + default: + blockTypeStr = ''; + break; + } + if (blockTypeStr) { + if (blockTypeOutput === 'string') { + info[blockTypeStr] = this.raw.toString('ucs2', pos, pos + blockLength); + } + else { + // Output as hex in little endian order + let twoCharBlocks = this.raw.toString('hex', pos, pos + blockLength).match(/.{2}/g); + if (twoCharBlocks) { + info[blockTypeStr] = twoCharBlocks.reverse().join(""); + } + else { + info[blockTypeStr] = null; + } + } + } + pos += blockLength; + } + return { + parsed: info, + buffer: targetInfoBuffer + }; + } + } + exports.Type2Message = Type2Message; +}); +define("ntlm/hash", ["require", "exports", "crypto"], function (require, exports, crypto) { + 'use strict'; + Object.defineProperty(exports, "__esModule", { value: true }); + class Hash { + static createLMResponse(challenge, lmhash) { + let buf = Buffer.alloc(24); + let pwBuffer = Buffer.alloc(21).fill(0); + lmhash.copy(pwBuffer); + Hash.calculateDES(pwBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(pwBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(pwBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createLMHash(password) { + let buf = Buffer.alloc(16), pwBuffer = Buffer.alloc(14), magicKey = Buffer.from('KGS!@#$%', 'ascii'); + if (password.length > 14) { + buf.fill(0); + return buf; + } + pwBuffer.fill(0); + pwBuffer.write(password.toUpperCase(), 0, 'ascii'); + return Buffer.concat([ + Hash.calculateDES(pwBuffer.slice(0, 7), magicKey), + Hash.calculateDES(pwBuffer.slice(7), magicKey) + ]); + } + static calculateDES(key, message) { + let desKey = Buffer.alloc(8); + desKey[0] = key[0] & 0xFE; + desKey[1] = ((key[0] << 7) & 0xFF) | (key[1] >> 1); + desKey[2] = ((key[1] << 6) & 0xFF) | (key[2] >> 2); + desKey[3] = ((key[2] << 5) & 0xFF) | (key[3] >> 3); + desKey[4] = ((key[3] << 4) & 0xFF) | (key[4] >> 4); + desKey[5] = ((key[4] << 3) & 0xFF) | (key[5] >> 5); + desKey[6] = ((key[5] << 2) & 0xFF) | (key[6] >> 6); + desKey[7] = (key[6] << 1) & 0xFF; + for (let i = 0; i < 8; i++) { + let parity = 0; + for (let j = 1; j < 8; j++) { + parity += (desKey[i] >> j) % 2; + } + desKey[i] |= (parity % 2) === 0 ? 1 : 0; + } + let des = crypto.createCipheriv('DES-ECB', desKey, ''); + return des.update(message); + } + static createNTLMResponse(challenge, ntlmhash) { + let buf = Buffer.alloc(24), ntlmBuffer = Buffer.alloc(21).fill(0); + ntlmhash.copy(ntlmBuffer); + Hash.calculateDES(ntlmBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(ntlmBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(ntlmBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createNTLMHash(password) { + let md4sum = crypto.createHash('md4'); + md4sum.update(Buffer.from(password, 'ucs2')); // lgtm[js/insufficient-password-hash] + return md4sum.digest(); + } + static createNTLMv2Hash(ntlmhash, username, authTargetName) { + let hmac = crypto.createHmac('md5', ntlmhash); + hmac.update(Buffer.from(username.toUpperCase() + authTargetName, 'ucs2')); // lgtm[js/weak-cryptographic-algorithm] + return hmac.digest(); + } + static createLMv2Response(type2message, username, authTargetName, ntlmhash, nonce) { + let buf = Buffer.alloc(24); + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let hmac = crypto.createHmac('md5', ntlm2hash); + //server challenge + type2message.challenge.copy(buf, 8); + //client nonce + buf.write(nonce, 16, 'hex'); + //create hash + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let bufferSize = 48 + type2message.targetInfo.buffer.length; + if (withMic) { + bufferSize += 8; + } + let buf = Buffer.alloc(bufferSize), ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName), hmac = crypto.createHmac('md5', ntlm2hash); + //the first 8 bytes are spare to store the hashed value before the blob + //server challenge + type2message.challenge.copy(buf, 8); + //blob signature + buf.writeUInt32BE(0x01010000, 16); + //reserved + buf.writeUInt32LE(0, 20); + //timestamp + let timestampLow = Number('0x' + timestamp.substring(Math.max(0, timestamp.length - 8))); + let timestampHigh = Number('0x' + timestamp.substring(0, Math.max(0, timestamp.length - 8))); + buf.writeUInt32LE(timestampLow, 24); + buf.writeUInt32LE(timestampHigh, 28); + //random client nonce + buf.write(nonce, 32, 'hex'); + //zero + buf.writeUInt32LE(0, 40); + //complete target information block from type 2 message + type2message.targetInfo.buffer.copy(buf, 44); + let bufferPos = 44 + type2message.targetInfo.buffer.length; + if (withMic) { + // Should include MIC in response, indicate it in AV_FLAGS + buf.writeUInt16LE(0x06, bufferPos - 4); + buf.writeUInt16LE(0x04, bufferPos - 2); + buf.writeUInt32LE(0x02, bufferPos); + // Write new endblock + buf.writeUInt32LE(0, bufferPos + 4); + bufferPos += 8; + } + //zero + buf.writeUInt32LE(0, bufferPos); + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createMIC(type1message, type2message, type3message, username, authTargetName, ntlmhash, nonce, timestamp) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, true); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + //create MIC hash + hmac = crypto.createHmac('md5', key_exchange_key); + hmac.update(type1message); + hmac.update(type2message.raw); + hmac.update(type3message); + let hashedBuffer = hmac.digest(); + return hashedBuffer; + } + static createRandomSessionKey(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + let exported_session_key_hex = Hash.createPseudoRandomValue(32); + let exported_session_key = Buffer.from(exported_session_key_hex, 'hex'); + let rc4 = crypto.createCipheriv('rc4', key_exchange_key, ''); + let encrypted_random_session_key = rc4.update(exported_session_key); + return encrypted_random_session_key; + } + static createPseudoRandomValue(length) { + let str = ''; + while (str.length < length) { + str += Math.floor(Math.random() * 16).toString(16); + } + return str; + } + static createTimestamp() { + //TODO: we are loosing precision here since js is not able to handle those large integers + // maybe think about a different solution here + // 11644473600000 = diff between 1970 and 1601 + return ((Date.now() + 11644473600000) * 10000).toString(16); + } + } + exports.Hash = Hash; +}); +define("ntlm/ntlm.message", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + class NtlmMessage { + constructor(buf) { + this.raw = buf; + } + header() { + return 'NTLM ' + this.raw.toString('base64'); + } + } + exports.NtlmMessage = NtlmMessage; +}); +define("ntlm/interfaces/i.ntlm", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); +}); +// All code in this folder is heavily based on the node project ntlm-client. +// https://github.com/clncln1/node-ntlm-client +// ---------------------------------------------------------------------------- +// Original license statement: +define("ntlm/ntlm", ["require", "exports", "ntlm/ntlm.flags", "ntlm/ntlm.constants", "ntlm/hash", "os", "ntlm/type2.message", "ntlm/ntlm.message"], function (require, exports, ntlm_flags_2, ntlm_constants_2, hash_1, os, type2_message_1, ntlm_message_1) { + // Copyright (c) 2015 Nico Haller + // Permission is hereby granted, free of charge, to any person obtaining a copy + // of this software and associated documentation files (the "Software"), to deal + // in the Software without restriction, including without limitation the rights + // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + // copies of the Software, and to permit persons to whom the Software is + // furnished to do so, subject to the following conditions: + // The above copyright notice and this permission notice shall be included in + // all copies or substantial portions of the Software. + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + // THE SOFTWARE. + // ---------------------------------------------------------------------------- + 'use strict'; + Object.defineProperty(exports, "__esModule", { value: true }); + function ntlm() { + return new Ntlm(); + } + exports.default = ntlm; + class Ntlm { + createType1Message(ntlm_version, workstation, target) { + let dataPos = 40; + let pos = 0; + let buf = Buffer.alloc(256); + if (target === undefined) { + target = ''; + } + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + //signature + buf.write(ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE, pos, ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + pos += ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE.length; + //message type + buf.writeUInt32LE(1, pos); + pos += 4; + //flags + let messageFlags = ntlm_flags_2.NtlmFlags.NEGOTIATE_OEM | + ntlm_flags_2.NtlmFlags.NEGOTIATE_ALWAYS_SIGN | + ntlm_flags_2.NtlmFlags.NEGOTIATE_VERSION; + if (ntlm_version == 1) { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_NTLM_KEY | + ntlm_flags_2.NtlmFlags.NEGOTIATE_LM_KEY; + } + else { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_NTLM2_KEY; + } + if (target.length > 0) { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_DOMAIN_SUPPLIED; + } + if (workstation.length > 0) { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_WORKSTATION_SUPPLIED; + } + // special operator to force conversion to unsigned + buf.writeUInt32LE(messageFlags >>> 0, pos); + pos += 4; + //domain security buffer + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (target.length > 0) { + dataPos += buf.write(target, dataPos, 'ascii'); + } + //workstation security buffer + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (workstation.length > 0) { + dataPos += buf.write(workstation, dataPos, 'ascii'); + } + this.addVersionStruct(buf, pos); + return new ntlm_message_1.NtlmMessage(buf.slice(0, dataPos)); + } + // Version - hard-coded to + // Major version 10, minor version 0 (Windows 10) + // build number 18362 (1903 update), NTLM revision 15 + addVersionStruct(buf, pos) { + buf.writeUInt8(10, pos); + pos++; + buf.writeUInt8(0, pos); + pos++; + buf.writeUInt16LE(18362, pos); + pos += 2; + buf.writeUInt32LE(0x0F000000, pos); + pos += 4; + return pos; + } + decodeType2Message(str) { + if (str === undefined) { + throw new Error('Invalid argument'); + } + let ntlmMatch = /^NTLM ([^,\s]+)/.exec(str); + if (ntlmMatch) { + str = ntlmMatch[1]; + } + let buf = Buffer.from(str, 'base64'); + let type2message = new type2_message_1.Type2Message(buf); + return type2message; + } + createType3Message(type1message, type2message, username, password, workstation, target, client_nonce_override, timestamp_override) { + let dataPos = 72; + let buf = Buffer.alloc(1024); + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + if (target === undefined) { + target = type2message.targetName; + } + //signature + buf.write(ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE, 0, ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + //message type + buf.writeUInt32LE(3, 8); + let targetLen = type2message.encoding === 'ascii' ? target.length : target.length * 2; + let usernameLen = type2message.encoding === 'ascii' ? username.length : username.length * 2; + let workstationLen = type2message.encoding === 'ascii' ? workstation.length : workstation.length * 2; + let dataPosOffset = targetLen + usernameLen + workstationLen; + let timestamp = ''; + let client_nonce = ''; + let withMic = false; + let withServerTimestamp = false; + if (type2message.version === 2 && + type2message.targetInfo && + type2message.targetInfo.parsed['SERVER_TIMESTAMP']) { // Must include MIC, add room for it + withServerTimestamp = true; + withMic = true; + dataPos += 16; + } + let hashDataPos = dataPos + dataPosOffset; + let ntlmHash = hash_1.Hash.createNTLMHash(password); + if (type2message.version === 2) { + client_nonce = client_nonce_override || hash_1.Hash.createPseudoRandomValue(16); + if (withServerTimestamp) { // Use server timestamp if provided + timestamp = type2message.targetInfo.parsed['SERVER_TIMESTAMP']; + } + else { + timestamp = timestamp_override || hash_1.Hash.createTimestamp(); + } + let lmv2; + if (withServerTimestamp) { + lmv2 = Buffer.alloc(24); // zero-filled + } + else { + lmv2 = hash_1.Hash.createLMv2Response(type2message, username, target, ntlmHash, client_nonce); + } + //lmv2 security buffer + buf.writeUInt16LE(lmv2.length, 12); + buf.writeUInt16LE(lmv2.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lmv2.copy(buf, hashDataPos); + hashDataPos += lmv2.length; + let ntlmv2 = hash_1.Hash.createNTLMv2Response(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + //ntlmv2 security buffer + buf.writeUInt16LE(ntlmv2.length, 20); + buf.writeUInt16LE(ntlmv2.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlmv2.copy(buf, hashDataPos); + hashDataPos += ntlmv2.length; + } + else { + let lmHash = hash_1.Hash.createLMHash(password); + let lm = hash_1.Hash.createLMResponse(type2message.challenge, lmHash); + let ntlm = hash_1.Hash.createNTLMResponse(type2message.challenge, ntlmHash); + //lm security buffer + buf.writeUInt16LE(lm.length, 12); + buf.writeUInt16LE(lm.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lm.copy(buf, hashDataPos); + hashDataPos += lm.length; + //ntlm security buffer + buf.writeUInt16LE(ntlm.length, 20); + buf.writeUInt16LE(ntlm.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlm.copy(buf, hashDataPos); + hashDataPos += ntlm.length; + } + //target name security buffer + buf.writeUInt16LE(targetLen, 28); + buf.writeUInt16LE(targetLen, 30); + buf.writeUInt32LE(dataPos, 32); + dataPos += buf.write(target, dataPos, type2message.encoding); + //user name security buffer + buf.writeUInt16LE(usernameLen, 36); + buf.writeUInt16LE(usernameLen, 38); + buf.writeUInt32LE(dataPos, 40); + dataPos += buf.write(username, dataPos, type2message.encoding); + //workstation name security buffer + buf.writeUInt16LE(workstationLen, 44); + buf.writeUInt16LE(workstationLen, 46); + buf.writeUInt32LE(dataPos, 48); + dataPos += buf.write(workstation, dataPos, type2message.encoding); + //session key security buffer + let session_key = Buffer.alloc(0); + // if (type2message.flags & NtlmFlags.NEGOTIATE_KEY_EXCHANGE) { + // session_key = hash.createRandomSessionKey(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + // } + buf.writeUInt16LE(session_key.length, 52); + buf.writeUInt16LE(session_key.length, 54); + buf.writeUInt32LE(hashDataPos, 56); + session_key.copy(buf, hashDataPos); + hashDataPos += session_key.length; + //flags + buf.writeUInt32LE(type2message.flags, 60); + this.addVersionStruct(buf, 64); + if (withMic) { + // Calculate and add MIC + let mic = hash_1.Hash.createMIC(type1message.raw, type2message, buf.slice(0, hashDataPos), username, target, ntlmHash, client_nonce, timestamp); + mic.copy(buf, 72); + } + return new ntlm_message_1.NtlmMessage(buf.slice(0, hashDataPos)); + //return 'NTLM ' + buf.toString('base64', 0, hashDataPos); + } + } + exports.Ntlm = Ntlm; +}); define("tests/dynamicsMetadataTests", ["require", "exports", "Dynamics/DynamicsMetadata"], function (require, exports, DynamicsMetadata_1) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); @@ -805,12 +1559,19 @@ define("tests/dynamicsMetadataTests", ["require", "exports", "Dynamics/DynamicsM } exports.dynamicsMetadataRetrieveAll = dynamicsMetadataRetrieveAll; }); -define("tests/dynamicsTests", ["require", "exports", "Dynamics/Dynamics", "Query/Query"], function (require, exports, Dynamics_4, Query_5) { +define("tests/dynamicsTests", ["require", "exports", "Dynamics/Dynamics", "Query/Query", "Dynamics/DynamicsRequest"], function (require, exports, Dynamics_3, Query_5, DynamicsRequest_5) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function dynamicsTestAll() { return __awaiter(this, void 0, void 0, function* () { - const dyn = Dynamics_4.default(); + const options = new DynamicsRequest_5.ConnectionOptions(); + options.authType = DynamicsRequest_5.AuthenticationType.Windows; + options.username = "Administrator"; + options.domain = "CONTOSO"; + options.password = "{password}"; + options.serverUrl = "http://{server}/{org}/"; + options.webApiVersion = "v9.0"; + const dyn = Dynamics_3.default(options); /* Batch Request */ const allAccounts = yield dyn.batch() .requestAllUrls(['/api/data/v9.1/accounts']) @@ -871,3 +1632,4 @@ define("tests/queryTests", ["require", "exports", "Query/Query", "Query/QueryXml } exports.createQueryWithAllExpressions = createQueryWithAllExpressions; }); +//# sourceMappingURL=more-xrm.js.map \ No newline at end of file diff --git a/lib/amd/more-xrm.js.map b/lib/amd/more-xrm.js.map new file mode 100644 index 0000000..e30b96c --- /dev/null +++ b/lib/amd/more-xrm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"more-xrm.js","sourceRoot":"","sources":["../../src/Query/Query.ts","../../src/Query/QueryXml.ts","../../src/Dynamics/DynamicsRequest.ts","../../src/Dynamics/DynamicsBatch.ts","../../src/Dynamics/Dynamics.ts","../../src/Dynamics/Model/OrganizationMetadata.ts","../../src/Dynamics/DynamicsDiscovery.ts","../../src/Dynamics/Model/EntityMetadata.ts","../../src/Dynamics/Model/AttributeMetadata.ts","../../src/Dynamics/Model/OptionSetMetadata.ts","../../src/Dynamics/DynamicsMetadata.ts","../../src/ntlm/ntlm.flags.ts","../../src/ntlm/ntlm.constants.ts","../../src/ntlm/type2.message.ts","../../src/ntlm/hash.ts","../../src/ntlm/ntlm.message.ts","../../src/ntlm/interfaces/i.ntlm.ts","../../src/ntlm/ntlm.ts","../../src/tests/dynamicsMetadataTests.ts","../../src/tests/dynamicsTests.ts","../../src/tests/queryTests.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Dynamics.d.ts b/lib/commonjs/Dynamics/Dynamics.d.ts index 510c564..8adc0aa 100644 --- a/lib/commonjs/Dynamics/Dynamics.d.ts +++ b/lib/commonjs/Dynamics/Dynamics.d.ts @@ -1,6 +1,7 @@ import { Query } from "../Query/Query"; import { DynamicsBatch } from "./DynamicsBatch"; -export declare const WebApiVersion = "v9.1"; +import { ConnectionOptions } from "./DynamicsRequest"; +export declare const DefaultWebApiVersion = "v9.1"; export declare const DefaultMaxRecords = 100; export declare const DynamicsHeaders: { 'OData-MaxVersion': string; @@ -17,4 +18,4 @@ export interface Dynamics { query(entityLogicalName: string, entitySetName: string): Query; save(entitySetName: string, data: any, id?: string): Promise; } -export default function dynamics(accessToken?: string): Dynamics; +export default function dynamics(connectionOptions?: ConnectionOptions): Dynamics; diff --git a/lib/commonjs/Dynamics/Dynamics.js b/lib/commonjs/Dynamics/Dynamics.js index 665f4c5..01de861 100644 --- a/lib/commonjs/Dynamics/Dynamics.js +++ b/lib/commonjs/Dynamics/Dynamics.js @@ -3,31 +3,31 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Query_1 = require("../Query/Query"); const DynamicsBatch_1 = require("./DynamicsBatch"); const DynamicsRequest_1 = require("./DynamicsRequest"); -exports.WebApiVersion = 'v9.1'; +exports.DefaultWebApiVersion = 'v9.1'; exports.DefaultMaxRecords = 100; exports.DynamicsHeaders = { 'OData-MaxVersion': '4.0', 'OData-Version': '4.0', 'Prefer': 'odata.include-annotations=OData.Community.Display.V1.FormattedValue' }; -function dynamics(accessToken) { - return new DynamicsClient(accessToken); +function dynamics(connectionOptions) { + return new DynamicsClient(connectionOptions); } exports.default = dynamics; class DynamicsClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } batch() { - return DynamicsBatch_1.dynamicsBatch(this.dynamicsHeaders); + return DynamicsBatch_1.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders); } fetch(query, maxRowCount = exports.DefaultMaxRecords) { - return DynamicsRequest_1.dynamicsQuery(query, maxRowCount, this.dynamicsHeaders); + return DynamicsRequest_1.dynamicsQuery(this.connectionOptions, query, maxRowCount, this.dynamicsHeaders); } optionset(entityName, attributeName) { - return DynamicsRequest_1.dynamicsRequest(`/api/data/${exports.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) + return DynamicsRequest_1.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) .then(attribute => (attribute.OptionSet || attribute.GlobalOptionSet).Options.map((option) => ({ label: (option.Label && option.Label.UserLocalizedLabel && option.Label.UserLocalizedLabel.Label), value: option.Value @@ -37,6 +37,7 @@ class DynamicsClient { return Query_1.default(entityLogicalName).path(entitySetName); } save(entitySetName, data, id) { - return DynamicsRequest_1.dynamicsSave(entitySetName, data, id, this.dynamicsHeaders); + return DynamicsRequest_1.dynamicsSave(this.connectionOptions, entitySetName, data, id, this.dynamicsHeaders); } } +//# sourceMappingURL=Dynamics.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Dynamics.js.map b/lib/commonjs/Dynamics/Dynamics.js.map new file mode 100644 index 0000000..1524153 --- /dev/null +++ b/lib/commonjs/Dynamics/Dynamics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Dynamics.js","sourceRoot":"","sources":["../../../src/Dynamics/Dynamics.ts"],"names":[],"mappings":";;AAAA,0CAA8C;AAC9C,mDAA+D;AAC/D,uDAAoG;AAEvF,QAAA,oBAAoB,GAAG,MAAM,CAAC;AAC9B,QAAA,iBAAiB,GAAG,GAAG,CAAC;AACxB,QAAA,eAAe,GAAG;IAC3B,kBAAkB,EAAE,KAAK;IACzB,eAAe,EAAE,KAAK;IACtB,QAAQ,EAAE,qEAAqE;CAClF,CAAC;AAUF,SAAwB,QAAQ,CAAC,iBAAqC;IAClE,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAFD,2BAEC;AAGD,MAAM,cAAc;IAIhB,YAAY,OAA0B;QAClC,IAAI,OAAO,EACX;YACI,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;SACpC;IACL,CAAC;IAED,KAAK;QACD,OAAO,6BAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAI,KAAY,EAAE,cAAsB,yBAAiB;QAE1D,OAAO,+BAAa,CAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9F,CAAC;IAED,SAAS,CAAC,UAAe,EAAE,aAAkB;QAEzC,OAAO,iCAAe,CAAM,IAAI,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,mCAAmC,UAAU,8BAA8B,aAAa,6IAA6I,EAAE,IAAI,CAAC,eAAe,CAAC;aAChW,IAAI,CAAC,SAAS,CAAC,EAAE,CACd,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,CAC1D,CAAC,MAAwE,EAAE,EAAE,CAAC,CAAC;YAC3E,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC;YACjG,KAAK,EAAE,MAAM,CAAC,KAAK;SACtB,CAAC,CACL,CACJ,CAAC;IACN,CAAC;IAED,KAAK,CAAC,iBAAyB,EAAE,aAAqB;QAElD,OAAO,eAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,aAAqB,EAAE,IAAS,EAAE,EAAW;QAC9C,OAAO,8BAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/F,CAAC;CACJ"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsBatch.d.ts b/lib/commonjs/Dynamics/DynamicsBatch.d.ts index 715fa4b..06b0748 100644 --- a/lib/commonjs/Dynamics/DynamicsBatch.d.ts +++ b/lib/commonjs/Dynamics/DynamicsBatch.d.ts @@ -1,6 +1,7 @@ import { Query } from "../Query/Query"; +import { ConnectionOptions } from "./DynamicsRequest"; export interface DynamicsBatch { - execute(): Promise; + execute(): Promise; request(query: Query, maxRowCount?: number): DynamicsBatch; requestAll(queries: Query[]): DynamicsBatch; requestAllUrls(urls: string[]): DynamicsBatch; @@ -8,6 +9,6 @@ export interface DynamicsBatch { createRelatedEntity(entitySetName: string, data: any, navigationPropertyName: string): void; }; } -export declare function dynamicsBatch(headers?: any): DynamicsBatch; -export declare function dynamicsBatchRequest(...url: string[]): Promise; -export declare function dynamicsBatchQuery(...query: Query[]): Promise; +export declare function dynamicsBatch(connectionOptions: ConnectionOptions, headers?: any): DynamicsBatch; +export declare function dynamicsBatchRequest(connectionOptions: ConnectionOptions, ...url: string[]): Promise; +export declare function dynamicsBatchQuery(connectionOptions: ConnectionOptions, ...query: Query[]): Promise; diff --git a/lib/commonjs/Dynamics/DynamicsBatch.js b/lib/commonjs/Dynamics/DynamicsBatch.js index ccf9288..9b8e075 100644 --- a/lib/commonjs/Dynamics/DynamicsBatch.js +++ b/lib/commonjs/Dynamics/DynamicsBatch.js @@ -1,9 +1,10 @@ "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; @@ -12,39 +13,45 @@ const Query_1 = require("../Query/Query"); const QueryXml_1 = require("../Query/QueryXml"); const Dynamics_1 = require("./Dynamics"); const DynamicsRequest_1 = require("./DynamicsRequest"); -function dynamicsBatch(headers) { - return new Batch(headers); +const httpntlm = require("httpntlm"); +const node_fetch_1 = require("node-fetch"); +function dynamicsBatch(connectionOptions, headers) { + return new Batch(connectionOptions, headers); } exports.dynamicsBatch = dynamicsBatch; -function dynamicsBatchRequest(...url) { - const batch = new Batch(); +function dynamicsBatchRequest(connectionOptions, ...url) { + const batch = new Batch(connectionOptions); batch.requestAllUrls(url); return batch.execute(); } exports.dynamicsBatchRequest = dynamicsBatchRequest; -function dynamicsBatchQuery(...query) { - const batch = new Batch(); +function dynamicsBatchQuery(connectionOptions, ...query) { + const batch = new Batch(connectionOptions); batch.requestAll(query); return batch.execute(); } exports.dynamicsBatchQuery = dynamicsBatchQuery; class Batch { - constructor(headers) { + constructor(options, headers) { + this.options = options; this.headers = headers; + this.ConnectionOptions = options; this.Changes = []; this.RelatedChanges = []; } execute() { return __awaiter(this, void 0, void 0, function* () { - const results = yield Batch.requestBatch(`/api/data/${Dynamics_1.WebApiVersion}/$batch`, this.Changes, this.headers); + const results = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.Changes, this.headers); if (this.RelatedChanges.length > 0) { for (let change of this.RelatedChanges) { - let changeIndex = this.Changes.indexOf(change.relatedChange); - let relatedId = results[changeIndex]; - change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + if (change !== undefined && change.relatedChange) { + let changeIndex = this.Changes.indexOf(change.relatedChange); + let relatedId = results !== undefined ? results[changeIndex] : undefined; + change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + } } - const related = yield Batch.requestBatch(`/api/data/${Dynamics_1.WebApiVersion}/$batch`, this.RelatedChanges, this.headers); - return results.concat(related); + const related = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.RelatedChanges, this.headers); + return results !== undefined ? results.concat(related) : undefined; } else { return results; @@ -95,8 +102,9 @@ class Batch { } createRelatedEntity(entitySetName, data, navigationPropertyName) { let lastChange = this.Changes[this.Changes.length - 1]; - if (!lastChange || lastChange.entityData == 'DELETE') + if (!lastChange || lastChange.entityData === 'DELETE') { throw new Error('createRelatedEntity relies on the previous change which was not found in the batch.'); + } if (lastChange.entityId) { data[`${navigationPropertyName}@odata.bind`] = `${lastChange.entitySetName}(${lastChange.entityId})`; this.Changes.push({ @@ -113,16 +121,42 @@ class Batch { }); } } - static requestBatch(url, requests, headers) { + static requestBatch(connectionOptions, url, requests, headers) { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; const batchId = Batch.createId(); - return fetch(url, { - method: 'POST', - headers: Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, Dynamics_1.DynamicsHeaders, headers), - body: Batch.formatBatchRequest(batchId, requests) - }) - .then(response => Batch.formatBatchResponse(response.text())); + if (connectionOptions.authType === DynamicsRequest_1.AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm.post({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: Batch.formatBatchRequest(connectionOptions, batchId, requests), + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, Dynamics_1.DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + resolve(Batch.formatBatchResponse(res.responseText)); + }); + }); + } + else { + return node_fetch_1.default(callUrl, { + method: 'POST', + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, 'Authorization': connectionOptions.accessToken }, Dynamics_1.DynamicsHeaders), headers), + body: Batch.formatBatchRequest(connectionOptions, batchId, requests) + }) + .then(response => Batch.formatBatchResponse(response.text())); + } } - static formatBatchRequest(batchId, changes) { + static formatBatchRequest(connectionOptions, batchId, changes) { let batchBody = []; let requestBody = []; let changeNumber = 1; @@ -137,7 +171,7 @@ class Batch { requestBody.push('Content-Transfer-Encoding:binary'); requestBody.push(''); if (change.entitySetName) { - requestBody.push(`GET ${encodeURI(`/api/data/${Dynamics_1.WebApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); + requestBody.push(`GET ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); } else { requestBody.push(`GET ${encodeURI(change.entitySetQuery)} HTTP/1.1`); @@ -152,7 +186,7 @@ class Batch { batchBody.push('Content-Transfer-Encoding:binary'); batchBody.push(`Content-ID: ${changeNumber++}`); batchBody.push(''); - batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${Dynamics_1.WebApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); + batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); batchBody.push('Content-Type: application/json;type=entry'); batchBody.push(''); batchBody.push(JSON.stringify(change.entityData)); @@ -198,6 +232,10 @@ class Batch { return 'id' + Math.random().toString(16).slice(2); } static trimId(id) { - return (id || '').replace(/{|}/g, ''); + if (id !== undefined) { + return (id || '').replace(/{|}/g, ''); + } + return undefined; } } +//# sourceMappingURL=DynamicsBatch.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsBatch.js.map b/lib/commonjs/Dynamics/DynamicsBatch.js.map new file mode 100644 index 0000000..53a0e5b --- /dev/null +++ b/lib/commonjs/Dynamics/DynamicsBatch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsBatch.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsBatch.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsDiscovery.d.ts b/lib/commonjs/Dynamics/DynamicsDiscovery.d.ts new file mode 100644 index 0000000..6c531d2 --- /dev/null +++ b/lib/commonjs/Dynamics/DynamicsDiscovery.d.ts @@ -0,0 +1,8 @@ +import { ConnectionOptions } from "./DynamicsRequest"; +import { OrganizationMetadata } from "./Model/OrganizationMetadata"; +export declare type OrganizationMetadata = OrganizationMetadata; +export declare const DefaultDiscoveryApiVersion = "v9.1"; +export default function dynamicsDiscovery(connectionOptions?: ConnectionOptions): DynamicsDiscovery; +export interface DynamicsDiscovery { + discover(): Promise; +} diff --git a/lib/commonjs/Dynamics/DynamicsDiscovery.js b/lib/commonjs/Dynamics/DynamicsDiscovery.js new file mode 100644 index 0000000..c35ce9e --- /dev/null +++ b/lib/commonjs/Dynamics/DynamicsDiscovery.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const DynamicsRequest_1 = require("./DynamicsRequest"); +exports.DefaultDiscoveryApiVersion = 'v9.1'; +function dynamicsDiscovery(connectionOptions) { + return new DynamicsDiscoveryClient(connectionOptions); +} +exports.default = dynamicsDiscovery; +class DynamicsDiscoveryClient { + constructor(options) { + if (options) { + this.connectionOptions = options; + if (!options.webApiVersion) { + this.connectionOptions.webApiVersion = exports.DefaultDiscoveryApiVersion; + } + } + } + discover() { + return DynamicsRequest_1.dynamicsRequest(this.connectionOptions, `/api/discovery/${this.connectionOptions.webApiVersion}/Instances`, this.dynamicsHeaders); + } +} +//# sourceMappingURL=DynamicsDiscovery.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsDiscovery.js.map b/lib/commonjs/Dynamics/DynamicsDiscovery.js.map new file mode 100644 index 0000000..7fa54de --- /dev/null +++ b/lib/commonjs/Dynamics/DynamicsDiscovery.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsDiscovery.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsDiscovery.ts"],"names":[],"mappings":";;AAAA,uDAAuE;AAK1D,QAAA,0BAA0B,GAAG,MAAM,CAAC;AAEjD,SAAwB,iBAAiB,CAAC,iBAAqC;IAC3E,OAAO,IAAI,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;AAC1D,CAAC;AAFD,oCAEC;AAMD,MAAM,uBAAuB;IAIzB,YAAY,OAA0B;QAClC,IAAI,OAAO,EACX;YACI,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;YAEjC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC1B;gBACI,IAAI,CAAC,iBAAiB,CAAC,aAAa,GAAG,kCAA0B,CAAC;aACrE;SACJ;IACL,CAAC;IAED,QAAQ;QACJ,OAAO,iCAAe,CAAyB,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,IAAI,CAAC,iBAAiB,CAAC,aAAa,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACrK,CAAC;CACJ"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsMetadata.d.ts b/lib/commonjs/Dynamics/DynamicsMetadata.d.ts index e1c6ff1..c64f886 100644 --- a/lib/commonjs/Dynamics/DynamicsMetadata.d.ts +++ b/lib/commonjs/Dynamics/DynamicsMetadata.d.ts @@ -1,3 +1,4 @@ +import { ConnectionOptions } from "./DynamicsRequest"; import { AttributeMetadata, EntityAttributeMetadata, LookupAttributeMetadata } from "./Model/AttributeMetadata"; import { EntityMetadata } from "./Model/EntityMetadata"; import { OptionSetAttributeMetadata, OptionSetMetadata } from "./Model/OptionSetMetadata"; @@ -6,7 +7,7 @@ export declare type DynamicsAttributeMetadata = AnyAttributeMetadata; export declare type DynamicsOptionSetMetadata = OptionSetMetadata; export declare type DynamicsLookupAttributeMetadata = LookupAttributeMetadata; export declare type DynamicsOptionSetAttributeMetadata = OptionSetAttributeMetadata; -export default function dynamicsMetadata(accessToken?: string): DynamicsMetadata; +export default function dynamicsmetdata(connectionOptions?: ConnectionOptions): DynamicsMetadata; export declare function isLookupAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsLookupAttributeMetadata; export declare function isOptionSetAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsOptionSetAttributeMetadata; export interface DynamicsMetadata { diff --git a/lib/commonjs/Dynamics/DynamicsMetadata.js b/lib/commonjs/Dynamics/DynamicsMetadata.js index b9ebe80..de8a1e6 100644 --- a/lib/commonjs/Dynamics/DynamicsMetadata.js +++ b/lib/commonjs/Dynamics/DynamicsMetadata.js @@ -1,12 +1,11 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const Dynamics_1 = require("./Dynamics"); const DynamicsBatch_1 = require("./DynamicsBatch"); const DynamicsRequest_1 = require("./DynamicsRequest"); -function dynamicsMetadata(accessToken) { - return new DynamicsMetadataClient(accessToken); +function dynamicsmetdata(connectionOptions) { + return new DynamicsMetadataClient(connectionOptions); } -exports.default = dynamicsMetadata; +exports.default = dynamicsmetdata; function isLookupAttribute(attribute) { return attribute.Type === 'Lookup' && attribute['LookupEntityName']; } @@ -50,31 +49,31 @@ const ExcludedAttributeNameFilters = [ 'entityimage_timestamp' ]; class DynamicsMetadataClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } attributes(entityName) { - return DynamicsBatch_1.dynamicsBatch(this.dynamicsHeaders) + return DynamicsBatch_1.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.getMetadataUrls(entityName, false)) .execute() .then(data => this.flatten(data) - .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') != attribute.LogicalName.length - 4) + .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') !== attribute.LogicalName.length - 4) .map(DynamicsMetadataMapper.MapAttribute)); } entities() { - return DynamicsRequest_1.dynamicsRequest(`/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return DynamicsRequest_1.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(data => data .map(entity => DynamicsMetadataMapper.MapEntity(entity))); } entity(entityName) { - return DynamicsRequest_1.dynamicsRequest(`/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return DynamicsRequest_1.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(entity => this.attributes(entityName) .then(attributes => DynamicsMetadataMapper.MapEntity(entity, attributes))); } entityAttributes(...entityNames) { - return DynamicsBatch_1.dynamicsBatch(this.dynamicsHeaders) + return DynamicsBatch_1.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.flatten(entityNames.map(e => this.getMetadataUrls(e, true)))) .execute() .then(data => { @@ -86,7 +85,7 @@ class DynamicsMetadataClient { currentEntity = DynamicsMetadataMapper.MapEntity(item); entities.push(currentEntity); } - else if (item.LogicalName.indexOf('yomi') == -1 && item.LogicalName.indexOf('base') != item.LogicalName.length - 4) { + else if (item.LogicalName.indexOf('yomi') === -1 && item.LogicalName.indexOf('base') !== item.LogicalName.length - 4) { currentEntity.Attributes.push(DynamicsMetadataMapper.MapAttribute(item)); } } @@ -97,12 +96,12 @@ class DynamicsMetadataClient { const attributeTypeFilter = ExcludedAttributeTypeFilters.map(v => `AttributeType ne Microsoft.Dynamics.CRM.AttributeTypeCode'${v}'`).join(' and '); const attributeNameFilter = ExcludedAttributeNameFilters.map(v => `LogicalName ne '${v}'`).join(' and '); return [ - `/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, - `/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, - `/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, - `/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${Dynamics_1.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` ].slice(includeEntity ? 0 : 1); } flatten(values) { @@ -145,3 +144,4 @@ function isLookup(attribute) { function isOptionSet(attribute) { return attribute['OptionSet'] && Array.isArray(attribute['OptionSet'].Options); } +//# sourceMappingURL=DynamicsMetadata.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsMetadata.js.map b/lib/commonjs/Dynamics/DynamicsMetadata.js.map new file mode 100644 index 0000000..7caa0dd --- /dev/null +++ b/lib/commonjs/Dynamics/DynamicsMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsMetadata.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsMetadata.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsRequest.d.ts b/lib/commonjs/Dynamics/DynamicsRequest.d.ts index a6d8062..9e1e264 100644 --- a/lib/commonjs/Dynamics/DynamicsRequest.d.ts +++ b/lib/commonjs/Dynamics/DynamicsRequest.d.ts @@ -1,6 +1,20 @@ import { Query } from "../Query/Query"; -export declare function dynamicsQuery(query: Query, maxRowCount?: number, headers?: any): Promise; -export declare function dynamicsQueryUrl(dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; -export declare function dynamicsRequest(dynamicsEntitySetUrl: string, headers?: any): Promise; -export declare function dynamicsSave(entitySetName: string, data: any, id?: string, headers?: any): Promise; +export declare enum AuthenticationType { + Windows = 1, + OAuth = 2 +} +export declare class ConnectionOptions { + authType: AuthenticationType; + username?: string; + password?: string; + domain?: string; + workstation?: string; + accessToken?: string; + serverUrl: string; + webApiVersion: string; +} +export declare function dynamicsQuery(connectionOptions: ConnectionOptions, query: Query, maxRowCount?: number, headers?: any): Promise; +export declare function dynamicsQueryUrl(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; +export declare function dynamicsRequest(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, headers?: any): Promise; +export declare function dynamicsSave(connectionOptions: ConnectionOptions, entitySetName: string, data: any, id?: string, headers?: any): Promise; export declare function formatDynamicsResponse(data: any): any; diff --git a/lib/commonjs/Dynamics/DynamicsRequest.js b/lib/commonjs/Dynamics/DynamicsRequest.js index 62fa14a..aae3eba 100644 --- a/lib/commonjs/Dynamics/DynamicsRequest.js +++ b/lib/commonjs/Dynamics/DynamicsRequest.js @@ -1,32 +1,64 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; Object.defineProperty(exports, "__esModule", { value: true }); const Query_1 = require("../Query/Query"); const QueryXml_1 = require("../Query/QueryXml"); const Dynamics_1 = require("./Dynamics"); -function dynamicsQuery(query, maxRowCount, headers) { - const dataQuery = Query_1.GetRootQuery(query); - if (!dataQuery.EntityPath) { - throw new Error('dynamicsQuery requires a Query object with an EntityPath'); +const httpntlm = require("httpntlm"); +const node_fetch_1 = require("node-fetch"); +var AuthenticationType; +(function (AuthenticationType) { + AuthenticationType[AuthenticationType["Windows"] = 1] = "Windows"; + AuthenticationType[AuthenticationType["OAuth"] = 2] = "OAuth"; +})(AuthenticationType = exports.AuthenticationType || (exports.AuthenticationType = {})); +class ConnectionOptions { + constructor() { + this.authType = AuthenticationType.OAuth; + this.serverUrl = ""; + this.webApiVersion = Dynamics_1.DefaultWebApiVersion; } - return dynamicsQueryUrl(`/api/data/${Dynamics_1.WebApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); +} +exports.ConnectionOptions = ConnectionOptions; +function dynamicsQuery(connectionOptions, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const dataQuery = Query_1.GetRootQuery(query); + if (!dataQuery.EntityPath) { + throw new Error('dynamicsQuery requires a Query object with an EntityPath'); + } + return yield dynamicsQueryUrl(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + }); } exports.dynamicsQuery = dynamicsQuery; -function dynamicsQueryUrl(dynamicsEntitySetUrl, query, maxRowCount, headers) { - const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); - return request(`${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(QueryXml_1.default(query, maxRowCount))}`, 'GET', undefined, headers); +function dynamicsQueryUrl(connectionOptions, dynamicsEntitySetUrl, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); + return yield request(connectionOptions, `${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(QueryXml_1.default(query, maxRowCount))}`, 'GET', undefined, headers); + }); } exports.dynamicsQueryUrl = dynamicsQueryUrl; -function dynamicsRequest(dynamicsEntitySetUrl, headers) { - return request(dynamicsEntitySetUrl, 'GET', undefined, headers); +function dynamicsRequest(connectionOptions, dynamicsEntitySetUrl, headers) { + return __awaiter(this, void 0, void 0, function* () { + return yield request(connectionOptions, dynamicsEntitySetUrl, 'GET', undefined, headers); + }); } exports.dynamicsRequest = dynamicsRequest; -function dynamicsSave(entitySetName, data, id, headers) { - if (id) { - return request(`/api/data/${Dynamics_1.WebApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); - } - else { - return request(`/api/data/${Dynamics_1.WebApiVersion}/${entitySetName}()`, 'POST', data, headers); - } +function dynamicsSave(connectionOptions, entitySetName, data, id, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (id) { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); + } + else { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}()`, 'POST', data, headers); + } + }); } exports.dynamicsSave = dynamicsSave; function formatDynamicsResponse(data) { @@ -42,10 +74,10 @@ function formatDynamicsResponse(data) { } if (data) { for (var item of data) { - var row = {}; - for (var key in item) { + let row = {}; + for (let key in item) { var name = key; - if (name.indexOf('@odata') == 0) { + if (name.indexOf('@odata') === 0) { continue; } if (name.indexOf('transactioncurrencyid') > -1) { @@ -53,12 +85,12 @@ function formatDynamicsResponse(data) { } if (name.indexOf('@') > -1) { name = name.substring(0, name.indexOf('@')); - if (name.indexOf('_') == 0) { + if (name.indexOf('_') === 0) { name = name.slice(1, -6); } name += "_formatted"; } - else if (name.indexOf('_') == 0) { + else if (name.indexOf('_') === 0) { name = name.slice(1, -6); } if (name.indexOf('_x002e_') > -1) { @@ -79,15 +111,56 @@ function formatDynamicsResponse(data) { return items; } exports.formatDynamicsResponse = formatDynamicsResponse; -function request(url, method, body, headers) { - return fetch(url, { - method: method, - headers: Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders, headers), - body: body - }) - .then(response => response.json()) - .then(data => formatDynamicsResponse(data)); +function request(connectionOptions, url, method, body, headers) { + return __awaiter(this, void 0, void 0, function* () { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; + //TODO: fetch if we can. + if (connectionOptions.authType === AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm[method.toLowerCase()]({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: body, + headers: Object.assign(Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + const json = JSON.parse(res.body); + if (json.error) { + console.error(json.error.message); + reject(json.error.message); + } + else if (json.ExceptionMessage) { + console.error(json.ExceptionMessage); + reject(`The service call returned HTTP ${json.ErrorCode} - ${json.ExceptionMessage}`); + } + else { + resolve(formatDynamicsResponse(json)); + } + }); + }); + } + else { + return node_fetch_1.default(url, { + method: method, + headers: Object.assign(Object.assign({ 'Authorization': `Bearer ${connectionOptions.accessToken}`, 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders), headers), + body: body + }) + .then(response => response.json()) + .then(data => formatDynamicsResponse(data)); + } + }); } function trimId(id) { return (id || '').replace(/{|}/g, ''); } +//# sourceMappingURL=DynamicsRequest.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/DynamicsRequest.js.map b/lib/commonjs/Dynamics/DynamicsRequest.js.map new file mode 100644 index 0000000..0d3bfc4 --- /dev/null +++ b/lib/commonjs/Dynamics/DynamicsRequest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsRequest.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsRequest.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,0CAAqD;AACrD,gDAA4C;AAC5C,yCAAmE;AACnE,qCAAqC;AACrC,2CAA+B;AAE/B,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAE1B,iEAAW,CAAA;IACX,6DAAS,CAAA;AACb,CAAC,EAJW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAI7B;AAED,MAAa,iBAAiB;IAA9B;QACI,aAAQ,GAAuB,kBAAkB,CAAC,KAAK,CAAC;QAMxD,cAAS,GAAW,EAAE,CAAC;QACvB,kBAAa,GAAW,+BAAoB,CAAC;IACjD,CAAC;CAAA;AATD,8CASC;AAED,SAAsB,aAAa,CAAI,iBAAoC,EAAE,KAAY,EAAE,WAAoB,EAAE,OAAa;;QAC1H,MAAM,SAAS,GAAG,oBAAY,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;SAC/E;QAED,OAAO,MAAM,gBAAgB,CAAI,iBAAiB,EAAE,aAAa,iBAAiB,CAAC,aAAa,IAAI,SAAS,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC7J,CAAC;CAAA;AARD,sCAQC;AAED,SAAsB,gBAAgB,CAAI,iBAAoC,EAAE,oBAA4B,EAAE,KAAY,EAAE,WAAoB,EAAE,OAAa;;QAC3J,MAAM,cAAc,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE5E,OAAO,MAAM,OAAO,CAAM,iBAAiB,EAAE,GAAG,oBAAoB,GAAG,cAAc,YAAY,MAAM,CAAC,kBAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3K,CAAC;CAAA;AAJD,4CAIC;AAED,SAAsB,eAAe,CAAI,iBAAoC,EAAE,oBAA4B,EAAE,OAAa;;QACtH,OAAO,MAAM,OAAO,CAAI,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChG,CAAC;CAAA;AAFD,0CAEC;AAED,SAAsB,YAAY,CAAC,iBAAoC,EAAE,aAAqB,EAAE,IAAS,EAAE,EAAW,EAAE,OAAa;;QACjI,IAAI,EAAE,EAAE;YACJ,OAAO,MAAM,OAAO,CAAC,iBAAiB,EAAE,aAAa,iBAAiB,CAAC,aAAa,IAAI,aAAa,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;SACnJ;aACI;YACD,OAAO,MAAM,OAAO,CAAC,iBAAiB,EAAE,aAAa,iBAAiB,CAAC,aAAa,IAAI,aAAa,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;SACrI;IACL,CAAC;CAAA;AAPD,oCAOC;AAED,SAAgB,sBAAsB,CAAC,IAAS;IAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC/B;IACD,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QACpB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;KACrB;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACtB,OAAO,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5C;IACD,IAAI,IAAI,EAAE;QACN,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;YACnB,IAAI,GAAG,GAAO,EAAE,CAAC;YAEjB,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;gBAClB,IAAI,IAAI,GAAW,GAAG,CAAC;gBAEvB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;oBAC9B,SAAS;iBACZ;gBAED,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC5C,SAAS;iBACZ;gBAED,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;oBACxB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;oBAE5C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;wBACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;qBAC5B;oBAED,IAAI,IAAI,YAAY,CAAC;iBACxB;qBACI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAC9B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;iBAC5B;gBAED,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;oBACrD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;oBAEnD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBACX,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;qBACjB;oBACD,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;iBAC9B;qBACI;oBACD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;iBACzB;aACJ;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACnB;KACJ;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAxDD,wDAwDC;AAED,SAAe,OAAO,CAAI,iBAAoC,EAAE,GAAW,EAAE,MAAmD,EAAE,IAAU,EAAE,OAAa;;QACvJ,IAAI,OAAO,GAAW,iBAAiB,CAAC,SAAS,CAAC;QAElD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EACzB;YACI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACnD;QAED,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC;QAE7B,wBAAwB;QACxB,IAAI,iBAAiB,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,EAC7D;YACI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAEnC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC3B,GAAG,EAAE,OAAO;oBACZ,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;oBACpC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;oBACpC,WAAW,EAAE,iBAAiB,CAAC,WAAW,IAAI,EAAE;oBAChD,MAAM,EAAE,iBAAiB,CAAC,MAAM,IAAI,EAAE;oBACtC,IAAI,EAAE,IAAI;oBACV,OAAO,gCACH,cAAc,EAAE,iCAAiC,IAC9C,0BAAe,GACf,OAAO,CACb;iBACJ,EAAE,UAAU,GAAG,EAAE,GAAG;oBACjB,IAAI,GAAG,EACP;wBACI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAEnB,MAAM,CAAC,GAAG,CAAC,CAAC;qBACf;oBAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAElC,IAAI,IAAI,CAAC,KAAK,EACd;wBACI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAElC,MAAM,CAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;qBAC/B;yBACI,IAAI,IAAI,CAAC,gBAAgB,EAC9B;wBACI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;wBAErC,MAAM,CAAE,kCAAkC,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;qBAC1F;yBAED;wBACI,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;qBACzC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;SACN;aAED;YACI,OAAO,oBAAK,CAAC,GAAG,EAAE;gBACd,MAAM,EAAE,MAAM;gBACd,OAAO,gCACH,eAAe,EAAE,UAAU,iBAAiB,CAAC,WAAW,EAAE,EAC1D,cAAc,EAAE,iCAAiC,IAC9C,0BAAe,GACf,OAAO,CACb;gBACD,IAAI,EAAE,IAAI;aACb,CAAC;iBACG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;iBACjC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;SACnD;IACL,CAAC;CAAA;AAED,SAAS,MAAM,CAAC,EAAU;IACtB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/AttributeMetadata.js b/lib/commonjs/Dynamics/Model/AttributeMetadata.js index a892b1d..8de72fa 100644 --- a/lib/commonjs/Dynamics/Model/AttributeMetadata.js +++ b/lib/commonjs/Dynamics/Model/AttributeMetadata.js @@ -17,3 +17,4 @@ exports.AttributeTypeCodes = [ 'Status', 'String' ]; +//# sourceMappingURL=AttributeMetadata.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/AttributeMetadata.js.map b/lib/commonjs/Dynamics/Model/AttributeMetadata.js.map new file mode 100644 index 0000000..36dc13c --- /dev/null +++ b/lib/commonjs/Dynamics/Model/AttributeMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AttributeMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/AttributeMetadata.ts"],"names":[],"mappings":";;AAoCa,QAAA,kBAAkB,GAAG;IAC9B,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,WAAW;IACX,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;CACX,CAAC"} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/EntityMetadata.js b/lib/commonjs/Dynamics/Model/EntityMetadata.js index c8ad2e5..b0421ce 100644 --- a/lib/commonjs/Dynamics/Model/EntityMetadata.js +++ b/lib/commonjs/Dynamics/Model/EntityMetadata.js @@ -1,2 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=EntityMetadata.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/EntityMetadata.js.map b/lib/commonjs/Dynamics/Model/EntityMetadata.js.map new file mode 100644 index 0000000..26dfcd7 --- /dev/null +++ b/lib/commonjs/Dynamics/Model/EntityMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EntityMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/EntityMetadata.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/OptionSetMetadata.js b/lib/commonjs/Dynamics/Model/OptionSetMetadata.js index c8ad2e5..5ad45d2 100644 --- a/lib/commonjs/Dynamics/Model/OptionSetMetadata.js +++ b/lib/commonjs/Dynamics/Model/OptionSetMetadata.js @@ -1,2 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=OptionSetMetadata.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/OptionSetMetadata.js.map b/lib/commonjs/Dynamics/Model/OptionSetMetadata.js.map new file mode 100644 index 0000000..8410470 --- /dev/null +++ b/lib/commonjs/Dynamics/Model/OptionSetMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"OptionSetMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/OptionSetMetadata.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/OrganizationMetadata.d.ts b/lib/commonjs/Dynamics/Model/OrganizationMetadata.d.ts new file mode 100644 index 0000000..15e6602 --- /dev/null +++ b/lib/commonjs/Dynamics/Model/OrganizationMetadata.d.ts @@ -0,0 +1,11 @@ +export interface OrganizationMetadata { + Id?: string; + UniqueName?: string; + UrlName?: string; + FriendlyName?: string; + State?: number; + Version?: string; + Uri?: string; + AppUri?: string; + LastUpdated?: Date; +} diff --git a/lib/commonjs/Dynamics/Model/OrganizationMetadata.js b/lib/commonjs/Dynamics/Model/OrganizationMetadata.js new file mode 100644 index 0000000..67b0407 --- /dev/null +++ b/lib/commonjs/Dynamics/Model/OrganizationMetadata.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=OrganizationMetadata.js.map \ No newline at end of file diff --git a/lib/commonjs/Dynamics/Model/OrganizationMetadata.js.map b/lib/commonjs/Dynamics/Model/OrganizationMetadata.js.map new file mode 100644 index 0000000..c636362 --- /dev/null +++ b/lib/commonjs/Dynamics/Model/OrganizationMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"OrganizationMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/OrganizationMetadata.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/commonjs/Query/Query.d.ts b/lib/commonjs/Query/Query.d.ts index d9ab90a..af078d7 100644 --- a/lib/commonjs/Query/Query.d.ts +++ b/lib/commonjs/Query/Query.d.ts @@ -19,6 +19,7 @@ export interface DataQueryJoin extends DataQuery { IsOuterJoin?: boolean; } export interface Query { + [key: string]: any; alias(attributeName: string, alias: string): Query; path(entityPath: string): Query; select(...attributeNames: string[]): Query; diff --git a/lib/commonjs/Query/Query.js b/lib/commonjs/Query/Query.js index 12e3fec..81a20f8 100644 --- a/lib/commonjs/Query/Query.js +++ b/lib/commonjs/Query/Query.js @@ -68,7 +68,7 @@ class QueryProvider { return this; } whereAny(any) { - var conditions = []; + let conditions = []; any((attributeName, operator, ...values) => { conditions.push({ AttributeName: attributeName, @@ -103,3 +103,4 @@ class QueryProvider { return [].concat(...values); } } +//# sourceMappingURL=Query.js.map \ No newline at end of file diff --git a/lib/commonjs/Query/Query.js.map b/lib/commonjs/Query/Query.js.map new file mode 100644 index 0000000..629e029 --- /dev/null +++ b/lib/commonjs/Query/Query.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Query.js","sourceRoot":"","sources":["../../../src/Query/Query.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/Query/QueryXml.js b/lib/commonjs/Query/QueryXml.js index c2aa88f..0daa234 100644 --- a/lib/commonjs/Query/QueryXml.js +++ b/lib/commonjs/Query/QueryXml.js @@ -35,7 +35,7 @@ function getQueryXml(query) { } }); query.OrderBy.forEach(attribute => { - if (attribute.indexOf('_') == 0) { + if (attribute.indexOf('_') === 0) { xml.push(``); } else { @@ -112,16 +112,21 @@ function getConditionXml(condition) { return xml.join('\n'); } function encodeValue(value) { - if (value === 0) + if (value === 0) { return '0'; - if (value === true) + } + if (value === true) { return 'true'; - if (value === false) + } + if (value === false) { return 'false'; - if (!value) + } + if (!value) { return ''; - if (typeof (value.toISOString) === 'function') + } + if (typeof (value.toISOString) === 'function') { return value.toISOString(); + } return xmlEncode(value.toString()); } function xmlEncode(text) { @@ -140,8 +145,9 @@ function formatXml(xmlString) { return xmlString.replace(/\s*<[^>\/]*>[^<>]*<\/[^>]*>|\s*<.+?>|\s*[^<]+/g, //pattern to match nodes (angled brackets or text) function (m, i) { m = m.replace(/^\s+|\s+$/g, ""); //trim the match just in case - if (i < 38 && /^<[?]xml/.test(m)) - return m + "\n"; //if the match is a header, ignore it + if (i < 38 && /^<[?]xml/.test(m)) { + return m + "\n"; + } //if the match is a header, ignore it if (/^<[/]/.test(m)) //if the match is a closing tag { tabs = tabs.replace(indent, ""); //remove one indent from the store @@ -166,3 +172,4 @@ function formatXml(xmlString) { return "\n" + m; //content has additional space(match) from header }); } +//# sourceMappingURL=QueryXml.js.map \ No newline at end of file diff --git a/lib/commonjs/Query/QueryXml.js.map b/lib/commonjs/Query/QueryXml.js.map new file mode 100644 index 0000000..b9e98e2 --- /dev/null +++ b/lib/commonjs/Query/QueryXml.js.map @@ -0,0 +1 @@ +{"version":3,"file":"QueryXml.js","sourceRoot":"","sources":["../../../src/Query/QueryXml.ts"],"names":[],"mappings":";;AAAA,mCAA6E;AAE7E,SAAwB,WAAW,CAAC,KAAY,EAAE,cAAsB,CAAC,EAAE,SAAkB,KAAK;IAC9F,MAAM,SAAS,GAAG,oBAAY,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM,EAAE;QACR,OAAO,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;KAC7D;SACI;QACD,OAAO,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;KAClD;AACL,CAAC;AARD,8BAQC;AAED,SAAS,eAAe,CAAC,KAAgB,EAAE,WAAmB;IAC1D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACrC,IAAI,WAAW,GAAG,CAAC,EAAE;QACjB,GAAG,CAAC,IAAI,CAAC,WAAW,WAAW,GAAG,CAAC,CAAC;KACvC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC;IACjD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,KAAgB;IACjC,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QACjC,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACxB,GAAG,CAAC,IAAI,CAAC,oBAAoB,SAAS,YAAY,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SACnF;aACI;YACD,GAAG,CAAC,IAAI,CAAC,oBAAoB,SAAS,MAAM,CAAC,CAAC;SACjD;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC9B,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;SAC7E;aACI;YACD,GAAG,CAAC,IAAI,CAAC,qBAAqB,SAAS,MAAM,CAAC,CAAC;SAClD;IACL,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7B,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE;YACjC,IAAI,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;gBAC3C,cAAc,GAAG,IAAI,CAAC;gBACtB,IAAI,UAAU,GAAyB,MAAM,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACnC,KAAK,IAAI,SAAS,IAAI,UAAU,EAAE;oBAC9B,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;iBAC5C;gBACD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;aACvC;iBACI;gBACD,OAAO,CAAC,IAAI,CAAC,eAAe,CAAqB,MAAM,CAAC,CAAC,CAAC;aAC7D;SACJ;QACD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE1B,IAAI,cAAc,EAAE;YAChB,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC7B;QAED,IAAI,cAAc,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC/G,cAAc,GAAG,IAAI,CAAC;aACzB;iBACI,IAAI,CAAC,cAAc,EAAE;gBACtB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;aACxB;iBACI;gBACD,cAAc,GAAG,KAAK,CAAC;aAC1B;SACJ;KACJ;IACD,IAAI,KAAK,CAAC,KAAK,EAAE;QACb,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;YAC1B,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,UAAU,YAAY,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,qBAAqB,SAAS,IAAI,CAAC,mBAAmB,gBAAgB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;YACxM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SAC9B;KACJ;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,SAA6B;IAClD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;QAC3C,SAAS,CAAC,aAAa,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9H;IAED,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACjD,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,GAAG,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,aAAa,eAAe,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;YAChG,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE;gBAChC,GAAG,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;aACpD;YACD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC5B;aACI;YACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,aAAa,eAAe,SAAS,CAAC,QAAQ,YAAY,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SACjJ;KACJ;SACI;QACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,aAAa,eAAe,SAAS,CAAC,QAAQ,MAAM,CAAC,CAAC;KACrG;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,KAAU;IAC3B,IAAI,KAAK,KAAK,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;KAAE;IAChC,IAAI,KAAK,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;KAAE;IACtC,IAAI,KAAK,KAAK,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC;KAAE;IACxC,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;KAAE;IAC1B,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;KAAE;IAC9E,OAAO,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,IAAS;IACxB,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;QACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KACrC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,SAAc;IAC7B,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,IAAI,GAAG,EAAE,CAAC,CAAE,+BAA+B;IAE/C,OAAO,SAAS,CAAC,OAAO,CACpB,gDAAgD,EAAE,kDAAkD;IACpG,UAAU,CAAS,EAAE,CAAS;QAC1B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAE,6BAA6B;QAE/D,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,CAAC,GAAG,IAAI,CAAC;SAAE,CAAE,qCAAqC;QAE7F,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAG,+BAA+B;SACrD;YACI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAE,kCAAkC;YACpE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAE,4CAA4C;SAC9D;aACI,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAG,sCAAsC;SACnF;YACI,0BAA0B;YAC1B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAE,kGAAkG;YACtJ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,4CAA4C;SAC7D;aACI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,6EAA6E;SACtG;YACI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAE,4CAA4C;YAC3D,IAAI,IAAI,MAAM,CAAC,CAAE,iCAAiC;SACrD;aACK,kCAAkC;SACxC;YACI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAE,6CAA6C;SAC/D;QAED,gBAAgB;QAChB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,iDAAiD;IACtE,CAAC,CACJ,CAAC;AACN,CAAC"} \ No newline at end of file diff --git a/lib/commonjs/ntlm/hash.d.ts b/lib/commonjs/ntlm/hash.d.ts new file mode 100644 index 0000000..726df27 --- /dev/null +++ b/lib/commonjs/ntlm/hash.d.ts @@ -0,0 +1,16 @@ +/// +import { Type2Message } from './type2.message'; +export declare class Hash { + static createLMResponse(challenge: Buffer, lmhash: Buffer): Buffer; + static createLMHash(password: string): Buffer; + static calculateDES(key: Buffer, message: Buffer): Buffer; + static createNTLMResponse(challenge: Buffer, ntlmhash: Buffer): Buffer; + static createNTLMHash(password: string): Buffer; + static createNTLMv2Hash(ntlmhash: Buffer, username: string, authTargetName: string): Buffer; + static createLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string): Buffer; + static createNTLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createMIC(type1message: Buffer, type2message: Type2Message, type3message: Buffer, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string): Buffer; + static createRandomSessionKey(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createPseudoRandomValue(length: number): string; + static createTimestamp(): string; +} diff --git a/lib/commonjs/ntlm/hash.js b/lib/commonjs/ntlm/hash.js new file mode 100644 index 0000000..b950f0f --- /dev/null +++ b/lib/commonjs/ntlm/hash.js @@ -0,0 +1,161 @@ +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto = require("crypto"); +class Hash { + static createLMResponse(challenge, lmhash) { + let buf = Buffer.alloc(24); + let pwBuffer = Buffer.alloc(21).fill(0); + lmhash.copy(pwBuffer); + Hash.calculateDES(pwBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(pwBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(pwBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createLMHash(password) { + let buf = Buffer.alloc(16), pwBuffer = Buffer.alloc(14), magicKey = Buffer.from('KGS!@#$%', 'ascii'); + if (password.length > 14) { + buf.fill(0); + return buf; + } + pwBuffer.fill(0); + pwBuffer.write(password.toUpperCase(), 0, 'ascii'); + return Buffer.concat([ + Hash.calculateDES(pwBuffer.slice(0, 7), magicKey), + Hash.calculateDES(pwBuffer.slice(7), magicKey) + ]); + } + static calculateDES(key, message) { + let desKey = Buffer.alloc(8); + desKey[0] = key[0] & 0xFE; + desKey[1] = ((key[0] << 7) & 0xFF) | (key[1] >> 1); + desKey[2] = ((key[1] << 6) & 0xFF) | (key[2] >> 2); + desKey[3] = ((key[2] << 5) & 0xFF) | (key[3] >> 3); + desKey[4] = ((key[3] << 4) & 0xFF) | (key[4] >> 4); + desKey[5] = ((key[4] << 3) & 0xFF) | (key[5] >> 5); + desKey[6] = ((key[5] << 2) & 0xFF) | (key[6] >> 6); + desKey[7] = (key[6] << 1) & 0xFF; + for (let i = 0; i < 8; i++) { + let parity = 0; + for (let j = 1; j < 8; j++) { + parity += (desKey[i] >> j) % 2; + } + desKey[i] |= (parity % 2) === 0 ? 1 : 0; + } + let des = crypto.createCipheriv('DES-ECB', desKey, ''); + return des.update(message); + } + static createNTLMResponse(challenge, ntlmhash) { + let buf = Buffer.alloc(24), ntlmBuffer = Buffer.alloc(21).fill(0); + ntlmhash.copy(ntlmBuffer); + Hash.calculateDES(ntlmBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(ntlmBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(ntlmBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createNTLMHash(password) { + let md4sum = crypto.createHash('md4'); + md4sum.update(Buffer.from(password, 'ucs2')); // lgtm[js/insufficient-password-hash] + return md4sum.digest(); + } + static createNTLMv2Hash(ntlmhash, username, authTargetName) { + let hmac = crypto.createHmac('md5', ntlmhash); + hmac.update(Buffer.from(username.toUpperCase() + authTargetName, 'ucs2')); // lgtm[js/weak-cryptographic-algorithm] + return hmac.digest(); + } + static createLMv2Response(type2message, username, authTargetName, ntlmhash, nonce) { + let buf = Buffer.alloc(24); + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let hmac = crypto.createHmac('md5', ntlm2hash); + //server challenge + type2message.challenge.copy(buf, 8); + //client nonce + buf.write(nonce, 16, 'hex'); + //create hash + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let bufferSize = 48 + type2message.targetInfo.buffer.length; + if (withMic) { + bufferSize += 8; + } + let buf = Buffer.alloc(bufferSize), ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName), hmac = crypto.createHmac('md5', ntlm2hash); + //the first 8 bytes are spare to store the hashed value before the blob + //server challenge + type2message.challenge.copy(buf, 8); + //blob signature + buf.writeUInt32BE(0x01010000, 16); + //reserved + buf.writeUInt32LE(0, 20); + //timestamp + let timestampLow = Number('0x' + timestamp.substring(Math.max(0, timestamp.length - 8))); + let timestampHigh = Number('0x' + timestamp.substring(0, Math.max(0, timestamp.length - 8))); + buf.writeUInt32LE(timestampLow, 24); + buf.writeUInt32LE(timestampHigh, 28); + //random client nonce + buf.write(nonce, 32, 'hex'); + //zero + buf.writeUInt32LE(0, 40); + //complete target information block from type 2 message + type2message.targetInfo.buffer.copy(buf, 44); + let bufferPos = 44 + type2message.targetInfo.buffer.length; + if (withMic) { + // Should include MIC in response, indicate it in AV_FLAGS + buf.writeUInt16LE(0x06, bufferPos - 4); + buf.writeUInt16LE(0x04, bufferPos - 2); + buf.writeUInt32LE(0x02, bufferPos); + // Write new endblock + buf.writeUInt32LE(0, bufferPos + 4); + bufferPos += 8; + } + //zero + buf.writeUInt32LE(0, bufferPos); + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createMIC(type1message, type2message, type3message, username, authTargetName, ntlmhash, nonce, timestamp) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, true); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + //create MIC hash + hmac = crypto.createHmac('md5', key_exchange_key); + hmac.update(type1message); + hmac.update(type2message.raw); + hmac.update(type3message); + let hashedBuffer = hmac.digest(); + return hashedBuffer; + } + static createRandomSessionKey(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + let exported_session_key_hex = Hash.createPseudoRandomValue(32); + let exported_session_key = Buffer.from(exported_session_key_hex, 'hex'); + let rc4 = crypto.createCipheriv('rc4', key_exchange_key, ''); + let encrypted_random_session_key = rc4.update(exported_session_key); + return encrypted_random_session_key; + } + static createPseudoRandomValue(length) { + let str = ''; + while (str.length < length) { + str += Math.floor(Math.random() * 16).toString(16); + } + return str; + } + static createTimestamp() { + //TODO: we are loosing precision here since js is not able to handle those large integers + // maybe think about a different solution here + // 11644473600000 = diff between 1970 and 1601 + return ((Date.now() + 11644473600000) * 10000).toString(16); + } +} +exports.Hash = Hash; +//# sourceMappingURL=hash.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/hash.js.map b/lib/commonjs/ntlm/hash.js.map new file mode 100644 index 0000000..61ade75 --- /dev/null +++ b/lib/commonjs/ntlm/hash.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/ntlm/hash.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/ntlm/interfaces/i.ntlm.d.ts b/lib/commonjs/ntlm/interfaces/i.ntlm.d.ts new file mode 100644 index 0000000..855a424 --- /dev/null +++ b/lib/commonjs/ntlm/interfaces/i.ntlm.d.ts @@ -0,0 +1,7 @@ +import { Type2Message } from "../type2.message"; +import { NtlmMessage } from "../ntlm.message"; +export interface INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2Message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce: string | undefined, timestamp: string | undefined): NtlmMessage; +} diff --git a/lib/commonjs/ntlm/interfaces/i.ntlm.js b/lib/commonjs/ntlm/interfaces/i.ntlm.js new file mode 100644 index 0000000..f0f9bdf --- /dev/null +++ b/lib/commonjs/ntlm/interfaces/i.ntlm.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=i.ntlm.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/interfaces/i.ntlm.js.map b/lib/commonjs/ntlm/interfaces/i.ntlm.js.map new file mode 100644 index 0000000..fc3fbdc --- /dev/null +++ b/lib/commonjs/ntlm/interfaces/i.ntlm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"i.ntlm.js","sourceRoot":"","sources":["../../../../src/ntlm/interfaces/i.ntlm.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.constants.d.ts b/lib/commonjs/ntlm/ntlm.constants.d.ts new file mode 100644 index 0000000..0a98088 --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.constants.d.ts @@ -0,0 +1,3 @@ +export declare class NtlmConstants { + static readonly NTLM_SIGNATURE = "NTLMSSP\0"; +} diff --git a/lib/commonjs/ntlm/ntlm.constants.js b/lib/commonjs/ntlm/ntlm.constants.js new file mode 100644 index 0000000..88c19ca --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.constants.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class NtlmConstants { +} +exports.NtlmConstants = NtlmConstants; +NtlmConstants.NTLM_SIGNATURE = 'NTLMSSP\0'; +//# sourceMappingURL=ntlm.constants.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.constants.js.map b/lib/commonjs/ntlm/ntlm.constants.js.map new file mode 100644 index 0000000..5061a7d --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.constants.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.constants.ts"],"names":[],"mappings":";;AAAA,MAAa,aAAa;;AAA1B,sCAEC;AADiB,4BAAc,GAAG,WAAW,CAAC"} \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.d.ts b/lib/commonjs/ntlm/ntlm.d.ts new file mode 100644 index 0000000..0a12dbc --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.d.ts @@ -0,0 +1,10 @@ +import { INtlm } from './interfaces/i.ntlm'; +import { Type2Message } from './type2.message'; +import { NtlmMessage } from './ntlm.message'; +export default function ntlm(): INtlm; +export declare class Ntlm implements INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + private addVersionStruct; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce_override: string | undefined, timestamp_override: string | undefined): NtlmMessage; +} diff --git a/lib/commonjs/ntlm/ntlm.flags.d.ts b/lib/commonjs/ntlm/ntlm.flags.d.ts new file mode 100644 index 0000000..37c462f --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.flags.d.ts @@ -0,0 +1,28 @@ +export declare enum NtlmFlags { + NEGOTIATE_UNICODE = 1, + NEGOTIATE_OEM = 2, + REQUEST_TARGET = 4, + NEGOTIATE_SIGN = 16, + NEGOTIATE_SEAL = 32, + NEGOTIATE_DATAGRAM_STYLE = 64, + NEGOTIATE_LM_KEY = 128, + NEGOTIATE_NETWARE = 256, + NEGOTIATE_NTLM_KEY = 512, + NEGOTIATE_ANONYMOUS = 2048, + NEGOTIATE_DOMAIN_SUPPLIED = 4096, + NEGOTIATE_WORKSTATION_SUPPLIED = 8192, + NEGOTIATE_LOCAL_CALL = 16384, + NEGOTIATE_ALWAYS_SIGN = 32768, + TARGET_TYPE_DOMAIN = 65536, + TARGET_TYPE_SERVER = 131072, + TARGET_TYPE_SHARE = 262144, + NEGOTIATE_NTLM2_KEY = 524288, + REQUEST_INIT_RESPONSE = 1048576, + REQUEST_ACCEPT_RESPONSE = 2097152, + REQUEST_NONNT_SESSION_KEY = 4194304, + NEGOTIATE_TARGET_INFO = 8388608, + NEGOTIATE_VERSION = 33554432, + NEGOTIATE_128 = 536870912, + NEGOTIATE_KEY_EXCHANGE = 1073741824, + NEGOTIATE_56 = -2147483648 +} diff --git a/lib/commonjs/ntlm/ntlm.flags.js b/lib/commonjs/ntlm/ntlm.flags.js new file mode 100644 index 0000000..db3c6fa --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.flags.js @@ -0,0 +1,83 @@ +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +var NtlmFlags; +(function (NtlmFlags) { + /* Indicates that Unicode strings are supported for use in security buffer + data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_UNICODE"] = 1] = "NEGOTIATE_UNICODE"; + /* Indicates that OEM strings are supported for use in security buffer data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_OEM"] = 2] = "NEGOTIATE_OEM"; + /* Requests that the server's authentication realm be included in the Type 2 + message. */ + NtlmFlags[NtlmFlags["REQUEST_TARGET"] = 4] = "REQUEST_TARGET"; + /* unknown (1<<3) */ + /* Specifies that authenticated communication between the client and server + should carry a digital signature (message integrity). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SIGN"] = 16] = "NEGOTIATE_SIGN"; + /* Specifies that authenticated communication between the client and server + should be encrypted (message confidentiality). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SEAL"] = 32] = "NEGOTIATE_SEAL"; + /* Indicates that datagram authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DATAGRAM_STYLE"] = 64] = "NEGOTIATE_DATAGRAM_STYLE"; + /* Indicates that the LAN Manager session key should be used for signing and + sealing authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LM_KEY"] = 128] = "NEGOTIATE_LM_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["NEGOTIATE_NETWARE"] = 256] = "NEGOTIATE_NETWARE"; + /* Indicates that NTLM authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM_KEY"] = 512] = "NEGOTIATE_NTLM_KEY"; + /* unknown (1<<10) */ + /* Sent by the client in the Type 3 message to indicate that an anonymous + context has been established. This also affects the response fields. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ANONYMOUS"] = 2048] = "NEGOTIATE_ANONYMOUS"; + /* Sent by the client in the Type 1 message to indicate that a desired + authentication realm is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DOMAIN_SUPPLIED"] = 4096] = "NEGOTIATE_DOMAIN_SUPPLIED"; + /* Sent by the client in the Type 1 message to indicate that the client + workstation's name is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_WORKSTATION_SUPPLIED"] = 8192] = "NEGOTIATE_WORKSTATION_SUPPLIED"; + /* Sent by the server to indicate that the server and client are on the same + machine. Implies that the client may use a pre-established local security + context rather than responding to the challenge. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LOCAL_CALL"] = 16384] = "NEGOTIATE_LOCAL_CALL"; + /* Indicates that authenticated communication between the client and server + should be signed with a "dummy" signature. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ALWAYS_SIGN"] = 32768] = "NEGOTIATE_ALWAYS_SIGN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a domain. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_DOMAIN"] = 65536] = "TARGET_TYPE_DOMAIN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a server. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SERVER"] = 131072] = "TARGET_TYPE_SERVER"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a share. Presumably, this is for share-level + authentication. Usage is unclear. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SHARE"] = 262144] = "TARGET_TYPE_SHARE"; + /* Indicates that the NTLM2 signing and sealing scheme should be used for + protecting authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM2_KEY"] = 524288] = "NEGOTIATE_NTLM2_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_INIT_RESPONSE"] = 1048576] = "REQUEST_INIT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_ACCEPT_RESPONSE"] = 2097152] = "REQUEST_ACCEPT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_NONNT_SESSION_KEY"] = 4194304] = "REQUEST_NONNT_SESSION_KEY"; + /* Sent by the client in the Type 1 message to request Target info block from server. + Sent by the server in the Type 2 message to indicate that it is including a + Target Information block in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_TARGET_INFO"] = 8388608] = "NEGOTIATE_TARGET_INFO"; + /* unknown (1<24) */ + /* Indicates that the version info block is included in the message */ + NtlmFlags[NtlmFlags["NEGOTIATE_VERSION"] = 33554432] = "NEGOTIATE_VERSION"; + /* unknown (1<26) */ + /* unknown (1<27) */ + /* unknown (1<28) */ + /* Indicates that 128-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_128"] = 536870912] = "NEGOTIATE_128"; + /* Indicates that the client will provide an encrypted master key in + the "Session Key" field of the Type 3 message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_KEY_EXCHANGE"] = 1073741824] = "NEGOTIATE_KEY_EXCHANGE"; + /* Indicates that 56-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_56"] = -2147483648] = "NEGOTIATE_56"; +})(NtlmFlags = exports.NtlmFlags || (exports.NtlmFlags = {})); +//# sourceMappingURL=ntlm.flags.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.flags.js.map b/lib/commonjs/ntlm/ntlm.flags.js.map new file mode 100644 index 0000000..3208b7d --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.flags.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.flags.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.flags.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,IAAY,SA2GX;AA3GD,WAAY,SAAS;IACnB;eACW;IACX,mEAAwB,CAAA;IAExB,+EAA+E;IAC/E,2DAAoB,CAAA;IAEpB;kBACc;IACd,6DAAqB,CAAA;IAErB,oBAAoB;IAEpB;+DAC2D;IAC3D,8DAAqB,CAAA;IAErB;wDACoD;IACpD,8DAAqB,CAAA;IAErB,2DAA2D;IAC3D,kFAA+B,CAAA;IAE/B;+CAC2C;IAC3C,mEAAuB,CAAA;IAEvB,qBAAqB;IACrB,qEAAwB,CAAA;IAExB,uDAAuD;IACvD,uEAAyB,CAAA;IAEzB,qBAAqB;IAErB;8EAC0E;IAC1E,0EAA2B,CAAA;IAE3B;0DACsD;IACtD,sFAAiC,CAAA;IAEjC;wDACoD;IACpD,gGAAsC,CAAA;IAEtC;;0DAEsD;IACtD,6EAA4B,CAAA;IAE5B;oDACgD;IAChD,+EAA6B,CAAA;IAE7B;2CACuC;IACvC,yEAA0B,CAAA;IAE1B;2CACuC;IACvC,0EAA0B,CAAA;IAE1B;;2CAEuC;IACvC,wEAAyB,CAAA;IAEzB;kDAC8C;IAC9C,4EAA2B,CAAA;IAE3B,qBAAqB;IACrB,iFAA6B,CAAA;IAE7B,qBAAqB;IACrB,qFAA+B,CAAA;IAE/B,qBAAqB;IACrB,yFAAiC,CAAA;IAEjC;;kDAE8C;IAC9C,iFAA6B,CAAA;IAE7B,oBAAoB;IAEpB,sEAAsE;IACtE,0EAAyB,CAAA;IAEzB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IAEpB,qDAAqD;IACrD,mEAAqB,CAAA;IAErB;wDACoD;IACpD,sFAA8B,CAAA;IAE9B,oDAAoD;IACpD,mEAAoB,CAAA;AACtB,CAAC,EA3GW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QA2GpB"} \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.js b/lib/commonjs/ntlm/ntlm.js new file mode 100644 index 0000000..842a685 --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.js @@ -0,0 +1,234 @@ +// All code in this folder is heavily based on the node project ntlm-client. +// https://github.com/clncln1/node-ntlm-client +// ---------------------------------------------------------------------------- +// Original license statement: +// Copyright (c) 2015 Nico Haller +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// ---------------------------------------------------------------------------- +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const ntlm_flags_1 = require("./ntlm.flags"); +const ntlm_constants_1 = require("./ntlm.constants"); +const hash_1 = require("./hash"); +const os = require("os"); +const type2_message_1 = require("./type2.message"); +const ntlm_message_1 = require("./ntlm.message"); +function ntlm() { + return new Ntlm(); +} +exports.default = ntlm; +class Ntlm { + createType1Message(ntlm_version, workstation, target) { + let dataPos = 40; + let pos = 0; + let buf = Buffer.alloc(256); + if (target === undefined) { + target = ''; + } + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + //signature + buf.write(ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE, pos, ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + pos += ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length; + //message type + buf.writeUInt32LE(1, pos); + pos += 4; + //flags + let messageFlags = ntlm_flags_1.NtlmFlags.NEGOTIATE_OEM | + ntlm_flags_1.NtlmFlags.NEGOTIATE_ALWAYS_SIGN | + ntlm_flags_1.NtlmFlags.NEGOTIATE_VERSION; + if (ntlm_version == 1) { + messageFlags |= ntlm_flags_1.NtlmFlags.NEGOTIATE_NTLM_KEY | + ntlm_flags_1.NtlmFlags.NEGOTIATE_LM_KEY; + } + else { + messageFlags |= ntlm_flags_1.NtlmFlags.NEGOTIATE_NTLM2_KEY; + } + if (target.length > 0) { + messageFlags |= ntlm_flags_1.NtlmFlags.NEGOTIATE_DOMAIN_SUPPLIED; + } + if (workstation.length > 0) { + messageFlags |= ntlm_flags_1.NtlmFlags.NEGOTIATE_WORKSTATION_SUPPLIED; + } + // special operator to force conversion to unsigned + buf.writeUInt32LE(messageFlags >>> 0, pos); + pos += 4; + //domain security buffer + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (target.length > 0) { + dataPos += buf.write(target, dataPos, 'ascii'); + } + //workstation security buffer + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (workstation.length > 0) { + dataPos += buf.write(workstation, dataPos, 'ascii'); + } + this.addVersionStruct(buf, pos); + return new ntlm_message_1.NtlmMessage(buf.slice(0, dataPos)); + } + // Version - hard-coded to + // Major version 10, minor version 0 (Windows 10) + // build number 18362 (1903 update), NTLM revision 15 + addVersionStruct(buf, pos) { + buf.writeUInt8(10, pos); + pos++; + buf.writeUInt8(0, pos); + pos++; + buf.writeUInt16LE(18362, pos); + pos += 2; + buf.writeUInt32LE(0x0F000000, pos); + pos += 4; + return pos; + } + decodeType2Message(str) { + if (str === undefined) { + throw new Error('Invalid argument'); + } + let ntlmMatch = /^NTLM ([^,\s]+)/.exec(str); + if (ntlmMatch) { + str = ntlmMatch[1]; + } + let buf = Buffer.from(str, 'base64'); + let type2message = new type2_message_1.Type2Message(buf); + return type2message; + } + createType3Message(type1message, type2message, username, password, workstation, target, client_nonce_override, timestamp_override) { + let dataPos = 72; + let buf = Buffer.alloc(1024); + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + if (target === undefined) { + target = type2message.targetName; + } + //signature + buf.write(ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE, 0, ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + //message type + buf.writeUInt32LE(3, 8); + let targetLen = type2message.encoding === 'ascii' ? target.length : target.length * 2; + let usernameLen = type2message.encoding === 'ascii' ? username.length : username.length * 2; + let workstationLen = type2message.encoding === 'ascii' ? workstation.length : workstation.length * 2; + let dataPosOffset = targetLen + usernameLen + workstationLen; + let timestamp = ''; + let client_nonce = ''; + let withMic = false; + let withServerTimestamp = false; + if (type2message.version === 2 && + type2message.targetInfo && + type2message.targetInfo.parsed['SERVER_TIMESTAMP']) { // Must include MIC, add room for it + withServerTimestamp = true; + withMic = true; + dataPos += 16; + } + let hashDataPos = dataPos + dataPosOffset; + let ntlmHash = hash_1.Hash.createNTLMHash(password); + if (type2message.version === 2) { + client_nonce = client_nonce_override || hash_1.Hash.createPseudoRandomValue(16); + if (withServerTimestamp) { // Use server timestamp if provided + timestamp = type2message.targetInfo.parsed['SERVER_TIMESTAMP']; + } + else { + timestamp = timestamp_override || hash_1.Hash.createTimestamp(); + } + let lmv2; + if (withServerTimestamp) { + lmv2 = Buffer.alloc(24); // zero-filled + } + else { + lmv2 = hash_1.Hash.createLMv2Response(type2message, username, target, ntlmHash, client_nonce); + } + //lmv2 security buffer + buf.writeUInt16LE(lmv2.length, 12); + buf.writeUInt16LE(lmv2.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lmv2.copy(buf, hashDataPos); + hashDataPos += lmv2.length; + let ntlmv2 = hash_1.Hash.createNTLMv2Response(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + //ntlmv2 security buffer + buf.writeUInt16LE(ntlmv2.length, 20); + buf.writeUInt16LE(ntlmv2.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlmv2.copy(buf, hashDataPos); + hashDataPos += ntlmv2.length; + } + else { + let lmHash = hash_1.Hash.createLMHash(password); + let lm = hash_1.Hash.createLMResponse(type2message.challenge, lmHash); + let ntlm = hash_1.Hash.createNTLMResponse(type2message.challenge, ntlmHash); + //lm security buffer + buf.writeUInt16LE(lm.length, 12); + buf.writeUInt16LE(lm.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lm.copy(buf, hashDataPos); + hashDataPos += lm.length; + //ntlm security buffer + buf.writeUInt16LE(ntlm.length, 20); + buf.writeUInt16LE(ntlm.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlm.copy(buf, hashDataPos); + hashDataPos += ntlm.length; + } + //target name security buffer + buf.writeUInt16LE(targetLen, 28); + buf.writeUInt16LE(targetLen, 30); + buf.writeUInt32LE(dataPos, 32); + dataPos += buf.write(target, dataPos, type2message.encoding); + //user name security buffer + buf.writeUInt16LE(usernameLen, 36); + buf.writeUInt16LE(usernameLen, 38); + buf.writeUInt32LE(dataPos, 40); + dataPos += buf.write(username, dataPos, type2message.encoding); + //workstation name security buffer + buf.writeUInt16LE(workstationLen, 44); + buf.writeUInt16LE(workstationLen, 46); + buf.writeUInt32LE(dataPos, 48); + dataPos += buf.write(workstation, dataPos, type2message.encoding); + //session key security buffer + let session_key = Buffer.alloc(0); + // if (type2message.flags & NtlmFlags.NEGOTIATE_KEY_EXCHANGE) { + // session_key = hash.createRandomSessionKey(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + // } + buf.writeUInt16LE(session_key.length, 52); + buf.writeUInt16LE(session_key.length, 54); + buf.writeUInt32LE(hashDataPos, 56); + session_key.copy(buf, hashDataPos); + hashDataPos += session_key.length; + //flags + buf.writeUInt32LE(type2message.flags, 60); + this.addVersionStruct(buf, 64); + if (withMic) { + // Calculate and add MIC + let mic = hash_1.Hash.createMIC(type1message.raw, type2message, buf.slice(0, hashDataPos), username, target, ntlmHash, client_nonce, timestamp); + mic.copy(buf, 72); + } + return new ntlm_message_1.NtlmMessage(buf.slice(0, hashDataPos)); + //return 'NTLM ' + buf.toString('base64', 0, hashDataPos); + } +} +exports.Ntlm = Ntlm; +//# sourceMappingURL=ntlm.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.js.map b/lib/commonjs/ntlm/ntlm.js.map new file mode 100644 index 0000000..83d31f9 --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.message.d.ts b/lib/commonjs/ntlm/ntlm.message.d.ts new file mode 100644 index 0000000..65dc231 --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.message.d.ts @@ -0,0 +1,6 @@ +/// +export declare class NtlmMessage { + raw: Buffer; + constructor(buf: Buffer); + header(): string; +} diff --git a/lib/commonjs/ntlm/ntlm.message.js b/lib/commonjs/ntlm/ntlm.message.js new file mode 100644 index 0000000..11f3f60 --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.message.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class NtlmMessage { + constructor(buf) { + this.raw = buf; + } + header() { + return 'NTLM ' + this.raw.toString('base64'); + } +} +exports.NtlmMessage = NtlmMessage; +//# sourceMappingURL=ntlm.message.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/ntlm.message.js.map b/lib/commonjs/ntlm/ntlm.message.js.map new file mode 100644 index 0000000..1d7ba0b --- /dev/null +++ b/lib/commonjs/ntlm/ntlm.message.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.message.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.message.ts"],"names":[],"mappings":";;AAAA,MAAa,WAAW;IAGtB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;CACF;AAVD,kCAUC"} \ No newline at end of file diff --git a/lib/commonjs/ntlm/type2.message.d.ts b/lib/commonjs/ntlm/type2.message.d.ts new file mode 100644 index 0000000..f1ce986 --- /dev/null +++ b/lib/commonjs/ntlm/type2.message.d.ts @@ -0,0 +1,13 @@ +/// +export declare class Type2Message { + raw: Buffer; + flags: number; + encoding: 'ascii' | 'ucs2'; + version: number; + challenge: Buffer; + targetName: string; + targetInfo: any; + constructor(buf: Buffer); + private readTargetName; + private parseTargetInfo; +} diff --git a/lib/commonjs/ntlm/type2.message.js b/lib/commonjs/ntlm/type2.message.js new file mode 100644 index 0000000..571f5d3 --- /dev/null +++ b/lib/commonjs/ntlm/type2.message.js @@ -0,0 +1,128 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ntlm_flags_1 = require("./ntlm.flags"); +const ntlm_constants_1 = require("./ntlm.constants"); +class Type2Message { + constructor(buf) { + this.raw = buf; + //check signature + if (buf.toString('ascii', 0, ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length) !== ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE) { + throw new Error('Invalid message signature'); + } + //check message type + if (buf.readUInt32LE(ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length) !== 2) { + throw new Error('Invalid message type (no type 2)'); + } + //read flags + this.flags = buf.readUInt32LE(20); + this.encoding = (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_OEM) ? 'ascii' : 'ucs2'; + this.version = (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_NTLM2_KEY) ? 2 : 1; + this.challenge = buf.slice(24, 32); + //read target name + this.targetName = this.readTargetName(); + //read target info + if (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_TARGET_INFO) { + this.targetInfo = this.parseTargetInfo(); + } + } + readTargetName() { + let length = this.raw.readUInt16LE(12); + //skipping allocated space + let offset = this.raw.readUInt32LE(16); + if (length === 0) { + return ''; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + return this.raw.toString(this.encoding, offset, offset + length); + } + parseTargetInfo() { + let info = {}; + let length = this.raw.readUInt16LE(40); + //skipping allocated space + let offset = this.raw.readUInt32LE(44); + let targetInfoBuffer = Buffer.alloc(length); + this.raw.copy(targetInfoBuffer, 0, offset, offset + length); + if (length === 0) { + return info; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + let pos = offset; + while (pos < (offset + length)) { + let blockType = this.raw.readUInt16LE(pos); + pos += 2; + let blockLength = this.raw.readUInt16LE(pos); + pos += 2; + if (blockType === 0) { + //reached the terminator subblock + break; + } + let blockTypeStr; + let blockTypeOutput = 'string'; + switch (blockType) { + case 0x01: + blockTypeStr = 'SERVER'; + break; + case 0x02: + blockTypeStr = 'DOMAIN'; + break; + case 0x03: + blockTypeStr = 'FQDN'; + break; + case 0x04: + blockTypeStr = 'DNS'; + break; + case 0x05: + blockTypeStr = 'PARENT_DNS'; + break; + case 0x06: + blockTypeStr = 'FLAGS'; + blockTypeOutput = 'hex'; + break; + case 0x07: + blockTypeStr = 'SERVER_TIMESTAMP'; + blockTypeOutput = 'hex'; + break; + case 0x08: + blockTypeStr = 'SINGLE_HOST'; + blockTypeOutput = 'hex'; + break; + case 0x09: + blockTypeStr = 'TARGET_NAME'; + break; + case 0x0A: + blockTypeStr = 'CHANNEL_BINDING'; + blockTypeOutput = 'hex'; + break; + default: + blockTypeStr = ''; + break; + } + if (blockTypeStr) { + if (blockTypeOutput === 'string') { + info[blockTypeStr] = this.raw.toString('ucs2', pos, pos + blockLength); + } + else { + // Output as hex in little endian order + let twoCharBlocks = this.raw.toString('hex', pos, pos + blockLength).match(/.{2}/g); + if (twoCharBlocks) { + info[blockTypeStr] = twoCharBlocks.reverse().join(""); + } + else { + info[blockTypeStr] = null; + } + } + } + pos += blockLength; + } + return { + parsed: info, + buffer: targetInfoBuffer + }; + } +} +exports.Type2Message = Type2Message; +//# sourceMappingURL=type2.message.js.map \ No newline at end of file diff --git a/lib/commonjs/ntlm/type2.message.js.map b/lib/commonjs/ntlm/type2.message.js.map new file mode 100644 index 0000000..bb9c797 --- /dev/null +++ b/lib/commonjs/ntlm/type2.message.js.map @@ -0,0 +1 @@ +{"version":3,"file":"type2.message.js","sourceRoot":"","sources":["../../../src/ntlm/type2.message.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/commonjs/tests/dynamicsMetadataTests.js b/lib/commonjs/tests/dynamicsMetadataTests.js index f335697..949d26f 100644 --- a/lib/commonjs/tests/dynamicsMetadataTests.js +++ b/lib/commonjs/tests/dynamicsMetadataTests.js @@ -1,9 +1,10 @@ "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; @@ -27,3 +28,4 @@ function dynamicsMetadataRetrieveAll() { }); } exports.dynamicsMetadataRetrieveAll = dynamicsMetadataRetrieveAll; +//# sourceMappingURL=dynamicsMetadataTests.js.map \ No newline at end of file diff --git a/lib/commonjs/tests/dynamicsMetadataTests.js.map b/lib/commonjs/tests/dynamicsMetadataTests.js.map new file mode 100644 index 0000000..1e24a78 --- /dev/null +++ b/lib/commonjs/tests/dynamicsMetadataTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dynamicsMetadataTests.js","sourceRoot":"","sources":["../../../src/tests/dynamicsMetadataTests.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mEAA4D;AAE5D,SAAsB,2BAA2B;;QAC7C,MAAM,IAAI,GAAG,0BAAgB,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,KAAK,aAAa,CAAC,WAAW,CAAC;QAE9E,IAAI,CAAC,eAAe,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACtD;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,eAAe,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;SAC5D;IACL,CAAC;CAAA;AAnBD,kEAmBC"} \ No newline at end of file diff --git a/lib/commonjs/tests/dynamicsTests.js b/lib/commonjs/tests/dynamicsTests.js index 8faa730..aa754b3 100644 --- a/lib/commonjs/tests/dynamicsTests.js +++ b/lib/commonjs/tests/dynamicsTests.js @@ -1,18 +1,27 @@ "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const Dynamics_1 = require("../Dynamics/Dynamics"); const Query_1 = require("../Query/Query"); +const DynamicsRequest_1 = require("../Dynamics/DynamicsRequest"); function dynamicsTestAll() { return __awaiter(this, void 0, void 0, function* () { - const dyn = Dynamics_1.default(); + const options = new DynamicsRequest_1.ConnectionOptions(); + options.authType = DynamicsRequest_1.AuthenticationType.Windows; + options.username = "Administrator"; + options.domain = "CONTOSO"; + options.password = "{password}"; + options.serverUrl = "http://{server}/{org}/"; + options.webApiVersion = "v9.0"; + const dyn = Dynamics_1.default(options); /* Batch Request */ const allAccounts = yield dyn.batch() .requestAllUrls(['/api/data/v9.1/accounts']) @@ -46,3 +55,4 @@ function dynamicsTestAll() { }); } exports.dynamicsTestAll = dynamicsTestAll; +//# sourceMappingURL=dynamicsTests.js.map \ No newline at end of file diff --git a/lib/commonjs/tests/dynamicsTests.js.map b/lib/commonjs/tests/dynamicsTests.js.map new file mode 100644 index 0000000..19c62ed --- /dev/null +++ b/lib/commonjs/tests/dynamicsTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dynamicsTests.js","sourceRoot":"","sources":["../../../src/tests/dynamicsTests.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mDAA4C;AAC5C,0CAA+C;AAC/C,iEAAoF;AAEpF,SAAsB,eAAe;;QACjC,MAAM,OAAO,GAAG,IAAI,mCAAiB,EAAE,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,oCAAkB,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,eAAe,CAAC;QACnC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC;QAChC,OAAO,CAAC,SAAS,GAAG,wBAAwB,CAAC;QAC7C,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC;QAE/B,MAAM,GAAG,GAAG,kBAAQ,CAAC,OAAO,CAAC,CAAC;QAE9B,mBAAmB;QACnB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE;aAChC,cAAc,CAAC,CAAC,yBAAyB,CAAC,CAAC;aAC3C,OAAO,EAAE,CAAC;QAEf,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACzC;QAED,mBAAmB;QACnB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,EAAE,EAAE;YACL,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,mBAAmB;QACnB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjE,IAAI,EAAE,KAAK,GAAG,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,iBAAiB;QACjB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,KAAK,CAE9B,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC;aAC3B,KAAK,CAAC,MAAM,EAAE,qBAAa,CAAC,UAAU,EAAE,KAAK,CAAC;aAC9C,OAAO,CAAC,MAAM,CAAC;aACf,MAAM,CAAC,MAAM,CAAC,CAEtB,CAAC,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,UAAU,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAClD;QAED,qBAAqB;QACrB,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEnE,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;SAC1D;IACL,CAAC;CAAA;AAtDD,0CAsDC"} \ No newline at end of file diff --git a/lib/commonjs/tests/queryTests.js b/lib/commonjs/tests/queryTests.js index a2a1dcb..5fb99b7 100644 --- a/lib/commonjs/tests/queryTests.js +++ b/lib/commonjs/tests/queryTests.js @@ -24,3 +24,4 @@ function createQueryWithAllExpressions() { } } exports.createQueryWithAllExpressions = createQueryWithAllExpressions; +//# sourceMappingURL=queryTests.js.map \ No newline at end of file diff --git a/lib/commonjs/tests/queryTests.js.map b/lib/commonjs/tests/queryTests.js.map new file mode 100644 index 0000000..4d91d17 --- /dev/null +++ b/lib/commonjs/tests/queryTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queryTests.js","sourceRoot":"","sources":["../../../src/tests/queryTests.ts"],"names":[],"mappings":";;AAAA,0CAAsD;AACtD,gDAA4C;AAE5C,SAAgB,6BAA6B;IACzC,MAAM,SAAS,GAAG,eAAK,CAAC,SAAS,CAAC,CAAC;IACnC,SAAS;SACJ,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC;SAC3B,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC;SACxB,OAAO,CAAC,MAAM,CAAC;SACf,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,MAAM,EAAE,qBAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;SAC5C,KAAK,CAAC,eAAe,EAAE,qBAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACpD,QAAQ,CAAC,EAAE,CAAC,EAAE;QACX,EAAE,CAAC,MAAM,EAAE,qBAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,EAAE,CAAC,MAAM,EAAE,qBAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,EAAE,CAAC,MAAM,EAAE,qBAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,kBAAW,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,CAAC,QAAQ,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;KACvD;AACL,CAAC;AAtBD,sEAsBC"} \ No newline at end of file diff --git a/lib/es6/Dynamics/Dynamics.d.ts b/lib/es6/Dynamics/Dynamics.d.ts index 510c564..8adc0aa 100644 --- a/lib/es6/Dynamics/Dynamics.d.ts +++ b/lib/es6/Dynamics/Dynamics.d.ts @@ -1,6 +1,7 @@ import { Query } from "../Query/Query"; import { DynamicsBatch } from "./DynamicsBatch"; -export declare const WebApiVersion = "v9.1"; +import { ConnectionOptions } from "./DynamicsRequest"; +export declare const DefaultWebApiVersion = "v9.1"; export declare const DefaultMaxRecords = 100; export declare const DynamicsHeaders: { 'OData-MaxVersion': string; @@ -17,4 +18,4 @@ export interface Dynamics { query(entityLogicalName: string, entitySetName: string): Query; save(entitySetName: string, data: any, id?: string): Promise; } -export default function dynamics(accessToken?: string): Dynamics; +export default function dynamics(connectionOptions?: ConnectionOptions): Dynamics; diff --git a/lib/es6/Dynamics/Dynamics.js b/lib/es6/Dynamics/Dynamics.js index c125945..9d842d4 100644 --- a/lib/es6/Dynamics/Dynamics.js +++ b/lib/es6/Dynamics/Dynamics.js @@ -1,30 +1,30 @@ import query from "../Query/Query"; import { dynamicsBatch } from "./DynamicsBatch"; import { dynamicsQuery, dynamicsRequest, dynamicsSave } from "./DynamicsRequest"; -export const WebApiVersion = 'v9.1'; +export const DefaultWebApiVersion = 'v9.1'; export const DefaultMaxRecords = 100; export const DynamicsHeaders = { 'OData-MaxVersion': '4.0', 'OData-Version': '4.0', 'Prefer': 'odata.include-annotations=OData.Community.Display.V1.FormattedValue' }; -export default function dynamics(accessToken) { - return new DynamicsClient(accessToken); +export default function dynamics(connectionOptions) { + return new DynamicsClient(connectionOptions); } class DynamicsClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } batch() { - return dynamicsBatch(this.dynamicsHeaders); + return dynamicsBatch(this.connectionOptions, this.dynamicsHeaders); } fetch(query, maxRowCount = DefaultMaxRecords) { - return dynamicsQuery(query, maxRowCount, this.dynamicsHeaders); + return dynamicsQuery(this.connectionOptions, query, maxRowCount, this.dynamicsHeaders); } optionset(entityName, attributeName) { - return dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) + return dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) .then(attribute => (attribute.OptionSet || attribute.GlobalOptionSet).Options.map((option) => ({ label: (option.Label && option.Label.UserLocalizedLabel && option.Label.UserLocalizedLabel.Label), value: option.Value @@ -34,6 +34,7 @@ class DynamicsClient { return query(entityLogicalName).path(entitySetName); } save(entitySetName, data, id) { - return dynamicsSave(entitySetName, data, id, this.dynamicsHeaders); + return dynamicsSave(this.connectionOptions, entitySetName, data, id, this.dynamicsHeaders); } } +//# sourceMappingURL=Dynamics.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/Dynamics.js.map b/lib/es6/Dynamics/Dynamics.js.map new file mode 100644 index 0000000..2137cfa --- /dev/null +++ b/lib/es6/Dynamics/Dynamics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Dynamics.js","sourceRoot":"","sources":["../../../src/Dynamics/Dynamics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAqB,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpG,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,kBAAkB,EAAE,KAAK;IACzB,eAAe,EAAE,KAAK;IACtB,QAAQ,EAAE,qEAAqE;CAClF,CAAC;AAUF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,iBAAqC;IAClE,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAGD,MAAM,cAAc;IAIhB,YAAY,OAA0B;QAClC,IAAI,OAAO,EACX;YACI,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;SACpC;IACL,CAAC;IAED,KAAK;QACD,OAAO,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAI,KAAY,EAAE,cAAsB,iBAAiB;QAE1D,OAAO,aAAa,CAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9F,CAAC;IAED,SAAS,CAAC,UAAe,EAAE,aAAkB;QAEzC,OAAO,eAAe,CAAM,IAAI,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,mCAAmC,UAAU,8BAA8B,aAAa,6IAA6I,EAAE,IAAI,CAAC,eAAe,CAAC;aAChW,IAAI,CAAC,SAAS,CAAC,EAAE,CACd,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,CAC1D,CAAC,MAAwE,EAAE,EAAE,CAAC,CAAC;YAC3E,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC;YACjG,KAAK,EAAE,MAAM,CAAC,KAAK;SACtB,CAAC,CACL,CACJ,CAAC;IACN,CAAC;IAED,KAAK,CAAC,iBAAyB,EAAE,aAAqB;QAElD,OAAO,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,aAAqB,EAAE,IAAS,EAAE,EAAW;QAC9C,OAAO,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/F,CAAC;CACJ"} \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsBatch.d.ts b/lib/es6/Dynamics/DynamicsBatch.d.ts index 715fa4b..06b0748 100644 --- a/lib/es6/Dynamics/DynamicsBatch.d.ts +++ b/lib/es6/Dynamics/DynamicsBatch.d.ts @@ -1,6 +1,7 @@ import { Query } from "../Query/Query"; +import { ConnectionOptions } from "./DynamicsRequest"; export interface DynamicsBatch { - execute(): Promise; + execute(): Promise; request(query: Query, maxRowCount?: number): DynamicsBatch; requestAll(queries: Query[]): DynamicsBatch; requestAllUrls(urls: string[]): DynamicsBatch; @@ -8,6 +9,6 @@ export interface DynamicsBatch { createRelatedEntity(entitySetName: string, data: any, navigationPropertyName: string): void; }; } -export declare function dynamicsBatch(headers?: any): DynamicsBatch; -export declare function dynamicsBatchRequest(...url: string[]): Promise; -export declare function dynamicsBatchQuery(...query: Query[]): Promise; +export declare function dynamicsBatch(connectionOptions: ConnectionOptions, headers?: any): DynamicsBatch; +export declare function dynamicsBatchRequest(connectionOptions: ConnectionOptions, ...url: string[]): Promise; +export declare function dynamicsBatchQuery(connectionOptions: ConnectionOptions, ...query: Query[]): Promise; diff --git a/lib/es6/Dynamics/DynamicsBatch.js b/lib/es6/Dynamics/DynamicsBatch.js index 16e2335..f793ac9 100644 --- a/lib/es6/Dynamics/DynamicsBatch.js +++ b/lib/es6/Dynamics/DynamicsBatch.js @@ -1,45 +1,52 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { GetRootQuery } from "../Query/Query"; import GetQueryXml from "../Query/QueryXml"; -import { DefaultMaxRecords, DynamicsHeaders, WebApiVersion } from "./Dynamics"; -import { formatDynamicsResponse } from "./DynamicsRequest"; -export function dynamicsBatch(headers) { - return new Batch(headers); +import { DefaultMaxRecords, DynamicsHeaders } from "./Dynamics"; +import { formatDynamicsResponse, AuthenticationType } from "./DynamicsRequest"; +import * as httpntlm from "httpntlm"; +import fetch from "node-fetch"; +export function dynamicsBatch(connectionOptions, headers) { + return new Batch(connectionOptions, headers); } -export function dynamicsBatchRequest(...url) { - const batch = new Batch(); +export function dynamicsBatchRequest(connectionOptions, ...url) { + const batch = new Batch(connectionOptions); batch.requestAllUrls(url); return batch.execute(); } -export function dynamicsBatchQuery(...query) { - const batch = new Batch(); +export function dynamicsBatchQuery(connectionOptions, ...query) { + const batch = new Batch(connectionOptions); batch.requestAll(query); return batch.execute(); } class Batch { - constructor(headers) { + constructor(options, headers) { + this.options = options; this.headers = headers; + this.ConnectionOptions = options; this.Changes = []; this.RelatedChanges = []; } execute() { return __awaiter(this, void 0, void 0, function* () { - const results = yield Batch.requestBatch(`/api/data/${WebApiVersion}/$batch`, this.Changes, this.headers); + const results = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.Changes, this.headers); if (this.RelatedChanges.length > 0) { for (let change of this.RelatedChanges) { - let changeIndex = this.Changes.indexOf(change.relatedChange); - let relatedId = results[changeIndex]; - change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + if (change !== undefined && change.relatedChange) { + let changeIndex = this.Changes.indexOf(change.relatedChange); + let relatedId = results !== undefined ? results[changeIndex] : undefined; + change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + } } - const related = yield Batch.requestBatch(`/api/data/${WebApiVersion}/$batch`, this.RelatedChanges, this.headers); - return results.concat(related); + const related = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.RelatedChanges, this.headers); + return results !== undefined ? results.concat(related) : undefined; } else { return results; @@ -90,8 +97,9 @@ class Batch { } createRelatedEntity(entitySetName, data, navigationPropertyName) { let lastChange = this.Changes[this.Changes.length - 1]; - if (!lastChange || lastChange.entityData == 'DELETE') + if (!lastChange || lastChange.entityData === 'DELETE') { throw new Error('createRelatedEntity relies on the previous change which was not found in the batch.'); + } if (lastChange.entityId) { data[`${navigationPropertyName}@odata.bind`] = `${lastChange.entitySetName}(${lastChange.entityId})`; this.Changes.push({ @@ -108,16 +116,42 @@ class Batch { }); } } - static requestBatch(url, requests, headers) { + static requestBatch(connectionOptions, url, requests, headers) { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; const batchId = Batch.createId(); - return fetch(url, { - method: 'POST', - headers: Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, DynamicsHeaders, headers), - body: Batch.formatBatchRequest(batchId, requests) - }) - .then(response => Batch.formatBatchResponse(response.text())); + if (connectionOptions.authType === AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm.post({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: Batch.formatBatchRequest(connectionOptions, batchId, requests), + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + resolve(Batch.formatBatchResponse(res.responseText)); + }); + }); + } + else { + return fetch(callUrl, { + method: 'POST', + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, 'Authorization': connectionOptions.accessToken }, DynamicsHeaders), headers), + body: Batch.formatBatchRequest(connectionOptions, batchId, requests) + }) + .then(response => Batch.formatBatchResponse(response.text())); + } } - static formatBatchRequest(batchId, changes) { + static formatBatchRequest(connectionOptions, batchId, changes) { let batchBody = []; let requestBody = []; let changeNumber = 1; @@ -132,7 +166,7 @@ class Batch { requestBody.push('Content-Transfer-Encoding:binary'); requestBody.push(''); if (change.entitySetName) { - requestBody.push(`GET ${encodeURI(`/api/data/${WebApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); + requestBody.push(`GET ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); } else { requestBody.push(`GET ${encodeURI(change.entitySetQuery)} HTTP/1.1`); @@ -147,7 +181,7 @@ class Batch { batchBody.push('Content-Transfer-Encoding:binary'); batchBody.push(`Content-ID: ${changeNumber++}`); batchBody.push(''); - batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${WebApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); + batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); batchBody.push('Content-Type: application/json;type=entry'); batchBody.push(''); batchBody.push(JSON.stringify(change.entityData)); @@ -193,6 +227,10 @@ class Batch { return 'id' + Math.random().toString(16).slice(2); } static trimId(id) { - return (id || '').replace(/{|}/g, ''); + if (id !== undefined) { + return (id || '').replace(/{|}/g, ''); + } + return undefined; } } +//# sourceMappingURL=DynamicsBatch.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsBatch.js.map b/lib/es6/Dynamics/DynamicsBatch.js.map new file mode 100644 index 0000000..c4a9120 --- /dev/null +++ b/lib/es6/Dynamics/DynamicsBatch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsBatch.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsBatch.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AACrD,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAqB,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,MAAM,YAAY,CAAC;AAY/B,MAAM,UAAU,aAAa,CAAC,iBAAoC,EAAE,OAAa;IAC7E,OAAO,IAAI,KAAK,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAU,iBAAoC,EAAE,GAAG,GAAa;IAChG,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3C,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAE1B,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAU,iBAAoC,EAAE,GAAG,KAAc;IAC/F,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3C,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC;AAWD,MAAM,KAAK;IAKP,YAAoB,OAA0B,EAAU,OAAa;QAAjD,YAAO,GAAP,OAAO,CAAmB;QAAU,YAAO,GAAP,OAAO,CAAM;QACjE,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC7B,CAAC;IAEK,OAAO;;YACT,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzJ,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;oBACpC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,EAChD;wBACI,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;wBAC7D,IAAI,SAAS,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBACzE,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,mBAAmB,aAAa,CAAC,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;qBACvI;iBACJ;gBAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEhK,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;aACtE;iBACI;gBACD,OAAO,OAAO,CAAC;aAClB;QACL,CAAC;KAAA;IAED,cAAc,CAAC,IAAc;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QAExF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU,CAAC,OAAgB;QACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACxC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAEpB,OAAO;gBACH,aAAa,EAAE,SAAS,CAAC,UAAU;gBACnC,cAAc,EAAE,YAAY,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE;aAC3D,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,KAAY,EAAE,cAAsB,iBAAiB;QACzD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;SACvF;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,SAAS,CAAC,UAAU;YACnC,cAAc,EAAE,YAAY,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE;SACxE,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,aAAqB,EAAE,EAAU;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,QAAQ;SACvB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU,CAAC,aAAqB,EAAE,IAAS,EAAE,EAAW;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,mBAAmB,CAAC,aAAqB,EAAE,IAAS,EAAE,sBAA8B;QAChF,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,KAAK,QAAQ,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;SAAE;QAClK,IAAI,UAAU,CAAC,QAAQ,EAAE;YACrB,IAAI,CAAC,GAAG,sBAAsB,aAAa,CAAC,GAAG,GAAG,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,QAAQ,GAAG,CAAC;YACrG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACd,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,IAAI;aACnB,CAAC,CAAC;SACN;aACI;YACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,UAAU;gBACzB,mBAAmB,EAAE,sBAAsB;aAC9C,CAAC,CAAC;SACN;IACL,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,iBAAoC,EAAE,GAAW,EAAE,QAAwB,EAAE,OAAa;QAC1G,IAAI,OAAO,GAAW,iBAAiB,CAAC,SAAS,CAAC;QAElD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EACzB;YACI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACnD;QAED,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC;QAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjC,IAAI,iBAAiB,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,EAC7D;YACI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAEnC,QAAQ,CAAC,IAAI,CAAC;oBACV,GAAG,EAAE,OAAO;oBACZ,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;oBACpC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ;oBACpC,WAAW,EAAE,iBAAiB,CAAC,WAAW,IAAI,EAAE;oBAChD,MAAM,EAAE,iBAAiB,CAAC,MAAM,IAAI,EAAE;oBACtC,IAAI,EAAE,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,CAAC;oBACpE,OAAO,gCACH,cAAc,EAAE,kCAAkC,OAAO,EAAE,IACxD,eAAe,GACf,OAAO,CACb;iBACJ,EAAE,UAAU,GAAG,EAAE,GAAG;oBACjB,IAAI,GAAG,EACP;wBACI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAEnB,MAAM,CAAC,GAAG,CAAC,CAAC;qBACf;oBAED,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;SACN;aAED;YACI,OAAO,KAAK,CAAC,OAAO,EAAE;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,gCACH,cAAc,EAAE,kCAAkC,OAAO,EAAE,EAC3D,eAAe,EAAE,iBAAiB,CAAC,WAAW,IAC3C,eAAe,GACf,OAAO,CACb;gBACD,IAAI,EAAE,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,CAAC;aACvE,CAAC;iBACG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACrE;IACL,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,iBAAmC,EAAE,OAAe,EAAE,OAAuB;QACnG,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,oDAAoD,WAAW,EAAE,CAAC,CAAC;QAClF,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE;YACxB,IAAI,MAAM,CAAC,cAAc,EAAE;gBACvB,WAAW,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;gBACvC,WAAW,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBACnD,WAAW,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBACrD,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrB,IAAI,MAAM,CAAC,aAAa,EAAE;oBACtB,WAAW,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,aAAa,iBAAiB,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAC;iBAClJ;qBACI;oBACD,WAAW,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;iBACxE;gBACD,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC7C,WAAW,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;gBAClG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB;iBACI;gBACD,SAAS,CAAC,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;gBAC7C,SAAS,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBACjD,SAAS,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBACnD,SAAS,CAAC,IAAI,CAAC,eAAe,YAAY,EAAE,EAAE,CAAC,CAAC;gBAChD,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnB,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,aAAa,iBAAiB,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACxL,SAAS,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;gBAC5D,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;aACrD;SACJ;QACD,SAAS,CAAC,IAAI,CAAC,eAAe,WAAW,IAAI,CAAC,CAAC;QAC/C,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;QACvC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,YAA6B;QACpD,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAChC,IAAI,QAAQ,EAAE;gBACV,IAAI,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;uBAClC,QAAQ,CAAC,OAAO,CAAC,oCAAoC,CAAC,GAAG,CAAC,CAAC;uBAC3D,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,EAAE;oBACtD,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,QAAQ,CAAC,CAAC;iBACvD;qBACI;oBACD,IAAI,IAAI,GAAG,EAAE,CAAC;oBACd,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACtD,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;wBAC5B,IAAI,SAAS,GAAG,CAAC,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC7E,IAAI,QAAQ,GAAG,CAAC,CAAC,+BAA+B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpF,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;qBAClC;oBACD,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACjD,KAAK,IAAI,OAAO,IAAI,QAAQ,EAAE;wBAC1B,6DAA6D;wBAC7D,IAAI,OAAO,CAAC,OAAO,CAAC,2CAA2C,CAAC,GAAG,CAAC,CAAC,EAAE;4BACnE,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;4BACzC,IAAI,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;4BAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAC5B,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;yBAC3C;qBACJ;oBACD,OAAO,IAAI,CAAC;iBACf;aACJ;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,QAAQ;QACX,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,EAAsB;QAChC,IAAI,EAAE,KAAK,SAAS,EACpB;YACI,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACzC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"} \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsDiscovery.d.ts b/lib/es6/Dynamics/DynamicsDiscovery.d.ts new file mode 100644 index 0000000..6c531d2 --- /dev/null +++ b/lib/es6/Dynamics/DynamicsDiscovery.d.ts @@ -0,0 +1,8 @@ +import { ConnectionOptions } from "./DynamicsRequest"; +import { OrganizationMetadata } from "./Model/OrganizationMetadata"; +export declare type OrganizationMetadata = OrganizationMetadata; +export declare const DefaultDiscoveryApiVersion = "v9.1"; +export default function dynamicsDiscovery(connectionOptions?: ConnectionOptions): DynamicsDiscovery; +export interface DynamicsDiscovery { + discover(): Promise; +} diff --git a/lib/es6/Dynamics/DynamicsDiscovery.js b/lib/es6/Dynamics/DynamicsDiscovery.js new file mode 100644 index 0000000..ec037a3 --- /dev/null +++ b/lib/es6/Dynamics/DynamicsDiscovery.js @@ -0,0 +1,19 @@ +import { dynamicsRequest } from "./DynamicsRequest"; +export const DefaultDiscoveryApiVersion = 'v9.1'; +export default function dynamicsDiscovery(connectionOptions) { + return new DynamicsDiscoveryClient(connectionOptions); +} +class DynamicsDiscoveryClient { + constructor(options) { + if (options) { + this.connectionOptions = options; + if (!options.webApiVersion) { + this.connectionOptions.webApiVersion = DefaultDiscoveryApiVersion; + } + } + } + discover() { + return dynamicsRequest(this.connectionOptions, `/api/discovery/${this.connectionOptions.webApiVersion}/Instances`, this.dynamicsHeaders); + } +} +//# sourceMappingURL=DynamicsDiscovery.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsDiscovery.js.map b/lib/es6/Dynamics/DynamicsDiscovery.js.map new file mode 100644 index 0000000..6543440 --- /dev/null +++ b/lib/es6/Dynamics/DynamicsDiscovery.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsDiscovery.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsDiscovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAqB,MAAM,mBAAmB,CAAC;AAKvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEjD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,iBAAqC;IAC3E,OAAO,IAAI,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;AAC1D,CAAC;AAMD,MAAM,uBAAuB;IAIzB,YAAY,OAA0B;QAClC,IAAI,OAAO,EACX;YACI,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;YAEjC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC1B;gBACI,IAAI,CAAC,iBAAiB,CAAC,aAAa,GAAG,0BAA0B,CAAC;aACrE;SACJ;IACL,CAAC;IAED,QAAQ;QACJ,OAAO,eAAe,CAAyB,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,IAAI,CAAC,iBAAiB,CAAC,aAAa,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACrK,CAAC;CACJ"} \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsMetadata.d.ts b/lib/es6/Dynamics/DynamicsMetadata.d.ts index e1c6ff1..c64f886 100644 --- a/lib/es6/Dynamics/DynamicsMetadata.d.ts +++ b/lib/es6/Dynamics/DynamicsMetadata.d.ts @@ -1,3 +1,4 @@ +import { ConnectionOptions } from "./DynamicsRequest"; import { AttributeMetadata, EntityAttributeMetadata, LookupAttributeMetadata } from "./Model/AttributeMetadata"; import { EntityMetadata } from "./Model/EntityMetadata"; import { OptionSetAttributeMetadata, OptionSetMetadata } from "./Model/OptionSetMetadata"; @@ -6,7 +7,7 @@ export declare type DynamicsAttributeMetadata = AnyAttributeMetadata; export declare type DynamicsOptionSetMetadata = OptionSetMetadata; export declare type DynamicsLookupAttributeMetadata = LookupAttributeMetadata; export declare type DynamicsOptionSetAttributeMetadata = OptionSetAttributeMetadata; -export default function dynamicsMetadata(accessToken?: string): DynamicsMetadata; +export default function dynamicsmetdata(connectionOptions?: ConnectionOptions): DynamicsMetadata; export declare function isLookupAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsLookupAttributeMetadata; export declare function isOptionSetAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsOptionSetAttributeMetadata; export interface DynamicsMetadata { diff --git a/lib/es6/Dynamics/DynamicsMetadata.js b/lib/es6/Dynamics/DynamicsMetadata.js index 05b6506..55113ec 100644 --- a/lib/es6/Dynamics/DynamicsMetadata.js +++ b/lib/es6/Dynamics/DynamicsMetadata.js @@ -1,8 +1,7 @@ -import { WebApiVersion } from "./Dynamics"; import { dynamicsBatch } from "./DynamicsBatch"; import { dynamicsRequest } from "./DynamicsRequest"; -export default function dynamicsMetadata(accessToken) { - return new DynamicsMetadataClient(accessToken); +export default function dynamicsmetdata(connectionOptions) { + return new DynamicsMetadataClient(connectionOptions); } export function isLookupAttribute(attribute) { return attribute.Type === 'Lookup' && attribute['LookupEntityName']; @@ -45,31 +44,31 @@ const ExcludedAttributeNameFilters = [ 'entityimage_timestamp' ]; class DynamicsMetadataClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } attributes(entityName) { - return dynamicsBatch(this.dynamicsHeaders) + return dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.getMetadataUrls(entityName, false)) .execute() .then(data => this.flatten(data) - .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') != attribute.LogicalName.length - 4) + .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') !== attribute.LogicalName.length - 4) .map(DynamicsMetadataMapper.MapAttribute)); } entities() { - return dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(data => data .map(entity => DynamicsMetadataMapper.MapEntity(entity))); } entity(entityName) { - return dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(entity => this.attributes(entityName) .then(attributes => DynamicsMetadataMapper.MapEntity(entity, attributes))); } entityAttributes(...entityNames) { - return dynamicsBatch(this.dynamicsHeaders) + return dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.flatten(entityNames.map(e => this.getMetadataUrls(e, true)))) .execute() .then(data => { @@ -81,7 +80,7 @@ class DynamicsMetadataClient { currentEntity = DynamicsMetadataMapper.MapEntity(item); entities.push(currentEntity); } - else if (item.LogicalName.indexOf('yomi') == -1 && item.LogicalName.indexOf('base') != item.LogicalName.length - 4) { + else if (item.LogicalName.indexOf('yomi') === -1 && item.LogicalName.indexOf('base') !== item.LogicalName.length - 4) { currentEntity.Attributes.push(DynamicsMetadataMapper.MapAttribute(item)); } } @@ -92,12 +91,12 @@ class DynamicsMetadataClient { const attributeTypeFilter = ExcludedAttributeTypeFilters.map(v => `AttributeType ne Microsoft.Dynamics.CRM.AttributeTypeCode'${v}'`).join(' and '); const attributeNameFilter = ExcludedAttributeNameFilters.map(v => `LogicalName ne '${v}'`).join(' and '); return [ - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` ].slice(includeEntity ? 0 : 1); } flatten(values) { @@ -140,3 +139,4 @@ function isLookup(attribute) { function isOptionSet(attribute) { return attribute['OptionSet'] && Array.isArray(attribute['OptionSet'].Options); } +//# sourceMappingURL=DynamicsMetadata.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsMetadata.js.map b/lib/es6/Dynamics/DynamicsMetadata.js.map new file mode 100644 index 0000000..f5c1f29 --- /dev/null +++ b/lib/es6/Dynamics/DynamicsMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsMetadata.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsMetadata.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsRequest.d.ts b/lib/es6/Dynamics/DynamicsRequest.d.ts index a6d8062..9e1e264 100644 --- a/lib/es6/Dynamics/DynamicsRequest.d.ts +++ b/lib/es6/Dynamics/DynamicsRequest.d.ts @@ -1,6 +1,20 @@ import { Query } from "../Query/Query"; -export declare function dynamicsQuery(query: Query, maxRowCount?: number, headers?: any): Promise; -export declare function dynamicsQueryUrl(dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; -export declare function dynamicsRequest(dynamicsEntitySetUrl: string, headers?: any): Promise; -export declare function dynamicsSave(entitySetName: string, data: any, id?: string, headers?: any): Promise; +export declare enum AuthenticationType { + Windows = 1, + OAuth = 2 +} +export declare class ConnectionOptions { + authType: AuthenticationType; + username?: string; + password?: string; + domain?: string; + workstation?: string; + accessToken?: string; + serverUrl: string; + webApiVersion: string; +} +export declare function dynamicsQuery(connectionOptions: ConnectionOptions, query: Query, maxRowCount?: number, headers?: any): Promise; +export declare function dynamicsQueryUrl(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; +export declare function dynamicsRequest(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, headers?: any): Promise; +export declare function dynamicsSave(connectionOptions: ConnectionOptions, entitySetName: string, data: any, id?: string, headers?: any): Promise; export declare function formatDynamicsResponse(data: any): any; diff --git a/lib/es6/Dynamics/DynamicsRequest.js b/lib/es6/Dynamics/DynamicsRequest.js index e267914..a38b2c7 100644 --- a/lib/es6/Dynamics/DynamicsRequest.js +++ b/lib/es6/Dynamics/DynamicsRequest.js @@ -1,27 +1,58 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; import { GetRootQuery } from "../Query/Query"; import GetQueryXml from "../Query/QueryXml"; -import { DynamicsHeaders, WebApiVersion } from "./Dynamics"; -export function dynamicsQuery(query, maxRowCount, headers) { - const dataQuery = GetRootQuery(query); - if (!dataQuery.EntityPath) { - throw new Error('dynamicsQuery requires a Query object with an EntityPath'); +import { DynamicsHeaders, DefaultWebApiVersion } from "./Dynamics"; +import * as httpntlm from "httpntlm"; +import fetch from "node-fetch"; +export var AuthenticationType; +(function (AuthenticationType) { + AuthenticationType[AuthenticationType["Windows"] = 1] = "Windows"; + AuthenticationType[AuthenticationType["OAuth"] = 2] = "OAuth"; +})(AuthenticationType || (AuthenticationType = {})); +export class ConnectionOptions { + constructor() { + this.authType = AuthenticationType.OAuth; + this.serverUrl = ""; + this.webApiVersion = DefaultWebApiVersion; } - return dynamicsQueryUrl(`/api/data/${WebApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); } -export function dynamicsQueryUrl(dynamicsEntitySetUrl, query, maxRowCount, headers) { - const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); - return request(`${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(GetQueryXml(query, maxRowCount))}`, 'GET', undefined, headers); +export function dynamicsQuery(connectionOptions, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const dataQuery = GetRootQuery(query); + if (!dataQuery.EntityPath) { + throw new Error('dynamicsQuery requires a Query object with an EntityPath'); + } + return yield dynamicsQueryUrl(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + }); } -export function dynamicsRequest(dynamicsEntitySetUrl, headers) { - return request(dynamicsEntitySetUrl, 'GET', undefined, headers); +export function dynamicsQueryUrl(connectionOptions, dynamicsEntitySetUrl, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); + return yield request(connectionOptions, `${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(GetQueryXml(query, maxRowCount))}`, 'GET', undefined, headers); + }); } -export function dynamicsSave(entitySetName, data, id, headers) { - if (id) { - return request(`/api/data/${WebApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); - } - else { - return request(`/api/data/${WebApiVersion}/${entitySetName}()`, 'POST', data, headers); - } +export function dynamicsRequest(connectionOptions, dynamicsEntitySetUrl, headers) { + return __awaiter(this, void 0, void 0, function* () { + return yield request(connectionOptions, dynamicsEntitySetUrl, 'GET', undefined, headers); + }); +} +export function dynamicsSave(connectionOptions, entitySetName, data, id, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (id) { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); + } + else { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}()`, 'POST', data, headers); + } + }); } export function formatDynamicsResponse(data) { var items = []; @@ -36,10 +67,10 @@ export function formatDynamicsResponse(data) { } if (data) { for (var item of data) { - var row = {}; - for (var key in item) { + let row = {}; + for (let key in item) { var name = key; - if (name.indexOf('@odata') == 0) { + if (name.indexOf('@odata') === 0) { continue; } if (name.indexOf('transactioncurrencyid') > -1) { @@ -47,12 +78,12 @@ export function formatDynamicsResponse(data) { } if (name.indexOf('@') > -1) { name = name.substring(0, name.indexOf('@')); - if (name.indexOf('_') == 0) { + if (name.indexOf('_') === 0) { name = name.slice(1, -6); } name += "_formatted"; } - else if (name.indexOf('_') == 0) { + else if (name.indexOf('_') === 0) { name = name.slice(1, -6); } if (name.indexOf('_x002e_') > -1) { @@ -72,15 +103,56 @@ export function formatDynamicsResponse(data) { } return items; } -function request(url, method, body, headers) { - return fetch(url, { - method: method, - headers: Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, DynamicsHeaders, headers), - body: body - }) - .then(response => response.json()) - .then(data => formatDynamicsResponse(data)); +function request(connectionOptions, url, method, body, headers) { + return __awaiter(this, void 0, void 0, function* () { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; + //TODO: fetch if we can. + if (connectionOptions.authType === AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm[method.toLowerCase()]({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: body, + headers: Object.assign(Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + const json = JSON.parse(res.body); + if (json.error) { + console.error(json.error.message); + reject(json.error.message); + } + else if (json.ExceptionMessage) { + console.error(json.ExceptionMessage); + reject(`The service call returned HTTP ${json.ErrorCode} - ${json.ExceptionMessage}`); + } + else { + resolve(formatDynamicsResponse(json)); + } + }); + }); + } + else { + return fetch(url, { + method: method, + headers: Object.assign(Object.assign({ 'Authorization': `Bearer ${connectionOptions.accessToken}`, 'Content-Type': 'application/json; charset=utf-8' }, DynamicsHeaders), headers), + body: body + }) + .then(response => response.json()) + .then(data => formatDynamicsResponse(data)); + } + }); } function trimId(id) { return (id || '').replace(/{|}/g, ''); } +//# sourceMappingURL=DynamicsRequest.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/DynamicsRequest.js.map b/lib/es6/Dynamics/DynamicsRequest.js.map new file mode 100644 index 0000000..7e1feed --- /dev/null +++ b/lib/es6/Dynamics/DynamicsRequest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DynamicsRequest.js","sourceRoot":"","sources":["../../../src/Dynamics/DynamicsRequest.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/AttributeMetadata.js b/lib/es6/Dynamics/Model/AttributeMetadata.js index 3c38485..71b95ce 100644 --- a/lib/es6/Dynamics/Model/AttributeMetadata.js +++ b/lib/es6/Dynamics/Model/AttributeMetadata.js @@ -15,3 +15,4 @@ export const AttributeTypeCodes = [ 'Status', 'String' ]; +//# sourceMappingURL=AttributeMetadata.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/AttributeMetadata.js.map b/lib/es6/Dynamics/Model/AttributeMetadata.js.map new file mode 100644 index 0000000..b1dfbcd --- /dev/null +++ b/lib/es6/Dynamics/Model/AttributeMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AttributeMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/AttributeMetadata.ts"],"names":[],"mappings":"AAoCA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,WAAW;IACX,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;CACX,CAAC"} \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/EntityMetadata.js b/lib/es6/Dynamics/Model/EntityMetadata.js index e69de29..0a1c5ba 100644 --- a/lib/es6/Dynamics/Model/EntityMetadata.js +++ b/lib/es6/Dynamics/Model/EntityMetadata.js @@ -0,0 +1 @@ +//# sourceMappingURL=EntityMetadata.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/EntityMetadata.js.map b/lib/es6/Dynamics/Model/EntityMetadata.js.map new file mode 100644 index 0000000..26dfcd7 --- /dev/null +++ b/lib/es6/Dynamics/Model/EntityMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"EntityMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/EntityMetadata.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/OptionSetMetadata.js b/lib/es6/Dynamics/Model/OptionSetMetadata.js index e69de29..e569170 100644 --- a/lib/es6/Dynamics/Model/OptionSetMetadata.js +++ b/lib/es6/Dynamics/Model/OptionSetMetadata.js @@ -0,0 +1 @@ +//# sourceMappingURL=OptionSetMetadata.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/OptionSetMetadata.js.map b/lib/es6/Dynamics/Model/OptionSetMetadata.js.map new file mode 100644 index 0000000..8410470 --- /dev/null +++ b/lib/es6/Dynamics/Model/OptionSetMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"OptionSetMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/OptionSetMetadata.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/OrganizationMetadata.d.ts b/lib/es6/Dynamics/Model/OrganizationMetadata.d.ts new file mode 100644 index 0000000..15e6602 --- /dev/null +++ b/lib/es6/Dynamics/Model/OrganizationMetadata.d.ts @@ -0,0 +1,11 @@ +export interface OrganizationMetadata { + Id?: string; + UniqueName?: string; + UrlName?: string; + FriendlyName?: string; + State?: number; + Version?: string; + Uri?: string; + AppUri?: string; + LastUpdated?: Date; +} diff --git a/lib/es6/Dynamics/Model/OrganizationMetadata.js b/lib/es6/Dynamics/Model/OrganizationMetadata.js new file mode 100644 index 0000000..913d8d1 --- /dev/null +++ b/lib/es6/Dynamics/Model/OrganizationMetadata.js @@ -0,0 +1 @@ +//# sourceMappingURL=OrganizationMetadata.js.map \ No newline at end of file diff --git a/lib/es6/Dynamics/Model/OrganizationMetadata.js.map b/lib/es6/Dynamics/Model/OrganizationMetadata.js.map new file mode 100644 index 0000000..c636362 --- /dev/null +++ b/lib/es6/Dynamics/Model/OrganizationMetadata.js.map @@ -0,0 +1 @@ +{"version":3,"file":"OrganizationMetadata.js","sourceRoot":"","sources":["../../../../src/Dynamics/Model/OrganizationMetadata.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/es6/Query/Query.d.ts b/lib/es6/Query/Query.d.ts index d9ab90a..af078d7 100644 --- a/lib/es6/Query/Query.d.ts +++ b/lib/es6/Query/Query.d.ts @@ -19,6 +19,7 @@ export interface DataQueryJoin extends DataQuery { IsOuterJoin?: boolean; } export interface Query { + [key: string]: any; alias(attributeName: string, alias: string): Query; path(entityPath: string): Query; select(...attributeNames: string[]): Query; diff --git a/lib/es6/Query/Query.js b/lib/es6/Query/Query.js index 898dedf..1ebfb55 100644 --- a/lib/es6/Query/Query.js +++ b/lib/es6/Query/Query.js @@ -64,7 +64,7 @@ class QueryProvider { return this; } whereAny(any) { - var conditions = []; + let conditions = []; any((attributeName, operator, ...values) => { conditions.push({ AttributeName: attributeName, @@ -99,3 +99,4 @@ class QueryProvider { return [].concat(...values); } } +//# sourceMappingURL=Query.js.map \ No newline at end of file diff --git a/lib/es6/Query/Query.js.map b/lib/es6/Query/Query.js.map new file mode 100644 index 0000000..5f8ea6f --- /dev/null +++ b/lib/es6/Query/Query.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Query.js","sourceRoot":"","sources":["../../../src/Query/Query.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/es6/Query/QueryXml.js b/lib/es6/Query/QueryXml.js index e2693d5..54dddbc 100644 --- a/lib/es6/Query/QueryXml.js +++ b/lib/es6/Query/QueryXml.js @@ -32,7 +32,7 @@ function getQueryXml(query) { } }); query.OrderBy.forEach(attribute => { - if (attribute.indexOf('_') == 0) { + if (attribute.indexOf('_') === 0) { xml.push(``); } else { @@ -109,16 +109,21 @@ function getConditionXml(condition) { return xml.join('\n'); } function encodeValue(value) { - if (value === 0) + if (value === 0) { return '0'; - if (value === true) + } + if (value === true) { return 'true'; - if (value === false) + } + if (value === false) { return 'false'; - if (!value) + } + if (!value) { return ''; - if (typeof (value.toISOString) === 'function') + } + if (typeof (value.toISOString) === 'function') { return value.toISOString(); + } return xmlEncode(value.toString()); } function xmlEncode(text) { @@ -137,8 +142,9 @@ function formatXml(xmlString) { return xmlString.replace(/\s*<[^>\/]*>[^<>]*<\/[^>]*>|\s*<.+?>|\s*[^<]+/g, //pattern to match nodes (angled brackets or text) function (m, i) { m = m.replace(/^\s+|\s+$/g, ""); //trim the match just in case - if (i < 38 && /^<[?]xml/.test(m)) - return m + "\n"; //if the match is a header, ignore it + if (i < 38 && /^<[?]xml/.test(m)) { + return m + "\n"; + } //if the match is a header, ignore it if (/^<[/]/.test(m)) //if the match is a closing tag { tabs = tabs.replace(indent, ""); //remove one indent from the store @@ -163,3 +169,4 @@ function formatXml(xmlString) { return "\n" + m; //content has additional space(match) from header }); } +//# sourceMappingURL=QueryXml.js.map \ No newline at end of file diff --git a/lib/es6/Query/QueryXml.js.map b/lib/es6/Query/QueryXml.js.map new file mode 100644 index 0000000..4619b38 --- /dev/null +++ b/lib/es6/Query/QueryXml.js.map @@ -0,0 +1 @@ +{"version":3,"file":"QueryXml.js","sourceRoot":"","sources":["../../../src/Query/QueryXml.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/es6/ntlm/hash.d.ts b/lib/es6/ntlm/hash.d.ts new file mode 100644 index 0000000..726df27 --- /dev/null +++ b/lib/es6/ntlm/hash.d.ts @@ -0,0 +1,16 @@ +/// +import { Type2Message } from './type2.message'; +export declare class Hash { + static createLMResponse(challenge: Buffer, lmhash: Buffer): Buffer; + static createLMHash(password: string): Buffer; + static calculateDES(key: Buffer, message: Buffer): Buffer; + static createNTLMResponse(challenge: Buffer, ntlmhash: Buffer): Buffer; + static createNTLMHash(password: string): Buffer; + static createNTLMv2Hash(ntlmhash: Buffer, username: string, authTargetName: string): Buffer; + static createLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string): Buffer; + static createNTLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createMIC(type1message: Buffer, type2message: Type2Message, type3message: Buffer, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string): Buffer; + static createRandomSessionKey(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createPseudoRandomValue(length: number): string; + static createTimestamp(): string; +} diff --git a/lib/es6/ntlm/hash.js b/lib/es6/ntlm/hash.js new file mode 100644 index 0000000..2880e15 --- /dev/null +++ b/lib/es6/ntlm/hash.js @@ -0,0 +1,159 @@ +'use strict'; +import * as crypto from 'crypto'; +export class Hash { + static createLMResponse(challenge, lmhash) { + let buf = Buffer.alloc(24); + let pwBuffer = Buffer.alloc(21).fill(0); + lmhash.copy(pwBuffer); + Hash.calculateDES(pwBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(pwBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(pwBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createLMHash(password) { + let buf = Buffer.alloc(16), pwBuffer = Buffer.alloc(14), magicKey = Buffer.from('KGS!@#$%', 'ascii'); + if (password.length > 14) { + buf.fill(0); + return buf; + } + pwBuffer.fill(0); + pwBuffer.write(password.toUpperCase(), 0, 'ascii'); + return Buffer.concat([ + Hash.calculateDES(pwBuffer.slice(0, 7), magicKey), + Hash.calculateDES(pwBuffer.slice(7), magicKey) + ]); + } + static calculateDES(key, message) { + let desKey = Buffer.alloc(8); + desKey[0] = key[0] & 0xFE; + desKey[1] = ((key[0] << 7) & 0xFF) | (key[1] >> 1); + desKey[2] = ((key[1] << 6) & 0xFF) | (key[2] >> 2); + desKey[3] = ((key[2] << 5) & 0xFF) | (key[3] >> 3); + desKey[4] = ((key[3] << 4) & 0xFF) | (key[4] >> 4); + desKey[5] = ((key[4] << 3) & 0xFF) | (key[5] >> 5); + desKey[6] = ((key[5] << 2) & 0xFF) | (key[6] >> 6); + desKey[7] = (key[6] << 1) & 0xFF; + for (let i = 0; i < 8; i++) { + let parity = 0; + for (let j = 1; j < 8; j++) { + parity += (desKey[i] >> j) % 2; + } + desKey[i] |= (parity % 2) === 0 ? 1 : 0; + } + let des = crypto.createCipheriv('DES-ECB', desKey, ''); + return des.update(message); + } + static createNTLMResponse(challenge, ntlmhash) { + let buf = Buffer.alloc(24), ntlmBuffer = Buffer.alloc(21).fill(0); + ntlmhash.copy(ntlmBuffer); + Hash.calculateDES(ntlmBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(ntlmBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(ntlmBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createNTLMHash(password) { + let md4sum = crypto.createHash('md4'); + md4sum.update(Buffer.from(password, 'ucs2')); // lgtm[js/insufficient-password-hash] + return md4sum.digest(); + } + static createNTLMv2Hash(ntlmhash, username, authTargetName) { + let hmac = crypto.createHmac('md5', ntlmhash); + hmac.update(Buffer.from(username.toUpperCase() + authTargetName, 'ucs2')); // lgtm[js/weak-cryptographic-algorithm] + return hmac.digest(); + } + static createLMv2Response(type2message, username, authTargetName, ntlmhash, nonce) { + let buf = Buffer.alloc(24); + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let hmac = crypto.createHmac('md5', ntlm2hash); + //server challenge + type2message.challenge.copy(buf, 8); + //client nonce + buf.write(nonce, 16, 'hex'); + //create hash + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let bufferSize = 48 + type2message.targetInfo.buffer.length; + if (withMic) { + bufferSize += 8; + } + let buf = Buffer.alloc(bufferSize), ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName), hmac = crypto.createHmac('md5', ntlm2hash); + //the first 8 bytes are spare to store the hashed value before the blob + //server challenge + type2message.challenge.copy(buf, 8); + //blob signature + buf.writeUInt32BE(0x01010000, 16); + //reserved + buf.writeUInt32LE(0, 20); + //timestamp + let timestampLow = Number('0x' + timestamp.substring(Math.max(0, timestamp.length - 8))); + let timestampHigh = Number('0x' + timestamp.substring(0, Math.max(0, timestamp.length - 8))); + buf.writeUInt32LE(timestampLow, 24); + buf.writeUInt32LE(timestampHigh, 28); + //random client nonce + buf.write(nonce, 32, 'hex'); + //zero + buf.writeUInt32LE(0, 40); + //complete target information block from type 2 message + type2message.targetInfo.buffer.copy(buf, 44); + let bufferPos = 44 + type2message.targetInfo.buffer.length; + if (withMic) { + // Should include MIC in response, indicate it in AV_FLAGS + buf.writeUInt16LE(0x06, bufferPos - 4); + buf.writeUInt16LE(0x04, bufferPos - 2); + buf.writeUInt32LE(0x02, bufferPos); + // Write new endblock + buf.writeUInt32LE(0, bufferPos + 4); + bufferPos += 8; + } + //zero + buf.writeUInt32LE(0, bufferPos); + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createMIC(type1message, type2message, type3message, username, authTargetName, ntlmhash, nonce, timestamp) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, true); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + //create MIC hash + hmac = crypto.createHmac('md5', key_exchange_key); + hmac.update(type1message); + hmac.update(type2message.raw); + hmac.update(type3message); + let hashedBuffer = hmac.digest(); + return hashedBuffer; + } + static createRandomSessionKey(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + let exported_session_key_hex = Hash.createPseudoRandomValue(32); + let exported_session_key = Buffer.from(exported_session_key_hex, 'hex'); + let rc4 = crypto.createCipheriv('rc4', key_exchange_key, ''); + let encrypted_random_session_key = rc4.update(exported_session_key); + return encrypted_random_session_key; + } + static createPseudoRandomValue(length) { + let str = ''; + while (str.length < length) { + str += Math.floor(Math.random() * 16).toString(16); + } + return str; + } + static createTimestamp() { + //TODO: we are loosing precision here since js is not able to handle those large integers + // maybe think about a different solution here + // 11644473600000 = diff between 1970 and 1601 + return ((Date.now() + 11644473600000) * 10000).toString(16); + } +} +//# sourceMappingURL=hash.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/hash.js.map b/lib/es6/ntlm/hash.js.map new file mode 100644 index 0000000..3203003 --- /dev/null +++ b/lib/es6/ntlm/hash.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/ntlm/hash.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/es6/ntlm/interfaces/i.ntlm.d.ts b/lib/es6/ntlm/interfaces/i.ntlm.d.ts new file mode 100644 index 0000000..855a424 --- /dev/null +++ b/lib/es6/ntlm/interfaces/i.ntlm.d.ts @@ -0,0 +1,7 @@ +import { Type2Message } from "../type2.message"; +import { NtlmMessage } from "../ntlm.message"; +export interface INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2Message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce: string | undefined, timestamp: string | undefined): NtlmMessage; +} diff --git a/lib/es6/ntlm/interfaces/i.ntlm.js b/lib/es6/ntlm/interfaces/i.ntlm.js new file mode 100644 index 0000000..e9ec7b3 --- /dev/null +++ b/lib/es6/ntlm/interfaces/i.ntlm.js @@ -0,0 +1 @@ +//# sourceMappingURL=i.ntlm.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/interfaces/i.ntlm.js.map b/lib/es6/ntlm/interfaces/i.ntlm.js.map new file mode 100644 index 0000000..fc3fbdc --- /dev/null +++ b/lib/es6/ntlm/interfaces/i.ntlm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"i.ntlm.js","sourceRoot":"","sources":["../../../../src/ntlm/interfaces/i.ntlm.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.constants.d.ts b/lib/es6/ntlm/ntlm.constants.d.ts new file mode 100644 index 0000000..0a98088 --- /dev/null +++ b/lib/es6/ntlm/ntlm.constants.d.ts @@ -0,0 +1,3 @@ +export declare class NtlmConstants { + static readonly NTLM_SIGNATURE = "NTLMSSP\0"; +} diff --git a/lib/es6/ntlm/ntlm.constants.js b/lib/es6/ntlm/ntlm.constants.js new file mode 100644 index 0000000..6b7ae60 --- /dev/null +++ b/lib/es6/ntlm/ntlm.constants.js @@ -0,0 +1,4 @@ +export class NtlmConstants { +} +NtlmConstants.NTLM_SIGNATURE = 'NTLMSSP\0'; +//# sourceMappingURL=ntlm.constants.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.constants.js.map b/lib/es6/ntlm/ntlm.constants.js.map new file mode 100644 index 0000000..23b28ce --- /dev/null +++ b/lib/es6/ntlm/ntlm.constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.constants.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.constants.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAa;;AACR,4BAAc,GAAG,WAAW,CAAC"} \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.d.ts b/lib/es6/ntlm/ntlm.d.ts new file mode 100644 index 0000000..0a12dbc --- /dev/null +++ b/lib/es6/ntlm/ntlm.d.ts @@ -0,0 +1,10 @@ +import { INtlm } from './interfaces/i.ntlm'; +import { Type2Message } from './type2.message'; +import { NtlmMessage } from './ntlm.message'; +export default function ntlm(): INtlm; +export declare class Ntlm implements INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + private addVersionStruct; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce_override: string | undefined, timestamp_override: string | undefined): NtlmMessage; +} diff --git a/lib/es6/ntlm/ntlm.flags.d.ts b/lib/es6/ntlm/ntlm.flags.d.ts new file mode 100644 index 0000000..37c462f --- /dev/null +++ b/lib/es6/ntlm/ntlm.flags.d.ts @@ -0,0 +1,28 @@ +export declare enum NtlmFlags { + NEGOTIATE_UNICODE = 1, + NEGOTIATE_OEM = 2, + REQUEST_TARGET = 4, + NEGOTIATE_SIGN = 16, + NEGOTIATE_SEAL = 32, + NEGOTIATE_DATAGRAM_STYLE = 64, + NEGOTIATE_LM_KEY = 128, + NEGOTIATE_NETWARE = 256, + NEGOTIATE_NTLM_KEY = 512, + NEGOTIATE_ANONYMOUS = 2048, + NEGOTIATE_DOMAIN_SUPPLIED = 4096, + NEGOTIATE_WORKSTATION_SUPPLIED = 8192, + NEGOTIATE_LOCAL_CALL = 16384, + NEGOTIATE_ALWAYS_SIGN = 32768, + TARGET_TYPE_DOMAIN = 65536, + TARGET_TYPE_SERVER = 131072, + TARGET_TYPE_SHARE = 262144, + NEGOTIATE_NTLM2_KEY = 524288, + REQUEST_INIT_RESPONSE = 1048576, + REQUEST_ACCEPT_RESPONSE = 2097152, + REQUEST_NONNT_SESSION_KEY = 4194304, + NEGOTIATE_TARGET_INFO = 8388608, + NEGOTIATE_VERSION = 33554432, + NEGOTIATE_128 = 536870912, + NEGOTIATE_KEY_EXCHANGE = 1073741824, + NEGOTIATE_56 = -2147483648 +} diff --git a/lib/es6/ntlm/ntlm.flags.js b/lib/es6/ntlm/ntlm.flags.js new file mode 100644 index 0000000..e26774a --- /dev/null +++ b/lib/es6/ntlm/ntlm.flags.js @@ -0,0 +1,82 @@ +'use strict'; +export var NtlmFlags; +(function (NtlmFlags) { + /* Indicates that Unicode strings are supported for use in security buffer + data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_UNICODE"] = 1] = "NEGOTIATE_UNICODE"; + /* Indicates that OEM strings are supported for use in security buffer data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_OEM"] = 2] = "NEGOTIATE_OEM"; + /* Requests that the server's authentication realm be included in the Type 2 + message. */ + NtlmFlags[NtlmFlags["REQUEST_TARGET"] = 4] = "REQUEST_TARGET"; + /* unknown (1<<3) */ + /* Specifies that authenticated communication between the client and server + should carry a digital signature (message integrity). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SIGN"] = 16] = "NEGOTIATE_SIGN"; + /* Specifies that authenticated communication between the client and server + should be encrypted (message confidentiality). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SEAL"] = 32] = "NEGOTIATE_SEAL"; + /* Indicates that datagram authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DATAGRAM_STYLE"] = 64] = "NEGOTIATE_DATAGRAM_STYLE"; + /* Indicates that the LAN Manager session key should be used for signing and + sealing authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LM_KEY"] = 128] = "NEGOTIATE_LM_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["NEGOTIATE_NETWARE"] = 256] = "NEGOTIATE_NETWARE"; + /* Indicates that NTLM authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM_KEY"] = 512] = "NEGOTIATE_NTLM_KEY"; + /* unknown (1<<10) */ + /* Sent by the client in the Type 3 message to indicate that an anonymous + context has been established. This also affects the response fields. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ANONYMOUS"] = 2048] = "NEGOTIATE_ANONYMOUS"; + /* Sent by the client in the Type 1 message to indicate that a desired + authentication realm is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DOMAIN_SUPPLIED"] = 4096] = "NEGOTIATE_DOMAIN_SUPPLIED"; + /* Sent by the client in the Type 1 message to indicate that the client + workstation's name is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_WORKSTATION_SUPPLIED"] = 8192] = "NEGOTIATE_WORKSTATION_SUPPLIED"; + /* Sent by the server to indicate that the server and client are on the same + machine. Implies that the client may use a pre-established local security + context rather than responding to the challenge. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LOCAL_CALL"] = 16384] = "NEGOTIATE_LOCAL_CALL"; + /* Indicates that authenticated communication between the client and server + should be signed with a "dummy" signature. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ALWAYS_SIGN"] = 32768] = "NEGOTIATE_ALWAYS_SIGN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a domain. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_DOMAIN"] = 65536] = "TARGET_TYPE_DOMAIN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a server. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SERVER"] = 131072] = "TARGET_TYPE_SERVER"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a share. Presumably, this is for share-level + authentication. Usage is unclear. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SHARE"] = 262144] = "TARGET_TYPE_SHARE"; + /* Indicates that the NTLM2 signing and sealing scheme should be used for + protecting authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM2_KEY"] = 524288] = "NEGOTIATE_NTLM2_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_INIT_RESPONSE"] = 1048576] = "REQUEST_INIT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_ACCEPT_RESPONSE"] = 2097152] = "REQUEST_ACCEPT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_NONNT_SESSION_KEY"] = 4194304] = "REQUEST_NONNT_SESSION_KEY"; + /* Sent by the client in the Type 1 message to request Target info block from server. + Sent by the server in the Type 2 message to indicate that it is including a + Target Information block in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_TARGET_INFO"] = 8388608] = "NEGOTIATE_TARGET_INFO"; + /* unknown (1<24) */ + /* Indicates that the version info block is included in the message */ + NtlmFlags[NtlmFlags["NEGOTIATE_VERSION"] = 33554432] = "NEGOTIATE_VERSION"; + /* unknown (1<26) */ + /* unknown (1<27) */ + /* unknown (1<28) */ + /* Indicates that 128-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_128"] = 536870912] = "NEGOTIATE_128"; + /* Indicates that the client will provide an encrypted master key in + the "Session Key" field of the Type 3 message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_KEY_EXCHANGE"] = 1073741824] = "NEGOTIATE_KEY_EXCHANGE"; + /* Indicates that 56-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_56"] = -2147483648] = "NEGOTIATE_56"; +})(NtlmFlags || (NtlmFlags = {})); +//# sourceMappingURL=ntlm.flags.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.flags.js.map b/lib/es6/ntlm/ntlm.flags.js.map new file mode 100644 index 0000000..a5f20c9 --- /dev/null +++ b/lib/es6/ntlm/ntlm.flags.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.flags.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.flags.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,MAAM,CAAN,IAAY,SA2GX;AA3GD,WAAY,SAAS;IACnB;eACW;IACX,mEAAwB,CAAA;IAExB,+EAA+E;IAC/E,2DAAoB,CAAA;IAEpB;kBACc;IACd,6DAAqB,CAAA;IAErB,oBAAoB;IAEpB;+DAC2D;IAC3D,8DAAqB,CAAA;IAErB;wDACoD;IACpD,8DAAqB,CAAA;IAErB,2DAA2D;IAC3D,kFAA+B,CAAA;IAE/B;+CAC2C;IAC3C,mEAAuB,CAAA;IAEvB,qBAAqB;IACrB,qEAAwB,CAAA;IAExB,uDAAuD;IACvD,uEAAyB,CAAA;IAEzB,qBAAqB;IAErB;8EAC0E;IAC1E,0EAA2B,CAAA;IAE3B;0DACsD;IACtD,sFAAiC,CAAA;IAEjC;wDACoD;IACpD,gGAAsC,CAAA;IAEtC;;0DAEsD;IACtD,6EAA4B,CAAA;IAE5B;oDACgD;IAChD,+EAA6B,CAAA;IAE7B;2CACuC;IACvC,yEAA0B,CAAA;IAE1B;2CACuC;IACvC,0EAA0B,CAAA;IAE1B;;2CAEuC;IACvC,wEAAyB,CAAA;IAEzB;kDAC8C;IAC9C,4EAA2B,CAAA;IAE3B,qBAAqB;IACrB,iFAA6B,CAAA;IAE7B,qBAAqB;IACrB,qFAA+B,CAAA;IAE/B,qBAAqB;IACrB,yFAAiC,CAAA;IAEjC;;kDAE8C;IAC9C,iFAA6B,CAAA;IAE7B,oBAAoB;IAEpB,sEAAsE;IACtE,0EAAyB,CAAA;IAEzB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IAEpB,qDAAqD;IACrD,mEAAqB,CAAA;IAErB;wDACoD;IACpD,sFAA8B,CAAA;IAE9B,oDAAoD;IACpD,mEAAoB,CAAA;AACtB,CAAC,EA3GW,SAAS,KAAT,SAAS,QA2GpB"} \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.js b/lib/es6/ntlm/ntlm.js new file mode 100644 index 0000000..90a1433 --- /dev/null +++ b/lib/es6/ntlm/ntlm.js @@ -0,0 +1,231 @@ +// All code in this folder is heavily based on the node project ntlm-client. +// https://github.com/clncln1/node-ntlm-client +// ---------------------------------------------------------------------------- +// Original license statement: +// Copyright (c) 2015 Nico Haller +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// ---------------------------------------------------------------------------- +'use strict'; +import { NtlmFlags } from './ntlm.flags'; +import { NtlmConstants } from './ntlm.constants'; +import { Hash } from './hash'; +import * as os from 'os'; +import { Type2Message } from './type2.message'; +import { NtlmMessage } from './ntlm.message'; +export default function ntlm() { + return new Ntlm(); +} +export class Ntlm { + createType1Message(ntlm_version, workstation, target) { + let dataPos = 40; + let pos = 0; + let buf = Buffer.alloc(256); + if (target === undefined) { + target = ''; + } + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + //signature + buf.write(NtlmConstants.NTLM_SIGNATURE, pos, NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + pos += NtlmConstants.NTLM_SIGNATURE.length; + //message type + buf.writeUInt32LE(1, pos); + pos += 4; + //flags + let messageFlags = NtlmFlags.NEGOTIATE_OEM | + NtlmFlags.NEGOTIATE_ALWAYS_SIGN | + NtlmFlags.NEGOTIATE_VERSION; + if (ntlm_version == 1) { + messageFlags |= NtlmFlags.NEGOTIATE_NTLM_KEY | + NtlmFlags.NEGOTIATE_LM_KEY; + } + else { + messageFlags |= NtlmFlags.NEGOTIATE_NTLM2_KEY; + } + if (target.length > 0) { + messageFlags |= NtlmFlags.NEGOTIATE_DOMAIN_SUPPLIED; + } + if (workstation.length > 0) { + messageFlags |= NtlmFlags.NEGOTIATE_WORKSTATION_SUPPLIED; + } + // special operator to force conversion to unsigned + buf.writeUInt32LE(messageFlags >>> 0, pos); + pos += 4; + //domain security buffer + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (target.length > 0) { + dataPos += buf.write(target, dataPos, 'ascii'); + } + //workstation security buffer + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (workstation.length > 0) { + dataPos += buf.write(workstation, dataPos, 'ascii'); + } + this.addVersionStruct(buf, pos); + return new NtlmMessage(buf.slice(0, dataPos)); + } + // Version - hard-coded to + // Major version 10, minor version 0 (Windows 10) + // build number 18362 (1903 update), NTLM revision 15 + addVersionStruct(buf, pos) { + buf.writeUInt8(10, pos); + pos++; + buf.writeUInt8(0, pos); + pos++; + buf.writeUInt16LE(18362, pos); + pos += 2; + buf.writeUInt32LE(0x0F000000, pos); + pos += 4; + return pos; + } + decodeType2Message(str) { + if (str === undefined) { + throw new Error('Invalid argument'); + } + let ntlmMatch = /^NTLM ([^,\s]+)/.exec(str); + if (ntlmMatch) { + str = ntlmMatch[1]; + } + let buf = Buffer.from(str, 'base64'); + let type2message = new Type2Message(buf); + return type2message; + } + createType3Message(type1message, type2message, username, password, workstation, target, client_nonce_override, timestamp_override) { + let dataPos = 72; + let buf = Buffer.alloc(1024); + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + if (target === undefined) { + target = type2message.targetName; + } + //signature + buf.write(NtlmConstants.NTLM_SIGNATURE, 0, NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + //message type + buf.writeUInt32LE(3, 8); + let targetLen = type2message.encoding === 'ascii' ? target.length : target.length * 2; + let usernameLen = type2message.encoding === 'ascii' ? username.length : username.length * 2; + let workstationLen = type2message.encoding === 'ascii' ? workstation.length : workstation.length * 2; + let dataPosOffset = targetLen + usernameLen + workstationLen; + let timestamp = ''; + let client_nonce = ''; + let withMic = false; + let withServerTimestamp = false; + if (type2message.version === 2 && + type2message.targetInfo && + type2message.targetInfo.parsed['SERVER_TIMESTAMP']) { // Must include MIC, add room for it + withServerTimestamp = true; + withMic = true; + dataPos += 16; + } + let hashDataPos = dataPos + dataPosOffset; + let ntlmHash = Hash.createNTLMHash(password); + if (type2message.version === 2) { + client_nonce = client_nonce_override || Hash.createPseudoRandomValue(16); + if (withServerTimestamp) { // Use server timestamp if provided + timestamp = type2message.targetInfo.parsed['SERVER_TIMESTAMP']; + } + else { + timestamp = timestamp_override || Hash.createTimestamp(); + } + let lmv2; + if (withServerTimestamp) { + lmv2 = Buffer.alloc(24); // zero-filled + } + else { + lmv2 = Hash.createLMv2Response(type2message, username, target, ntlmHash, client_nonce); + } + //lmv2 security buffer + buf.writeUInt16LE(lmv2.length, 12); + buf.writeUInt16LE(lmv2.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lmv2.copy(buf, hashDataPos); + hashDataPos += lmv2.length; + let ntlmv2 = Hash.createNTLMv2Response(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + //ntlmv2 security buffer + buf.writeUInt16LE(ntlmv2.length, 20); + buf.writeUInt16LE(ntlmv2.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlmv2.copy(buf, hashDataPos); + hashDataPos += ntlmv2.length; + } + else { + let lmHash = Hash.createLMHash(password); + let lm = Hash.createLMResponse(type2message.challenge, lmHash); + let ntlm = Hash.createNTLMResponse(type2message.challenge, ntlmHash); + //lm security buffer + buf.writeUInt16LE(lm.length, 12); + buf.writeUInt16LE(lm.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lm.copy(buf, hashDataPos); + hashDataPos += lm.length; + //ntlm security buffer + buf.writeUInt16LE(ntlm.length, 20); + buf.writeUInt16LE(ntlm.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlm.copy(buf, hashDataPos); + hashDataPos += ntlm.length; + } + //target name security buffer + buf.writeUInt16LE(targetLen, 28); + buf.writeUInt16LE(targetLen, 30); + buf.writeUInt32LE(dataPos, 32); + dataPos += buf.write(target, dataPos, type2message.encoding); + //user name security buffer + buf.writeUInt16LE(usernameLen, 36); + buf.writeUInt16LE(usernameLen, 38); + buf.writeUInt32LE(dataPos, 40); + dataPos += buf.write(username, dataPos, type2message.encoding); + //workstation name security buffer + buf.writeUInt16LE(workstationLen, 44); + buf.writeUInt16LE(workstationLen, 46); + buf.writeUInt32LE(dataPos, 48); + dataPos += buf.write(workstation, dataPos, type2message.encoding); + //session key security buffer + let session_key = Buffer.alloc(0); + // if (type2message.flags & NtlmFlags.NEGOTIATE_KEY_EXCHANGE) { + // session_key = hash.createRandomSessionKey(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + // } + buf.writeUInt16LE(session_key.length, 52); + buf.writeUInt16LE(session_key.length, 54); + buf.writeUInt32LE(hashDataPos, 56); + session_key.copy(buf, hashDataPos); + hashDataPos += session_key.length; + //flags + buf.writeUInt32LE(type2message.flags, 60); + this.addVersionStruct(buf, 64); + if (withMic) { + // Calculate and add MIC + let mic = Hash.createMIC(type1message.raw, type2message, buf.slice(0, hashDataPos), username, target, ntlmHash, client_nonce, timestamp); + mic.copy(buf, 72); + } + return new NtlmMessage(buf.slice(0, hashDataPos)); + //return 'NTLM ' + buf.toString('base64', 0, hashDataPos); + } +} +//# sourceMappingURL=ntlm.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.js.map b/lib/es6/ntlm/ntlm.js.map new file mode 100644 index 0000000..36a5c74 --- /dev/null +++ b/lib/es6/ntlm/ntlm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.message.d.ts b/lib/es6/ntlm/ntlm.message.d.ts new file mode 100644 index 0000000..65dc231 --- /dev/null +++ b/lib/es6/ntlm/ntlm.message.d.ts @@ -0,0 +1,6 @@ +/// +export declare class NtlmMessage { + raw: Buffer; + constructor(buf: Buffer); + header(): string; +} diff --git a/lib/es6/ntlm/ntlm.message.js b/lib/es6/ntlm/ntlm.message.js new file mode 100644 index 0000000..e48fd89 --- /dev/null +++ b/lib/es6/ntlm/ntlm.message.js @@ -0,0 +1,9 @@ +export class NtlmMessage { + constructor(buf) { + this.raw = buf; + } + header() { + return 'NTLM ' + this.raw.toString('base64'); + } +} +//# sourceMappingURL=ntlm.message.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/ntlm.message.js.map b/lib/es6/ntlm/ntlm.message.js.map new file mode 100644 index 0000000..3dc5d61 --- /dev/null +++ b/lib/es6/ntlm/ntlm.message.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ntlm.message.js","sourceRoot":"","sources":["../../../src/ntlm/ntlm.message.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IAGtB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;CACF"} \ No newline at end of file diff --git a/lib/es6/ntlm/type2.message.d.ts b/lib/es6/ntlm/type2.message.d.ts new file mode 100644 index 0000000..f1ce986 --- /dev/null +++ b/lib/es6/ntlm/type2.message.d.ts @@ -0,0 +1,13 @@ +/// +export declare class Type2Message { + raw: Buffer; + flags: number; + encoding: 'ascii' | 'ucs2'; + version: number; + challenge: Buffer; + targetName: string; + targetInfo: any; + constructor(buf: Buffer); + private readTargetName; + private parseTargetInfo; +} diff --git a/lib/es6/ntlm/type2.message.js b/lib/es6/ntlm/type2.message.js new file mode 100644 index 0000000..a7f5be4 --- /dev/null +++ b/lib/es6/ntlm/type2.message.js @@ -0,0 +1,125 @@ +import { NtlmFlags } from './ntlm.flags'; +import { NtlmConstants } from './ntlm.constants'; +export class Type2Message { + constructor(buf) { + this.raw = buf; + //check signature + if (buf.toString('ascii', 0, NtlmConstants.NTLM_SIGNATURE.length) !== NtlmConstants.NTLM_SIGNATURE) { + throw new Error('Invalid message signature'); + } + //check message type + if (buf.readUInt32LE(NtlmConstants.NTLM_SIGNATURE.length) !== 2) { + throw new Error('Invalid message type (no type 2)'); + } + //read flags + this.flags = buf.readUInt32LE(20); + this.encoding = (this.flags & NtlmFlags.NEGOTIATE_OEM) ? 'ascii' : 'ucs2'; + this.version = (this.flags & NtlmFlags.NEGOTIATE_NTLM2_KEY) ? 2 : 1; + this.challenge = buf.slice(24, 32); + //read target name + this.targetName = this.readTargetName(); + //read target info + if (this.flags & NtlmFlags.NEGOTIATE_TARGET_INFO) { + this.targetInfo = this.parseTargetInfo(); + } + } + readTargetName() { + let length = this.raw.readUInt16LE(12); + //skipping allocated space + let offset = this.raw.readUInt32LE(16); + if (length === 0) { + return ''; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + return this.raw.toString(this.encoding, offset, offset + length); + } + parseTargetInfo() { + let info = {}; + let length = this.raw.readUInt16LE(40); + //skipping allocated space + let offset = this.raw.readUInt32LE(44); + let targetInfoBuffer = Buffer.alloc(length); + this.raw.copy(targetInfoBuffer, 0, offset, offset + length); + if (length === 0) { + return info; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + let pos = offset; + while (pos < (offset + length)) { + let blockType = this.raw.readUInt16LE(pos); + pos += 2; + let blockLength = this.raw.readUInt16LE(pos); + pos += 2; + if (blockType === 0) { + //reached the terminator subblock + break; + } + let blockTypeStr; + let blockTypeOutput = 'string'; + switch (blockType) { + case 0x01: + blockTypeStr = 'SERVER'; + break; + case 0x02: + blockTypeStr = 'DOMAIN'; + break; + case 0x03: + blockTypeStr = 'FQDN'; + break; + case 0x04: + blockTypeStr = 'DNS'; + break; + case 0x05: + blockTypeStr = 'PARENT_DNS'; + break; + case 0x06: + blockTypeStr = 'FLAGS'; + blockTypeOutput = 'hex'; + break; + case 0x07: + blockTypeStr = 'SERVER_TIMESTAMP'; + blockTypeOutput = 'hex'; + break; + case 0x08: + blockTypeStr = 'SINGLE_HOST'; + blockTypeOutput = 'hex'; + break; + case 0x09: + blockTypeStr = 'TARGET_NAME'; + break; + case 0x0A: + blockTypeStr = 'CHANNEL_BINDING'; + blockTypeOutput = 'hex'; + break; + default: + blockTypeStr = ''; + break; + } + if (blockTypeStr) { + if (blockTypeOutput === 'string') { + info[blockTypeStr] = this.raw.toString('ucs2', pos, pos + blockLength); + } + else { + // Output as hex in little endian order + let twoCharBlocks = this.raw.toString('hex', pos, pos + blockLength).match(/.{2}/g); + if (twoCharBlocks) { + info[blockTypeStr] = twoCharBlocks.reverse().join(""); + } + else { + info[blockTypeStr] = null; + } + } + } + pos += blockLength; + } + return { + parsed: info, + buffer: targetInfoBuffer + }; + } +} +//# sourceMappingURL=type2.message.js.map \ No newline at end of file diff --git a/lib/es6/ntlm/type2.message.js.map b/lib/es6/ntlm/type2.message.js.map new file mode 100644 index 0000000..c177142 --- /dev/null +++ b/lib/es6/ntlm/type2.message.js.map @@ -0,0 +1 @@ +{"version":3,"file":"type2.message.js","sourceRoot":"","sources":["../../../src/ntlm/type2.message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,MAAM,OAAO,YAAY;IASvB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,iBAAiB;QACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,cAAc,EAAE;YAClG,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QAED,oBAAoB;QACpB,IAAI,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC/D,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACrD;QAED,YAAY;QACZ,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAE1E,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAExC,kBAAkB;QAClB,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,qBAAqB,EAAE;YAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1C;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvC,0BAA0B;QAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,MAAM,KAAK,CAAC,EAAE;YAChB,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,EAAE,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACnE,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,GAAmB,EAAE,CAAC;QAE9B,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvC,0BAA0B;QAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QAE5D,IAAI,MAAM,KAAK,CAAC,EAAE;YAChB,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,EAAE,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAED,IAAI,GAAG,GAAG,MAAM,CAAC;QAEjB,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;YAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC3C,GAAG,IAAI,CAAC,CAAC;YACT,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC7C,GAAG,IAAI,CAAC,CAAC;YAET,IAAI,SAAS,KAAK,CAAC,EAAE;gBACnB,iCAAiC;gBACjC,MAAM;aACP;YAED,IAAI,YAAY,CAAC;YACjB,IAAI,eAAe,GAAG,QAAQ,CAAC;YAE/B,QAAQ,SAAS,EAAE;gBACjB,KAAK,IAAI;oBACP,YAAY,GAAG,QAAQ,CAAC;oBACxB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,QAAQ,CAAC;oBACxB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,MAAM,CAAC;oBACtB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,KAAK,CAAC;oBACrB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,YAAY,CAAC;oBAC5B,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,OAAO,CAAC;oBACvB,eAAe,GAAG,KAAK,CAAC;oBACxB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,kBAAkB,CAAC;oBAClC,eAAe,GAAG,KAAK,CAAC;oBACxB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,aAAa,CAAC;oBAC7B,eAAe,GAAG,KAAK,CAAC;oBACxB,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,aAAa,CAAC;oBAC7B,MAAM;gBACR,KAAK,IAAI;oBACP,YAAY,GAAG,iBAAiB,CAAC;oBACjC,eAAe,GAAG,KAAK,CAAC;oBACxB,MAAM;gBACR;oBACE,YAAY,GAAG,EAAE,CAAC;oBAClB,MAAM;aACT;YAED,IAAI,YAAY,EAAE;gBAChB,IAAI,eAAe,KAAK,QAAQ,EAAE;oBAChC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC;iBACxE;qBAAM;oBACL,uCAAuC;oBACvC,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACpF,IAAI,aAAa,EAAE;wBACjB,IAAI,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;qBACvD;yBAAM;wBACL,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;qBAC3B;iBACF;aACF;YAED,GAAG,IAAI,WAAW,CAAC;SACpB;QAED,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,gBAAgB;SACzB,CAAC;IACJ,CAAC;CACF"} \ No newline at end of file diff --git a/lib/es6/tests/dynamicsMetadataTests.js b/lib/es6/tests/dynamicsMetadataTests.js index 84f2ad3..5f4c543 100644 --- a/lib/es6/tests/dynamicsMetadataTests.js +++ b/lib/es6/tests/dynamicsMetadataTests.js @@ -1,8 +1,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; @@ -24,3 +25,4 @@ export function dynamicsMetadataRetrieveAll() { } }); } +//# sourceMappingURL=dynamicsMetadataTests.js.map \ No newline at end of file diff --git a/lib/es6/tests/dynamicsMetadataTests.js.map b/lib/es6/tests/dynamicsMetadataTests.js.map new file mode 100644 index 0000000..cee9004 --- /dev/null +++ b/lib/es6/tests/dynamicsMetadataTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dynamicsMetadataTests.js","sourceRoot":"","sources":["../../../src/tests/dynamicsMetadataTests.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAE5D,MAAM,UAAgB,2BAA2B;;QAC7C,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,KAAK,aAAa,CAAC,WAAW,CAAC;QAE9E,IAAI,CAAC,eAAe,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACtD;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,eAAe,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;SAC5D;IACL,CAAC;CAAA"} \ No newline at end of file diff --git a/lib/es6/tests/dynamicsTests.js b/lib/es6/tests/dynamicsTests.js index 4c1c594..ac9270a 100644 --- a/lib/es6/tests/dynamicsTests.js +++ b/lib/es6/tests/dynamicsTests.js @@ -1,16 +1,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import dynamics from "../Dynamics/Dynamics"; import { QueryOperator } from "../Query/Query"; +import { ConnectionOptions, AuthenticationType } from "../Dynamics/DynamicsRequest"; export function dynamicsTestAll() { return __awaiter(this, void 0, void 0, function* () { - const dyn = dynamics(); + const options = new ConnectionOptions(); + options.authType = AuthenticationType.Windows; + options.username = "Administrator"; + options.domain = "CONTOSO"; + options.password = "{password}"; + options.serverUrl = "http://{server}/{org}/"; + options.webApiVersion = "v9.0"; + const dyn = dynamics(options); /* Batch Request */ const allAccounts = yield dyn.batch() .requestAllUrls(['/api/data/v9.1/accounts']) @@ -43,3 +52,4 @@ export function dynamicsTestAll() { } }); } +//# sourceMappingURL=dynamicsTests.js.map \ No newline at end of file diff --git a/lib/es6/tests/dynamicsTests.js.map b/lib/es6/tests/dynamicsTests.js.map new file mode 100644 index 0000000..07b098a --- /dev/null +++ b/lib/es6/tests/dynamicsTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dynamicsTests.js","sourceRoot":"","sources":["../../../src/tests/dynamicsTests.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,MAAM,UAAgB,eAAe;;QACjC,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,eAAe,CAAC;QACnC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC;QAChC,OAAO,CAAC,SAAS,GAAG,wBAAwB,CAAC;QAC7C,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC;QAE/B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE9B,mBAAmB;QACnB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE;aAChC,cAAc,CAAC,CAAC,yBAAyB,CAAC,CAAC;aAC3C,OAAO,EAAE,CAAC;QAEf,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACzC;QAED,mBAAmB;QACnB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,EAAE,EAAE;YACL,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,mBAAmB;QACnB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjE,IAAI,EAAE,KAAK,GAAG,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,iBAAiB;QACjB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,KAAK,CAE9B,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC;aAC3B,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;aAC9C,OAAO,CAAC,MAAM,CAAC;aACf,MAAM,CAAC,MAAM,CAAC,CAEtB,CAAC,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,UAAU,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAClD;QAED,qBAAqB;QACrB,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEnE,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;SAC1D;IACL,CAAC;CAAA"} \ No newline at end of file diff --git a/lib/es6/tests/queryTests.js b/lib/es6/tests/queryTests.js index 8ce6179..39a01b8 100644 --- a/lib/es6/tests/queryTests.js +++ b/lib/es6/tests/queryTests.js @@ -21,3 +21,4 @@ export function createQueryWithAllExpressions() { throw new Error('QueryXml could not be generated!'); } } +//# sourceMappingURL=queryTests.js.map \ No newline at end of file diff --git a/lib/es6/tests/queryTests.js.map b/lib/es6/tests/queryTests.js.map new file mode 100644 index 0000000..1c5141f --- /dev/null +++ b/lib/es6/tests/queryTests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"queryTests.js","sourceRoot":"","sources":["../../../src/tests/queryTests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAE5C,MAAM,UAAU,6BAA6B;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,SAAS;SACJ,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC;SAC3B,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC;SACxB,OAAO,CAAC,MAAM,CAAC;SACf,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;SAC5C,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACpD,QAAQ,CAAC,EAAE,CAAC,EAAE;QACX,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,CAAC,QAAQ,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;KACvD;AACL,CAAC"} \ No newline at end of file diff --git a/lib/system/more-xrm.d.ts b/lib/system/more-xrm.d.ts index 3b5818c..6e9b01a 100644 --- a/lib/system/more-xrm.d.ts +++ b/lib/system/more-xrm.d.ts @@ -1,3 +1,4 @@ +/// declare module "Query/Query" { export interface DataQuery { Alias: any; @@ -20,6 +21,7 @@ declare module "Query/Query" { IsOuterJoin?: boolean; } export interface Query { + [key: string]: any; alias(attributeName: string, alias: string): Query; path(entityPath: string): Query; select(...attributeNames: string[]): Query; @@ -58,16 +60,31 @@ declare module "Query/QueryXml" { } declare module "Dynamics/DynamicsRequest" { import { Query } from "Query/Query"; - export function dynamicsQuery(query: Query, maxRowCount?: number, headers?: any): Promise; - export function dynamicsQueryUrl(dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; - export function dynamicsRequest(dynamicsEntitySetUrl: string, headers?: any): Promise; - export function dynamicsSave(entitySetName: string, data: any, id?: string, headers?: any): Promise; + export enum AuthenticationType { + Windows = 1, + OAuth = 2 + } + export class ConnectionOptions { + authType: AuthenticationType; + username?: string; + password?: string; + domain?: string; + workstation?: string; + accessToken?: string; + serverUrl: string; + webApiVersion: string; + } + export function dynamicsQuery(connectionOptions: ConnectionOptions, query: Query, maxRowCount?: number, headers?: any): Promise; + export function dynamicsQueryUrl(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise; + export function dynamicsRequest(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, headers?: any): Promise; + export function dynamicsSave(connectionOptions: ConnectionOptions, entitySetName: string, data: any, id?: string, headers?: any): Promise; export function formatDynamicsResponse(data: any): any; } declare module "Dynamics/DynamicsBatch" { import { Query } from "Query/Query"; + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; export interface DynamicsBatch { - execute(): Promise; + execute(): Promise; request(query: Query, maxRowCount?: number): DynamicsBatch; requestAll(queries: Query[]): DynamicsBatch; requestAllUrls(urls: string[]): DynamicsBatch; @@ -75,14 +92,15 @@ declare module "Dynamics/DynamicsBatch" { createRelatedEntity(entitySetName: string, data: any, navigationPropertyName: string): void; }; } - export function dynamicsBatch(headers?: any): DynamicsBatch; - export function dynamicsBatchRequest(...url: string[]): Promise; - export function dynamicsBatchQuery(...query: Query[]): Promise; + export function dynamicsBatch(connectionOptions: ConnectionOptions, headers?: any): DynamicsBatch; + export function dynamicsBatchRequest(connectionOptions: ConnectionOptions, ...url: string[]): Promise; + export function dynamicsBatchQuery(connectionOptions: ConnectionOptions, ...query: Query[]): Promise; } declare module "Dynamics/Dynamics" { import { Query } from "Query/Query"; import { DynamicsBatch } from "Dynamics/DynamicsBatch"; - export const WebApiVersion = "v9.1"; + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; + export const DefaultWebApiVersion = "v9.1"; export const DefaultMaxRecords = 100; export const DynamicsHeaders: { 'OData-MaxVersion': string; @@ -99,7 +117,30 @@ declare module "Dynamics/Dynamics" { query(entityLogicalName: string, entitySetName: string): Query; save(entitySetName: string, data: any, id?: string): Promise; } - export default function dynamics(accessToken?: string): Dynamics; + export default function dynamics(connectionOptions?: ConnectionOptions): Dynamics; +} +declare module "Dynamics/Model/OrganizationMetadata" { + export interface OrganizationMetadata { + Id?: string; + UniqueName?: string; + UrlName?: string; + FriendlyName?: string; + State?: number; + Version?: string; + Uri?: string; + AppUri?: string; + LastUpdated?: Date; + } +} +declare module "Dynamics/DynamicsDiscovery" { + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; + import { OrganizationMetadata } from "Dynamics/Model/OrganizationMetadata"; + export type OrganizationMetadata = OrganizationMetadata; + export const DefaultDiscoveryApiVersion = "v9.1"; + export default function dynamicsDiscovery(connectionOptions?: ConnectionOptions): DynamicsDiscovery; + export interface DynamicsDiscovery { + discover(): Promise; + } } declare module "Dynamics/Model/EntityMetadata" { export interface EntityMetadata { @@ -144,6 +185,7 @@ declare module "Dynamics/Model/OptionSetMetadata" { } } declare module "Dynamics/DynamicsMetadata" { + import { ConnectionOptions } from "Dynamics/DynamicsRequest"; import { AttributeMetadata, EntityAttributeMetadata, LookupAttributeMetadata } from "Dynamics/Model/AttributeMetadata"; import { EntityMetadata } from "Dynamics/Model/EntityMetadata"; import { OptionSetAttributeMetadata, OptionSetMetadata } from "Dynamics/Model/OptionSetMetadata"; @@ -152,7 +194,7 @@ declare module "Dynamics/DynamicsMetadata" { export type DynamicsOptionSetMetadata = OptionSetMetadata; export type DynamicsLookupAttributeMetadata = LookupAttributeMetadata; export type DynamicsOptionSetAttributeMetadata = OptionSetAttributeMetadata; - export default function dynamicsMetadata(accessToken?: string): DynamicsMetadata; + export default function dynamicsmetdata(connectionOptions?: ConnectionOptions): DynamicsMetadata; export function isLookupAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsLookupAttributeMetadata; export function isOptionSetAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsOptionSetAttributeMetadata; export interface DynamicsMetadata { @@ -163,6 +205,100 @@ declare module "Dynamics/DynamicsMetadata" { } type AnyAttributeMetadata = AttributeMetadata | LookupAttributeMetadata | OptionSetAttributeMetadata; } +declare module "ntlm/ntlm.flags" { + export enum NtlmFlags { + NEGOTIATE_UNICODE = 1, + NEGOTIATE_OEM = 2, + REQUEST_TARGET = 4, + NEGOTIATE_SIGN = 16, + NEGOTIATE_SEAL = 32, + NEGOTIATE_DATAGRAM_STYLE = 64, + NEGOTIATE_LM_KEY = 128, + NEGOTIATE_NETWARE = 256, + NEGOTIATE_NTLM_KEY = 512, + NEGOTIATE_ANONYMOUS = 2048, + NEGOTIATE_DOMAIN_SUPPLIED = 4096, + NEGOTIATE_WORKSTATION_SUPPLIED = 8192, + NEGOTIATE_LOCAL_CALL = 16384, + NEGOTIATE_ALWAYS_SIGN = 32768, + TARGET_TYPE_DOMAIN = 65536, + TARGET_TYPE_SERVER = 131072, + TARGET_TYPE_SHARE = 262144, + NEGOTIATE_NTLM2_KEY = 524288, + REQUEST_INIT_RESPONSE = 1048576, + REQUEST_ACCEPT_RESPONSE = 2097152, + REQUEST_NONNT_SESSION_KEY = 4194304, + NEGOTIATE_TARGET_INFO = 8388608, + NEGOTIATE_VERSION = 33554432, + NEGOTIATE_128 = 536870912, + NEGOTIATE_KEY_EXCHANGE = 1073741824, + NEGOTIATE_56 = -2147483648 + } +} +declare module "ntlm/ntlm.constants" { + export class NtlmConstants { + static readonly NTLM_SIGNATURE = "NTLMSSP\0"; + } +} +declare module "ntlm/type2.message" { + export class Type2Message { + raw: Buffer; + flags: number; + encoding: 'ascii' | 'ucs2'; + version: number; + challenge: Buffer; + targetName: string; + targetInfo: any; + constructor(buf: Buffer); + private readTargetName; + private parseTargetInfo; + } +} +declare module "ntlm/hash" { + import { Type2Message } from "ntlm/type2.message"; + export class Hash { + static createLMResponse(challenge: Buffer, lmhash: Buffer): Buffer; + static createLMHash(password: string): Buffer; + static calculateDES(key: Buffer, message: Buffer): Buffer; + static createNTLMResponse(challenge: Buffer, ntlmhash: Buffer): Buffer; + static createNTLMHash(password: string): Buffer; + static createNTLMv2Hash(ntlmhash: Buffer, username: string, authTargetName: string): Buffer; + static createLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string): Buffer; + static createNTLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createMIC(type1message: Buffer, type2message: Type2Message, type3message: Buffer, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string): Buffer; + static createRandomSessionKey(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean): Buffer; + static createPseudoRandomValue(length: number): string; + static createTimestamp(): string; + } +} +declare module "ntlm/ntlm.message" { + export class NtlmMessage { + raw: Buffer; + constructor(buf: Buffer); + header(): string; + } +} +declare module "ntlm/interfaces/i.ntlm" { + import { Type2Message } from "ntlm/type2.message"; + import { NtlmMessage } from "ntlm/ntlm.message"; + export interface INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2Message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce: string | undefined, timestamp: string | undefined): NtlmMessage; + } +} +declare module "ntlm/ntlm" { + import { INtlm } from "ntlm/interfaces/i.ntlm"; + import { Type2Message } from "ntlm/type2.message"; + import { NtlmMessage } from "ntlm/ntlm.message"; + export default function ntlm(): INtlm; + export class Ntlm implements INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + private addVersionStruct; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce_override: string | undefined, timestamp_override: string | undefined): NtlmMessage; + } +} declare module "tests/dynamicsMetadataTests" { export function dynamicsMetadataRetrieveAll(): Promise; } diff --git a/lib/system/more-xrm.js b/lib/system/more-xrm.js index 9fc5820..01b9572 100644 --- a/lib/system/more-xrm.js +++ b/lib/system/more-xrm.js @@ -1,8 +1,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; @@ -81,7 +82,7 @@ System.register("Query/Query", [], function (exports_1, context_1) { return this; } whereAny(any) { - var conditions = []; + let conditions = []; any((attributeName, operator, ...values) => { conditions.push({ AttributeName: attributeName, @@ -157,7 +158,7 @@ System.register("Query/QueryXml", ["Query/Query"], function (exports_2, context_ } }); query.OrderBy.forEach(attribute => { - if (attribute.indexOf('_') == 0) { + if (attribute.indexOf('_') === 0) { xml.push(``); } else { @@ -234,16 +235,21 @@ System.register("Query/QueryXml", ["Query/Query"], function (exports_2, context_ return xml.join('\n'); } function encodeValue(value) { - if (value === 0) + if (value === 0) { return '0'; - if (value === true) + } + if (value === true) { return 'true'; - if (value === false) + } + if (value === false) { return 'false'; - if (!value) + } + if (!value) { return ''; - if (typeof (value.toISOString) === 'function') + } + if (typeof (value.toISOString) === 'function') { return value.toISOString(); + } return xmlEncode(value.toString()); } function xmlEncode(text) { @@ -262,8 +268,9 @@ System.register("Query/QueryXml", ["Query/Query"], function (exports_2, context_ return xmlString.replace(/\s*<[^>\/]*>[^<>]*<\/[^>]*>|\s*<.+?>|\s*[^<]+/g, //pattern to match nodes (angled brackets or text) function (m, i) { m = m.replace(/^\s+|\s+$/g, ""); //trim the match just in case - if (i < 38 && /^<[?]xml/.test(m)) - return m + "\n"; //if the match is a header, ignore it + if (i < 38 && /^<[?]xml/.test(m)) { + return m + "\n"; + } //if the match is a header, ignore it if (/^<[/]/.test(m)) //if the match is a closing tag { tabs = tabs.replace(indent, ""); //remove one indent from the store @@ -298,34 +305,42 @@ System.register("Query/QueryXml", ["Query/Query"], function (exports_2, context_ } }; }); -System.register("Dynamics/DynamicsRequest", ["Query/Query", "Query/QueryXml", "Dynamics/Dynamics"], function (exports_3, context_3) { +System.register("Dynamics/DynamicsRequest", ["Query/Query", "Query/QueryXml", "Dynamics/Dynamics", "httpntlm", "node-fetch"], function (exports_3, context_3) { "use strict"; - var Query_2, QueryXml_1, Dynamics_1; + var Query_2, QueryXml_1, Dynamics_1, httpntlm, node_fetch_1, AuthenticationType, ConnectionOptions; var __moduleName = context_3 && context_3.id; - function dynamicsQuery(query, maxRowCount, headers) { - const dataQuery = Query_2.GetRootQuery(query); - if (!dataQuery.EntityPath) { - throw new Error('dynamicsQuery requires a Query object with an EntityPath'); - } - return dynamicsQueryUrl(`/api/data/${Dynamics_1.WebApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + function dynamicsQuery(connectionOptions, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const dataQuery = Query_2.GetRootQuery(query); + if (!dataQuery.EntityPath) { + throw new Error('dynamicsQuery requires a Query object with an EntityPath'); + } + return yield dynamicsQueryUrl(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + }); } exports_3("dynamicsQuery", dynamicsQuery); - function dynamicsQueryUrl(dynamicsEntitySetUrl, query, maxRowCount, headers) { - const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); - return request(`${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(QueryXml_1.default(query, maxRowCount))}`, 'GET', undefined, headers); + function dynamicsQueryUrl(connectionOptions, dynamicsEntitySetUrl, query, maxRowCount, headers) { + return __awaiter(this, void 0, void 0, function* () { + const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); + return yield request(connectionOptions, `${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(QueryXml_1.default(query, maxRowCount))}`, 'GET', undefined, headers); + }); } exports_3("dynamicsQueryUrl", dynamicsQueryUrl); - function dynamicsRequest(dynamicsEntitySetUrl, headers) { - return request(dynamicsEntitySetUrl, 'GET', undefined, headers); + function dynamicsRequest(connectionOptions, dynamicsEntitySetUrl, headers) { + return __awaiter(this, void 0, void 0, function* () { + return yield request(connectionOptions, dynamicsEntitySetUrl, 'GET', undefined, headers); + }); } exports_3("dynamicsRequest", dynamicsRequest); - function dynamicsSave(entitySetName, data, id, headers) { - if (id) { - return request(`/api/data/${Dynamics_1.WebApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); - } - else { - return request(`/api/data/${Dynamics_1.WebApiVersion}/${entitySetName}()`, 'POST', data, headers); - } + function dynamicsSave(connectionOptions, entitySetName, data, id, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (id) { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); + } + else { + return yield request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}()`, 'POST', data, headers); + } + }); } exports_3("dynamicsSave", dynamicsSave); function formatDynamicsResponse(data) { @@ -341,10 +356,10 @@ System.register("Dynamics/DynamicsRequest", ["Query/Query", "Query/QueryXml", "D } if (data) { for (var item of data) { - var row = {}; - for (var key in item) { + let row = {}; + for (let key in item) { var name = key; - if (name.indexOf('@odata') == 0) { + if (name.indexOf('@odata') === 0) { continue; } if (name.indexOf('transactioncurrencyid') > -1) { @@ -352,12 +367,12 @@ System.register("Dynamics/DynamicsRequest", ["Query/Query", "Query/QueryXml", "D } if (name.indexOf('@') > -1) { name = name.substring(0, name.indexOf('@')); - if (name.indexOf('_') == 0) { + if (name.indexOf('_') === 0) { name = name.slice(1, -6); } name += "_formatted"; } - else if (name.indexOf('_') == 0) { + else if (name.indexOf('_') === 0) { name = name.slice(1, -6); } if (name.indexOf('_x002e_') > -1) { @@ -378,14 +393,54 @@ System.register("Dynamics/DynamicsRequest", ["Query/Query", "Query/QueryXml", "D return items; } exports_3("formatDynamicsResponse", formatDynamicsResponse); - function request(url, method, body, headers) { - return fetch(url, { - method: method, - headers: Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders, headers), - body: body - }) - .then(response => response.json()) - .then(data => formatDynamicsResponse(data)); + function request(connectionOptions, url, method, body, headers) { + return __awaiter(this, void 0, void 0, function* () { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; + //TODO: fetch if we can. + if (connectionOptions.authType === AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm[method.toLowerCase()]({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: body, + headers: Object.assign(Object.assign({ 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + const json = JSON.parse(res.body); + if (json.error) { + console.error(json.error.message); + reject(json.error.message); + } + else if (json.ExceptionMessage) { + console.error(json.ExceptionMessage); + reject(`The service call returned HTTP ${json.ErrorCode} - ${json.ExceptionMessage}`); + } + else { + resolve(formatDynamicsResponse(json)); + } + }); + }); + } + else { + return node_fetch_1.default(url, { + method: method, + headers: Object.assign(Object.assign({ 'Authorization': `Bearer ${connectionOptions.accessToken}`, 'Content-Type': 'application/json; charset=utf-8' }, Dynamics_1.DynamicsHeaders), headers), + body: body + }) + .then(response => response.json()) + .then(data => formatDynamicsResponse(data)); + } + }); } function trimId(id) { return (id || '').replace(/{|}/g, ''); @@ -400,28 +455,47 @@ System.register("Dynamics/DynamicsRequest", ["Query/Query", "Query/QueryXml", "D }, function (Dynamics_1_1) { Dynamics_1 = Dynamics_1_1; + }, + function (httpntlm_1) { + httpntlm = httpntlm_1; + }, + function (node_fetch_1_1) { + node_fetch_1 = node_fetch_1_1; } ], execute: function () { + (function (AuthenticationType) { + AuthenticationType[AuthenticationType["Windows"] = 1] = "Windows"; + AuthenticationType[AuthenticationType["OAuth"] = 2] = "OAuth"; + })(AuthenticationType || (AuthenticationType = {})); + exports_3("AuthenticationType", AuthenticationType); + ConnectionOptions = class ConnectionOptions { + constructor() { + this.authType = AuthenticationType.OAuth; + this.serverUrl = ""; + this.webApiVersion = Dynamics_1.DefaultWebApiVersion; + } + }; + exports_3("ConnectionOptions", ConnectionOptions); } }; }); -System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dynamics/Dynamics", "Dynamics/DynamicsRequest"], function (exports_4, context_4) { +System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dynamics/Dynamics", "Dynamics/DynamicsRequest", "httpntlm", "node-fetch"], function (exports_4, context_4) { "use strict"; - var Query_3, QueryXml_2, Dynamics_2, DynamicsRequest_1, Batch; + var Query_3, QueryXml_2, Dynamics_2, DynamicsRequest_1, httpntlm, node_fetch_2, Batch; var __moduleName = context_4 && context_4.id; - function dynamicsBatch(headers) { - return new Batch(headers); + function dynamicsBatch(connectionOptions, headers) { + return new Batch(connectionOptions, headers); } exports_4("dynamicsBatch", dynamicsBatch); - function dynamicsBatchRequest(...url) { - const batch = new Batch(); + function dynamicsBatchRequest(connectionOptions, ...url) { + const batch = new Batch(connectionOptions); batch.requestAllUrls(url); return batch.execute(); } exports_4("dynamicsBatchRequest", dynamicsBatchRequest); - function dynamicsBatchQuery(...query) { - const batch = new Batch(); + function dynamicsBatchQuery(connectionOptions, ...query) { + const batch = new Batch(connectionOptions); batch.requestAll(query); return batch.execute(); } @@ -439,26 +513,36 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn }, function (DynamicsRequest_1_1) { DynamicsRequest_1 = DynamicsRequest_1_1; + }, + function (httpntlm_2) { + httpntlm = httpntlm_2; + }, + function (node_fetch_2_1) { + node_fetch_2 = node_fetch_2_1; } ], execute: function () { Batch = class Batch { - constructor(headers) { + constructor(options, headers) { + this.options = options; this.headers = headers; + this.ConnectionOptions = options; this.Changes = []; this.RelatedChanges = []; } execute() { return __awaiter(this, void 0, void 0, function* () { - const results = yield Batch.requestBatch(`/api/data/${Dynamics_2.WebApiVersion}/$batch`, this.Changes, this.headers); + const results = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.Changes, this.headers); if (this.RelatedChanges.length > 0) { for (let change of this.RelatedChanges) { - let changeIndex = this.Changes.indexOf(change.relatedChange); - let relatedId = results[changeIndex]; - change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + if (change !== undefined && change.relatedChange) { + let changeIndex = this.Changes.indexOf(change.relatedChange); + let relatedId = results !== undefined ? results[changeIndex] : undefined; + change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + } } - const related = yield Batch.requestBatch(`/api/data/${Dynamics_2.WebApiVersion}/$batch`, this.RelatedChanges, this.headers); - return results.concat(related); + const related = yield Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.RelatedChanges, this.headers); + return results !== undefined ? results.concat(related) : undefined; } else { return results; @@ -509,8 +593,9 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn } createRelatedEntity(entitySetName, data, navigationPropertyName) { let lastChange = this.Changes[this.Changes.length - 1]; - if (!lastChange || lastChange.entityData == 'DELETE') + if (!lastChange || lastChange.entityData === 'DELETE') { throw new Error('createRelatedEntity relies on the previous change which was not found in the batch.'); + } if (lastChange.entityId) { data[`${navigationPropertyName}@odata.bind`] = `${lastChange.entitySetName}(${lastChange.entityId})`; this.Changes.push({ @@ -527,16 +612,42 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn }); } } - static requestBatch(url, requests, headers) { + static requestBatch(connectionOptions, url, requests, headers) { + let callUrl = connectionOptions.serverUrl; + if (callUrl.endsWith("/")) { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + callUrl = `${callUrl}${url}`; const batchId = Batch.createId(); - return fetch(url, { - method: 'POST', - headers: Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, Dynamics_2.DynamicsHeaders, headers), - body: Batch.formatBatchRequest(batchId, requests) - }) - .then(response => Batch.formatBatchResponse(response.text())); - } - static formatBatchRequest(batchId, changes) { + if (connectionOptions.authType === DynamicsRequest_1.AuthenticationType.Windows) { + return new Promise((resolve, reject) => { + httpntlm.post({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: Batch.formatBatchRequest(connectionOptions, batchId, requests), + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}` }, Dynamics_2.DynamicsHeaders), headers) + }, function (err, res) { + if (err) { + console.error(err); + reject(err); + } + resolve(Batch.formatBatchResponse(res.responseText)); + }); + }); + } + else { + return node_fetch_2.default(callUrl, { + method: 'POST', + headers: Object.assign(Object.assign({ 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, 'Authorization': connectionOptions.accessToken }, Dynamics_2.DynamicsHeaders), headers), + body: Batch.formatBatchRequest(connectionOptions, batchId, requests) + }) + .then(response => Batch.formatBatchResponse(response.text())); + } + } + static formatBatchRequest(connectionOptions, batchId, changes) { let batchBody = []; let requestBody = []; let changeNumber = 1; @@ -551,7 +662,7 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn requestBody.push('Content-Transfer-Encoding:binary'); requestBody.push(''); if (change.entitySetName) { - requestBody.push(`GET ${encodeURI(`/api/data/${Dynamics_2.WebApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); + requestBody.push(`GET ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); } else { requestBody.push(`GET ${encodeURI(change.entitySetQuery)} HTTP/1.1`); @@ -566,7 +677,7 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn batchBody.push('Content-Transfer-Encoding:binary'); batchBody.push(`Content-ID: ${changeNumber++}`); batchBody.push(''); - batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${Dynamics_2.WebApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); + batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); batchBody.push('Content-Type: application/json;type=entry'); batchBody.push(''); batchBody.push(JSON.stringify(change.entityData)); @@ -612,7 +723,10 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn return 'id' + Math.random().toString(16).slice(2); } static trimId(id) { - return (id || '').replace(/{|}/g, ''); + if (id !== undefined) { + return (id || '').replace(/{|}/g, ''); + } + return undefined; } }; } @@ -620,10 +734,10 @@ System.register("Dynamics/DynamicsBatch", ["Query/Query", "Query/QueryXml", "Dyn }); System.register("Dynamics/Dynamics", ["Query/Query", "Dynamics/DynamicsBatch", "Dynamics/DynamicsRequest"], function (exports_5, context_5) { "use strict"; - var Query_4, DynamicsBatch_1, DynamicsRequest_2, WebApiVersion, DefaultMaxRecords, DynamicsHeaders, DynamicsClient; + var Query_4, DynamicsBatch_1, DynamicsRequest_2, DefaultWebApiVersion, DefaultMaxRecords, DynamicsHeaders, DynamicsClient; var __moduleName = context_5 && context_5.id; - function dynamics(accessToken) { - return new DynamicsClient(accessToken); + function dynamics(connectionOptions) { + return new DynamicsClient(connectionOptions); } exports_5("default", dynamics); return { @@ -639,7 +753,7 @@ System.register("Dynamics/Dynamics", ["Query/Query", "Dynamics/DynamicsBatch", " } ], execute: function () { - exports_5("WebApiVersion", WebApiVersion = 'v9.1'); + exports_5("DefaultWebApiVersion", DefaultWebApiVersion = 'v9.1'); exports_5("DefaultMaxRecords", DefaultMaxRecords = 100); exports_5("DynamicsHeaders", DynamicsHeaders = { 'OData-MaxVersion': '4.0', @@ -647,19 +761,19 @@ System.register("Dynamics/Dynamics", ["Query/Query", "Dynamics/DynamicsBatch", " 'Prefer': 'odata.include-annotations=OData.Community.Display.V1.FormattedValue' }); DynamicsClient = class DynamicsClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } batch() { - return DynamicsBatch_1.dynamicsBatch(this.dynamicsHeaders); + return DynamicsBatch_1.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders); } fetch(query, maxRowCount = DefaultMaxRecords) { - return DynamicsRequest_2.dynamicsQuery(query, maxRowCount, this.dynamicsHeaders); + return DynamicsRequest_2.dynamicsQuery(this.connectionOptions, query, maxRowCount, this.dynamicsHeaders); } optionset(entityName, attributeName) { - return DynamicsRequest_2.dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) + return DynamicsRequest_2.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) .then(attribute => (attribute.OptionSet || attribute.GlobalOptionSet).Options.map((option) => ({ label: (option.Label && option.Label.UserLocalizedLabel && option.Label.UserLocalizedLabel.Label), value: option.Value @@ -669,13 +783,13 @@ System.register("Dynamics/Dynamics", ["Query/Query", "Dynamics/DynamicsBatch", " return Query_4.default(entityLogicalName).path(entitySetName); } save(entitySetName, data, id) { - return DynamicsRequest_2.dynamicsSave(entitySetName, data, id, this.dynamicsHeaders); + return DynamicsRequest_2.dynamicsSave(this.connectionOptions, entitySetName, data, id, this.dynamicsHeaders); } }; } }; }); -System.register("Dynamics/Model/EntityMetadata", [], function (exports_6, context_6) { +System.register("Dynamics/Model/OrganizationMetadata", [], function (exports_6, context_6) { "use strict"; var __moduleName = context_6 && context_6.id; return { @@ -684,14 +798,55 @@ System.register("Dynamics/Model/EntityMetadata", [], function (exports_6, contex } }; }); -System.register("Dynamics/Model/AttributeMetadata", [], function (exports_7, context_7) { +System.register("Dynamics/DynamicsDiscovery", ["Dynamics/DynamicsRequest"], function (exports_7, context_7) { "use strict"; - var AttributeTypeCodes; + var DynamicsRequest_3, DefaultDiscoveryApiVersion, DynamicsDiscoveryClient; var __moduleName = context_7 && context_7.id; + function dynamicsDiscovery(connectionOptions) { + return new DynamicsDiscoveryClient(connectionOptions); + } + exports_7("default", dynamicsDiscovery); + return { + setters: [ + function (DynamicsRequest_3_1) { + DynamicsRequest_3 = DynamicsRequest_3_1; + } + ], + execute: function () { + exports_7("DefaultDiscoveryApiVersion", DefaultDiscoveryApiVersion = 'v9.1'); + DynamicsDiscoveryClient = class DynamicsDiscoveryClient { + constructor(options) { + if (options) { + this.connectionOptions = options; + if (!options.webApiVersion) { + this.connectionOptions.webApiVersion = DefaultDiscoveryApiVersion; + } + } + } + discover() { + return DynamicsRequest_3.dynamicsRequest(this.connectionOptions, `/api/discovery/${this.connectionOptions.webApiVersion}/Instances`, this.dynamicsHeaders); + } + }; + } + }; +}); +System.register("Dynamics/Model/EntityMetadata", [], function (exports_8, context_8) { + "use strict"; + var __moduleName = context_8 && context_8.id; return { setters: [], execute: function () { - exports_7("AttributeTypeCodes", AttributeTypeCodes = [ + } + }; +}); +System.register("Dynamics/Model/AttributeMetadata", [], function (exports_9, context_9) { + "use strict"; + var AttributeTypeCodes; + var __moduleName = context_9 && context_9.id; + return { + setters: [], + execute: function () { + exports_9("AttributeTypeCodes", AttributeTypeCodes = [ 'BigInt', 'Boolean', 'Customer', @@ -711,31 +866,31 @@ System.register("Dynamics/Model/AttributeMetadata", [], function (exports_7, con } }; }); -System.register("Dynamics/Model/OptionSetMetadata", [], function (exports_8, context_8) { +System.register("Dynamics/Model/OptionSetMetadata", [], function (exports_10, context_10) { "use strict"; - var __moduleName = context_8 && context_8.id; + var __moduleName = context_10 && context_10.id; return { setters: [], execute: function () { } }; }); -System.register("Dynamics/DynamicsMetadata", ["Dynamics/Dynamics", "Dynamics/DynamicsBatch", "Dynamics/DynamicsRequest"], function (exports_9, context_9) { +System.register("Dynamics/DynamicsMetadata", ["Dynamics/DynamicsBatch", "Dynamics/DynamicsRequest"], function (exports_11, context_11) { "use strict"; - var Dynamics_3, DynamicsBatch_2, DynamicsRequest_3, entityProperties, attributeProperties, ExcludedAttributeTypeFilters, ExcludedAttributeNameFilters, DynamicsMetadataClient, DynamicsMetadataMapper; - var __moduleName = context_9 && context_9.id; - function dynamicsMetadata(accessToken) { - return new DynamicsMetadataClient(accessToken); + var DynamicsBatch_2, DynamicsRequest_4, entityProperties, attributeProperties, ExcludedAttributeTypeFilters, ExcludedAttributeNameFilters, DynamicsMetadataClient, DynamicsMetadataMapper; + var __moduleName = context_11 && context_11.id; + function dynamicsmetdata(connectionOptions) { + return new DynamicsMetadataClient(connectionOptions); } - exports_9("default", dynamicsMetadata); + exports_11("default", dynamicsmetdata); function isLookupAttribute(attribute) { return attribute.Type === 'Lookup' && attribute['LookupEntityName']; } - exports_9("isLookupAttribute", isLookupAttribute); + exports_11("isLookupAttribute", isLookupAttribute); function isOptionSetAttribute(attribute) { return (attribute.Type === 'Picklist' || attribute.Type === 'State' || attribute.Type === 'Status') && attribute['PicklistOptions']; } - exports_9("isOptionSetAttribute", isOptionSetAttribute); + exports_11("isOptionSetAttribute", isOptionSetAttribute); function isLookup(attribute) { return Array.isArray(attribute['Targets']); } @@ -744,14 +899,11 @@ System.register("Dynamics/DynamicsMetadata", ["Dynamics/Dynamics", "Dynamics/Dyn } return { setters: [ - function (Dynamics_3_1) { - Dynamics_3 = Dynamics_3_1; - }, function (DynamicsBatch_2_1) { DynamicsBatch_2 = DynamicsBatch_2_1; }, - function (DynamicsRequest_3_1) { - DynamicsRequest_3 = DynamicsRequest_3_1; + function (DynamicsRequest_4_1) { + DynamicsRequest_4 = DynamicsRequest_4_1; } ], execute: function () { @@ -790,31 +942,31 @@ System.register("Dynamics/DynamicsMetadata", ["Dynamics/Dynamics", "Dynamics/Dyn 'entityimage_timestamp' ]; DynamicsMetadataClient = class DynamicsMetadataClient { - constructor(accessToken) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options) { + if (options) { + this.connectionOptions = options; + } } attributes(entityName) { - return DynamicsBatch_2.dynamicsBatch(this.dynamicsHeaders) + return DynamicsBatch_2.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.getMetadataUrls(entityName, false)) .execute() .then(data => this.flatten(data) - .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') != attribute.LogicalName.length - 4) + .filter((attribute) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') !== attribute.LogicalName.length - 4) .map(DynamicsMetadataMapper.MapAttribute)); } entities() { - return DynamicsRequest_3.dynamicsRequest(`/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return DynamicsRequest_4.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(data => data .map(entity => DynamicsMetadataMapper.MapEntity(entity))); } entity(entityName) { - return DynamicsRequest_3.dynamicsRequest(`/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return DynamicsRequest_4.dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(entity => this.attributes(entityName) .then(attributes => DynamicsMetadataMapper.MapEntity(entity, attributes))); } entityAttributes(...entityNames) { - return DynamicsBatch_2.dynamicsBatch(this.dynamicsHeaders) + return DynamicsBatch_2.dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.flatten(entityNames.map(e => this.getMetadataUrls(e, true)))) .execute() .then(data => { @@ -826,7 +978,7 @@ System.register("Dynamics/DynamicsMetadata", ["Dynamics/Dynamics", "Dynamics/Dyn currentEntity = DynamicsMetadataMapper.MapEntity(item); entities.push(currentEntity); } - else if (item.LogicalName.indexOf('yomi') == -1 && item.LogicalName.indexOf('base') != item.LogicalName.length - 4) { + else if (item.LogicalName.indexOf('yomi') === -1 && item.LogicalName.indexOf('base') !== item.LogicalName.length - 4) { currentEntity.Attributes.push(DynamicsMetadataMapper.MapAttribute(item)); } } @@ -837,12 +989,12 @@ System.register("Dynamics/DynamicsMetadata", ["Dynamics/Dynamics", "Dynamics/Dyn const attributeTypeFilter = ExcludedAttributeTypeFilters.map(v => `AttributeType ne Microsoft.Dynamics.CRM.AttributeTypeCode'${v}'`).join(' and '); const attributeNameFilter = ExcludedAttributeNameFilters.map(v => `LogicalName ne '${v}'`).join(' and '); return [ - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${Dynamics_3.WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` ].slice(includeEntity ? 0 : 1); } flatten(values) { @@ -882,10 +1034,707 @@ System.register("Dynamics/DynamicsMetadata", ["Dynamics/Dynamics", "Dynamics/Dyn } }; }); -System.register("tests/dynamicsMetadataTests", ["Dynamics/DynamicsMetadata"], function (exports_10, context_10) { +System.register("ntlm/ntlm.flags", [], function (exports_12, context_12) { + 'use strict'; + var NtlmFlags; + var __moduleName = context_12 && context_12.id; + return { + setters: [], + execute: function () { + (function (NtlmFlags) { + /* Indicates that Unicode strings are supported for use in security buffer + data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_UNICODE"] = 1] = "NEGOTIATE_UNICODE"; + /* Indicates that OEM strings are supported for use in security buffer data. */ + NtlmFlags[NtlmFlags["NEGOTIATE_OEM"] = 2] = "NEGOTIATE_OEM"; + /* Requests that the server's authentication realm be included in the Type 2 + message. */ + NtlmFlags[NtlmFlags["REQUEST_TARGET"] = 4] = "REQUEST_TARGET"; + /* unknown (1<<3) */ + /* Specifies that authenticated communication between the client and server + should carry a digital signature (message integrity). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SIGN"] = 16] = "NEGOTIATE_SIGN"; + /* Specifies that authenticated communication between the client and server + should be encrypted (message confidentiality). */ + NtlmFlags[NtlmFlags["NEGOTIATE_SEAL"] = 32] = "NEGOTIATE_SEAL"; + /* Indicates that datagram authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DATAGRAM_STYLE"] = 64] = "NEGOTIATE_DATAGRAM_STYLE"; + /* Indicates that the LAN Manager session key should be used for signing and + sealing authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LM_KEY"] = 128] = "NEGOTIATE_LM_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["NEGOTIATE_NETWARE"] = 256] = "NEGOTIATE_NETWARE"; + /* Indicates that NTLM authentication is being used. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM_KEY"] = 512] = "NEGOTIATE_NTLM_KEY"; + /* unknown (1<<10) */ + /* Sent by the client in the Type 3 message to indicate that an anonymous + context has been established. This also affects the response fields. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ANONYMOUS"] = 2048] = "NEGOTIATE_ANONYMOUS"; + /* Sent by the client in the Type 1 message to indicate that a desired + authentication realm is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_DOMAIN_SUPPLIED"] = 4096] = "NEGOTIATE_DOMAIN_SUPPLIED"; + /* Sent by the client in the Type 1 message to indicate that the client + workstation's name is included in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_WORKSTATION_SUPPLIED"] = 8192] = "NEGOTIATE_WORKSTATION_SUPPLIED"; + /* Sent by the server to indicate that the server and client are on the same + machine. Implies that the client may use a pre-established local security + context rather than responding to the challenge. */ + NtlmFlags[NtlmFlags["NEGOTIATE_LOCAL_CALL"] = 16384] = "NEGOTIATE_LOCAL_CALL"; + /* Indicates that authenticated communication between the client and server + should be signed with a "dummy" signature. */ + NtlmFlags[NtlmFlags["NEGOTIATE_ALWAYS_SIGN"] = 32768] = "NEGOTIATE_ALWAYS_SIGN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a domain. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_DOMAIN"] = 65536] = "TARGET_TYPE_DOMAIN"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a server. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SERVER"] = 131072] = "TARGET_TYPE_SERVER"; + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a share. Presumably, this is for share-level + authentication. Usage is unclear. */ + NtlmFlags[NtlmFlags["TARGET_TYPE_SHARE"] = 262144] = "TARGET_TYPE_SHARE"; + /* Indicates that the NTLM2 signing and sealing scheme should be used for + protecting authenticated communications. */ + NtlmFlags[NtlmFlags["NEGOTIATE_NTLM2_KEY"] = 524288] = "NEGOTIATE_NTLM2_KEY"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_INIT_RESPONSE"] = 1048576] = "REQUEST_INIT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_ACCEPT_RESPONSE"] = 2097152] = "REQUEST_ACCEPT_RESPONSE"; + /* unknown purpose */ + NtlmFlags[NtlmFlags["REQUEST_NONNT_SESSION_KEY"] = 4194304] = "REQUEST_NONNT_SESSION_KEY"; + /* Sent by the client in the Type 1 message to request Target info block from server. + Sent by the server in the Type 2 message to indicate that it is including a + Target Information block in the message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_TARGET_INFO"] = 8388608] = "NEGOTIATE_TARGET_INFO"; + /* unknown (1<24) */ + /* Indicates that the version info block is included in the message */ + NtlmFlags[NtlmFlags["NEGOTIATE_VERSION"] = 33554432] = "NEGOTIATE_VERSION"; + /* unknown (1<26) */ + /* unknown (1<27) */ + /* unknown (1<28) */ + /* Indicates that 128-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_128"] = 536870912] = "NEGOTIATE_128"; + /* Indicates that the client will provide an encrypted master key in + the "Session Key" field of the Type 3 message. */ + NtlmFlags[NtlmFlags["NEGOTIATE_KEY_EXCHANGE"] = 1073741824] = "NEGOTIATE_KEY_EXCHANGE"; + /* Indicates that 56-bit encryption is supported. */ + NtlmFlags[NtlmFlags["NEGOTIATE_56"] = -2147483648] = "NEGOTIATE_56"; + })(NtlmFlags || (NtlmFlags = {})); + exports_12("NtlmFlags", NtlmFlags); + } + }; +}); +System.register("ntlm/ntlm.constants", [], function (exports_13, context_13) { + "use strict"; + var NtlmConstants; + var __moduleName = context_13 && context_13.id; + return { + setters: [], + execute: function () { + NtlmConstants = class NtlmConstants { + }; + exports_13("NtlmConstants", NtlmConstants); + NtlmConstants.NTLM_SIGNATURE = 'NTLMSSP\0'; + } + }; +}); +System.register("ntlm/type2.message", ["ntlm/ntlm.flags", "ntlm/ntlm.constants"], function (exports_14, context_14) { + "use strict"; + var ntlm_flags_1, ntlm_constants_1, Type2Message; + var __moduleName = context_14 && context_14.id; + return { + setters: [ + function (ntlm_flags_1_1) { + ntlm_flags_1 = ntlm_flags_1_1; + }, + function (ntlm_constants_1_1) { + ntlm_constants_1 = ntlm_constants_1_1; + } + ], + execute: function () { + Type2Message = class Type2Message { + constructor(buf) { + this.raw = buf; + //check signature + if (buf.toString('ascii', 0, ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length) !== ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE) { + throw new Error('Invalid message signature'); + } + //check message type + if (buf.readUInt32LE(ntlm_constants_1.NtlmConstants.NTLM_SIGNATURE.length) !== 2) { + throw new Error('Invalid message type (no type 2)'); + } + //read flags + this.flags = buf.readUInt32LE(20); + this.encoding = (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_OEM) ? 'ascii' : 'ucs2'; + this.version = (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_NTLM2_KEY) ? 2 : 1; + this.challenge = buf.slice(24, 32); + //read target name + this.targetName = this.readTargetName(); + //read target info + if (this.flags & ntlm_flags_1.NtlmFlags.NEGOTIATE_TARGET_INFO) { + this.targetInfo = this.parseTargetInfo(); + } + } + readTargetName() { + let length = this.raw.readUInt16LE(12); + //skipping allocated space + let offset = this.raw.readUInt32LE(16); + if (length === 0) { + return ''; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + return this.raw.toString(this.encoding, offset, offset + length); + } + parseTargetInfo() { + let info = {}; + let length = this.raw.readUInt16LE(40); + //skipping allocated space + let offset = this.raw.readUInt32LE(44); + let targetInfoBuffer = Buffer.alloc(length); + this.raw.copy(targetInfoBuffer, 0, offset, offset + length); + if (length === 0) { + return info; + } + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + let pos = offset; + while (pos < (offset + length)) { + let blockType = this.raw.readUInt16LE(pos); + pos += 2; + let blockLength = this.raw.readUInt16LE(pos); + pos += 2; + if (blockType === 0) { + //reached the terminator subblock + break; + } + let blockTypeStr; + let blockTypeOutput = 'string'; + switch (blockType) { + case 0x01: + blockTypeStr = 'SERVER'; + break; + case 0x02: + blockTypeStr = 'DOMAIN'; + break; + case 0x03: + blockTypeStr = 'FQDN'; + break; + case 0x04: + blockTypeStr = 'DNS'; + break; + case 0x05: + blockTypeStr = 'PARENT_DNS'; + break; + case 0x06: + blockTypeStr = 'FLAGS'; + blockTypeOutput = 'hex'; + break; + case 0x07: + blockTypeStr = 'SERVER_TIMESTAMP'; + blockTypeOutput = 'hex'; + break; + case 0x08: + blockTypeStr = 'SINGLE_HOST'; + blockTypeOutput = 'hex'; + break; + case 0x09: + blockTypeStr = 'TARGET_NAME'; + break; + case 0x0A: + blockTypeStr = 'CHANNEL_BINDING'; + blockTypeOutput = 'hex'; + break; + default: + blockTypeStr = ''; + break; + } + if (blockTypeStr) { + if (blockTypeOutput === 'string') { + info[blockTypeStr] = this.raw.toString('ucs2', pos, pos + blockLength); + } + else { + // Output as hex in little endian order + let twoCharBlocks = this.raw.toString('hex', pos, pos + blockLength).match(/.{2}/g); + if (twoCharBlocks) { + info[blockTypeStr] = twoCharBlocks.reverse().join(""); + } + else { + info[blockTypeStr] = null; + } + } + } + pos += blockLength; + } + return { + parsed: info, + buffer: targetInfoBuffer + }; + } + }; + exports_14("Type2Message", Type2Message); + } + }; +}); +System.register("ntlm/hash", ["crypto"], function (exports_15, context_15) { + 'use strict'; + var crypto, Hash; + var __moduleName = context_15 && context_15.id; + return { + setters: [ + function (crypto_1) { + crypto = crypto_1; + } + ], + execute: function () { + Hash = class Hash { + static createLMResponse(challenge, lmhash) { + let buf = Buffer.alloc(24); + let pwBuffer = Buffer.alloc(21).fill(0); + lmhash.copy(pwBuffer); + Hash.calculateDES(pwBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(pwBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(pwBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createLMHash(password) { + let buf = Buffer.alloc(16), pwBuffer = Buffer.alloc(14), magicKey = Buffer.from('KGS!@#$%', 'ascii'); + if (password.length > 14) { + buf.fill(0); + return buf; + } + pwBuffer.fill(0); + pwBuffer.write(password.toUpperCase(), 0, 'ascii'); + return Buffer.concat([ + Hash.calculateDES(pwBuffer.slice(0, 7), magicKey), + Hash.calculateDES(pwBuffer.slice(7), magicKey) + ]); + } + static calculateDES(key, message) { + let desKey = Buffer.alloc(8); + desKey[0] = key[0] & 0xFE; + desKey[1] = ((key[0] << 7) & 0xFF) | (key[1] >> 1); + desKey[2] = ((key[1] << 6) & 0xFF) | (key[2] >> 2); + desKey[3] = ((key[2] << 5) & 0xFF) | (key[3] >> 3); + desKey[4] = ((key[3] << 4) & 0xFF) | (key[4] >> 4); + desKey[5] = ((key[4] << 3) & 0xFF) | (key[5] >> 5); + desKey[6] = ((key[5] << 2) & 0xFF) | (key[6] >> 6); + desKey[7] = (key[6] << 1) & 0xFF; + for (let i = 0; i < 8; i++) { + let parity = 0; + for (let j = 1; j < 8; j++) { + parity += (desKey[i] >> j) % 2; + } + desKey[i] |= (parity % 2) === 0 ? 1 : 0; + } + let des = crypto.createCipheriv('DES-ECB', desKey, ''); + return des.update(message); + } + static createNTLMResponse(challenge, ntlmhash) { + let buf = Buffer.alloc(24), ntlmBuffer = Buffer.alloc(21).fill(0); + ntlmhash.copy(ntlmBuffer); + Hash.calculateDES(ntlmBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(ntlmBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(ntlmBuffer.slice(14), challenge).copy(buf, 16); + return buf; + } + static createNTLMHash(password) { + let md4sum = crypto.createHash('md4'); + md4sum.update(Buffer.from(password, 'ucs2')); // lgtm[js/insufficient-password-hash] + return md4sum.digest(); + } + static createNTLMv2Hash(ntlmhash, username, authTargetName) { + let hmac = crypto.createHmac('md5', ntlmhash); + hmac.update(Buffer.from(username.toUpperCase() + authTargetName, 'ucs2')); // lgtm[js/weak-cryptographic-algorithm] + return hmac.digest(); + } + static createLMv2Response(type2message, username, authTargetName, ntlmhash, nonce) { + let buf = Buffer.alloc(24); + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let hmac = crypto.createHmac('md5', ntlm2hash); + //server challenge + type2message.challenge.copy(buf, 8); + //client nonce + buf.write(nonce, 16, 'hex'); + //create hash + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let bufferSize = 48 + type2message.targetInfo.buffer.length; + if (withMic) { + bufferSize += 8; + } + let buf = Buffer.alloc(bufferSize), ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName), hmac = crypto.createHmac('md5', ntlm2hash); + //the first 8 bytes are spare to store the hashed value before the blob + //server challenge + type2message.challenge.copy(buf, 8); + //blob signature + buf.writeUInt32BE(0x01010000, 16); + //reserved + buf.writeUInt32LE(0, 20); + //timestamp + let timestampLow = Number('0x' + timestamp.substring(Math.max(0, timestamp.length - 8))); + let timestampHigh = Number('0x' + timestamp.substring(0, Math.max(0, timestamp.length - 8))); + buf.writeUInt32LE(timestampLow, 24); + buf.writeUInt32LE(timestampHigh, 28); + //random client nonce + buf.write(nonce, 32, 'hex'); + //zero + buf.writeUInt32LE(0, 40); + //complete target information block from type 2 message + type2message.targetInfo.buffer.copy(buf, 44); + let bufferPos = 44 + type2message.targetInfo.buffer.length; + if (withMic) { + // Should include MIC in response, indicate it in AV_FLAGS + buf.writeUInt16LE(0x06, bufferPos - 4); + buf.writeUInt16LE(0x04, bufferPos - 2); + buf.writeUInt32LE(0x02, bufferPos); + // Write new endblock + buf.writeUInt32LE(0, bufferPos + 4); + bufferPos += 8; + } + //zero + buf.writeUInt32LE(0, bufferPos); + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + hashedBuffer.copy(buf); + return buf; + } + static createMIC(type1message, type2message, type3message, username, authTargetName, ntlmhash, nonce, timestamp) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, true); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + //create MIC hash + hmac = crypto.createHmac('md5', key_exchange_key); + hmac.update(type1message); + hmac.update(type2message.raw); + hmac.update(type3message); + let hashedBuffer = hmac.digest(); + return hashedBuffer; + } + static createRandomSessionKey(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0, 16)).digest(); + let key_exchange_key = session_base_key; + let exported_session_key_hex = Hash.createPseudoRandomValue(32); + let exported_session_key = Buffer.from(exported_session_key_hex, 'hex'); + let rc4 = crypto.createCipheriv('rc4', key_exchange_key, ''); + let encrypted_random_session_key = rc4.update(exported_session_key); + return encrypted_random_session_key; + } + static createPseudoRandomValue(length) { + let str = ''; + while (str.length < length) { + str += Math.floor(Math.random() * 16).toString(16); + } + return str; + } + static createTimestamp() { + //TODO: we are loosing precision here since js is not able to handle those large integers + // maybe think about a different solution here + // 11644473600000 = diff between 1970 and 1601 + return ((Date.now() + 11644473600000) * 10000).toString(16); + } + }; + exports_15("Hash", Hash); + } + }; +}); +System.register("ntlm/ntlm.message", [], function (exports_16, context_16) { + "use strict"; + var NtlmMessage; + var __moduleName = context_16 && context_16.id; + return { + setters: [], + execute: function () { + NtlmMessage = class NtlmMessage { + constructor(buf) { + this.raw = buf; + } + header() { + return 'NTLM ' + this.raw.toString('base64'); + } + }; + exports_16("NtlmMessage", NtlmMessage); + } + }; +}); +System.register("ntlm/interfaces/i.ntlm", [], function (exports_17, context_17) { + "use strict"; + var __moduleName = context_17 && context_17.id; + return { + setters: [], + execute: function () { + } + }; +}); +// All code in this folder is heavily based on the node project ntlm-client. +// https://github.com/clncln1/node-ntlm-client +// ---------------------------------------------------------------------------- +// Original license statement: +System.register("ntlm/ntlm", ["ntlm/ntlm.flags", "ntlm/ntlm.constants", "ntlm/hash", "os", "ntlm/type2.message", "ntlm/ntlm.message"], function (exports_18, context_18) { + // Copyright (c) 2015 Nico Haller + // Permission is hereby granted, free of charge, to any person obtaining a copy + // of this software and associated documentation files (the "Software"), to deal + // in the Software without restriction, including without limitation the rights + // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + // copies of the Software, and to permit persons to whom the Software is + // furnished to do so, subject to the following conditions: + // The above copyright notice and this permission notice shall be included in + // all copies or substantial portions of the Software. + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + // THE SOFTWARE. + // ---------------------------------------------------------------------------- + 'use strict'; + var ntlm_flags_2, ntlm_constants_2, hash_1, os, type2_message_1, ntlm_message_1, Ntlm; + var __moduleName = context_18 && context_18.id; + function ntlm() { + return new Ntlm(); + } + exports_18("default", ntlm); + return { + setters: [ + function (ntlm_flags_2_1) { + ntlm_flags_2 = ntlm_flags_2_1; + }, + function (ntlm_constants_2_1) { + ntlm_constants_2 = ntlm_constants_2_1; + }, + function (hash_1_1) { + hash_1 = hash_1_1; + }, + function (os_1) { + os = os_1; + }, + function (type2_message_1_1) { + type2_message_1 = type2_message_1_1; + }, + function (ntlm_message_1_1) { + ntlm_message_1 = ntlm_message_1_1; + } + ], + execute: function () { + Ntlm = class Ntlm { + createType1Message(ntlm_version, workstation, target) { + let dataPos = 40; + let pos = 0; + let buf = Buffer.alloc(256); + if (target === undefined) { + target = ''; + } + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + //signature + buf.write(ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE, pos, ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + pos += ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE.length; + //message type + buf.writeUInt32LE(1, pos); + pos += 4; + //flags + let messageFlags = ntlm_flags_2.NtlmFlags.NEGOTIATE_OEM | + ntlm_flags_2.NtlmFlags.NEGOTIATE_ALWAYS_SIGN | + ntlm_flags_2.NtlmFlags.NEGOTIATE_VERSION; + if (ntlm_version == 1) { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_NTLM_KEY | + ntlm_flags_2.NtlmFlags.NEGOTIATE_LM_KEY; + } + else { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_NTLM2_KEY; + } + if (target.length > 0) { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_DOMAIN_SUPPLIED; + } + if (workstation.length > 0) { + messageFlags |= ntlm_flags_2.NtlmFlags.NEGOTIATE_WORKSTATION_SUPPLIED; + } + // special operator to force conversion to unsigned + buf.writeUInt32LE(messageFlags >>> 0, pos); + pos += 4; + //domain security buffer + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (target.length > 0) { + dataPos += buf.write(target, dataPos, 'ascii'); + } + //workstation security buffer + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + if (workstation.length > 0) { + dataPos += buf.write(workstation, dataPos, 'ascii'); + } + this.addVersionStruct(buf, pos); + return new ntlm_message_1.NtlmMessage(buf.slice(0, dataPos)); + } + // Version - hard-coded to + // Major version 10, minor version 0 (Windows 10) + // build number 18362 (1903 update), NTLM revision 15 + addVersionStruct(buf, pos) { + buf.writeUInt8(10, pos); + pos++; + buf.writeUInt8(0, pos); + pos++; + buf.writeUInt16LE(18362, pos); + pos += 2; + buf.writeUInt32LE(0x0F000000, pos); + pos += 4; + return pos; + } + decodeType2Message(str) { + if (str === undefined) { + throw new Error('Invalid argument'); + } + let ntlmMatch = /^NTLM ([^,\s]+)/.exec(str); + if (ntlmMatch) { + str = ntlmMatch[1]; + } + let buf = Buffer.from(str, 'base64'); + let type2message = new type2_message_1.Type2Message(buf); + return type2message; + } + createType3Message(type1message, type2message, username, password, workstation, target, client_nonce_override, timestamp_override) { + let dataPos = 72; + let buf = Buffer.alloc(1024); + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + if (target === undefined) { + target = type2message.targetName; + } + //signature + buf.write(ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE, 0, ntlm_constants_2.NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + //message type + buf.writeUInt32LE(3, 8); + let targetLen = type2message.encoding === 'ascii' ? target.length : target.length * 2; + let usernameLen = type2message.encoding === 'ascii' ? username.length : username.length * 2; + let workstationLen = type2message.encoding === 'ascii' ? workstation.length : workstation.length * 2; + let dataPosOffset = targetLen + usernameLen + workstationLen; + let timestamp = ''; + let client_nonce = ''; + let withMic = false; + let withServerTimestamp = false; + if (type2message.version === 2 && + type2message.targetInfo && + type2message.targetInfo.parsed['SERVER_TIMESTAMP']) { // Must include MIC, add room for it + withServerTimestamp = true; + withMic = true; + dataPos += 16; + } + let hashDataPos = dataPos + dataPosOffset; + let ntlmHash = hash_1.Hash.createNTLMHash(password); + if (type2message.version === 2) { + client_nonce = client_nonce_override || hash_1.Hash.createPseudoRandomValue(16); + if (withServerTimestamp) { // Use server timestamp if provided + timestamp = type2message.targetInfo.parsed['SERVER_TIMESTAMP']; + } + else { + timestamp = timestamp_override || hash_1.Hash.createTimestamp(); + } + let lmv2; + if (withServerTimestamp) { + lmv2 = Buffer.alloc(24); // zero-filled + } + else { + lmv2 = hash_1.Hash.createLMv2Response(type2message, username, target, ntlmHash, client_nonce); + } + //lmv2 security buffer + buf.writeUInt16LE(lmv2.length, 12); + buf.writeUInt16LE(lmv2.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lmv2.copy(buf, hashDataPos); + hashDataPos += lmv2.length; + let ntlmv2 = hash_1.Hash.createNTLMv2Response(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + //ntlmv2 security buffer + buf.writeUInt16LE(ntlmv2.length, 20); + buf.writeUInt16LE(ntlmv2.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlmv2.copy(buf, hashDataPos); + hashDataPos += ntlmv2.length; + } + else { + let lmHash = hash_1.Hash.createLMHash(password); + let lm = hash_1.Hash.createLMResponse(type2message.challenge, lmHash); + let ntlm = hash_1.Hash.createNTLMResponse(type2message.challenge, ntlmHash); + //lm security buffer + buf.writeUInt16LE(lm.length, 12); + buf.writeUInt16LE(lm.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + lm.copy(buf, hashDataPos); + hashDataPos += lm.length; + //ntlm security buffer + buf.writeUInt16LE(ntlm.length, 20); + buf.writeUInt16LE(ntlm.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + ntlm.copy(buf, hashDataPos); + hashDataPos += ntlm.length; + } + //target name security buffer + buf.writeUInt16LE(targetLen, 28); + buf.writeUInt16LE(targetLen, 30); + buf.writeUInt32LE(dataPos, 32); + dataPos += buf.write(target, dataPos, type2message.encoding); + //user name security buffer + buf.writeUInt16LE(usernameLen, 36); + buf.writeUInt16LE(usernameLen, 38); + buf.writeUInt32LE(dataPos, 40); + dataPos += buf.write(username, dataPos, type2message.encoding); + //workstation name security buffer + buf.writeUInt16LE(workstationLen, 44); + buf.writeUInt16LE(workstationLen, 46); + buf.writeUInt32LE(dataPos, 48); + dataPos += buf.write(workstation, dataPos, type2message.encoding); + //session key security buffer + let session_key = Buffer.alloc(0); + // if (type2message.flags & NtlmFlags.NEGOTIATE_KEY_EXCHANGE) { + // session_key = hash.createRandomSessionKey(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + // } + buf.writeUInt16LE(session_key.length, 52); + buf.writeUInt16LE(session_key.length, 54); + buf.writeUInt32LE(hashDataPos, 56); + session_key.copy(buf, hashDataPos); + hashDataPos += session_key.length; + //flags + buf.writeUInt32LE(type2message.flags, 60); + this.addVersionStruct(buf, 64); + if (withMic) { + // Calculate and add MIC + let mic = hash_1.Hash.createMIC(type1message.raw, type2message, buf.slice(0, hashDataPos), username, target, ntlmHash, client_nonce, timestamp); + mic.copy(buf, 72); + } + return new ntlm_message_1.NtlmMessage(buf.slice(0, hashDataPos)); + //return 'NTLM ' + buf.toString('base64', 0, hashDataPos); + } + }; + exports_18("Ntlm", Ntlm); + } + }; +}); +System.register("tests/dynamicsMetadataTests", ["Dynamics/DynamicsMetadata"], function (exports_19, context_19) { "use strict"; var DynamicsMetadata_1; - var __moduleName = context_10 && context_10.id; + var __moduleName = context_19 && context_19.id; function dynamicsMetadataRetrieveAll() { return __awaiter(this, void 0, void 0, function* () { const meta = DynamicsMetadata_1.default(); @@ -903,7 +1752,7 @@ System.register("tests/dynamicsMetadataTests", ["Dynamics/DynamicsMetadata"], fu } }); } - exports_10("dynamicsMetadataRetrieveAll", dynamicsMetadataRetrieveAll); + exports_19("dynamicsMetadataRetrieveAll", dynamicsMetadataRetrieveAll); return { setters: [ function (DynamicsMetadata_1_1) { @@ -914,13 +1763,20 @@ System.register("tests/dynamicsMetadataTests", ["Dynamics/DynamicsMetadata"], fu } }; }); -System.register("tests/dynamicsTests", ["Dynamics/Dynamics", "Query/Query"], function (exports_11, context_11) { +System.register("tests/dynamicsTests", ["Dynamics/Dynamics", "Query/Query", "Dynamics/DynamicsRequest"], function (exports_20, context_20) { "use strict"; - var Dynamics_4, Query_5; - var __moduleName = context_11 && context_11.id; + var Dynamics_3, Query_5, DynamicsRequest_5; + var __moduleName = context_20 && context_20.id; function dynamicsTestAll() { return __awaiter(this, void 0, void 0, function* () { - const dyn = Dynamics_4.default(); + const options = new DynamicsRequest_5.ConnectionOptions(); + options.authType = DynamicsRequest_5.AuthenticationType.Windows; + options.username = "Administrator"; + options.domain = "CONTOSO"; + options.password = "{password}"; + options.serverUrl = "http://{server}/{org}/"; + options.webApiVersion = "v9.0"; + const dyn = Dynamics_3.default(options); /* Batch Request */ const allAccounts = yield dyn.batch() .requestAllUrls(['/api/data/v9.1/accounts']) @@ -953,24 +1809,27 @@ System.register("tests/dynamicsTests", ["Dynamics/Dynamics", "Query/Query"], fun } }); } - exports_11("dynamicsTestAll", dynamicsTestAll); + exports_20("dynamicsTestAll", dynamicsTestAll); return { setters: [ - function (Dynamics_4_1) { - Dynamics_4 = Dynamics_4_1; + function (Dynamics_3_1) { + Dynamics_3 = Dynamics_3_1; }, function (Query_5_1) { Query_5 = Query_5_1; + }, + function (DynamicsRequest_5_1) { + DynamicsRequest_5 = DynamicsRequest_5_1; } ], execute: function () { } }; }); -System.register("tests/queryTests", ["Query/Query", "Query/QueryXml"], function (exports_12, context_12) { +System.register("tests/queryTests", ["Query/Query", "Query/QueryXml"], function (exports_21, context_21) { "use strict"; var Query_6, QueryXml_3; - var __moduleName = context_12 && context_12.id; + var __moduleName = context_21 && context_21.id; function createQueryWithAllExpressions() { const thisQuery = Query_6.default('account'); thisQuery @@ -992,7 +1851,7 @@ System.register("tests/queryTests", ["Query/Query", "Query/QueryXml"], function throw new Error('QueryXml could not be generated!'); } } - exports_12("createQueryWithAllExpressions", createQueryWithAllExpressions); + exports_21("createQueryWithAllExpressions", createQueryWithAllExpressions); return { setters: [ function (Query_6_1) { @@ -1006,3 +1865,4 @@ System.register("tests/queryTests", ["Query/Query", "Query/QueryXml"], function } }; }); +//# sourceMappingURL=more-xrm.js.map \ No newline at end of file diff --git a/lib/system/more-xrm.js.map b/lib/system/more-xrm.js.map new file mode 100644 index 0000000..22c910d --- /dev/null +++ b/lib/system/more-xrm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"more-xrm.js","sourceRoot":"","sources":["../../src/Query/Query.ts","../../src/Query/QueryXml.ts","../../src/Dynamics/DynamicsRequest.ts","../../src/Dynamics/DynamicsBatch.ts","../../src/Dynamics/Dynamics.ts","../../src/Dynamics/Model/OrganizationMetadata.ts","../../src/Dynamics/DynamicsDiscovery.ts","../../src/Dynamics/Model/EntityMetadata.ts","../../src/Dynamics/Model/AttributeMetadata.ts","../../src/Dynamics/Model/OptionSetMetadata.ts","../../src/Dynamics/DynamicsMetadata.ts","../../src/ntlm/ntlm.flags.ts","../../src/ntlm/ntlm.constants.ts","../../src/ntlm/type2.message.ts","../../src/ntlm/hash.ts","../../src/ntlm/ntlm.message.ts","../../src/ntlm/interfaces/i.ntlm.ts","../../src/ntlm/ntlm.ts","../../src/tests/dynamicsMetadataTests.ts","../../src/tests/dynamicsTests.ts","../../src/tests/queryTests.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d1080c0..01851d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,11 +4,66 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/inversify": { + "version": "2.0.33", + "resolved": "https://registry.npmjs.org/@types/inversify/-/inversify-2.0.33.tgz", + "integrity": "sha1-B3Da4imaruV4A/dSNeZKmbdPbeA=", + "requires": { + "inversify": "*" + } + }, + "@types/node": { + "version": "12.7.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.11.tgz", + "integrity": "sha512-Otxmr2rrZLKRYIybtdG/sgeO+tHY20GxeDjcGmUnmmlCWyEnv2a2x1ZXBo3BTec4OiTXMQCiazB8NMBf0iRlFw==" + }, + "@types/node-fetch": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.2.tgz", + "integrity": "sha512-djYYKmdNRSBtL1x4CiE9UJb9yZhwtI1VC+UxZD0psNznrUj80ywsxKlEGAE+QL1qvLjPbfb24VosjkYM6W4RSQ==", + "requires": { + "@types/node": "*" + } + }, + "httpntlm": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.6.tgz", + "integrity": "sha1-aZHoNSg2AH1nEBuD247Q+RX5BtA=", + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=" + }, + "inversify": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", + "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "os": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", + "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" + }, "typescript": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" } } } diff --git a/package.json b/package.json index ea6b197..b35ee8d 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,11 @@ "name": "more-xrm", "version": "0.1.2", "private": false, - "author": { - "name": "Greg DeCarlo", - "email": "greg@scalabledynamicsllc.com", - "url": "http://www.scalabledynamicsllc.com" - }, + "author": "Greg DeCarlo (http://www.scalabledynamicsllc.com)", "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/scalable-dynamics/more-xrm.git" + "url": "git+https://github.com/scalable-dynamics/more-xrm.git" }, "homepage": "https://github.com/scalable-dynamics/more-xrm", "description": "Create more applications using the Microsoft Dynamics Xrm platform, enables querying the dynamics data model from any application.", @@ -42,5 +38,23 @@ }, "files": [ "lib/**/*" - ] + ], + "dependencies": { + "@types/inversify": "^2.0.33", + "@types/node": "^12.7.11", + "@types/node-fetch": "^2.5.2", + "httpntlm": "^1.7.6", + "inversify": "^5.0.1", + "node-fetch": "^2.6.0", + "os": "^0.1.1" + }, + "bugs": { + "url": "https://github.com/scalable-dynamics/more-xrm/issues" + }, + "directories": { + "lib": "lib" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + } } diff --git a/src/Dynamics/Dynamics.ts b/src/Dynamics/Dynamics.ts index e498444..4a023d2 100644 --- a/src/Dynamics/Dynamics.ts +++ b/src/Dynamics/Dynamics.ts @@ -1,8 +1,8 @@ import query, { Query } from "../Query/Query"; import { dynamicsBatch, DynamicsBatch } from "./DynamicsBatch"; -import { dynamicsQuery, dynamicsRequest, dynamicsSave } from "./DynamicsRequest"; +import { ConnectionOptions, dynamicsQuery, dynamicsRequest, dynamicsSave } from "./DynamicsRequest"; -export const WebApiVersion = 'v9.1'; +export const DefaultWebApiVersion = 'v9.1'; export const DefaultMaxRecords = 100; export const DynamicsHeaders = { 'OData-MaxVersion': '4.0', @@ -18,34 +18,37 @@ export interface Dynamics { save(entitySetName: string, data: any, id?: string): Promise; } -export default function dynamics(accessToken?: string): Dynamics { - return new DynamicsClient(accessToken); +export default function dynamics(connectionOptions?: ConnectionOptions): Dynamics { + return new DynamicsClient(connectionOptions); } + class DynamicsClient implements Dynamics { private dynamicsHeaders: any; + private connectionOptions!: ConnectionOptions; - constructor(accessToken?: string) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken + constructor(options?:ConnectionOptions) { + if (options) + { + this.connectionOptions = options; } } batch(): DynamicsBatch { - return dynamicsBatch(this.dynamicsHeaders); + return dynamicsBatch(this.connectionOptions, this.dynamicsHeaders); } fetch(query: Query, maxRowCount: number = DefaultMaxRecords): Promise { - return dynamicsQuery(query, maxRowCount, this.dynamicsHeaders); + return dynamicsQuery(this.connectionOptions, query, maxRowCount, this.dynamicsHeaders); } optionset(entityName: any, attributeName: any): Promise<{ label: string, value: number }[]> { - return dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) + return dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes(LogicalName='${attributeName}')/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=LogicalName&$expand=OptionSet($select=Options),GlobalOptionSet($select=Options)`, this.dynamicsHeaders) .then(attribute => (attribute.OptionSet || attribute.GlobalOptionSet).Options.map( - (option) => ({ + (option: { Label: { UserLocalizedLabel: { Label: any; }; }; Value: any; }) => ({ label: (option.Label && option.Label.UserLocalizedLabel && option.Label.UserLocalizedLabel.Label), value: option.Value }) @@ -59,6 +62,6 @@ class DynamicsClient implements Dynamics { } save(entitySetName: string, data: any, id?: string): Promise { - return dynamicsSave(entitySetName, data, id, this.dynamicsHeaders); + return dynamicsSave(this.connectionOptions, entitySetName, data, id, this.dynamicsHeaders); } } \ No newline at end of file diff --git a/src/Dynamics/DynamicsBatch.ts b/src/Dynamics/DynamicsBatch.ts index 0377290..4606b32 100644 --- a/src/Dynamics/DynamicsBatch.ts +++ b/src/Dynamics/DynamicsBatch.ts @@ -1,10 +1,12 @@ import { GetRootQuery, Query } from "../Query/Query"; import GetQueryXml from "../Query/QueryXml"; -import { DefaultMaxRecords, DynamicsHeaders, WebApiVersion } from "./Dynamics"; -import { formatDynamicsResponse } from "./DynamicsRequest"; +import { DefaultMaxRecords, DynamicsHeaders } from "./Dynamics"; +import { formatDynamicsResponse, ConnectionOptions, AuthenticationType } from "./DynamicsRequest"; +import * as httpntlm from "httpntlm"; +import fetch from "node-fetch"; export interface DynamicsBatch { - execute(): Promise; + execute(): Promise; request(query: Query, maxRowCount?: number): DynamicsBatch; requestAll(queries: Query[]): DynamicsBatch; requestAllUrls(urls: string[]): DynamicsBatch; @@ -13,19 +15,21 @@ export interface DynamicsBatch { }; } -export function dynamicsBatch(headers?: any): DynamicsBatch { - return new Batch(headers); +export function dynamicsBatch(connectionOptions: ConnectionOptions, headers?: any): DynamicsBatch { + return new Batch(connectionOptions, headers); } -export function dynamicsBatchRequest(...url: string[]): Promise { - const batch = new Batch(); +export function dynamicsBatchRequest(connectionOptions: ConnectionOptions, ...url: string[]): Promise { + const batch = new Batch(connectionOptions); batch.requestAllUrls(url); + return batch.execute(); } -export function dynamicsBatchQuery(...query: Query[]): Promise { - const batch = new Batch(); +export function dynamicsBatchQuery(connectionOptions: ConnectionOptions, ...query: Query[]): Promise { + const batch = new Batch(connectionOptions); batch.requestAll(query); + return batch.execute(); } @@ -41,22 +45,30 @@ interface BatchRequest { class Batch implements DynamicsBatch { private Changes: BatchRequest[]; private RelatedChanges: BatchRequest[]; + private ConnectionOptions!: ConnectionOptions; - constructor(private headers?: any) { + constructor(private options: ConnectionOptions, private headers?: any) { + this.ConnectionOptions = options; this.Changes = []; this.RelatedChanges = []; } async execute() { - const results = await Batch.requestBatch(`/api/data/${WebApiVersion}/$batch`, this.Changes, this.headers); + const results = await Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.Changes, this.headers); + if (this.RelatedChanges.length > 0) { for (let change of this.RelatedChanges) { - let changeIndex = this.Changes.indexOf(change.relatedChange); - let relatedId = results[changeIndex]; - change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + if (change !== undefined && change.relatedChange) + { + let changeIndex = this.Changes.indexOf(change.relatedChange); + let relatedId = results !== undefined ? results[changeIndex] : undefined; + change.entityData[`${change.relatedPropertyName}@odata.bind`] = `${change.relatedChange.entitySetName}(${Batch.trimId(relatedId)})`; + } } - const related = await Batch.requestBatch(`/api/data/${WebApiVersion}/$batch`, this.RelatedChanges, this.headers); - return results.concat(related); + + const related = await Batch.requestBatch(this.ConnectionOptions, `/api/data/${this.ConnectionOptions.webApiVersion}/$batch`, this.RelatedChanges, this.headers); + + return results !== undefined ? results.concat(related) : undefined; } else { return results; @@ -65,6 +77,7 @@ class Batch implements DynamicsBatch { requestAllUrls(urls: string[]) { this.Changes.push.apply(this.Changes, urls.map(entitySetQuery => ({ entitySetQuery }))); + return this; } @@ -72,11 +85,13 @@ class Batch implements DynamicsBatch { this.Changes.push.apply(queries.map(query => { const dataQuery = GetRootQuery(query); this.request(query); + return { entitySetName: dataQuery.EntityPath, entitySetQuery: `fetchXml=${escape(GetQueryXml(query))}` }; })); + return this; } @@ -112,7 +127,7 @@ class Batch implements DynamicsBatch { createRelatedEntity(entitySetName: string, data: any, navigationPropertyName: string) { let lastChange = this.Changes[this.Changes.length - 1]; - if (!lastChange || lastChange.entityData == 'DELETE') throw new Error('createRelatedEntity relies on the previous change which was not found in the batch.'); + if (!lastChange || lastChange.entityData === 'DELETE') { throw new Error('createRelatedEntity relies on the previous change which was not found in the batch.'); } if (lastChange.entityId) { data[`${navigationPropertyName}@odata.bind`] = `${lastChange.entitySetName}(${lastChange.entityId})`; this.Changes.push({ @@ -130,21 +145,63 @@ class Batch implements DynamicsBatch { } } - static requestBatch(url: string, requests: BatchRequest[], headers?: any): Promise { + static requestBatch(connectionOptions: ConnectionOptions, url: string, requests: BatchRequest[], headers?: any): Promise { + let callUrl: string = connectionOptions.serverUrl; + + if (callUrl.endsWith("/")) + { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + + callUrl = `${callUrl}${url}`; + const batchId = Batch.createId(); - return fetch(url, { - method: 'POST', - headers: { - 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, - ...DynamicsHeaders, - ...headers - }, - body: Batch.formatBatchRequest(batchId, requests) - }) - .then(response => Batch.formatBatchResponse(response.text())); + + if (connectionOptions.authType === AuthenticationType.Windows) + { + return new Promise((resolve, reject) => + { + httpntlm.post({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: Batch.formatBatchRequest(connectionOptions, batchId, requests), + headers: { + 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, + ...DynamicsHeaders, + ...headers + } + }, function (err, res){ + if (err) + { + console.error(err); + + reject(err); + } + + resolve(Batch.formatBatchResponse(res.responseText)); + }); + }); + } + else + { + return fetch(callUrl, { + method: 'POST', + headers: { + 'Content-Type': `multipart/mixed;boundary=batch_${batchId}`, + 'Authorization': connectionOptions.accessToken, + ...DynamicsHeaders, + ...headers + }, + body: Batch.formatBatchRequest(connectionOptions, batchId, requests) + }) + .then(response => Batch.formatBatchResponse(response.text())); + } } - static formatBatchRequest(batchId: string, changes: BatchRequest[]) { + static formatBatchRequest(connectionOptions:ConnectionOptions, batchId: string, changes: BatchRequest[]) { let batchBody = []; let requestBody = []; let changeNumber = 1; @@ -159,7 +216,7 @@ class Batch implements DynamicsBatch { requestBody.push('Content-Transfer-Encoding:binary'); requestBody.push(''); if (change.entitySetName) { - requestBody.push(`GET ${encodeURI(`/api/data/${WebApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); + requestBody.push(`GET ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}?${change.entitySetQuery}`)} HTTP/1.1`); } else { requestBody.push(`GET ${encodeURI(change.entitySetQuery)} HTTP/1.1`); @@ -174,7 +231,7 @@ class Batch implements DynamicsBatch { batchBody.push('Content-Transfer-Encoding:binary'); batchBody.push(`Content-ID: ${changeNumber++}`); batchBody.push(''); - batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${WebApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); + batchBody.push(`${change.entityId ? 'PATCH' : 'POST'} ${encodeURI(`/api/data/${connectionOptions.webApiVersion}/${change.entitySetName}(${Batch.trimId(change.entityId)})`)} HTTP/1.1`); batchBody.push('Content-Type: application/json;type=entry'); batchBody.push(''); batchBody.push(JSON.stringify(change.entityData)); @@ -186,7 +243,7 @@ class Batch implements DynamicsBatch { return batchBody.join('\n'); } - static formatBatchResponse(responseText: Promise): Promise { + static formatBatchResponse(responseText: Promise): Promise { return responseText.then(response => { if (response) { if (response.indexOf('"innererror"') > -1 @@ -222,7 +279,12 @@ class Batch implements DynamicsBatch { return 'id' + Math.random().toString(16).slice(2); } - static trimId(id: string) { - return (id || '').replace(/{|}/g, ''); + static trimId(id: string | undefined) { + if (id !== undefined) + { + return (id || '').replace(/{|}/g, ''); + } + + return undefined; } } \ No newline at end of file diff --git a/src/Dynamics/DynamicsDiscovery.ts b/src/Dynamics/DynamicsDiscovery.ts new file mode 100644 index 0000000..b61972a --- /dev/null +++ b/src/Dynamics/DynamicsDiscovery.ts @@ -0,0 +1,35 @@ +import { dynamicsRequest, ConnectionOptions } from "./DynamicsRequest"; +import { OrganizationMetadata } from "./Model/OrganizationMetadata"; + +export type OrganizationMetadata = OrganizationMetadata; + +export const DefaultDiscoveryApiVersion = 'v9.1'; + +export default function dynamicsDiscovery(connectionOptions?: ConnectionOptions): DynamicsDiscovery { + return new DynamicsDiscoveryClient(connectionOptions); +} + +export interface DynamicsDiscovery { + discover(): Promise; +} + +class DynamicsDiscoveryClient implements DynamicsDiscovery { + private dynamicsHeaders: any; + private connectionOptions: ConnectionOptions; + + constructor(options?:ConnectionOptions) { + if (options) + { + this.connectionOptions = options; + + if (!options.webApiVersion) + { + this.connectionOptions.webApiVersion = DefaultDiscoveryApiVersion; + } + } + } + + discover(): Promise { + return dynamicsRequest(this.connectionOptions, `/api/discovery/${this.connectionOptions.webApiVersion}/Instances`, this.dynamicsHeaders); + } +} \ No newline at end of file diff --git a/src/Dynamics/DynamicsMetadata.ts b/src/Dynamics/DynamicsMetadata.ts index b9fd3f7..935d50b 100644 --- a/src/Dynamics/DynamicsMetadata.ts +++ b/src/Dynamics/DynamicsMetadata.ts @@ -1,6 +1,5 @@ -import { WebApiVersion } from "./Dynamics"; import { dynamicsBatch } from "./DynamicsBatch"; -import { dynamicsRequest } from "./DynamicsRequest"; +import { dynamicsRequest, ConnectionOptions } from "./DynamicsRequest"; import { AttributeMetadata, AttributeTypeCode, EntityAttributeMetadata, LookupAttributeMetadata } from "./Model/AttributeMetadata"; import { EntityMetadata } from "./Model/EntityMetadata"; import { OptionSetAttributeMetadata, OptionSetMetadata } from "./Model/OptionSetMetadata"; @@ -11,8 +10,8 @@ export type DynamicsOptionSetMetadata = OptionSetMetadata; export type DynamicsLookupAttributeMetadata = LookupAttributeMetadata; export type DynamicsOptionSetAttributeMetadata = OptionSetAttributeMetadata; -export default function dynamicsMetadata(accessToken?: string): DynamicsMetadata { - return new DynamicsMetadataClient(accessToken); +export default function dynamicsmetdata(connectionOptions?: ConnectionOptions): DynamicsMetadata { + return new DynamicsMetadataClient(connectionOptions); } export function isLookupAttribute(attribute: DynamicsAttributeMetadata): attribute is DynamicsLookupAttributeMetadata { @@ -55,7 +54,7 @@ interface LookupAttributeType extends AttributeType { } interface OptionSetAttributeType extends AttributeType { - OptionSet?: { Options: OptionSetType[] } + OptionSet?: { Options: OptionSetType[] }; } interface OptionSetType { @@ -69,7 +68,7 @@ type AnyAttributeMetadata = AttributeMetadata | LookupAttributeMetadata | Option interface DisplayName { UserLocalizedLabel: { Label: string; - } + }; } const entityProperties = [ @@ -112,32 +111,34 @@ const ExcludedAttributeNameFilters = [ class DynamicsMetadataClient implements DynamicsMetadata { private dynamicsHeaders: any; + private connectionOptions: ConnectionOptions; - constructor(accessToken?: string) { - this.dynamicsHeaders = accessToken && { - 'Authorization': 'Bearer ' + accessToken - }; + constructor(options?:ConnectionOptions) { + if (options) + { + this.connectionOptions = options; + } } attributes(entityName: string): Promise { - return dynamicsBatch(this.dynamicsHeaders) + return dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.getMetadataUrls(entityName, false)) .execute() .then(data => this.flatten(data) - .filter((attribute: AttributeType) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') != attribute.LogicalName.length - 4) + .filter((attribute: AttributeType) => attribute.LogicalName.indexOf('yomi') === -1 || attribute.LogicalName.indexOf('base') !== attribute.LogicalName.length - 4) .map(DynamicsMetadataMapper.MapAttribute) ); } entities(): Promise { - return dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(data => data .map(entity => DynamicsMetadataMapper.MapEntity(entity)) ); } entity(entityName: string): Promise { - return dynamicsRequest(`/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) + return dynamicsRequest(this.connectionOptions, `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=EntitySetName,Description,DisplayName,LogicalName,PrimaryIdAttribute,PrimaryNameAttribute,IconSmallName,IsActivity,IsCustomEntity`, this.dynamicsHeaders) .then(entity => this.attributes(entityName) .then(attributes => DynamicsMetadataMapper.MapEntity(entity, attributes)) @@ -145,7 +146,7 @@ class DynamicsMetadataClient implements DynamicsMetadata { } entityAttributes(...entityNames: string[]): Promise { - return dynamicsBatch(this.dynamicsHeaders) + return dynamicsBatch(this.connectionOptions, this.dynamicsHeaders) .requestAllUrls(this.flatten(entityNames.map(e => this.getMetadataUrls(e, true)))) .execute() .then(data => { @@ -157,7 +158,7 @@ class DynamicsMetadataClient implements DynamicsMetadata { currentEntity = DynamicsMetadataMapper.MapEntity(item); entities.push(currentEntity); } - else if (item.LogicalName.indexOf('yomi') == -1 && item.LogicalName.indexOf('base') != item.LogicalName.length - 4) { + else if (item.LogicalName.indexOf('yomi') === -1 && item.LogicalName.indexOf('base') !== item.LogicalName.length - 4) { currentEntity.Attributes.push(DynamicsMetadataMapper.MapAttribute(item)); } } @@ -169,12 +170,12 @@ class DynamicsMetadataClient implements DynamicsMetadata { const attributeTypeFilter = ExcludedAttributeTypeFilters.map(v => `AttributeType ne Microsoft.Dynamics.CRM.AttributeTypeCode'${v}'`).join(' and '); const attributeNameFilter = ExcludedAttributeNameFilters.map(v => `LogicalName ne '${v}'`).join(' and '); return [ - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, - `/api/data/${WebApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')?$select=${entityProperties}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes?$select=${attributeProperties}&$filter=${attributeTypeFilter} and ${attributeNameFilter}`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.LookupAttributeMetadata?$select=${attributeProperties},Targets`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.PicklistAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StatusAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)`, + `/api/data/${this.connectionOptions.webApiVersion}/EntityDefinitions(LogicalName='${entityName}')/Attributes/Microsoft.Dynamics.CRM.StateAttributeMetadata?$select=${attributeProperties}&$expand=OptionSet($select=Options)` ].slice(includeEntity ? 0 : 1); } diff --git a/src/Dynamics/DynamicsRequest.ts b/src/Dynamics/DynamicsRequest.ts index c136488..19eeb9c 100644 --- a/src/Dynamics/DynamicsRequest.ts +++ b/src/Dynamics/DynamicsRequest.ts @@ -1,35 +1,57 @@ import { GetRootQuery, Query } from "../Query/Query"; import GetQueryXml from "../Query/QueryXml"; -import { DynamicsHeaders, WebApiVersion } from "./Dynamics"; +import { DynamicsHeaders, DefaultWebApiVersion } from "./Dynamics"; +import * as httpntlm from "httpntlm"; +import fetch from "node-fetch"; -export function dynamicsQuery(query: Query, maxRowCount?: number, headers?: any): Promise { +export enum AuthenticationType +{ + Windows = 1, + OAuth = 2 +} + +export class ConnectionOptions { + authType: AuthenticationType = AuthenticationType.OAuth; + username?: string; + password?: string; + domain?: string; + workstation?: string; + accessToken?: string; + serverUrl: string = ""; + webApiVersion: string = DefaultWebApiVersion; +} + +export async function dynamicsQuery(connectionOptions: ConnectionOptions, query: Query, maxRowCount?: number, headers?: any): Promise { const dataQuery = GetRootQuery(query); + if (!dataQuery.EntityPath) { throw new Error('dynamicsQuery requires a Query object with an EntityPath'); } - return dynamicsQueryUrl(`/api/data/${WebApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); + + return await dynamicsQueryUrl(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${dataQuery.EntityPath}`, query, maxRowCount, headers); } -export function dynamicsQueryUrl(dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise { +export async function dynamicsQueryUrl(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, query: Query, maxRowCount?: number, headers?: any): Promise { const querySeparator = (dynamicsEntitySetUrl.indexOf('?') > -1 ? '&' : '?'); - return request(`${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(GetQueryXml(query, maxRowCount))}`, 'GET', undefined, headers); + + return await request(connectionOptions, `${dynamicsEntitySetUrl}${querySeparator}fetchXml=${escape(GetQueryXml(query, maxRowCount))}`, 'GET', undefined, headers); } -export function dynamicsRequest(dynamicsEntitySetUrl: string, headers?: any): Promise { - return request(dynamicsEntitySetUrl, 'GET', undefined, headers); +export async function dynamicsRequest(connectionOptions: ConnectionOptions, dynamicsEntitySetUrl: string, headers?: any): Promise { + return await request(connectionOptions, dynamicsEntitySetUrl, 'GET', undefined, headers); } -export function dynamicsSave(entitySetName: string, data: any, id?: string, headers?: any): Promise { +export async function dynamicsSave(connectionOptions: ConnectionOptions, entitySetName: string, data: any, id?: string, headers?: any): Promise { if (id) { - return request(`/api/data/${WebApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); + return await request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}(${trimId(id)})`, 'PATCH', data, headers); } else { - return request(`/api/data/${WebApiVersion}/${entitySetName}()`, 'POST', data, headers); + return await request(connectionOptions, `/api/data/${connectionOptions.webApiVersion}/${entitySetName}()`, 'POST', data, headers); } } -export function formatDynamicsResponse(data) { - var items = []; +export function formatDynamicsResponse(data: any): any { + var items = []; if (data && data.error) { throw new Error(data.error); } @@ -41,11 +63,12 @@ export function formatDynamicsResponse(data) { } if (data) { for (var item of data) { - var row = {}; - for (var key in item) { + let row:any = {}; + + for (let key in item) { var name: string = key; - if (name.indexOf('@odata') == 0) { + if (name.indexOf('@odata') === 0) { continue; } @@ -54,19 +77,22 @@ export function formatDynamicsResponse(data) { } if (name.indexOf('@') > -1) { - name = name.substring(0, name.indexOf('@')) - if (name.indexOf('_') == 0) { + name = name.substring(0, name.indexOf('@')); + + if (name.indexOf('_') === 0) { name = name.slice(1, -6); } + name += "_formatted"; } - else if (name.indexOf('_') == 0) { + else if (name.indexOf('_') === 0) { name = name.slice(1, -6); } if (name.indexOf('_x002e_') > -1) { var obj = name.substring(0, name.indexOf('_x002e_')); name = name.substring(name.indexOf('_x002e_') + 7); + if (!row[obj]) { row[obj] = {}; } @@ -82,18 +108,77 @@ export function formatDynamicsResponse(data) { return items; } -function request(url: string, method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: any, headers?: any): Promise { - return fetch(url, { - method: method, - headers: { - 'Content-Type': 'application/json; charset=utf-8', - ...DynamicsHeaders, - ...headers - }, - body: body - }) - .then(response => response.json()) - .then(data => formatDynamicsResponse(data)); +async function request(connectionOptions: ConnectionOptions, url: string, method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: any, headers?: any): Promise { + let callUrl: string = connectionOptions.serverUrl; + + if (callUrl.endsWith("/")) + { + callUrl = callUrl.substr(0, callUrl.length - 1); + } + + callUrl = `${callUrl}${url}`; + + //TODO: fetch if we can. + if (connectionOptions.authType === AuthenticationType.Windows) + { + return new Promise((resolve, reject) => + { + httpntlm[method.toLowerCase()]({ + url: callUrl, + username: connectionOptions.username, + password: connectionOptions.password, + workstation: connectionOptions.workstation || '', + domain: connectionOptions.domain || '', + body: body, + headers: { + 'Content-Type': 'application/json; charset=utf-8', + ...DynamicsHeaders, + ...headers + } + }, function (err, res){ + if (err) + { + console.error(err); + + reject(err); + } + + const json = JSON.parse(res.body); + + if (json.error) + { + console.error(json.error.message); + + reject (json.error.message); + } + else if (json.ExceptionMessage) + { + console.error(json.ExceptionMessage); + + reject (`The service call returned HTTP ${json.ErrorCode} - ${json.ExceptionMessage}`); + } + else + { + resolve(formatDynamicsResponse(json)); + } + }); + }); + } + else + { + return fetch(url, { + method: method, + headers: { + 'Authorization': `Bearer ${connectionOptions.accessToken}`, + 'Content-Type': 'application/json; charset=utf-8', + ...DynamicsHeaders, + ...headers + }, + body: body + }) + .then(response => response.json()) + .then(data => formatDynamicsResponse(data)); + } } function trimId(id: string) { diff --git a/src/Dynamics/Model/OrganizationMetadata.ts b/src/Dynamics/Model/OrganizationMetadata.ts new file mode 100644 index 0000000..bce2c2f --- /dev/null +++ b/src/Dynamics/Model/OrganizationMetadata.ts @@ -0,0 +1,12 @@ +export interface OrganizationMetadata +{ + Id?: string; + UniqueName?: string; + UrlName?: string; + FriendlyName?: string; + State?: number; + Version?: string; + Uri?: string; + AppUri?: string; + LastUpdated?: Date; +} \ No newline at end of file diff --git a/src/Query/Query.ts b/src/Query/Query.ts index 2a97acf..9cd7121 100644 --- a/src/Query/Query.ts +++ b/src/Query/Query.ts @@ -22,6 +22,7 @@ export interface DataQueryJoin extends DataQuery { } export interface Query { + [key:string]: any; // Add index signature alias(attributeName: string, alias: string): Query; path(entityPath: string): Query; select(...attributeNames: string[]): Query; @@ -80,7 +81,7 @@ export function GetRootQuery(query: Query): DataQuery { } class QueryProvider implements Query { public Query: DataQuery; - public RootQuery: Query; + public RootQuery: Query | undefined; constructor(private EntityName: string) { this.Query = { @@ -126,7 +127,8 @@ class QueryProvider implements Query { } public whereAny(any: (or: (attributeName: string, operator: QueryOperatorParam, ...values: any[]) => void) => void): Query { - var conditions = []; + let conditions:DataQueryCondition[] = []; + any((attributeName: string, operator: QueryOperatorParam, ...values: any[]) => { conditions.push({ AttributeName: attributeName, diff --git a/src/Query/QueryXml.ts b/src/Query/QueryXml.ts index f2823af..e2a45df 100644 --- a/src/Query/QueryXml.ts +++ b/src/Query/QueryXml.ts @@ -24,7 +24,7 @@ function GetDataQueryXml(query: DataQuery, maxRowCount: number) { return xml.join(''); } -function getQueryXml(query: DataQuery) { +function getQueryXml(query: DataQuery) : any { const xml = []; query.Attributes.forEach(attribute => { @@ -36,7 +36,7 @@ function getQueryXml(query: DataQuery) { } }); query.OrderBy.forEach(attribute => { - if (attribute.indexOf('_') == 0) { + if (attribute.indexOf('_') === 0) { xml.push(``); } else { @@ -118,16 +118,16 @@ function getConditionXml(condition: DataQueryCondition): string { return xml.join('\n'); } -function encodeValue(value) { - if (value === 0) return '0'; - if (value === true) return 'true'; - if (value === false) return 'false'; - if (!value) return ''; - if (typeof (value.toISOString) === 'function') return value.toISOString(); +function encodeValue(value: any) { + if (value === 0) { return '0'; } + if (value === true) { return 'true'; } + if (value === false) { return 'false'; } + if (!value) { return ''; } + if (typeof (value.toISOString) === 'function') { return value.toISOString(); } return xmlEncode(value.toString()); } -function xmlEncode(text) { +function xmlEncode(text: any) { if (text && typeof (text) === 'string') { text = text.replace(/&/g, '&'); text = text.replace(/\"/g, '"'); @@ -138,16 +138,16 @@ function xmlEncode(text) { return text; } -function formatXml(xmlString) { +function formatXml(xmlString: any) { var indent = "\t"; var tabs = ""; //store the current indentation return xmlString.replace( /\s*<[^>\/]*>[^<>]*<\/[^>]*>|\s*<.+?>|\s*[^<]+/g, //pattern to match nodes (angled brackets or text) - function (m, i) { + function (m: string, i: number) { m = m.replace(/^\s+|\s+$/g, ""); //trim the match just in case - if (i < 38 && /^<[?]xml/.test(m)) return m + "\n"; //if the match is a header, ignore it + if (i < 38 && /^<[?]xml/.test(m)) { return m + "\n"; } //if the match is a header, ignore it if (/^<[/]/.test(m)) //if the match is a closing tag { diff --git a/src/ntlm/hash.ts b/src/ntlm/hash.ts new file mode 100644 index 0000000..83607ce --- /dev/null +++ b/src/ntlm/hash.ts @@ -0,0 +1,211 @@ +'use strict'; + +import * as crypto from 'crypto'; +import { Type2Message } from './type2.message'; + +export class Hash { + static createLMResponse(challenge: Buffer, lmhash: Buffer) { + let buf = Buffer.alloc(24); + let pwBuffer = Buffer.alloc(21).fill(0); + + lmhash.copy(pwBuffer); + + Hash.calculateDES(pwBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(pwBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(pwBuffer.slice(14), challenge).copy(buf, 16); + + return buf; + } + + static createLMHash(password: string) { + let buf = Buffer.alloc(16), + pwBuffer = Buffer.alloc(14), + magicKey = Buffer.from('KGS!@#$%', 'ascii'); + + if (password.length > 14) { + buf.fill(0); + return buf; + } + + pwBuffer.fill(0); + pwBuffer.write(password.toUpperCase(), 0, 'ascii'); + + return Buffer.concat([ + Hash.calculateDES(pwBuffer.slice(0, 7), magicKey), + Hash.calculateDES(pwBuffer.slice(7), magicKey) + ]); + } + + static calculateDES(key: Buffer, message: Buffer) { + let desKey = Buffer.alloc(8); + + desKey[0] = key[0] & 0xFE; + desKey[1] = ((key[0] << 7) & 0xFF) | (key[1] >> 1); + desKey[2] = ((key[1] << 6) & 0xFF) | (key[2] >> 2); + desKey[3] = ((key[2] << 5) & 0xFF) | (key[3] >> 3); + desKey[4] = ((key[3] << 4) & 0xFF) | (key[4] >> 4); + desKey[5] = ((key[4] << 3) & 0xFF) | (key[5] >> 5); + desKey[6] = ((key[5] << 2) & 0xFF) | (key[6] >> 6); + desKey[7] = (key[6] << 1) & 0xFF; + + for (let i = 0; i < 8; i++) { + let parity = 0; + + for (let j = 1; j < 8; j++) { + parity += (desKey[i] >> j) % 2; + } + + desKey[i] |= (parity % 2) === 0 ? 1 : 0; + } + + let des = crypto.createCipheriv('DES-ECB', desKey, ''); + return des.update(message); + } + + static createNTLMResponse(challenge: Buffer, ntlmhash: Buffer) { + let buf = Buffer.alloc(24), + ntlmBuffer = Buffer.alloc(21).fill(0); + + ntlmhash.copy(ntlmBuffer); + + Hash.calculateDES(ntlmBuffer.slice(0, 7), challenge).copy(buf); + Hash.calculateDES(ntlmBuffer.slice(7, 14), challenge).copy(buf, 8); + Hash.calculateDES(ntlmBuffer.slice(14), challenge).copy(buf, 16); + + return buf; + } + + static createNTLMHash(password: string) { + let md4sum = crypto.createHash('md4'); + md4sum.update(Buffer.from(password, 'ucs2')); // lgtm[js/insufficient-password-hash] + return md4sum.digest(); + } + + static createNTLMv2Hash(ntlmhash: Buffer, username: string, authTargetName: string) { + let hmac = crypto.createHmac('md5', ntlmhash); + hmac.update(Buffer.from(username.toUpperCase() + authTargetName, 'ucs2')); // lgtm[js/weak-cryptographic-algorithm] + return hmac.digest(); + } + + static createLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string) { + let buf = Buffer.alloc(24); + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let hmac = crypto.createHmac('md5', ntlm2hash); + + //server challenge + type2message.challenge.copy(buf, 8); + + //client nonce + buf.write(nonce, 16, 'hex'); + + //create hash + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + + hashedBuffer.copy(buf); + + return buf; + } + + static createNTLMv2Response(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean) { + let bufferSize = 48 + type2message.targetInfo.buffer.length; + if (withMic) { + bufferSize += 8; + } + let buf = Buffer.alloc(bufferSize), + ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName), + hmac = crypto.createHmac('md5', ntlm2hash); + + //the first 8 bytes are spare to store the hashed value before the blob + + //server challenge + type2message.challenge.copy(buf, 8); + + //blob signature + buf.writeUInt32BE(0x01010000, 16); + + //reserved + buf.writeUInt32LE(0, 20); + + //timestamp + let timestampLow = Number('0x' + timestamp.substring(Math.max(0, timestamp.length - 8))); + let timestampHigh = Number('0x' + timestamp.substring(0, Math.max(0, timestamp.length - 8))); + + buf.writeUInt32LE(timestampLow, 24); + buf.writeUInt32LE(timestampHigh, 28); + + //random client nonce + buf.write(nonce, 32, 'hex'); + + //zero + buf.writeUInt32LE(0, 40); + + //complete target information block from type 2 message + type2message.targetInfo.buffer.copy(buf, 44); + + let bufferPos = 44 + type2message.targetInfo.buffer.length; + if (withMic) { + // Should include MIC in response, indicate it in AV_FLAGS + buf.writeUInt16LE(0x06, bufferPos - 4); + buf.writeUInt16LE(0x04, bufferPos - 2); + buf.writeUInt32LE(0x02, bufferPos); + // Write new endblock + buf.writeUInt32LE(0, bufferPos + 4); + bufferPos += 8; + } + + //zero + buf.writeUInt32LE(0, bufferPos); + + hmac.update(buf.slice(8)); + let hashedBuffer = hmac.digest(); + + hashedBuffer.copy(buf); + + return buf; + } + + static createMIC(type1message: Buffer, type2message: Type2Message, type3message: Buffer, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, true); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0,16)).digest(); + let key_exchange_key = session_base_key; + //create MIC hash + hmac = crypto.createHmac('md5', key_exchange_key); + hmac.update(type1message); + hmac.update(type2message.raw); + hmac.update(type3message); + let hashedBuffer = hmac.digest(); + return hashedBuffer; + } + + static createRandomSessionKey(type2message: Type2Message, username: string, authTargetName: string, ntlmhash: Buffer, nonce: string, timestamp: string, withMic: boolean) { + let ntlm2hash = Hash.createNTLMv2Hash(ntlmhash, username, authTargetName); + let ntlm2response = Hash.createNTLMv2Response(type2message, username, authTargetName, ntlmhash, nonce, timestamp, withMic); + let hmac = crypto.createHmac('md5', ntlm2hash); + let session_base_key = hmac.update(ntlm2response.slice(0,16)).digest(); + let key_exchange_key = session_base_key; + + let exported_session_key_hex = Hash.createPseudoRandomValue(32); + let exported_session_key = Buffer.from(exported_session_key_hex, 'hex'); + let rc4 = crypto.createCipheriv('rc4', key_exchange_key, ''); + let encrypted_random_session_key = rc4.update(exported_session_key); + return encrypted_random_session_key; + } + + static createPseudoRandomValue(length: number) { + let str = ''; + while (str.length < length) { + str += Math.floor(Math.random() * 16).toString(16); + } + return str; + } + + static createTimestamp() { + //TODO: we are loosing precision here since js is not able to handle those large integers + // maybe think about a different solution here + // 11644473600000 = diff between 1970 and 1601 + return ((Date.now() + 11644473600000) * 10000).toString(16); + } +} diff --git a/src/ntlm/interfaces/i.ntlm.ts b/src/ntlm/interfaces/i.ntlm.ts new file mode 100644 index 0000000..5652878 --- /dev/null +++ b/src/ntlm/interfaces/i.ntlm.ts @@ -0,0 +1,8 @@ +import { Type2Message } from "../type2.message"; +import { NtlmMessage } from "../ntlm.message"; + +export interface INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage; + decodeType2Message(str: string | undefined): Type2Message; + createType3Message(type1message: NtlmMessage, type2Message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce: string | undefined, timestamp: string | undefined): NtlmMessage; +} diff --git a/src/ntlm/ntlm.constants.ts b/src/ntlm/ntlm.constants.ts new file mode 100644 index 0000000..f5541f5 --- /dev/null +++ b/src/ntlm/ntlm.constants.ts @@ -0,0 +1,3 @@ +export class NtlmConstants { + static readonly NTLM_SIGNATURE = 'NTLMSSP\0'; +} diff --git a/src/ntlm/ntlm.flags.ts b/src/ntlm/ntlm.flags.ts new file mode 100644 index 0000000..d1a5073 --- /dev/null +++ b/src/ntlm/ntlm.flags.ts @@ -0,0 +1,111 @@ +'use strict'; + +export enum NtlmFlags { + /* Indicates that Unicode strings are supported for use in security buffer + data. */ + NEGOTIATE_UNICODE = 1<<0, + + /* Indicates that OEM strings are supported for use in security buffer data. */ + NEGOTIATE_OEM = 1<<1, + + /* Requests that the server's authentication realm be included in the Type 2 + message. */ + REQUEST_TARGET = 1<<2, + + /* unknown (1<<3) */ + + /* Specifies that authenticated communication between the client and server + should carry a digital signature (message integrity). */ + NEGOTIATE_SIGN = 1<<4, + + /* Specifies that authenticated communication between the client and server + should be encrypted (message confidentiality). */ + NEGOTIATE_SEAL = 1<<5, + + /* Indicates that datagram authentication is being used. */ + NEGOTIATE_DATAGRAM_STYLE = 1<<6, + + /* Indicates that the LAN Manager session key should be used for signing and + sealing authenticated communications. */ + NEGOTIATE_LM_KEY = 1<<7, + + /* unknown purpose */ + NEGOTIATE_NETWARE = 1<<8, + + /* Indicates that NTLM authentication is being used. */ + NEGOTIATE_NTLM_KEY = 1<<9, + + /* unknown (1<<10) */ + + /* Sent by the client in the Type 3 message to indicate that an anonymous + context has been established. This also affects the response fields. */ + NEGOTIATE_ANONYMOUS = 1<<11, + + /* Sent by the client in the Type 1 message to indicate that a desired + authentication realm is included in the message. */ + NEGOTIATE_DOMAIN_SUPPLIED = 1<<12, + + /* Sent by the client in the Type 1 message to indicate that the client + workstation's name is included in the message. */ + NEGOTIATE_WORKSTATION_SUPPLIED = 1<<13, + + /* Sent by the server to indicate that the server and client are on the same + machine. Implies that the client may use a pre-established local security + context rather than responding to the challenge. */ + NEGOTIATE_LOCAL_CALL = 1<<14, + + /* Indicates that authenticated communication between the client and server + should be signed with a "dummy" signature. */ + NEGOTIATE_ALWAYS_SIGN = 1<<15, + + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a domain. */ + TARGET_TYPE_DOMAIN = 1<<16, + + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a server. */ + TARGET_TYPE_SERVER = 1<<17, + + /* Sent by the server in the Type 2 message to indicate that the target + authentication realm is a share. Presumably, this is for share-level + authentication. Usage is unclear. */ + TARGET_TYPE_SHARE = 1<<18, + + /* Indicates that the NTLM2 signing and sealing scheme should be used for + protecting authenticated communications. */ + NEGOTIATE_NTLM2_KEY = 1<<19, + + /* unknown purpose */ + REQUEST_INIT_RESPONSE = 1<<20, + + /* unknown purpose */ + REQUEST_ACCEPT_RESPONSE = 1<<21, + + /* unknown purpose */ + REQUEST_NONNT_SESSION_KEY = 1<<22, + + /* Sent by the client in the Type 1 message to request Target info block from server. + Sent by the server in the Type 2 message to indicate that it is including a + Target Information block in the message. */ + NEGOTIATE_TARGET_INFO = 1<<23, + + /* unknown (1<24) */ + + /* Indicates that the version info block is included in the message */ + NEGOTIATE_VERSION = 1<<25, + + /* unknown (1<26) */ + /* unknown (1<27) */ + /* unknown (1<28) */ + + /* Indicates that 128-bit encryption is supported. */ + NEGOTIATE_128 = 1<<29, + + /* Indicates that the client will provide an encrypted master key in + the "Session Key" field of the Type 3 message. */ + NEGOTIATE_KEY_EXCHANGE = 1<<30, + + /* Indicates that 56-bit encryption is supported. */ + NEGOTIATE_56 = 1<<31, +} + diff --git a/src/ntlm/ntlm.message.ts b/src/ntlm/ntlm.message.ts new file mode 100644 index 0000000..e79ec61 --- /dev/null +++ b/src/ntlm/ntlm.message.ts @@ -0,0 +1,11 @@ +export class NtlmMessage { + raw: Buffer; + + constructor(buf: Buffer) { + this.raw = buf; + } + + header(): string { + return 'NTLM ' + this.raw.toString('base64'); + } +} diff --git a/src/ntlm/ntlm.ts b/src/ntlm/ntlm.ts new file mode 100644 index 0000000..22276a3 --- /dev/null +++ b/src/ntlm/ntlm.ts @@ -0,0 +1,281 @@ +// All code in this folder is heavily based on the node project ntlm-client. +// https://github.com/clncln1/node-ntlm-client +// ---------------------------------------------------------------------------- +// Original license statement: + +// Copyright (c) 2015 Nico Haller + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// ---------------------------------------------------------------------------- + +'use strict'; + +import { INtlm } from './interfaces/i.ntlm'; +import { NtlmFlags } from './ntlm.flags'; +import { NtlmConstants } from './ntlm.constants'; +import { Hash } from './hash'; +import * as os from 'os'; +import { Type2Message } from './type2.message'; +import { NtlmMessage } from './ntlm.message'; + +export default function ntlm(): INtlm { + return new Ntlm(); +} + +export class Ntlm implements INtlm { + createType1Message(ntlm_version: number, workstation: string | undefined, target: string | undefined): NtlmMessage { + let dataPos = 40; + let pos = 0; + let buf = Buffer.alloc(256); + + if (target === undefined) { + target = ''; + } + + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + + //signature + buf.write(NtlmConstants.NTLM_SIGNATURE, pos, NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + pos += NtlmConstants.NTLM_SIGNATURE.length; + + //message type + buf.writeUInt32LE(1, pos); + pos += 4; + + //flags + let messageFlags = NtlmFlags.NEGOTIATE_OEM | + NtlmFlags.NEGOTIATE_ALWAYS_SIGN | + NtlmFlags.NEGOTIATE_VERSION; + + if (ntlm_version == 1) { + messageFlags |= NtlmFlags.NEGOTIATE_NTLM_KEY | + NtlmFlags.NEGOTIATE_LM_KEY; + } else { + messageFlags |= NtlmFlags.NEGOTIATE_NTLM2_KEY; + } + + if (target.length > 0) { + messageFlags |= NtlmFlags.NEGOTIATE_DOMAIN_SUPPLIED; + } + if (workstation.length > 0) { + messageFlags |= NtlmFlags.NEGOTIATE_WORKSTATION_SUPPLIED; + } + + // special operator to force conversion to unsigned + buf.writeUInt32LE(messageFlags >>> 0, pos); + pos += 4; + + //domain security buffer + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt16LE(target.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + + if (target.length > 0) { + dataPos += buf.write(target, dataPos, 'ascii'); + } + + //workstation security buffer + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt16LE(workstation.length, pos); + pos += 2; + buf.writeUInt32LE(dataPos, pos); + pos += 4; + + if (workstation.length > 0) { + dataPos += buf.write(workstation, dataPos, 'ascii'); + } + + this.addVersionStruct(buf, pos); + return new NtlmMessage(buf.slice(0, dataPos)); +} + + // Version - hard-coded to + // Major version 10, minor version 0 (Windows 10) + // build number 18362 (1903 update), NTLM revision 15 +private addVersionStruct(buf: Buffer, pos: number) { + buf.writeUInt8(10, pos); + pos++; + buf.writeUInt8(0, pos); + pos++; + buf.writeUInt16LE(18362, pos); + pos += 2; + buf.writeUInt32LE(0x0F000000, pos); + pos += 4; + return pos; +} + +decodeType2Message(str: string | undefined): Type2Message { + if (str === undefined) { + throw new Error('Invalid argument'); + } + + let ntlmMatch = /^NTLM ([^,\s]+)/.exec(str); + + if (ntlmMatch) { + str = ntlmMatch[1]; + } + + let buf = Buffer.from(str, 'base64'); + let type2message = new Type2Message(buf); + return type2message; +} + +createType3Message(type1message: NtlmMessage, type2message: Type2Message, username: string, password: string, workstation: string | undefined, target: string | undefined, client_nonce_override: string | undefined, timestamp_override: string | undefined): NtlmMessage { + let dataPos = 72; + let buf = Buffer.alloc(1024); + + if (workstation === undefined) { + workstation = os.hostname().toUpperCase(); + } + + if (target === undefined) { + target = type2message.targetName; + } + + //signature + buf.write(NtlmConstants.NTLM_SIGNATURE, 0, NtlmConstants.NTLM_SIGNATURE.length, 'ascii'); + + //message type + buf.writeUInt32LE(3, 8); + + let targetLen = type2message.encoding === 'ascii' ? target.length : target.length * 2; + let usernameLen = type2message.encoding === 'ascii' ? username.length : username.length * 2; + let workstationLen = type2message.encoding === 'ascii' ? workstation.length : workstation.length * 2; + let dataPosOffset = targetLen + usernameLen + workstationLen; + let timestamp = ''; + let client_nonce = ''; + let withMic = false; + let withServerTimestamp = false; + if (type2message.version === 2 && + type2message.targetInfo && + type2message.targetInfo.parsed['SERVER_TIMESTAMP']) { // Must include MIC, add room for it + withServerTimestamp = true; + withMic = true; + dataPos += 16; + } + let hashDataPos = dataPos + dataPosOffset; + let ntlmHash = Hash.createNTLMHash(password); + + if (type2message.version === 2) { + client_nonce = client_nonce_override || Hash.createPseudoRandomValue(16); + if (withServerTimestamp) { // Use server timestamp if provided + timestamp = type2message.targetInfo.parsed['SERVER_TIMESTAMP']; + } else { + timestamp = timestamp_override || Hash.createTimestamp(); + } + + let lmv2; + if (withServerTimestamp) { + lmv2 = Buffer.alloc(24); // zero-filled + } else { + lmv2 = Hash.createLMv2Response(type2message, username, target, ntlmHash, client_nonce); + } + + //lmv2 security buffer + buf.writeUInt16LE(lmv2.length, 12); + buf.writeUInt16LE(lmv2.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + + lmv2.copy(buf, hashDataPos); + hashDataPos += lmv2.length; + + let ntlmv2 = Hash.createNTLMv2Response(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + + //ntlmv2 security buffer + buf.writeUInt16LE(ntlmv2.length, 20); + buf.writeUInt16LE(ntlmv2.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + + ntlmv2.copy(buf, hashDataPos); + hashDataPos += ntlmv2.length; + } else { + let lmHash = Hash.createLMHash(password); + let lm = Hash.createLMResponse(type2message.challenge, lmHash); + let ntlm = Hash.createNTLMResponse(type2message.challenge, ntlmHash); + + //lm security buffer + buf.writeUInt16LE(lm.length, 12); + buf.writeUInt16LE(lm.length, 14); + buf.writeUInt32LE(hashDataPos, 16); + + lm.copy(buf, hashDataPos); + hashDataPos += lm.length; + + //ntlm security buffer + buf.writeUInt16LE(ntlm.length, 20); + buf.writeUInt16LE(ntlm.length, 22); + buf.writeUInt32LE(hashDataPos, 24); + + ntlm.copy(buf, hashDataPos); + hashDataPos += ntlm.length; + } + + //target name security buffer + buf.writeUInt16LE(targetLen, 28); + buf.writeUInt16LE(targetLen, 30); + buf.writeUInt32LE(dataPos, 32); + + dataPos += buf.write(target, dataPos, type2message.encoding); + + //user name security buffer + buf.writeUInt16LE(usernameLen, 36); + buf.writeUInt16LE(usernameLen, 38); + buf.writeUInt32LE(dataPos, 40); + + dataPos += buf.write(username, dataPos, type2message.encoding); + + //workstation name security buffer + buf.writeUInt16LE(workstationLen, 44); + buf.writeUInt16LE(workstationLen, 46); + buf.writeUInt32LE(dataPos, 48); + + dataPos += buf.write(workstation, dataPos, type2message.encoding); + + //session key security buffer + let session_key = Buffer.alloc(0); + // if (type2message.flags & NtlmFlags.NEGOTIATE_KEY_EXCHANGE) { + // session_key = hash.createRandomSessionKey(type2message, username, target, ntlmHash, client_nonce, timestamp, withMic); + // } + buf.writeUInt16LE(session_key.length, 52); + buf.writeUInt16LE(session_key.length, 54); + buf.writeUInt32LE(hashDataPos, 56); + session_key.copy(buf, hashDataPos); + hashDataPos += session_key.length; + + //flags + buf.writeUInt32LE(type2message.flags, 60); + + this.addVersionStruct(buf, 64); + + if (withMic) { + // Calculate and add MIC + let mic = Hash.createMIC(type1message.raw, type2message, buf.slice(0, hashDataPos), username, target, ntlmHash, client_nonce, timestamp); + mic.copy(buf, 72); + } + + return new NtlmMessage(buf.slice(0, hashDataPos)); + //return 'NTLM ' + buf.toString('base64', 0, hashDataPos); +} +} diff --git a/src/ntlm/type2.message.ts b/src/ntlm/type2.message.ts new file mode 100644 index 0000000..735d659 --- /dev/null +++ b/src/ntlm/type2.message.ts @@ -0,0 +1,160 @@ +import { NtlmFlags } from './ntlm.flags'; +import { NtlmConstants } from './ntlm.constants'; + +interface TargetInfoHash { + [key: string]: string | null; +} + +export class Type2Message { + raw: Buffer; + flags: number; + encoding: 'ascii' | 'ucs2'; + version: number; + challenge: Buffer; + targetName: string; + targetInfo: any; + + constructor(buf: Buffer) { + this.raw = buf; + + //check signature + if (buf.toString('ascii', 0, NtlmConstants.NTLM_SIGNATURE.length) !== NtlmConstants.NTLM_SIGNATURE) { + throw new Error('Invalid message signature'); + } + + //check message type + if (buf.readUInt32LE(NtlmConstants.NTLM_SIGNATURE.length) !== 2) { + throw new Error('Invalid message type (no type 2)'); + } + + //read flags + this.flags = buf.readUInt32LE(20); + + this.encoding = (this.flags & NtlmFlags.NEGOTIATE_OEM) ? 'ascii' : 'ucs2'; + + this.version = (this.flags & NtlmFlags.NEGOTIATE_NTLM2_KEY) ? 2 : 1; + + this.challenge = buf.slice(24, 32); + + //read target name + this.targetName = this.readTargetName(); + + //read target info + if (this.flags & NtlmFlags.NEGOTIATE_TARGET_INFO) { + this.targetInfo = this.parseTargetInfo(); + } + } + + private readTargetName(): string { + let length = this.raw.readUInt16LE(12); + //skipping allocated space + let offset = this.raw.readUInt32LE(16); + + if (length === 0) { + return ''; + } + + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + + return this.raw.toString(this.encoding, offset, offset + length); + } + + private parseTargetInfo() { + let info: TargetInfoHash = {}; + + let length = this.raw.readUInt16LE(40); + //skipping allocated space + let offset = this.raw.readUInt32LE(44); + + let targetInfoBuffer = Buffer.alloc(length); + this.raw.copy(targetInfoBuffer, 0, offset, offset + length); + + if (length === 0) { + return info; + } + + if ((offset + length) > this.raw.length || offset < 32) { + throw new Error('Bad type 2 message'); + } + + let pos = offset; + + while (pos < (offset + length)) { + let blockType = this.raw.readUInt16LE(pos); + pos += 2; + let blockLength = this.raw.readUInt16LE(pos); + pos += 2; + + if (blockType === 0) { + //reached the terminator subblock + break; + } + + let blockTypeStr; + let blockTypeOutput = 'string'; + + switch (blockType) { + case 0x01: + blockTypeStr = 'SERVER'; + break; + case 0x02: + blockTypeStr = 'DOMAIN'; + break; + case 0x03: + blockTypeStr = 'FQDN'; + break; + case 0x04: + blockTypeStr = 'DNS'; + break; + case 0x05: + blockTypeStr = 'PARENT_DNS'; + break; + case 0x06: + blockTypeStr = 'FLAGS'; + blockTypeOutput = 'hex'; + break; + case 0x07: + blockTypeStr = 'SERVER_TIMESTAMP'; + blockTypeOutput = 'hex'; + break; + case 0x08: + blockTypeStr = 'SINGLE_HOST'; + blockTypeOutput = 'hex'; + break; + case 0x09: + blockTypeStr = 'TARGET_NAME'; + break; + case 0x0A: + blockTypeStr = 'CHANNEL_BINDING'; + blockTypeOutput = 'hex'; + break; + default: + blockTypeStr = ''; + break; + } + + if (blockTypeStr) { + if (blockTypeOutput === 'string') { + info[blockTypeStr] = this.raw.toString('ucs2', pos, pos + blockLength); + } else { + // Output as hex in little endian order + let twoCharBlocks = this.raw.toString('hex', pos, pos + blockLength).match(/.{2}/g); + if (twoCharBlocks) { + info[blockTypeStr] = twoCharBlocks.reverse().join(""); + } else { + info[blockTypeStr] = null; + } + } + } + + pos += blockLength; + } + + return { + parsed: info, + buffer: targetInfoBuffer + }; + } +} diff --git a/src/tests/dynamicsTests.ts b/src/tests/dynamicsTests.ts index 66f55ec..81bf257 100644 --- a/src/tests/dynamicsTests.ts +++ b/src/tests/dynamicsTests.ts @@ -1,8 +1,17 @@ import dynamics from "../Dynamics/Dynamics"; -import query, { QueryOperator } from "../Query/Query"; +import { QueryOperator } from "../Query/Query"; +import { ConnectionOptions, AuthenticationType } from "../Dynamics/DynamicsRequest"; export async function dynamicsTestAll() { - const dyn = dynamics(); + const options = new ConnectionOptions(); + options.authType = AuthenticationType.Windows; + options.username = "Administrator"; + options.domain = "CONTOSO"; + options.password = "{password}"; + options.serverUrl = "http://{server}/{org}/"; + options.webApiVersion = "v9.0"; + + const dyn = dynamics(options); /* Batch Request */ const allAccounts = await dyn.batch() diff --git a/tsconfig.json b/tsconfig.json index 855eb51..448c65a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,20 @@ { "compilerOptions": { + "experimentalDecorators": true, "declaration": true, - "module": "es6", + "module": "commonjs", "rootDir": "src", - "target": "es6" - } + "target": "es6", + "outDir": "./bin", + "sourceMap": true, + "strict": false, + "noImplicitAny": false, + "strictNullChecks": false + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } \ No newline at end of file