2 function mdesk_readMember($mxURL, $mxKey, $orgid, $member, $parms) {
8 $request =
"{$mxURL}/{$orgid}/users/{$orgid}-{$member}/members/M-{$orgid}-{$member}.json";
9 $reqHeaders = array(
"Content-Type:application/json",
11 "Accept: application/vnd.moneydesktop.mdx.v5+json");
13 $parms[
"environment"][
"logPoint"] =
"readMember";
14 $MXsaid = mdesk_embcurl($parms, $request,
'GET',$mxKey, $reqHeaders);
19 function mdesk_createMember($mxURL, $mxKey, $orgid, $member, $token, $parms) {
26 $request =
"{$mxURL}/{$orgid}/users/{$orgid}-{$member}/members.json";
28 $reqData = json_encode(array(
"member" => array(
"id" =>
"M-{$orgid}-{$member}",
"userkey" =>
"$token")));
30 $reqHeaders = array(
"Content-Type:application/json",
32 "Accept: application/vnd.moneydesktop.mdx.v5+json");
34 $parms[
"environment"][
"logPoint"] =
"createMember";
35 $MXsaid = mdesk_embcurl($parms, $request,
'POST',$mxKey, $reqHeaders, $reqData);
40 function mdesk_updateMember($mxURL, $mxKey, $orgid, $member, $token, $parms) {
46 $request =
"{$mxURL}/{$orgid}/users/{$orgid}-{$member}/members/M-{$orgid}-{$member}.json";
47 $reqData = json_encode(array(
"member" => array(
48 "user_id" =>
"{$orgid}-{$member}",
"id" =>
"M-{$orgid}-{$member}",
49 "userkey" =>
"$token")));
51 $reqHeaders = array(
"Content-Type:application/json",
53 "Accept: application/vnd.moneydesktop.mdx.v5+json");
55 $parms[
"environment"][
"logPoint"] =
"updateMember";
56 $MXsaid = mdesk_embcurl($parms, $request,
'PUT',$mxKey, $reqHeaders, $reqData);
61 function mdesk_readUser($mxURL, $mxKey, $orgid, $member, $parms) {
67 $request =
"{$mxURL}/{$orgid}/users/{$orgid}-{$member}.json";
68 $reqHeaders = array(
"Content-Type:application/json",
70 "Accept: application/vnd.moneydesktop.mdx.v5+json");
72 $parms[
"environment"][
"logPoint"] =
"readUser";
73 $MXsaid = mdesk_embcurl($parms, $request,
'GET',$mxKey, $reqHeaders);
78 function mdesk_createUser($mxURL, $mxKey, $orgid, $member, $email, $parms) {
84 $request =
"{$mxURL}/{$orgid}/users.json";
85 $reqArr = array(
"user" => array(
"id" =>
"{$orgid}-{$member}"));
86 if (!empty($email) && validateEmail($email) ) {
87 $reqArr[
"user"][
"email"] = $email;
89 $reqData = json_encode($reqArr);
91 $reqHeaders = array(
"Content-Type:application/json",
93 "Accept: application/vnd.moneydesktop.mdx.v5+json");
95 $parms[
"environment"][
"logPoint"] =
"createUser";
96 $MXsaid = mdesk_embcurl($parms, $request,
'POST', $mxKey, $reqHeaders, $reqData);
101 function mdesk_getURL($mxURL, $mxKey, $orgid, $Uid, $widget, $parms) {
103 $request =
"{$mxURL}/{$orgid}/users/{$orgid}-{$Uid}/urls/{$widget}.json";
104 $reqHeaders = array(
"Content-Type:application/json",
105 "MD-API-Key: $mxKey",
106 "Accept: application/vnd.moneydesktop.sso.v3+json");
108 $parms[
"environment"][
"logPoint"] =
"getURL";
109 $MXsaid = mdesk_embcurl($parms, $request,
'GET',$mxKey, $reqHeaders);
114 function mdesk_embcurl($parms, $reqURL, $reqMethod, $reqAPIkey, $reqHeaders, $reqData=
'') {
115 # reqURL is the service url 116 # reqOpts is an array of curlopts 117 # reqHeaders is an array of headers to be sent 120 CURLOPT_RETURNTRANSFER => 1,
121 CURLOPT_SSL_VERIFYPEER => 0,
122 CURLOPT_SSL_VERIFYHOST => 0,
123 CURLOPT_HEADER => FALSE,
124 CURLOPT_URL =>
"$reqURL");
127 @curl_setopt_array($ch, $curlopts);
131 if ($reqMethod !=
'GET') {
132 @curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $reqMethod);
134 if (strlen($reqData) > 0) {
135 @curl_setopt($ch, CURLOPT_POSTFIELDS, $reqData);
137 @curl_setopt($ch, CURLOPT_HTTPHEADER, $reqHeaders);
139 $response = @curl_exec($ch);
140 if ($parms[
"logging"] ==
"enabled") {
141 $logParms = $parms[
"environment"];
142 $logParms[
"token"] =
'';
143 $logParms[
"txnId"] = time();
145 $logParms[
"request"] =
"curl ";
146 if ($reqMethod !=
'GET') {
147 $logParms[
"request"] .=
"-X $reqMethod ";
149 $logParms[
"request"] .=
"'$reqURL' ";
150 if (is_array($reqHeaders)) {
151 foreach($reqHeaders as $hdr) {
152 $logParms[
"request"] .=
"-H $hdr ";
155 if (strlen($reqData) > 0) {
156 $logParms[
"request"] .=
"-d '$reqData' ";
158 $logParms[
"reply"] = $response;
159 LogSSOActivity($logParms);
161 $respHTTP = curl_getinfo($ch,CURLINFO_HTTP_CODE);
162 if ($respHTTP > 400 && $respHTTP < 600 ) {
163 # HTTP Response 4xx client error or 5xx server error 164 $respArr = array(
"error"=>array(
"status" =>
"hcuH" . $respHTTP,
"message" =>
"Connection Failed HTTP Error"));
165 } elseif (curl_errno($ch)) {
166 $respArr = array(
"error"=>array(
"status" =>
"hcuC" . curl_errno($ch),
"message" =>
"Curl Error"));
167 } elseif (!isset($response) || $response ==
'') {
168 $respArr = array(
"error"=>array(
"status" =>
"hcuE" . curl_errno($ch),
"message" =>
"Empty Response"));
170 $respArr = json_decode($response, TRUE);
190 function mdesk_sync($data_URL, $API_key, $Cu, $Uid, $Cn, $Ml, $mxtoken, $parms) {
195 $resparr = mdesk_readMember($data_URL, $API_key, $Cu, $Uid, $parms); #Odyssey w/Uid
197 if (isset($resparr[
'error']) && ($resparr[
'error'][
'status'] ==
'hcuC' || $resparr[
'error'][
'status'] ==
'hcuE')) {
198 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to connect to MoneyDesktop. Please contact the credit union");
200 if (isset($resparr[
'member'])) {
201 # if member found, update it with the new token 203 $resparr = mdesk_updateMember($data_URL, $API_key, $Cu, $Uid, $mxtoken, $parms); #Mammoth w/Cn
204 if (isset($resparr[
'error'])) {
205 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to set security token for MoneyDesktop. Please contact the credit union");
208 # member read did not get a member 211 $resparr = mdesk_readUser($data_URL, $API_key, $Cu, $Uid, $parms); #Odyssey w/Uid
212 if (isset($resparr[
'error']) && ($resparr[
'error'][
'status'] ==
'hcuC' || $resparr[
'error'][
'status'] ==
'hcuE')) {
213 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to connect to MoneyDesktop. Please contact the credit union");
215 if (!isset($resparr[
'user'])) {
216 # no user, try to create one 218 $resparr = mdesk_createUser($data_URL, $API_key, $Cu, $Uid, $Ml, $parms); #Odyssey w/Uid & added Ml
219 if (isset($resparr[
'error'])) {
220 if ($resparr[
'error'][
'status'] ==
'hcuC' || $resparr[
'error'][
'status'] ==
'hcuE') {
221 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to connect to MoneyDesktop. Please contact the credit union");
223 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to create user for MoneyDesktop. Please contact the credit union");
227 # user exists, or we made one. Now make the member 229 $resparr = mdesk_createMember($data_URL, $API_key, $Cu, $Uid, $mxtoken, $parms); #Odyssey w/Uid
230 if (isset($resparr[
'error'])) {
231 if ($resparr[
'error'][
'status'] ==
'hcuC' || $resparr[
'error'][
'status'] ==
'hcuE') {
232 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to connect to MoneyDesktop. Please contact the credit union");
234 throw new Exception(
"Error ({$resparr['error']['message']}). Unable to create member for MoneyDesktop. Please contact the credit union");
239 $result = array(
'status' =>
'Success',
'code' => 0);
240 }
catch (Exception $e) {
244 $result = array(
'status' => $e->getMessage(),
'code' => $e->getCode());
249 function mxValidRequest($headers, $mxHMACKey, $mxRestOpt, $mxSessionData) {
252 $statusreason =
'Success';
253 if (empty($mxHMACKey)) {
254 throw new Exception(
"Missing key");
256 if (empty($mxSessionData)) {
257 $mxSessionData =
''; # in
case it is
null, force empty
string 259 $mxContentMD5 = HCU_array_key_value(
'Content-MD5', $headers);
260 $digest = md5($mxSessionData);
261 if ($digest !== $mxContentMD5) {
262 throw new Exception(
"Precondition failed Session Data ");
265 $mxVerb = $_SERVER[
'REQUEST_METHOD'];
266 $mxHMAC = HCU_array_key_value(
'MDX-HMAC', $headers);
267 $mxContentType = HCU_array_key_value(
'Content-Type', $headers);
268 $mxEpoch = HCU_array_key_value(
'Date', $headers);
269 $mxAccept = HCU_array_key_value(
'Accept', $headers);
270 $mxSessionKey = HCU_array_key_value(
'MDX-Session-Key', $headers);
271 if (empty($mxSessionKey)) {
272 $mxSessionKey =
''; # in
case it is
null, force empty
string 279 #HTTP VERB + "\n" + # $mxVerb 280 #Content-MD5 Header + "\n" + # $mxContentMD5 281 #Content-Type Header + "\n" + # $mxContentType 282 #UNIX Epoch Date Time + "\n" + # $mxEpoch 283 #Accept Header + "\n" + # $mxAccept 284 #MDX-Session-Key + "\n" + # $mxSessionKey 285 #REST Resource of Request # $mxRestOpt 287 # $mxHMACKey = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo3ODkwMTI="; 290 $sigStr =
"{$mxVerb}\n{$mxContentMD5}\n{$mxContentType}\n{$mxEpoch}\n{$mxAccept}\n{$mxSessionKey}\n/{$mxRestOpt}";
291 # calculate SHA1 using key mxHMACKey above as test 292 $sigHash = hash_hmac(
"SHA1", $sigStr, base64_decode($mxHMACKey));
293 if ($sigHash !== $mxHMAC) {
294 throw new Exception(
"Precondition Failed Signature");
296 }
catch (Exception $e) {
298 $statusreason = $e -> getMessage();
305 return array(
'status' => $statusresult,
'message' => $statusreason);
307 function CheckMxKey($CU, $USERKEY, $MXKEY, $HMETHOD) {
309 $result = array(
'Status' => array(
'Code' => 0,
'Message' =>
'Success'));
311 $apptokarr = array();
314 parse_str(urldecode($USERKEY), $apptokarr);
316 if (!HCU_array_key_value(
'E',$apptokarr) || !HCU_array_key_value(
'A',$apptokarr) || !HCU_array_key_value(
'H',$apptokarr) ) {
317 throw new Exception(
"Invalid Credentials (Partial Token) " . __LINE__, 15510);
320 if ($apptokarr[
'E'] < time()) {
321 throw new Exception(
"Invalid Credentials (Expired Token) " . __LINE__, 15510);
324 $MEMBER = $apptokarr[
'A'];
325 $EXPIRES = $apptokarr[
'E'];
327 if (HCU_array_key_exists(
'P',$apptokarr) ) {
328 $PWCHANGE = HCU_array_key_value(
'P',$apptokarr);
332 if ($HMETHOD ==
'S') {
333 $hash = hash_hmac(
'sha384', MD5(join(
':', array($MXKEY, $EXPIRES, $CU, $MEMBER, $PWCHANGE))), $MXKEY);
335 $hash = MD5($MXKEY . MD5(join(
':', array($MXKEY, $EXPIRES, $CU, $MEMBER, $MEMBER))));
337 if ($apptokarr[
'H'] != $hash) {
338 throw new Exception(
"Invalid Credentials (Corrupted Token) " . __LINE__, 15510);
341 $result[
'data'] = $apptokarr;
342 }
catch (Exception $e) {
343 $result = array(
'Status' => array(
'Code' => $e->getCode(),
'Message' =>
'Failed ' . $e->getMessage()));
358 function MakeMxKey($CU, $USER, $TTL, $KEY, $KEYTYPE, $HMETHOD, $PWCHANGE=0) {
359 $appexpires = time() + $TTL; # 94 days
360 if ($HMETHOD ==
'S') {
361 $apphash = hash_hmac(
'sha384',MD5(join(
':', array($KEY, $appexpires, $CU, $MEMBER, $PWCHANGE))),$KEY);
362 $apptoken = urlencode(
"H=$apphash&E=$appexpires&A=$MEMBER&P=$PWCHANGE");
364 $apphash = MD5($KEY . MD5(join(
':', array($KEY, $appexpires, $CU, $MEMBER, $MEMBER))));
365 $apptoken = urlencode(
"H=$apphash&E=$appexpires&A=$MEMBER&C=$MEMBER");
369 function createMxKey($Cu, $mxBundle) {
371 $mxBundle = HCU_PayloadEncode($Cu,$mxBundle);
372 $mxBundle = str_replace(array(
"+",
"/",
"="), array(
"-",
"_",
"."), $mxBundle);
373 }
catch (Exception $e) {
379 function openMxKey($Cu, $mxBundle) {
382 $mxBundle = str_replace(array(
"-",
"_",
"."), array(
"+",
"/",
"="), $mxBundle);
383 $mxBundle = HCU_PayloadDecode($Cu, $mxBundle);
385 }
catch (Exception $e) {
390 function mdesk_setLogging($dbh, $Cu, $username, &$parms) {
391 # set up logging here 392 $loggingFlag = trim($parms[
"hcuLogging"]);
393 if (strlen($loggingFlag) > 0) {
395 $enable = $loggingFlag == -1;
398 $loggingFlag = str_replace(
" ",
"", strtolower($loggingFlag));
399 $testArray = explode(
",", $loggingFlag);
400 $enable = in_array(strtolower($username), $testArray);
405 $parms[
"logging"] =
"enabled";
406 $parms[
"environment"] = array(
"Cu" => $Cu,
407 "memberId" => $username,
408 "SSOVendor" =>
'MDX',
409 "userIP" => $_SERVER[
'REMOTE_ADDR'],