1/**
2 * WHMCS authentication module
3 *
4 * @copyright Copyright (c) WHMCS Limited 2005-2017
5 * @license http://www.whmcs.com/license/ WHMCS Eula
6 */
7
8(function(module) {
9 if (!WHMCS.hasModule('authn')) {
10 WHMCS.loadModule('authn', module);
11 }
12})({
13provider: function () {
14 var callbackFired = false;
15
16 /**
17 * @return {jQuery}
18 */
19 this.feedbackContainer = function () {
20 return jQuery(".providerLinkingFeedback");
21 };
22
23 /**
24 * @returns {jQuery}
25 */
26 this.btnContainer = function () {
27 return jQuery(".providerPreLinking");
28 };
29
30 this.feedbackMessage = function (context) {
31 if (typeof context === 'undefined') {
32 context = 'complete_sign_in';
33 }
34 var msgContainer = jQuery('p.providerLinkingMsg-preLink-' + context);
35 if (msgContainer.length) {
36 return msgContainer.first().html();
37 }
38
39 return '';
40 };
41
42 this.showProgressMessage = function(callback) {
43 this.feedbackContainer().fadeIn('fast', function () {
44 if (typeof callback === 'function' && !callbackFired) {
45 callbackFired = true;
46 callback();
47 }
48 });
49 };
50
51 this.preLinkInit = function (callback) {
52 var icon = '<i class="fas fa-fw fa-spinner fa-spin"></i> ';
53
54 this.feedbackContainer()
55 .removeClass('alert-danger alert-success')
56 .addClass('alert alert-info')
57 .html(icon + this.feedbackMessage())
58 .hide();
59
60 var btnContainer = this.btnContainer();
61 if (btnContainer.length) {
62 if (btnContainer.data('hideOnPrelink')) {
63 var self = this;
64 btnContainer.fadeOut('false', function ()
65 {
66 self.showProgressMessage(callback)
67 });
68 } else if (btnContainer.data('disableOnPrelink')) {
69 btnContainer.find('.btn').addClass('disabled');
70 this.showProgressMessage(callback);
71 } else {
72 this.showProgressMessage(callback);
73 }
74 } else {
75 this.showProgressMessage(callback);
76 }
77 };
78
79 this.displayError = function (provider, errorCondition, providerErrorText){
80 jQuery('#providerLinkingMessages .provider-name').html(provider);
81
82 var feedbackMsg = this.feedbackMessage('connect_error');
83 if (errorCondition) {
84 var errorMsg = this.feedbackMessage(errorCondition);
85 if (errorMsg) {
86 feedbackMsg = errorMsg
87 }
88 }
89
90 if (providerErrorText && $('.btn-logged-in-admin').length > 0) {
91 feedbackMsg += ' Error: ' + providerErrorText;
92 }
93
94 this.feedbackContainer().removeClass('alert-info alert-success')
95 .addClass('alert alert-danger')
96 .html(feedbackMsg).slideDown();
97 };
98
99 this.displaySuccess = function (data, context, provider) {
100 var icon = provider.icon;
101 var htmlTarget = context.htmlTarget;
102 var targetLogin = context.targetLogin;
103 var targetRegister = context.targetRegister;
104 var displayName = provider.name;
105 var feedbackMsg = '';
106
107 switch (data.result) {
108 case "logged_in":
109 case "2fa_needed":
110 feedbackMsg = this.feedbackMessage('2fa_needed');
111 this.feedbackContainer().removeClass('alert-danger alert-warning alert-success')
112 .addClass('alert alert-info')
113 .html(feedbackMsg);
114
115 window.location = data.redirect_url
116 ? decodeURIComponent(data.redirect_url)
117 : decodeURIComponent(context.redirectUrl);
118
119 break;
120
121 case "linking_complete":
122 var accountInfo = '';
123 if (data.remote_account.email) {
124 accountInfo = data.remote_account.email;
125 } else {
126 accountInfo = data.remote_account.firstname + " " + data.remote_account.lastname;
127 }
128
129 accountInfo = accountInfo.trim();
130
131 feedbackMsg = this.feedbackMessage('linking_complete').trim().replace(':displayName', displayName);
132 if (accountInfo) {
133 feedbackMsg = feedbackMsg.replace(/\.$/, ' (' + accountInfo + ').');
134 }
135
136 this.feedbackContainer().removeClass('alert-danger alert-warning alert-info')
137 .addClass('alert alert-success')
138 .html(icon + feedbackMsg);
139 break;
140
141 case "login_to_link":
142 if (htmlTarget === targetLogin) {
143 feedbackMsg = this.feedbackMessage('login_to_link-signin-required');
144 this.feedbackContainer().removeClass('alert-danger alert-success alert-info')
145 .addClass('alert alert-warning')
146 .html(icon + feedbackMsg);
147 } else {
148 var emailField = jQuery("input[name=email]");
149 var firstNameField = jQuery("input[name=firstname]");
150 var lastNameField = jQuery("input[name=lastname]");
151
152 if (emailField.val() === "") {
153 emailField.val(data.remote_account.email);
154 }
155
156 if (firstNameField.val() === "") {
157 firstNameField.val(data.remote_account.firstname);
158 }
159
160 if (lastNameField.val() === "") {
161 lastNameField.val(data.remote_account.lastname);
162 }
163
164 if (htmlTarget === targetRegister) {
165 if (typeof WHMCS.client.registration === 'object') {
166 WHMCS.client.registration.prefillPassword();
167 }
168 feedbackMsg = this.feedbackMessage('login_to_link-registration-required');
169 this.feedbackContainer().fadeOut('slow', function () {
170 $(this).removeClass('alert-danger alert-success alert-info')
171 .addClass('alert alert-warning')
172 .html(icon + feedbackMsg).fadeIn('fast');
173 });
174
175 } else {
176 // this is checkout
177 if (typeof WHMCS.client.registration === 'object') {
178 WHMCS.client.registration.prefillPassword();
179 }
180
181 var self = this;
182 this.feedbackContainer().each(function (i, el) {
183 var container = $(el);
184 var linkContext = container.siblings('div .providerPreLinking').data('linkContext');
185
186 container.fadeOut('slow', function () {
187 if (linkContext === 'checkout-new') {
188 feedbackMsg = self.feedbackMessage('checkout-new');
189 } else {
190 feedbackMsg = self.feedbackMessage('login_to_link-signin-required');
191 }
192 container.removeClass('alert-danger alert-success alert-info')
193 .addClass('alert alert-warning')
194 .html(icon + feedbackMsg).fadeIn('fast');
195 });
196 });
197 }
198 }
199
200 break;
201
202 case "other_user_exists":
203 feedbackMsg = this.feedbackMessage('other_user_exists');
204 this.feedbackContainer().removeClass('alert-info alert-success')
205 .addClass('alert alert-danger')
206 .html(icon + feedbackMsg).slideDown();
207 break;
208
209 case "already_linked":
210 feedbackMsg = this.feedbackMessage('already_linked');
211 this.feedbackContainer().removeClass('alert-info alert-success')
212 .addClass('alert alert-danger')
213 .html(icon + feedbackMsg).slideDown();
214 break;
215
216 default:
217 feedbackMsg = this.feedbackMessage('default');
218 this.feedbackContainer().removeClass('alert-info alert-success')
219 .addClass('alert alert-danger')
220 .html(icon + feedbackMsg).slideDown();
221 break;
222 }
223 };
224
225 this.signIn = function (config, context, provider, providerDone, providerError) {
226 jQuery.ajax(config).done(function(data) {
227 providerDone();
228 WHMCS.authn.provider.displaySuccess(data, context, provider);
229 var table = jQuery('#tableLinkedAccounts');
230 if (table.length) {
231 WHMCS.ui.dataTable.getTableById('tableLinkedAccounts').ajax.reload();
232 }
233 }).error(function() {
234 providerError();
235 WHMCS.authn.provider.displayError();
236 });
237 };
238
239 return this;
240}});
241