PageSourceSearch

https://www.crn.com/scripts/authentication/apiclient.js

js crn.com collected 2026-09-24 06:49:18 UTC 9,533 bytes, 253 lines download raw bytes

1// AEM refresh note: branch JS/CSS sync for issue-366-429.
2import {
3  API_ACCOUNT,
4  WYVERN_PROXY_PATH,
5  WYVERN_PROXY_PRODUCTION_URL,
6  WYVERN_USE_SAME_ORIGIN_PROXY,
7} from './constants.js';
8import { buildApiUrl } from './wyvern-crypto.js';
9
10let token = localStorage.getItem('apiToken');
11
12function paramsToObject(urlSearchParams) {
13  return Object.fromEntries(urlSearchParams.entries());
14}
15
16/** Worker route exists on www.crn.com only; dev/preview hosts call the production proxy. */
17function getWyvernProxyUrl() {
18  if (typeof window === 'undefined' || !window.location) {
19    return WYVERN_PROXY_PRODUCTION_URL;
20  }
21  const hostname = window.location.hostname.toLowerCase();
22  if (hostname === 'www.crn.com' || hostname === 'crn.com') {
23    return WYVERN_PROXY_PATH;
24  }
25  if (
26    hostname === 'localhost'
27    || hostname === '127.0.0.1'
28    || hostname.endsWith('.aem.page')
29    || hostname.endsWith('.aem.live')
30  ) {
31    return WYVERN_PROXY_PRODUCTION_URL;
32  }
33  return WYVERN_PROXY_PATH;
34}
35
36async function fetchWyvern(urlSearchParams) {
37  if (WYVERN_USE_SAME_ORIGIN_PROXY) {
38    const response = await fetch(getWyvernProxyUrl(), {
39      method: 'POST',
40      headers: { 'Content-Type': 'application/json' },
41      body: JSON.stringify({ params: paramsToObject(urlSearchParams) }),
42    });
43    if (!response.ok) {
44      let message = `Wyvern proxy error (${response.status})`;
45      try {
46        const err = await response.json();
47        if (err?.error) message = err.error;
48      } catch {
49        // ignore non-JSON error bodies
50      }
51      throw new Error(message);
52    }
53    return response.json();
54  }
55
56  const apiUrl = await buildApiUrl(urlSearchParams);
57  const request = await fetch(apiUrl);
58  return request.json();
59}
60
61export async function performApiLoginRequest(urlSearchParams) {
62  try {
63    const response = await fetchWyvern(urlSearchParams);
64
65    if (Object.prototype.hasOwnProperty.call(response, 'ErrorMessage') && response.ErrorMessage !== '') {
66      return Promise.reject(response.ErrorMessage);
67    }
68
69    if (Object.prototype.hasOwnProperty.call(response, 'JsonData') && response.JsonData !== '') {
70      return Promise.resolve(JSON.parse(response?.JsonData));
71    }
72
73    return Promise.resolve(response.Message);
74  } catch (e) {
75    return Promise.reject(e.message);
76  }
77}
78
79export async function performApiRequest(urlSearchParams) {
80  try {
81    const response = await fetchWyvern(urlSearchParams);
82
83    const hasErr = Object.prototype.hasOwnProperty.call(response, 'ErrorMessage');
84    if (response.Status !== 1 || (hasErr && response.ErrorMessage !== '')) {
85      return Promise.reject(response.ErrorMessage || response.Message || 'Unknown error');
86    }
87
88    let result;
89    if (Object.prototype.hasOwnProperty.call(response, 'JsonData') && response.JsonData !== '') {
90      result = JSON.parse(response.JsonData);
91    } else {
92      result = response.Message;
93    }
94
95    if (response.Token) {
96      token = response.Token;
97      localStorage.setItem('apiToken', token);
98    }
99    return Promise.resolve({ result, token });
100  } catch (e) {
101    return Promise.reject(e.message);
102  }
103}
104
105export async function login(username, password) {
106  const urlSearchParams = new URLSearchParams();
107  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
108  urlSearchParams.append('ReturnDataType', '1');
109  urlSearchParams.append('WyvernApiActionType', 'Membership');
110  urlSearchParams.append('WyvernApiAction', 'UserLogin');
111  urlSearchParams.append('WyvernApiGetAction', 'False');
112  urlSearchParams.append('User_LoginName', username);
113  urlSearchParams.append('User_Password', password);
114
115  return performApiLoginRequest(urlSearchParams);
116}
117
118export async function register(username, password) {
119  const urlSearchParams = new URLSearchParams();
120  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
121  urlSearchParams.append('ReturnDataType', '1');
122  urlSearchParams.append('WyvernApiActionType', 'Membership');
123  urlSearchParams.append('WyvernApiAction', 'ContactCreateDemo');
124  urlSearchParams.append('WyvernApiGetAction', 'False');
125  urlSearchParams.append('ContactAPI_Email', username);
126  urlSearchParams.append('User_Password', password);
127  urlSearchParams.append('ContactAPI_Forename', 'Foo');
128  urlSearchParams.append('ContactAPI_Surname', 'Bar');
129  urlSearchParams.append('UserAPIValidate_ValidationSet', 'False');
130  urlSearchParams.append('ContactAPIValidate_ValidationSet', 'False');
131
132  return performApiLoginRequest(urlSearchParams);
133}
134
135export async function getUser(userId) {
136  const urlSearchParams = new URLSearchParams();
137  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
138  urlSearchParams.append('ReturnDataType', '1');
139  urlSearchParams.append('WyvernApiAction', 'ContactGet');
140  urlSearchParams.append('ContactAPI_ContactID', userId);
141  urlSearchParams.append('WyvernApiActionType', 'Membership');
142  urlSearchParams.append('ContactTypeID', '0');
143  return performApiLoginRequest(urlSearchParams);
144}
145
146export async function getUserSubscriptions(userId) {
147  const urlSearchParams = new URLSearchParams();
148  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
149  urlSearchParams.append('ReturnDataType', '1');
150  urlSearchParams.append('WyvernApiAction', 'ContactSubscriptionGet');
151  urlSearchParams.append('Subscription_ContactID', userId);
152  urlSearchParams.append('WyvernApiActionType', 'Membership');
153  urlSearchParams.append('ContactTypeID', '0');
154  return performApiLoginRequest(urlSearchParams);
155}
156
157export async function cancelUserSubscription(subscriptionLinkId) {
158  const urlSearchParams = new URLSearchParams();
159  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
160  urlSearchParams.append('ReturnDataType', '1');
161  urlSearchParams.append('WyvernApiAction', 'ContactSubscriptionLinkCancel');
162  urlSearchParams.append('subscription_contactsubscriptionlinkid', subscriptionLinkId);
163  urlSearchParams.append('WyvernApiActionType', 'Membership');
164  urlSearchParams.append('ContactTypeID', '0');
165  return performApiRequest(urlSearchParams);
166}
167
168export async function getUserFormAutoPopulate(userId, siteSubscriptionId) {
169  const urlSearchParams = new URLSearchParams();
170  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
171  urlSearchParams.append('ReturnDataType', '1');
172  urlSearchParams.append('WyvernApiAction', 'SubscriptionFormAutoPopDataGet');
173  urlSearchParams.append('ContactAPI_ContactEmail', userId);
174  urlSearchParams.append('WyvernApiActionType', 'Membership');
175  urlSearchParams.append('ContactTypeID', '0');
176  urlSearchParams.append('billing_productid', `${siteSubscriptionId}`);
177  return performApiLoginRequest(urlSearchParams);
178}
179
180export async function getUserWebsiteActivityStartData(userId, site, page, title, tags) {
181  const urlSearchParams = new URLSearchParams();
182  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
183  urlSearchParams.append('contactapi_contactid', userId);
184  urlSearchParams.append('ReturnDataType', '1');
185  urlSearchParams.append('WyvernApiAction', 'WebsiteActivityStartData');
186  urlSearchParams.append('WyvernApiActionType', 'Membership');
187  urlSearchParams.append('siteactivity_site', site);
188  urlSearchParams.append('siteactivity_page', page);
189  urlSearchParams.append('siteactivity_title', title);
190  urlSearchParams.append('siteactivity_tags', tags);
191
192  if (token) {
193    urlSearchParams.append('ContactAPI_SessionID', token);
194  }
195
196  try {
197    const response = await performApiRequest(urlSearchParams);
198    return response.result;
199  } catch (error) {
200    return Promise.reject(error);
201  }
202}
203
204export async function getUserWebsiteActivityEndData(userId, site, page, title, tags) {
205  const urlSearchParams = new URLSearchParams();
206  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
207  urlSearchParams.append('contactapi_contactid', userId);
208  urlSearchParams.append('ReturnDataType', '1');
209  urlSearchParams.append('WyvernApiAction', 'WebsiteActivityEndData');
210  urlSearchParams.append('WyvernApiActionType', 'Membership');
211  urlSearchParams.append('siteactivity_site', site);
212  urlSearchParams.append('siteactivity_page', page);
213  urlSearchParams.append('siteactivity_title', title);
214  urlSearchParams.append('siteactivity_tags', tags);
215
216  if (token) {
217    urlSearchParams.append('ContactAPI_SessionID', token);
218  }
219
220  try {
221    return performApiRequest(urlSearchParams);
222  } catch (error) {
223    return Promise.reject(error);
224  }
225}
226
227export async function logout(userId) {
228  const urlSearchParams = new URLSearchParams();
229  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
230  urlSearchParams.append('ReturnDataType', '1');
231  urlSearchParams.append('WyvernApiAction', 'UserLogout');
232  urlSearchParams.append('User_ContactID', userId);
233  urlSearchParams.append('WyvernApiActionType', 'Membership');
234  urlSearchParams.append('ContactTypeID', '0');
235
236  token = null;
237  localStorage.removeItem('apiToken');
238
239  return performApiLoginRequest(urlSearchParams);
240}
241
242export async function passwordResetEmailSend(email, siteSubscriptionId) {
243  const urlSearchParams = new URLSearchParams();
244  urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`);
245  urlSearchParams.append('ReturnDataType', '1');
246  urlSearchParams.append('WyvernApiAction', 'PasswordResetEmailSend');
247  urlSearchParams.append('ContactAPI_ContactEmail', email);
248  urlSearchParams.append('WyvernApiActionType', 'Membership');
249  urlSearchParams.append('ContactTypeID', '0');
250  urlSearchParams.append('billing_productid', `${siteSubscriptionId}`);
251
252  return performApiLoginRequest(urlSearchParams);
253}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.