/** * * @param <String> $rev_id * @param <String> $sessionId * @param <Object> $model boModel * @param <Object> $blobCB=0 (should have been a causal barrier object but * not used yet) */ static function storeModel($rev_id, $sessionId, $model, $blobCB) { wfDebugLog('p2p', ' -> store model into revid : ' . $rev_id . ' sessionid : ' . $sessionId . ' model : ' . $model->getText()); try { $dao = new dao(); $dao->storeModel($rev_id, $sessionId, $model, $blobCB); } catch (Exception $e) { die($e->getMessage()); throw new MWException(__METHOD__ . ' db access problems'); } }
/** * This function generates an error message based on whats returned from the DbObject validation method * $w is for the error() function * $object is the object that one is saving/updating whatever * $type is for the message returned, i.e. "Updating this $type failed" * $response is the reponse array from the validation method * $isUpdating is a helper for the message i.e. creating/updating * $returnUrl is where the redirection in error() will go * * @param <Object> $object * @param <String> $type * @param <Array|Boolean> $response * @param <Boolean> $isUpdating * @param <String> $returnUrl * @return null */ function errorMessage($object, $type = null, $response = true, $isUpdating = false, $returnUrl = "/") { if ($response === true || empty($type)) { return; } else { if (is_array($response)) { $errorMsg = ($isUpdating ? "Updating" : "Creating") . " this {$type} failed because<br/><br/>\n"; foreach ($response["invalid"] as $property => $reason) { foreach ($reason as $r) { $errorMsg .= $object->getHumanReadableAttributeName($property) . ": {$r} <br/>\n"; } } $this->Log->error("System: Saving " . get_class($object) . " error: " . $errorMsg); $this->error($errorMsg, $returnUrl); } else { $this->Log->error("System: " . ($isUpdating ? "Updating" : "Creating") . " this {$type} failed."); $this->error(($isUpdating ? "Updating" : "Creating") . " this {$type} failed.", $returnUrl); } } }
/** * Function to get contents of this task * @param <Object> $entity * @return <Array> contents */ public function getContents($entity, $entityCache = false) { if (!$this->contents) { global $adb, $current_user; $taskContents = array(); $entityId = $entity->getId(); $utils = new VTWorkflowUtils(); $adminUser = $utils->adminUser(); if (!$entityCache) { $entityCache = new VTEntityCache($adminUser); } $fromUserId = Users::getActiveAdminId(); $entityOwnerId = $entity->get('assigned_user_id'); if ($entityOwnerId) { list($moduleId, $fromUserId) = explode('x', $entityOwnerId); } $ownerEntity = $entityCache->forId($entityOwnerId); if ($ownerEntity->getModuleName() === 'Groups') { list($moduleId, $recordId) = vtws_getIdComponents($entityId); $fromUserId = Vtiger_Util_Helper::getCreator($recordId); } if ($this->fromEmail && !($ownerEntity->getModuleName() === 'Groups' && strpos($this->fromEmail, 'assigned_user_id : (Users) ') !== false)) { $et = new VTEmailRecipientsTemplate($this->fromEmail); $fromEmailDetails = $et->render($entityCache, $entityId); $con1 = strpos($fromEmailDetails, '<'); $con2 = strpos($fromEmailDetails, '>'); if ($con1 && $con2) { list($fromName, $fromEmail) = explode('<', $fromEmailDetails); list($fromEmail, $rest) = explode('>', $fromEmail); } else { $fromName = ""; $fromEmail = $fromEmailDetails; } } else { $userObj = CRMEntity::getInstance('Users'); $userObj->retrieveCurrentUserInfoFromFile($fromUserId); if ($userObj) { $fromEmail = $userObj->email1; $fromName = $userObj->user_name; } else { $result = $adb->pquery('SELECT user_name, email1 FROM vtiger_users WHERE id = ?', array($fromUserId)); $fromEmail = $adb->query_result($result, 0, 'email1'); $fromName = $adb->query_result($result, 0, 'user_name'); } } if (!$fromEmail) { $utils->revertUser(); return false; } $taskContents['fromEmail'] = $fromEmail; $taskContents['fromName'] = $fromName; if ($entity->getModuleName() === 'Events') { $contactId = $entity->get('contact_id'); if ($contactId) { $contactIds = ''; list($wsId, $recordId) = explode('x', $entityId); $webserviceObject = VtigerWebserviceObject::fromName($adb, 'Contacts'); $result = $adb->pquery('SELECT contactid FROM vtiger_cntactivityrel WHERE activityid = ?', array($recordId)); $numOfRows = $adb->num_rows($result); for ($i = 0; $i < $numOfRows; $i++) { $contactIds .= vtws_getId($webserviceObject->getEntityId(), $adb->query_result($result, $i, 'contactid')) . ','; } } $entity->set('contact_id', trim($contactIds, ',')); $entityCache->cache[$entityId] = $entity; } $et = new VTEmailRecipientsTemplate($this->recepient); $toEmail = $et->render($entityCache, $entityId); $ecct = new VTEmailRecipientsTemplate($this->emailcc); $ccEmail = $ecct->render($entityCache, $entityId); $ebcct = new VTEmailRecipientsTemplate($this->emailbcc); $bccEmail = $ebcct->render($entityCache, $entityId); if (strlen(trim($toEmail, " \t\n,")) == 0 && strlen(trim($ccEmail, " \t\n,")) == 0 && strlen(trim($bccEmail, " \t\n,")) == 0) { $utils->revertUser(); return false; } $taskContents['toEmail'] = $toEmail; $taskContents['ccEmail'] = $ccEmail; $taskContents['bccEmail'] = $bccEmail; $st = new VTSimpleTemplate($this->subject); $taskContents['subject'] = $st->render($entityCache, $entityId); $ct = new VTSimpleTemplate($this->content); $taskContents['content'] = $ct->render($entityCache, $entityId); $this->contents = $taskContents; $utils->revertUser(); } if (is_array($this->contents)) { $this->contents = Zend_Json::encode($this->contents); } return $this->contents; }
/** * $action=admin is generated when the administration tab is clicked * Calculates every that is displayed on this page (cf user manual) * * @global <Object> $wgOut output page instance * @global <Object> $wgCachePages * @global <String> $wgServerName * @global <String> $wgScriptPath * @param <String> $action * @param <Object> $article * @return <bool> */ function onUnknownAction($action, $article) { global $wgOut, $wgCachePages, $wgServerName, $wgScriptPath, $wgScriptExtension; $urlServer = 'http://' . $wgServerName . $wgScriptPath; $wgCachePages = false; //Verify that the action coming in is "admin" if ($action == "admin") { wfDebugLog('p2p', 'Admin page'); if ($article->mTitle->getNamespace() == 0) { $title = $article->mTitle->getText(); } else { $title = $article->mTitle->getNsText() . ':' . $article->mTitle->getText(); } wfDebugLog('p2p', ' -> title : ' . $title); $wgOut->setPagetitle('DSMW on ' . $title); //part list of patch $patchs = utils::orderPatchByPrevious($title); $wgOut->addWikiText('[[Special:ArticleAdminPage|DSMW Admin functions]] ==Features=='); $output = '<div style="width:60%;height:40%;overflow:auto;"> <table style="border-bottom: 2px solid #000;"> <caption><b>List of patchs</b></caption>'; //color the remote patch of the current page foreach ($patchs as $patch) { wfDebugLog('p2p', ' -> patchId : ' . $patch); if (!utils::isRemote($patch)) { wfDebugLog('p2p', ' -> remote patch'); $output .= '<tr BGCOLOR="#CCCCCC"><td>' . wfTimestamp(TS_RFC2822, $article->getTimestamp()) . ' : </td>'; // $output .= '<tr><td BGCOLOR="#33CC00"><a href="'.$_SERVER['PHP_SELF'].'?title='.$patch.'">'.$patch.'</a></td>'; } else { wfDebugLog('p2p', ' -> local patch'); $output .= '<tr><td>' . wfTimestamp(TS_RFC2822, $article->getTimestamp()) . ' : </td>'; //$output .= '<tr><td><a href="'.$_SERVER['PHP_SELF'].'?title='.$patch.'">'.$patch.'</a></td>'; } //count the number of delete and insert operations into the patch $results = array(); $op = utils::getSemanticQuery('[[Patch:+]][[patchID::' . $patch . ']]', '?hasOperation'); $count = $op->getCount(); for ($i = 0; $i < $count; $i++) { $row = $op->getNext(); if ($row === false) { break; } $row = $row[1]; $col = $row->getContent(); //SMWResultArray object foreach ($col as $object) { //SMWDataValue object $wikiValue = $object->getWikiValue(); $results[] = $wikiValue; } } $countOp = utils::countOperation($results); //old code passed $op parameter $output .= '<td>' . $countOp['insert'] . ' insert, ' . $countOp['delete'] . ' delete</td>'; $output .= '<td>(<a href="' . $_SERVER['PHP_SELF'] . '?title=' . $patch . '">' . $patch . '</a>)</td></tr>'; /*$titlePatch = Title::newFromText( $patch,PATCH ); $article = new Article( $title );*/ } $output .= '</table></div>'; //list of push $pushs = array(); $res = utils::getSemanticQuery('[[ChangeSet:+]][[hasPatch::' . $patchs[0] . ']][[inPushFeed::+]]', '?inPushFeed'); $count = $res->getCount(); for ($i = 0; $i < $count; $i++) { $row = $res->getNext(); if ($row === false) { break; } $row = $row[1]; $col = $row->getContent(); //SMWResultArray object foreach ($col as $object) { //SMWDataValue object $wikiValue = $object->getWikiValue(); $pushs[] = $wikiValue; } } if (!empty($pushs)) { $output .= '<br><div style="width:60%;height:40%;overflow:auto;"><table style="border-bottom: 2px solid #000;"><caption><b>List of pushs</b></caption>'; foreach ($pushs as $push) { $pushName = $push; $output .= '<tr><td align="right" width="50%"><a href="' . $_SERVER['PHP_SELF'] . '?title=' . $pushName . '">' . $pushName . '</a> : </td>'; //count the number of published patchs by the current pushFeed for the current page $published = utils::getPublishedPatchs($urlServer, $pushName, $title); //$publishedInPush = utils::getSemanticRequest('http://'.$wgServerName.$wgScriptPath, '', $param); //count the number of unpublished patchs $unpublished = array_diff($patchs, $published); if (!is_null($unpublished) && count($unpublished) > 0) { $output .= '<td align="left" width="50%">' . count($unpublished) . ' unpublished patchs on ' . count($patchs) . ' </td></tr>'; } else { $output .= '<td align="left" width="50%"> all ' . $title . "'" . 'patchs are pushed </td></tr>'; } } $output .= '</table></div>'; } //end if empty $pushs //part list of pull $pulls = array(); $res = utils::getSemanticQuery('[[ChangeSet:+]][[hasPatch::' . $patchs[0] . ']][[inPullFeed::+]]', '?inPullFeed'); $count = $res->getCount(); for ($i = 0; $i < $count; $i++) { $row = $res->getNext(); if ($row === false) { break; } $row = $row[1]; $col = $row->getContent(); //SMWResultArray object foreach ($col as $object) { //SMWDataValue object $wikiValue = $object->getWikiValue(); $pulls[] = $wikiValue; } } if (!empty($pulls)) { $output .= '<br><div style="width:60%;height:40%;overflow:auto;"><table style="border-bottom: 2px solid #000;"><caption><b>List of pull</b></caption>'; foreach ($pulls as $pull) { $pullName = $pull; $pushServer = getPushURL($pullName); $pushName = getPushName($pullName); $output .= '<tr><td align="right" width="50%"><a href="' . $_SERVER['PHP_SELF'] . '?title=' . $pullName . '">' . $pullName . '</a> : </td>'; $pulledPatch = utils::getPulledPatches($pullName); $patchs = array(); foreach ($pulledPatch as $patch) { $onPage = array(); $res = utils::getSemanticQuery('[[Patch:+]][[patchID::' . $patch . ']]', '?onPage'); $count = $res->getCount(); for ($i = 0; $i < $count; $i++) { $row = $res->getNext(); if ($row === false) { break; } $row = $row[1]; $col = $row->getContent(); //SMWResultArray object foreach ($col as $object) { //SMWDataValue object $wikiValue = $object->getWikiValue(); $onPage[] = $wikiValue; } } if ($onPage[0] == $title) { $patchs[] = $patch; } } $published = utils::getPublishedPatchs($pushServer, $pushName, $title); if (!is_null($published)) { $unpublished = array_diff($patchs, $published); $t = count($published); $t = count($patchs); $count = count($published) - count($patchs); $output .= '<td align="left" width="50%"> ' . $count . ' unpulled patchs </td></tr>'; } else { $output .= '<td align="left" width="50%"> up to date </td></tr>'; } } $output .= '</table></div>'; } //end if empty $pulls //part push page $url = "http://" . $wgServerName . $wgScriptPath . "/index{$wgScriptExtension}"; $output .= ' <h2>Actions</h2> <div><FORM name="formPush"> <table > <tr><td> <input type="button" value="PUSH" onClick="pushpage(\'' . $url . '\',\'' . $title . '\');"></input></td></tr></table></form></div> This [Push page : "' . $title . '"] action will create a PushFeed and publish the modifications of the "' . $title . '" article <div id="pushstatus" style="display: none; width: 100%; clear: both;" > <a name="PUSH_Progress_:" id="PUSH_Progress_:"></a><h2> <span class="mw-headline"> PUSH Progress : </span></h2> <div id="statepush" ></div><br /> </div> '; $wgOut->addHTML($output); return false; } else { return true; } }
/** * utility function used in the binary search * @param <Object> $position1 LogootPosition * @param <Object> $position2 LogootPosition * @return <Integer> -1, 0 or 1 */ private function dichoComp1($position1, $position2) { // if both positions are 1 vector Ids if ($position1->size() == 1 && $position2->size() == 1) { $tab1 = $position1->getThisPosition(); $tab2 = $position2->getThisPosition(); if ($position1->lessThan($tab1[0], $tab2[0])) { return -1; } if ($position1->greaterThan($tab1[0], $tab2[0])) { return 1; } if ($position1->equals($tab1[0], $tab2[0])) { return 0; } } else { // else if both logootIds are n vectors Ids if ($position1->nLessThan($position2)) { return -1; } if ($position1->nGreaterThan($position2)) { return 1; } if ($position1->nEquals($position2)) { return 0; } } }
/** * MW Hook used to redirect to page creation (pushfeed, pullfeed, changeset), * to forms or to push/pull action testing the action param * * * @global <Object> $wgOut * @param <Object> $action * @param <Object> $article * @return <boolean> */ function onUnknownAction($action, $article) { global $wgOut, $wgServerName, $wgScriptPath, $wgUser, $wgScriptExtension, $wgDSMWIP; $urlServer = 'http://' . $wgServerName . $wgScriptPath . "/index{$wgScriptExtension}"; $urlAjax = 'http://' . $wgServerName . $wgScriptPath; //////////pull form page//////// if (isset($_GET['action']) && $_GET['action'] == 'addpullpage') { wfDebugLog('p2p', '@@@@@@@@@@@@@@@@@@ addPullPage '); $newtext = "Add a new site:\n<div id='dsmw' style=\"color:green;\"></div>\n\n{{#form:action=" . $urlServer . "?action=pullpage|method=POST|\nPushFeed Url: {{#input:type=button|value=Url test|onClick=\nvar url = document.getElementsByName('url')[0].value;\nif(url.indexOf('PushFeed')==-1){\nalert('No valid PushFeed syntax, see example.');\n}else{\nvar urlTmp = url.substring(0,url.indexOf('PushFeed'));\n//alert(urlTmp);\n\nvar pos1 = urlTmp.indexOf('index.php');\n//alert(pos1);\nvar pushUrl='';\nif(pos1!=-1){\npushUrl = urlTmp.substring(0,pos1);\n//alert('if');\n}else{\npushUrl = urlTmp;\n//alert('else');\n}\n//alert(pushUrl);\n\n//alert(pushUrl+'api.php?action=query&meta=patch&papatchId=1&format=xml');\nvar xhr_object = null;\n\n\t if(window.XMLHttpRequest) // Firefox\n\t xhr_object = new XMLHttpRequest();\n\t else if(window.ActiveXObject) // Internet Explorer\n\t xhr_object = new ActiveXObject('Microsoft.XMLHTTP');\n\t else {\n\t alert('Votre navigateur ne supporte pas les objets XMLHTTPRequest...');\n\t return;\n\t }\n try{ xhr_object.open('GET', '" . $urlAjax . "/extensions/DSMW/files/ajax.php?url='+escape(pushUrl+'api.php?action=query&meta=patch&papatchId=1&format=xml'), true);}\n catch(e){\n //alert('There is no DSMW Server responding at this URL');\n document.getElementById('dsmw').innerHTML = 'There is no DSMW Server responding at this URL!';\n document.getElementById('dsmw').style.color = 'red';\n }\n xhr_object.onreadystatechange = function() {\n\nif(xhr_object.readyState == 4) {\n if(xhr_object.statusText=='OK'){\n if(xhr_object.responseText == 'true'){ //alert('URL valid, there is a DSMW Server responding');\n document.getElementById('dsmw').innerHTML = 'URL valid, there is a DSMW Server responding!';\n document.getElementById('dsmw').style.color = 'green';\n }\n else{ //alert('There is no DSMW Server responding at this URL');\n document.getElementById('dsmw').innerHTML = 'There is no DSMW Server responding at this URL!';\n document.getElementById('dsmw').style.color = 'red';\n }\n }\n else{\n //alert('There is no DSMW Server responding at this URL');\n document.getElementById('dsmw').innerHTML = 'There is no DSMW Server responding at this URL!';\n document.getElementById('dsmw').style.color = 'red';\n}\n\t\t }\n\t }\n\n\t xhr_object.send(null);\n}\n}}<br> {{#input:type=text|name=url|size=50}} <b>e.g. http://server/path/index.php?title=PushFeed:PushName</b><br>\nPullFeed Name: <br> {{#input:type=text|name=pullname}}<br>\n{{#input:type=submit|value=ADD}}\n}}"; //if article doesn't exist insertNewArticle if ($article->mTitle->exists()) { $article->updateArticle($newtext, $summary = "", false, false); } else { $article->insertNewArticle($newtext, $summary = "", false, false); } $article->doRedirect(); return false; } elseif (isset($_GET['action']) && $_GET['action'] == 'addpushpage') { wfDebugLog('p2p', '@@@@@@@@@@@@@@@@ addPushPage'); $specialAsk = $urlServer . '?title=Special:Ask'; $newtext = "Add a new pushfeed:\n\n{{#form:action=" . $urlServer . "?action=pushpage|method=POST|\nPushFeed Name: <br> {{#input:class=test|name=name|type=text|onKeyUp=test('{$urlServer}');}}<div style=\"display:inline; \" id=\"state\" ></div><br />\nRequest: {{#input:type=button|value=Test your query|title=click here to test your query results|onClick=\nvar query = document.getElementsByName('keyword')[0].value;\nvar query1 = encodeURI(query);\nwindow.open('" . $specialAsk . "&q='+query1+'&eq=yes&p%5Bformat%5D=broadtable','querywindow','menubar=no, status=no, scrollbars=yes, menubar=no, width=1000, height=900');}}\n <br>{{#input:type=textarea|cols=30 | style=width:auto |rows=2|name=keyword}} <b>e.g. [[Category:city]][[locatedIn::France]]</b><br>\n{{#input:type=submit|value=ADD}}\n}}"; $article->doEdit($newtext, $summary = ""); $article->doRedirect(); return false; } elseif (isset($_GET['action']) && $_GET['action'] == 'pushpage') { //$url = $_POST['url'];//pas url mais changesetId wfDebugLog('p2p', '@@@@@@@@@@@@@@@@@ Create new push ' . $_POST['name'] . ' with ' . $_POST['keyword']); $name = $_POST['name']; $request = $_POST['keyword']; $stringReq = utils::encodeRequest($request); //avoid "semantic injection" :)) //addPushSite($url, $name, $request); $newtext = "\n[[Special:ArticleAdminPage|DSMW Admin functions]]\n\n==Features==\n[[name::PushFeed:" . $name . "| ]]\n'''Semantic query:''' [[hasSemanticQuery::" . $stringReq . "| ]]<nowiki>" . $request . "</nowiki>\n\n'''Pages concerned:'''\n{{#ask: " . $request . "}}\n[[deleted::false| ]]\n\n==Actions==\n\n{{#input:type=ajax|value=PUSH|onClick=pushpull('" . $urlServer . "','PushFeed:" . $name . "', 'onpush');}}\nThe \"PUSH\" action publishes the (unpublished) modifications of the articles listed above.\n\n== PUSH Progress : ==\n<div id=\"state\" ></div><br />\n"; wfDebugLog('p2p', ' -> push page contains : ' . $newtext); $title = Title::newFromText($_POST['name'], PUSHFEED); $article = new Article($title); $edit = $article->doEdit($newtext, $summary = ""); $article->doRedirect(); return false; } elseif (isset($_POST['action']) && $_POST['action'] == 'onpush') { wfDebugLog('p2p', '@@@@@@@@@@@@ ChangeSet page'); /* In case we push directly from an article page */ if (isset($_POST['page']) && isset($_POST['request'])) { $articlename = Title::newFromText($_POST['name']); if (!$articlename->exists()) { $result = utils::createPushFeed($_POST['name'], $_POST['request']); utils::writeAndFlush("Create push <A HREF=" . 'http://' . $wgServerName . $wgScriptPath . "/index.php?title=" . $_POST['name'] . ">" . $_POST['name'] . "</a>"); if ($result == false) { throw new MWException(__METHOD__ . ': no Pushfeed created in utils:: createPushFeed: name: ' . $_POST['name'] . ' request' . $_POST['request']); } } } wfDebugLog('p2p', 'push on '); $patches = array(); $tmpPatches = array(); if (isset($_POST['name'])) { $name1 = $_POST['name']; if (!is_array($name1)) { $name1 = array($name1); } foreach ($name1 as $push) { wfDebugLog('p2p', ' - ' . $push); } } else { $name1 = ""; } if ($name1 == "") { utils::writeAndFlush('<p><b>No pushfeed selected!</b></p>'); $title = Title::newFromText('Special:ArticleAdminPage'); $article = new Article($title); $article->doRedirect(); return false; } //$name = $name1[0]; utils::writeAndFlush('<p><b>Start push </b></p>'); foreach ($name1 as $name) { utils::writeAndFlush("<span style=\"margin-left:30px;\">begin push: <A HREF=" . 'http://' . $wgServerName . $wgScriptPath . "/index.php?title={$name}>" . $name . "</a></span> <br/>"); $patches = array(); //// for each pushfeed name==> push wfDebugLog('p2p', ' -> pushname ' . $name); // $name = $_GET['name'];//PushFeed name $request = getPushFeedRequest($name); // $previousCSID = getPreviousCSID($name); $previousCSID = getHasPushHead($name); if ($previousCSID == false) { $previousCSID = "none"; //$CSID = $name."_0"; } //else{ // $count = explode(" ", $previousCSID); // $cnt = $count[1] + 1; // $CSID = $name."_".$cnt; // } wfDebugLog('p2p', ' ->pushrequest ' . $request); wfDebugLog('p2p', ' ->pushHead : ' . $previousCSID); $CSID = utils::generateID(); //changesetID if ($request == false) { $outtext = '<p><b>No semantic request found!</b></p> <a href="' . $_SERVER['HTTP_REFERER'] . '">back</a>'; $wgOut->addHTML($outtext); return false; } $pages = getRequestedPages($request); //ce sont des pages et non des patches foreach ($pages as $page) { wfDebugLog('p2p', ' ->requested page ' . $page); $page = str_replace('"', '', $page); $request1 = '[[Patch:+]][[onPage::' . $page . ']]'; $tmpPatches = utils::orderPatchByPrevious($page); if (!is_array($tmpPatches)) { throw new MWException(__METHOD__ . ': $tmpPatches is not an array'); } $patches = array_merge($patches, $tmpPatches); wfDebugLog('p2p', ' -> ' . count($tmpPatches) . 'patchs were found for the page ' . $page); } wfDebugLog('p2p', ' -> ' . count($patches) . ' patchs were found for the pushfeed ' . $name); $published = getPublishedPatches($name); $unpublished = array_diff($patches, $published); /* unpublished = patches-published */ wfDebugLog('p2p', ' -> ' . count($published) . ' patchs were published for the pushfeed ' . $name . ' and ' . count($unpublished) . ' unpublished patchs'); if (empty($unpublished)) { wfDebugLog('p2p', ' -> no unpublished patch'); utils::writeAndFlush("<span style=\"margin-left:60px;\">no unpublished patch</span><br/>"); //return false; //If there is no unpublished patch } else { utils::writeAndFlush("<span style=\"margin-left:60px;\">" . count($unpublished) . " unpublished patch</span><br/>"); $pos = strrpos($CSID, ":"); //NS removing if ($pos === false) { // not found... $articleName = $CSID; $CSID = "ChangeSet:" . $articleName; } else { $articleName = substr($CSID, 0, $pos + 1); $CSID = "ChangeSet:" . $articleName; } $newtext = "\n[[Special:ArticleAdminPage|DSMW Admin functions]]\n\n==Features==\n[[changeSetID::" . $CSID . "| ]]\n\n'''Date:''' " . date(DATE_RFC822) . "\n\n'''User:''' " . $wgUser->getName() . "\n\nThis ChangeSet is in : [[inPushFeed::" . $name . "]]<br>\n==Published patches==\n\n{| class=\"wikitable\" border=\"1\" style=\"text-align:left; width:30%;\"\n|-\n!bgcolor=#c0e8f0 scope=col | Patch\n|-\n"; //wfDebugLog('p2p',' -> count unpublished patch '.count($unpublished)); foreach ($unpublished as $patch) { wfDebugLog('p2p', ' -> unpublished patch ' . $patch); $newtext .= "|[[hasPatch::" . $patch . "]]\n|-\n"; } $newtext .= "\n|}"; $newtext .= "\n==Previous ChangeSet==\n[[previousChangeSet::" . $previousCSID . "]]\n"; $update = updatePushFeed($name, $CSID); if ($update == true) { // update the "hasPushHead" value successful $title = Title::newFromText($articleName, CHANGESET); $article = new Article($title); $article->doEdit($newtext, $summary = ""); } else { $outtext = '<p><b>PushFeed has not been updated!</b></p>'; $wgOut->addHTML($outtext); } } } //end foreach pushfeed list utils::writeAndFlush('<p><b>End push</b></p>'); $title = Title::newFromText('Special:ArticleAdminPage'); $article = new Article($title); $article->doRedirect(); return false; } elseif (isset($_GET['action']) && $_GET['action'] == 'pullpage') { //$url = rtrim($_POST['url'], "/"); //removes the final "/" if there is one $urlTmp = $_POST['url']; if (utils::isValidURL($urlTmp) == false) { throw new MWException(__METHOD__ . ': ' . $urlTmp . ' seems not to be an url'); } //throws an exception if $url is invalid $res = utils::parsePushURL($urlTmp); if ($res === false || empty($res)) { throw new MWException(__METHOD__ . ': URL format problem'); } $pushname = $res[0]; $url = $res[1]; //$pushname = $_POST['pushname']; $pullname = $_POST['pullname']; wfDebugLog('p2p', '@@@@@@@@@@@@@ Create pull ' . $pullname . ' with pushName ' . $pushname . ' on ' . $url); $newtext = "\n[[Special:ArticleAdminPage|DSMW Admin functions]]\n\n==Features==\n\n[[name::PullFeed:" . $pullname . "| ]]\n'''URL of the DSMW PushServer:''' [[pushFeedServer::" . $url . "]]<br>\n'''PushFeed name:''' [[pushFeedName::PushFeed:" . $pushname . "]]\n[[deleted::false| ]]\n\n==Actions==\n\n{{#input:type=ajax|value=PULL|onClick=pushpull('" . $urlServer . "','PullFeed:" . $pullname . "','onpull');}}\n\nThe \"PULL\" action gets the modifications published in the PushFeed of the PushFeedServer above.\n\n== PULL Progress : ==\n<div id=\"state\" ></div><br />\n"; $title = Title::newFromText($pullname, PULLFEED); $article = new Article($title); $article->doEdit($newtext, $summary = ""); $article->doRedirect(); return false; } elseif (isset($_POST['action']) && $_POST['action'] == 'onpull') { if (isset($_POST['name'])) { $name1 = $_POST['name']; wfDebugLog('p2p', '@@@@@@@@@@@@@ pull on '); if (!is_array($name1)) { $name1 = array($name1); } } else { $name1 = ""; } if ($name1 == "") { utils::writeAndFlush('<p><b>No pullfeed selected!</b></p> '); $title = Title::newFromText('Special:ArticleAdminPage'); $article = new Article($title); $article->doEdit('', $summary = ""); $article->doRedirect(); return false; } //$name = $name1[0];//with NS utils::writeAndFlush('<p><b>Start pull</b></p>'); foreach ($name1 as $name) { // for each pullfeed name==> pull utils::writeAndFlush("<span style=\"margin-left:30px;\">begin pull: <A HREF=" . 'http://' . $wgServerName . $wgScriptPath . "/index.php?title={$name}>" . $name . "</a></span> <br/>"); wfDebugLog('p2p', ' -> pull : ' . $name); // $previousCSID = getPreviousPulledCSID($name); // if($previousCSID==false) { // $previousCSID = "none"; // } $previousCSID = getHasPullHead($name); if ($previousCSID == false) { $previousCSID = "none"; } wfDebugLog('p2p', ' -> pullHead : ' . $previousCSID); $relatedPushServer = getPushURL($name); if (is_null($relatedPushServer)) { throw new MWException(__METHOD__ . ': no relatedPushServer url'); } $namePush = getPushName($name); $namePush = str_replace(' ', '_', $namePush); wfDebugLog('p2p', ' -> pushServer : ' . $relatedPushServer); wfDebugLog('p2p', ' -> pushName : ' . $namePush); if (is_null($namePush)) { throw new MWException(__METHOD__ . ': no PushName'); } //split NS and name preg_match("/^(.+?)_*:_*(.*)\$/S", $namePush, $m); $nameWithoutNS = $m[2]; //$url = $relatedPushServer.'/api.php?action=query&meta=changeSet&cspushName='.$nameWithoutNS.'&cschangeSet='.$previousCSID.'&format=xml'; //$url = $relatedPushServer."/api{$wgScriptExtension}?action=query&meta=changeSet&cspushName=".$nameWithoutNS.'&cschangeSet='.$previousCSID.'&format=xml'; wfDebugLog('testlog', ' -> request ChangeSet : ' . $relatedPushServer . '/api.php?action=query&meta=changeSet&cspushName=' . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml'); $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml'); /* test if it is a xml file. If not, the server is not reachable via the url * Then we try to reach it with the .php5 extension */ if (strpos($cs, "<?xml version=\"1.0\"?>") === false) { $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php5?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml'); } if (strpos($cs, "<?xml version=\"1.0\"?>") === false) { $cs = false; } if ($cs === false) { throw new MWException(__METHOD__ . ': Cannot connect to Push Server (ChangeSet API)'); } $cs = trim($cs); $dom = new DOMDocument(); $dom->loadXML($cs); $changeSet = $dom->getElementsByTagName('changeSet'); $CSID = null; $csName = null; foreach ($changeSet as $cs) { if ($cs->hasAttribute("id")) { $CSID = $cs->getAttribute('id'); $csName = $CSID; } } wfDebugLog('p2p', ' -> changeSet found ' . $CSID); while ($CSID != null) { //if(!utils::pageExist($CSID)) { $listPatch = null; $patchs = $dom->getElementsByTagName('patch'); foreach ($patchs as $p) { wfDebugLog('p2p', ' -> patch ' . $p->firstChild->nodeValue); $listPatch[] = $p->firstChild->nodeValue; } // $CSID = substr($CSID,strlen('changeSet:')); utils::createChangeSetPull($CSID, $name, $previousCSID, $listPatch); integrate($CSID, $listPatch, $relatedPushServer, $csName); updatePullFeed($name, $CSID); // } $previousCSID = $CSID; wfDebugLog('p2p', ' -> request ChangeSet : ' . $relatedPushServer . '/api.php?action=query&meta=changeSet&cspushName=' . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml'); $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml'); /* test if it is a xml file. If not, the server is not reachable via the url * Then we try to reach it with the .php5 extension */ if (strpos($cs, "<?xml version=\"1.0\"?>") === false) { $cs = utils::file_get_contents_curl(utils::lcfirst($relatedPushServer) . "/api.php5?action=query&meta=changeSet&cspushName=" . $nameWithoutNS . '&cschangeSet=' . $previousCSID . '&format=xml'); } if (strpos($cs, "<?xml version=\"1.0\"?>") === false) { $cs = false; } if ($cs === false) { throw new MWException(__METHOD__ . ': Cannot connect to Push Server (ChangeSet API)'); } $cs = trim($cs); $dom = new DOMDocument(); $dom->loadXML($cs); $changeSet = $dom->getElementsByTagName('changeSet'); $CSID = null; foreach ($changeSet as $cs) { if ($cs->hasAttribute("id")) { $CSID = $cs->getAttribute('id'); } } wfDebugLog('p2p', ' -> changeSet found ' . $CSID); } if (is_null($csName)) { wfDebugLog('p2p', ' - redirect to Special:ArticleAdminPage'); utils::writeAndFlush("<span style=\"margin-left:60px;\">no new patch</span><br/>"); } else { wfDebugLog('p2p', ' - redirect to ChangeSet:' . $csName); } } //end foreach list pullfeed utils::writeAndFlush('<p><b>End pull</b></p>'); $title = Title::newFromText('Special:ArticleAdminPage'); $article = new Article($title); $article->doRedirect(); return false; } else { return true; } }