示例#1
0
文件: Page.php 项目: jbzdak/wikidot
 public function save($args)
 {
     $db = Database::connection();
     $db->begin();
     // simple argument checking
     if (!isset($args['page'])) {
         throw new Wikidot_Facade_Exception_WrongArguments("Page argument must be passed");
     }
     $pm = new WDPermissionManager();
     $now = new ODate();
     // page (existant or not) name
     $arg_page = WDStringUtils::toUnixName($args['page']);
     // parse the rest (beside page name)
     unset($args['page']);
     $this->parseArgs($args, array("performer", "site"));
     try {
         // parse page name to figure out if it points to an existant page
         $page = $this->_parsePage($this->site, $arg_page);
         $new = false;
         // check permissions to edit the page
         $pm->hasPagePermission('edit', $this->performer, $page->getCategory(), $page);
     } catch (Wikidot_Facade_Exception_WrongArguments $e) {
         if ($this->source === null) {
             $this->source = "";
         }
         if ($this->title === null) {
             $this->title = $arg_page;
         }
         $new = true;
         $category_name = preg_replace('/^([^:]*):.*$/', '\\1', $arg_page);
         if ($category_name == $arg_page) {
             $category_name = '_default';
         }
         $category = $this->_getOrCreateCategory($this->site, $category_name);
         $page = new DB_Page();
         $page->setSiteId($this->site->getSiteId());
         $page->setCategoryId($category->getCategoryId());
         $page->setUnixName($arg_page);
         $page->setDateCreated(new ODate());
         $page->setOwnerUserId($this->performer->getUserId());
         $page->save();
         $compiled = new DB_PageCompiled();
         $compiled->setPageId($page->getPageId());
         $compiled->save();
     }
     // get current revision and metadata
     if (!$new) {
         $cur_rev = $page->getCurrentRevision();
         $cur_meta = $cur_rev->getMetadata();
     }
     // construct new metadata
     if ($new) {
         $new_meta = new DB_PageMetadata();
         $new_meta->setUnixName($arg_page);
         $new_meta->setOwnerUserId($this->performer->getUserId());
     } else {
         $new_meta = clone $cur_meta;
         $new_meta->setNew(true);
         $new_meta->setMetadataId(null);
     }
     // construct new revision
     $new_rev = new DB_PageRevision();
     $new_rev->setSiteId($this->site->getSiteId());
     $new_rev->setPageId($page->getPageId());
     $new_rev->setUserId($this->performer->getUserId());
     $new_rev->setDateLastEdited($now);
     if ($new) {
         $new_rev->setRevisionNumber(0);
     } else {
         $new_rev->setRevisionNumber($cur_rev->getRevisionNumber() + 1);
     }
     $src_changed = false;
     $title_changed = false;
     $parent_changed = false;
     $tags_changed = false;
     // handle source change
     if ($new || $this->source !== null && $page->getSource() != $this->source) {
         $new_src = new DB_PageSource();
         $new_src->setText($this->source);
         $new_src->save();
         $new_rev->setSourceId($new_src->getSourceId());
         $src_changed = true;
     } else {
         $new_rev->setSourceId($cur_rev->getSourceId());
         $new_rev->setSinceFullSource($cur_rev->getSinceFullSource());
         $new_rev->setDiffSource($cur_rev->getDiffSource());
     }
     // handle tags change
     if ($this->tags) {
         $new_tags = $this->tags;
         $cur_tags = $page->getTagsAsArray();
         sort($cur_tags);
         sort($new_tags);
         if ($cur_tags != $new_tags) {
             $tags_changed = true;
             $tags_deleted = array();
             $tags_added = array();
             foreach ($cur_tags as $tag) {
                 if (!in_array($tag, $new_tags)) {
                     $c = new Criteria();
                     $c->add('page_id', $page->getPageId());
                     $c->add('tag', $tag);
                     if ($t = DB_PageTagPeer::instance()->selectOne($c)) {
                         $t->delete();
                         $tags_deleted[] = $tag;
                     }
                 }
             }
             foreach ($new_tags as $tag) {
                 if (!in_array($tag, $cur_tags)) {
                     $t = new DB_PageTag();
                     $t->getPageId($page->getPageId());
                     $t->setSiteId($this->site->getSiteId());
                     $t->setTag($tag);
                     $t->save();
                     $tags_added[] = $tag;
                 }
             }
         }
     }
     // handle metadata: title change
     if ($new || $this->title !== null && $cur_meta->getTitle() != $this->title) {
         $new_meta->setTitle($this->title);
         $page->setTitle($this->title);
         $title_changed = true;
     }
     // handle metadata: parent page change
     if ($this->parent_page) {
         if (!$cur_meta->getParentPageId() || $cur_meta->getParentPageId() != $this->parent_page->getPageId()) {
             $new_meta->setParentPageId($this->parent_page->getPageId());
             $parent_changed = true;
         }
     }
     if ($this->clear_parent_page && $page->getParentPageId()) {
         $new_meta->setParentPageId(null);
         $parent_changed = true;
     }
     $meta_changed = $title_changed || $parent_changed;
     // decide whether to use previous metadata or create a new object
     if ($meta_changed) {
         $new_meta->save();
         $new_rev->setMetadataId($new_meta->getMetadataId());
     } else {
         $new_rev->setMetadataId($cur_meta->getMetadataId());
     }
     // set flag on revision
     if ($new) {
         $new_rev->setFlagNew(true);
     } else {
         if ($src_changed) {
             $new_rev->setFlagText(true);
         }
         if ($title_changed) {
             $new_rev->setFlagTitle(true);
         }
         if ($parent_changed) {
             $new_rev->setFlagMeta(true);
         }
     }
     if ($src_changed || $meta_changed || $tags_changed) {
         $new_rev->save();
         $page->setSourceId($new_rev->getSourceId());
         $page->setDateLastEdited($now);
         $page->setMetadataId($new_rev->getMetadataId());
         $page->setRevisionNumber($new_rev->getRevisionNumber());
         $page->setRevisionId($new_rev->getRevisionId());
         $page->save();
         $db->commit();
         $GLOBALS['site'] = $this->site;
         $outdater = new Outdater();
         if ($src_changed) {
             $outdater->pageEvent("source_changed", $page);
         }
         if ($title_changed) {
             $outdater->pageEvent("title_changed", $page);
         }
         if ($parent_changed) {
             $outdater->pageEvent("parent_changed", $page);
         }
         if ($tags_changed) {
             $outdater->pageEvent("tag_changed", $page);
         }
     } else {
         /* This place is reached when API client tries to set source or
          * title or parent page or tags that are already set (in the DB)
          * to the same value.
          * 
          * Let's suppose doing nothing is the desired behavior in this case
          * 
          * Other possible way to react can be raising an exception.
          * But it should be different from Wikidot_Facade_Exception_WrongArguments
          * because this one implies client error (and client does not need
          * to know the exact database state).
          */
     }
 }
示例#2
0
 public function saveTagsEvent($runData)
 {
     // do not create any new revision... :-(
     // or create???
     $user = $runData->getUser();
     $pl = $runData->getParameterList();
     $tags = strtolower(trim($pl->getParameterValue("tags")));
     $pageId = $pl->getParameterValue("pageId");
     $site = $runData->getTemp("site");
     $page = DB_PagePeer::instance()->selectByPrimaryKey($pageId);
     if ($page == null || $page->getSiteId() != $site->getSiteId()) {
         throw new ProcessException(_("Error getting page information."), "no_page");
     }
     $category = $page->getCategory();
     WDPermissionManager::instance()->hasPagePermission('edit', $user, $category, $page);
     if (strlen8($tags) > 256) {
         throw new ProcessException(_('"Tags" field too long.'), "form_error");
     }
     $db = Database::connection();
     $db->begin();
     $c = new Criteria();
     $c->add("page_id", $pageId);
     $dbTags = DB_PageTagPeer::instance()->select($c);
     $tags = preg_split("/[ ,]+/", $tags);
     $tagstmp = array();
     foreach ($tags as $tag) {
         $tagstmp[] = substr($tag, 0, 64);
     }
     $tags = $tagstmp;
     $tags = array_unique($tags);
     foreach ($dbTags as $dbTag) {
         if (in_array($dbTag->getTag(), $tags)) {
             unset($tags[array_search($dbTag->getTag(), $tags)]);
         } else {
             DB_PageTagPeer::instance()->deleteByPrimaryKey($dbTag->getTagId());
         }
     }
     // insert all the other
     foreach ($tags as $tag) {
         if (trim($tag) != '') {
             $dbTag = new DB_PageTag();
             $dbTag->setSiteId($site->getSiteId());
             $dbTag->setPageId($pageId);
             $dbTag->setTag($tag);
             $dbTag->save();
         }
     }
     $od = new Outdater();
     $od->pageEvent("tag_change", $page);
     $db->commit();
     if (GlobalProperties::$UI_SLEEP) {
         sleep(1);
     }
 }
示例#3
0
 public function deleteSite($site)
 {
     if (!$site) {
         return;
     }
     // get all pages and delete each one
     $c = new Criteria();
     $c->add("site_id", $site->getSiteId());
     $pages = DB_PagePeer::instance()->select($c);
     foreach ($pages as $page) {
         $this->deletePage($page);
     }
     // delete forum? no. will be autodeleted based on the database constrains.
     // need to delete post revisions
     $db = Database::connection();
     $q = "DELETE FROM forum_post_revision WHERE forum_post_id IN (SELECT post_id FROM forum_post WHERE site_id= {$site->getSiteId()}";
     $db->query($q);
     //delete the site itself
     $outdater = new Outdater();
     $outdater->siteEvent('delete', $site);
     DB_SitePeer::instance()->deleteByPrimaryKey($site->getSiteId());
 }
示例#4
0
 public function restoreSite($nsite, $dump)
 {
     $superSettings = $dump['superSettings'];
     $settings = $dump['settings'];
     $superSettings->setNew(true);
     $superSettings->setSiteId($nsite->getSiteId());
     $superSettings->save();
     // site_settings
     $settings->setNew(true);
     $settings->setSiteId($nsite->getSiteId());
     $settings->save();
     $forumSettings = $dump['forumSettings'];
     $forumSettings->setNew(true);
     $forumSettings->setSiteId($nsite->getSiteId());
     $forumSettings->save();
     // add user as admin
     $owner = $this->owner;
     if ($owner) {
         $admin = new DB_Admin();
         $admin->setSiteId($nsite->getSiteId());
         $admin->setUserId($owner->getUserId());
         $admin->setFounder(true);
         // will be nonremovable ;-)
         $admin->save();
         $member = new DB_Member();
         $member->setSiteId($nsite->getSiteId());
         $member->setUserId($owner->getUserId());
         $member->setDateJoined(new ODate());
         $member->save();
     }
     $categories = $dump['categories'];
     foreach ($categories as $category) {
         $cat = clone $category;
         $cat->setNew(true);
         $cat->setCategoryId(null);
         $cat->setSiteId($nsite->getSiteId());
         $cat->save();
         // get pages
         $pages = $dump['pages'][$category->getCategoryId()];
         foreach ($pages as $page) {
             $newUnixName = $page->getUnixName();
             $now = new ODate();
             // create new page object based on the existing page
             $nsource = new DB_PageSource();
             $nsource->setText($page->getTemp("source"));
             $nsource->save();
             $meta = $page->getTemp("meta");
             $nmeta = new DB_PageMetadata();
             $nmeta->setTitle($meta->getTitle());
             $nmeta->setUnixName($newUnixName);
             if ($owner) {
                 $nmeta->setOwnerUserId($owner->getUserId());
             } else {
                 $nmeta->setOwnerUserId($meta->getOwnerUserId());
             }
             $nmeta->save();
             $nrev = new DB_PageRevision();
             $nrev->setSiteId($nsite->getSiteId());
             $nrev->setSourceId($nsource->getSourceId());
             $nrev->setMetadataId($nmeta->getMetadataId());
             $nrev->setFlagNew(true);
             $nrev->setDateLastEdited($now);
             $nrev->setUserId($owner->getUserId());
             $nrev->obtainPK();
             $npage = new DB_Page();
             $npage->setSiteId($nsite->getSiteId());
             $npage->setCategoryId($cat->getCategoryId());
             $npage->setRevisionId($nrev->getRevisionId());
             $npage->setSourceId($nsource->getSourceId());
             $npage->setMetadataId($nmeta->getMetadataId());
             $npage->setTitle($page->getTitle());
             $npage->setUnixName($newUnixName);
             $npage->setDateLastEdited($now);
             $npage->setLastEditUserId($owner->getUserId());
             $npage->setOwnerUserId($owner->getUserId());
             $npage->save();
             $nrev->setPageId($npage->getPageId());
             $nrev->save();
             $ncomp = new DB_PageCompiled();
             $ncomp->setPageId($npage->getPageId());
             $ncomp->setDateCompiled($now);
             $ncomp->save();
         }
     }
     $od = new Outdater();
     $od->recompileWholeSite($nsite);
 }
示例#5
0
    $npage->setDateLastEdited($now);
    $npage->setDateCreated($now);
    $npage->setLastEditUserId(1);
    $npage->setOwnerUserId(1);
    $npage->save();
    $nrev->setPageId($npage->getPageId());
    $nrev->save();
    $ncomp = new DB_PageCompiled();
    $ncomp->setPageId($npage->getPageId());
    $ncomp->setDateCompiled($now);
    $ncomp->save();
}
Ozone::init();
$db = Database::connection();
$db->begin();
$od = new Outdater();
$od->recompileWholeSite(DB_SitePeer::instance()->selectByPrimaryKey(1));
$db->commit();
$db->begin();
$c = new Criteria();
$c->add("name", "auth");
$c->add("site_id", 1);
if (DB_CategoryPeer::instance()->selectOne($c)) {
    die("The auth category already exists!\n\n");
}
$ncat = DB_CategoryPeer::instance()->selectByPrimaryKey(1);
$ncat->setNew(true);
$ncat->setCategoryId(null);
$ncat->setName("auth");
$ncat->save();
addAPage($ncat, "auth:login", "[[module LoginModule]]", "Log in");
示例#6
0
 public function finalizeEvent($runData, $skipEvcode = false)
 {
     // get the form data
     $pl = $runData->getParameterList();
     if (!$skipEvcode) {
         $evcode = $pl->getParameterValue("evcode", "AMODULE");
         //check if the email vercode is correct
         $evcode2 = $runData->sessionGet('evcode');
         if ($evcode !== $evcode2) {
             throw new ProcessException(_("Invalid email verification code."), "invalid_code");
         }
     }
     $data = $runData->sessionGet("ca_data");
     $name = $data['name'];
     $email = $data['email'];
     $password = $data['password'];
     $lang = $data['language'];
     $db = Database::connection();
     $db->begin();
     // check again if email and nick are not duplicate!
     $c = new Criteria();
     $c->add("lower(email)", strtolower($email));
     $u = DB_OzoneUserPeer::instance()->selectOne($c);
     if ($u != null) {
         $runData->resetSession();
         throw new ProcessException(_("A user with this email already exists. Must have been created meanwhile... " . "Unfortunately you have to repeat the whole procedure. :-("), "user_exists");
     }
     $unixified = WDStringUtils::toUnixName($name);
     $c = new Criteria();
     $c->add("unix_name", $unixified);
     $u = DB_OzoneUserPeer::instance()->selectOne($c);
     if ($u != null) {
         $runData->resetSession();
         throw new ProcessException(_("A user with this name (or very similar) already exists. Must have been created meanwhile... " . "Unfortunately you have to repeat the whole procedure. :-("), "user_exists");
     }
     // add new user!!!
     $nuser = new DB_OzoneUser();
     /* email as the username!!! */
     $nuser->setName($email);
     $nuser->setEmail($email);
     $nuser->setPassword(md5($password));
     $nuser->setNickName($name);
     $nuser->setUnixName($unixified);
     $nuser->setLanguage($lang);
     $date = new ODate();
     $nuser->setRegisteredDate($date);
     $nuser->setLastLogin($date);
     $nuser->save();
     // profile
     $profile = new DB_Profile();
     $profile->setUserId($nuser->getUserId());
     $profile->save();
     $us = new DB_UserSettings();
     $us->setUserId($nuser->getUserId());
     $us->save();
     // profile page
     $c = new Criteria();
     $c->add("unix_name", "profiles");
     $nsite = DB_SitePeer::instance()->selectOne($c);
     $ncategory = DB_CategoryPeer::instance()->selectByName('profile', $nsite->getSiteId());
     $dup = new Duplicator();
     $dup->setOwner($nuser);
     $dup->duplicatePage(DB_PagePeer::instance()->selectByName($nsite->getSiteId(), 'template:profile'), $nsite, $ncategory, 'profile:' . $nuser->getUnixName());
     $page = DB_PagePeer::instance()->selectByName($nsite->getSiteId(), 'profile:' . $nuser->getUnixName());
     $ou = new Outdater();
     $ou->pageEvent('new_page', $page);
     $db->commit();
     /* Handle originalUrl. */
     $originalUrl = $runData->sessionGet('loginOriginalUrl');
     if ($originalUrl) {
         $runData->ajaxResponseAdd('originalUrl', $originalUrl);
         if ($runData->sessionGet('loginOriginalUrlForce')) {
             $runData->ajaxResponseAdd('originalUrlForce', true);
         }
     }
     // reset session etc.
     $runData->resetSession();
     $runData->getSession()->setUserId($nuser->getUserId());
     setcookie("welcome", $nuser->getUserId(), time() + 10000000, "/", GlobalProperties::$SESSION_COOKIE_DOMAIN);
     setcookie(GlobalProperties::$SESSION_COOKIE_NAME_IE, $runData->getSessionId(), null, "/");
 }
示例#7
0
 public function saveOpenIDEvent($runData)
 {
     $pl = $runData->getParameterList();
     $site = $runData->getTemp("site");
     $settings = $site->getSettings();
     $openIdEnabled = $pl->getParameterValue("enableOpenID") == "true";
     $json = new JSONService(SERVICES_JSON_LOOSE_TYPE);
     $vals = $json->decode($pl->getParameterValue("vals"));
     $affectedPages = array();
     $outdater = new Outdater();
     $db = Database::connection();
     $db->begin();
     $settings->setOpenidEnabled($openIdEnabled);
     $settings->save();
     // get the already assigned openids
     $c = new Criteria();
     $c->add("site_id", $site->getSiteId());
     $oldOpenIDs = DB_OpenidEntryPeer::instance()->select($c);
     $rootProcessed = false;
     $oldOpenIDs2 = $oldOpenIDs;
     foreach ($vals as $val) {
         $pageId = null;
         $page = null;
         if ($val['page']) {
             // not a root page
             $page = DB_PagePeer::instance()->selectByName($site->getSiteId(), $val['page']);
             if (!$page) {
                 throw new ProcessException(sprintf(_("The page %s can not be found"), $vals['page']));
             }
             $pageId = $page->getPageId();
         } elseif (!$rootProcessed) {
             $rootProcessed = true;
         } elseif ($rootProcessed) {
             continue;
         }
         // validate the data
         $url = $val['identityUrl'];
         $serverUrl = $val['serverUrl'];
         if (!$url) {
             continue;
         }
         if (!preg_match(';^[a-z0-9\\-\\./#]+$;i', $url)) {
             throw new ProcessException(sprintf("Identity URL %s is not valid.", $url));
         }
         if (!preg_match(';^https?://[a-z0-9\\-\\./#]+$;i', $serverUrl)) {
             throw new ProcessException(sprintf("Server URL %s is not valid.", $serverUrl));
         }
         // check if the entry already exists
         $entry = null;
         foreach ($oldOpenIDs as $oo) {
             if ($oo->getPageId() === $pageId) {
                 $entry = $oo;
                 foreach ($oldOpenIDs2 as $oo2key => &$oo2) {
                     if ($oo2->getPageId() === $pageId) {
                         $ookey = $oo2key;
                         break;
                     }
                 }
                 unset($oldOpenIDs2[$ookey]);
                 break;
             }
         }
         if (!$entry) {
             $entry = new DB_OpenidEntry();
             $entry->setSiteId($site->getSiteId());
             $entry->setPageId($pageId);
         }
         $entry->setUrl('http://' . $url);
         $entry->setServerUrl($serverUrl);
         // save the entry
         $entry->save();
         // outdate caches
         if ($page) {
             $outdater->outdatePageCache($page);
         } else {
             $outdater->outdatePageCache($site->getDefaultPage());
         }
     }
     // remove unused entries
     foreach ($oldOpenIDs2 as $oo) {
         DB_OpenidEntryPeer::instance()->deleteByPrimaryKey($oo->getOpenidId());
         // outdate caches
         $pageId = $oo->getPageId();
         if ($pageId) {
             $page = DB_PagePeer::instance()->selectByPrimaryKey($pageId);
         } else {
             $page = $site->getDefaultPage();
         }
         $outdater->outdatePageCache($page);
     }
     $db->commit();
 }
示例#8
0
 /**
  * Changes the "unix name" of the site and effectively its URL address.
  *
  * @param unknown_type $runData
  */
 public function renameSiteEvent($runData)
 {
     $pl = $runData->getParameterList();
     $site = $runData->getTemp("site");
     $user = $runData->getUser();
     $unixName = trim($pl->getParameterValue('unixName'));
     $c = new Criteria();
     $c->add("user_id", $user->getUserId());
     $c->add("site_id", $site->getSiteId());
     $c->add("founder", true);
     $rel = DB_AdminPeer::instance()->selectOne($c);
     if (!$rel) {
         throw new ProcessException(_("Sorry, you have no permissions to change URL of this site."));
     }
     $db = Database::connection();
     $db->begin();
     $oldUnixName = $site->getUnixName();
     // validate unix name
     $errors = array();
     if ($unixName == $site->getUnixName()) {
         $errors['unixname'] = _('The new and current addresses are the same.');
     } elseif ($unixName === null || strlen($unixName) < 3 || strlen(WDStringUtils::toUnixName($unixName)) < 3) {
         $errors['unixname'] = _("Web address must be present and should be at least 3 characters long.");
     } elseif (strlen($unixName) > 30) {
         $errors['unixname'] = _("Web address name should not be longer than 30 characters.");
     } elseif (preg_match("/^[a-z0-9\\-]+\$/", $unixName) == 0) {
         $errors['unixname'] = _('Only lowercase alphanumeric and "-" (dash) characters allowed in the web address.');
     } elseif (preg_match("/\\-\\-/", $unixName) !== 0) {
         $errors['unixname'] = _('Only lowercase alphanumeric and "-" (dash) characters allowed in the web address. Double-dash (--) is not allowed.');
     } else {
         $unixName = WDStringUtils::toUnixName($unixName);
         if (!$runData->getUser()->getSuperAdmin()) {
             //	handle forbidden names
             $forbiddenUnixNames = explode("\n", file_get_contents(WIKIDOT_ROOT . '/conf/forbidden_site_names.conf'));
             foreach ($forbiddenUnixNames as $f) {
                 if (preg_match($f, $unixName) > 0) {
                     $errors['unixname'] = _('For some reason this web address is not allowed or is reserved for future use.');
                 }
             }
         }
         // check if the domain is not taken.
         $c = new Criteria();
         $c->add("unix_name", $unixName);
         $ss = DB_SitePeer::instance()->selectOne($c);
         if ($ss) {
             $errors['unixname'] = _('Sorry, this web address is already used by another site.');
         }
     }
     if (isset($errors['unixname'])) {
         throw new ProcessException($errors['unixname']);
     }
     // remove some data.
     $c = new Criteria();
     $c->add('site_id', $site->getSiteId());
     // now clear cache!
     $keys = array();
     $keys[] = 'site..' . $site->getUnixName();
     $keys[] = 'site_cd..' . $site->getCustomDomain();
     $mc = OZONE::$memcache;
     foreach ($keys as $k) {
         $mc->delete($k);
     }
     $outdater = new Outdater();
     $outdater->siteEvent('delete', $site);
     $outdater->siteEvent('sitewide_change', $site);
     // change site name!!!
     $site->setUnixName($unixName);
     $site->save();
     // remove custom domain link
     // rename the files
     @rename(WIKIDOT_ROOT . '/web/files--sites/' . $oldUnixName, WIKIDOT_ROOT . '/web/files--sites/' . $site->getUnixName());
     // delete custom domain link
     if ($site->getCustomDomain()) {
         @unlink(WIKIDOT_ROOT . '/web/custom--domains/' . $site->getCustomDomain());
         symlink(WIKIDOT_ROOT . '/web/files--sites/' . $site->getUnixName(), WIKIDOT_ROOT . '/web/custom--domains/' . $site->getCustomDomain());
     }
     $db->commit();
     $runData->ajaxResponseAdd("unixName", $site->getUnixName());
 }
示例#9
0
 public function cancelVoteEvent($runData)
 {
     $pl = $runData->getParameterList();
     $site = $runData->getTemp("site");
     $pageId = $pl->getParameterValue("pageId");
     $user = $runData->getUser();
     $page = DB_PagePeer::instance()->selectByPrimaryKey($pageId);
     if (!$pageId || $page == null || $page->getSiteId() != $runData->getTemp("site")->getSiteId()) {
         throw new ProcessException(_("Error getting page information."), "no_page");
     }
     // check if allowed
     if (!$this->canRatePage($user, $page)) {
         // prepare the message
         throw new ProcessException($this->message);
     }
     $db = Database::connection();
     $db->begin();
     $c = new Criteria();
     $c->add("page_id", $page->getPageId());
     $c->add("user_id", $user->getUserId());
     $v = DB_PageRateVotePeer::instance()->selectOne($c);
     if (!$v) {
         $runData->ajaxResponseAdd("points", 0);
         return;
     }
     DB_PageRateVotePeer::instance()->delete($c);
     $rpoints = 0 - $v->getRate();
     // update page points
     $q = "UPDATE page SET rate=COALESCE((" . "SELECT sum(rate) FROM page_rate_vote WHERE page_id = '" . $page->getPageId() . "'),0) " . "WHERE page_id='" . $page->getPageId() . "'";
     $db->query($q);
     $outdater = new Outdater();
     $outdater->pageEvent("page_vote", $page);
     $db->commit();
     $runData->ajaxResponseAdd("points", $rpoints);
 }
示例#10
0
 public function savePerPageDiscussionEvent($runData)
 {
     $pl = $runData->getParameterList();
     $site = $runData->getTemp("site");
     $siteId = $site->getSiteId();
     $json = new JSONService(SERVICES_JSON_LOOSE_TYPE);
     $cats0 = $json->decode($pl->getParameterValue("categories"));
     $db = Database::connection();
     $db->begin();
     $outdater = new Outdater();
     foreach ($cats0 as $category) {
         $categoryId = $category['category_id'];
         $c = new Criteria();
         $c->add("category_id", $categoryId);
         $c->add("site_id", $siteId);
         // for sure ;-)
         $dCategory = DB_CategoryPeer::instance()->selectOne($c);
         // now compare
         $changed = false;
         if ($category['per_page_discussion'] !== $dCategory->getPerPageDiscussion()) {
             $dCategory->setPerPageDiscussion($category['per_page_discussion']);
             $changed = true;
         }
         if ($changed) {
             $dCategory->save();
             // outdate category too
             $outdater->categoryEvent("category_save", $dCategory);
         }
     }
     $outdater->forumEvent("outdate_forum");
     $db->commit();
     if (GlobalProperties::$UI_SLEEP) {
         sleep(1);
     }
 }
示例#11
0
 public function changeScreenNameEvent($runData)
 {
     $user = $runData->getUser();
     $userId = $user->getUserId();
     $profile = $user->getProfile();
     if ($profile->getChangeScreenNameCount() >= 2) {
         throw new ProcessException('Your are allowed to change your screen name only 2 times.');
     }
     $pl = $runData->getParameterList();
     $name = trim($pl->getParameterValue("screenName"));
     if ($name == $user->getNickName()) {
         throw new ProcessException("Your new and current screen names are the same.");
     }
     $db = Database::connection();
     $db->begin();
     $unixified = WDStringUtils::toUnixName($name);
     if (strlen($name) < 2) {
         throw new ProcessException(_("You really should provide the screen name you want to use."));
     }
     if (strlen8($name) > 20) {
         throw new ProcessException(_("Your screen name should not be longer than 20 characters."));
     }
     if (preg_match('/^[ _a-zA-Z0-9-\\!#\\$%\\^\\*\\(\\)]+$/', $name) == 0) {
         throw new ProcessException(_("Only alphanumeric characters (+a few special) can be used in the screen name."));
     }
     if (strlen($unixified) < 2) {
         throw new ProcessException(_("It seems there are too less alphanumeric characters in your screen name"));
     }
     //handle forbidden names
     $unixName = WDStringUtils::toUnixName($name);
     $forbiddenUnixNames = explode("\n", file_get_contents(WIKIDOT_ROOT . '/conf/forbidden_user_names.conf'));
     foreach ($forbiddenUnixNames as $f) {
         if (preg_match($f, $unixName) > 0) {
             throw new ProcessException(_('For some reason this name is not allowed or is reserved for future use.'));
         }
     }
     // check if user does not exist
     $c = new Criteria();
     $c->add("unix_name", $unixified);
     $u = DB_OzoneUserPeer::instance()->selectOne($c);
     if ($u != null) {
         throw new ProcessException(_("A user with this screen name (or very similar) already exists."));
     }
     // rename the profile page
     $c = new Criteria();
     $c->add("unix_name", "profiles");
     $nsite = DB_SitePeer::instance()->selectOne($c);
     $pageName = 'profile:' . $user->getUnixName();
     $c = new Criteria();
     $c->add('site_id', $nsite->getSiteId());
     $c->add('unix_name', $pageName);
     $page = DB_PagePeer::instance()->selectOne($c);
     if (!$page) {
         throw new ProcessException('Internal error');
     }
     $metadata = $page->getMetadata();
     $metadata->setUnixName('profile:' . $unixified);
     $page->setUnixName('profile:' . $unixified);
     $metadata->save();
     $page->save();
     // outdate page cache
     $outdater = new Outdater();
     $outdater->pageEvent("rename", $page, $pageName);
     // now, try to apply new name!!!
     $user->setNickName($name);
     $user->setUnixName($unixified);
     $user->save();
     $profile->setChangeScreenNameCount($profile->getChangeScreenNameCount() + 1);
     $profile->save();
     $db->commit();
 }
示例#12
0
 public function deletePostEvent($runData)
 {
     $pl = $runData->getParameterList();
     $site = $runData->getTemp("site");
     $postId = $pl->getParameterValue("postId");
     if ($postId == null || !is_numeric($postId)) {
         throw new ProcessException(_("No such post."), "no_post");
     }
     $db = Database::connection();
     $db->begin();
     $post = DB_ForumPostPeer::instance()->selectByPrimaryKey($postId);
     if ($post == null || $post->getSiteId() != $site->getSiteId()) {
         throw new ProcessException(_("No such post."), "no_post");
     }
     $thread = $post->getForumThread();
     $category = $thread->getForumCategory();
     try {
         WDPermissionManager::instance()->hasForumPermission('moderate_forum', $runData->getUser(), $category);
     } catch (Exception $e) {
         throw new WDPermissionException(_("Sorry, you are not allowed to delete posts. Only site administrators and moderators are the ones who can."));
     }
     $c = new Criteria();
     $c->add("parent_id", $postId);
     $toDelete = array();
     $chposts = DB_ForumPostPeer::instance()->select($c);
     while ($chposts && count($chposts) > 0) {
         $toDelete = array_merge($toDelete, $chposts);
         $c = new Criteria();
         foreach ($chposts as $f) {
             $c->addOr("parent_id", $f->getPostId());
         }
         $chposts = DB_ForumPostPeer::instance()->select($c);
     }
     DB_ForumPostPeer::instance()->deleteByPrimaryKey($post->getPostId());
     foreach ($toDelete as $f) {
         DB_ForumPostPeer::instance()->deleteByPrimaryKey($f->getPostId());
     }
     // now recalculate a few things...
     $thread->calculateNumberPosts();
     $thread->findLastPost();
     $thread->save();
     $category->calculateNumberPosts();
     $category->findLastPost();
     $category->save();
     // outdate
     $o = new Outdater();
     $o->forumEvent("thread_save", $thread);
     // index thread
     Indexer::instance()->indexThread($thread);
     EventLogger::instance()->logPostDelete($thread, $post->getTitle());
     $db->commit();
     if (GlobalProperties::$UI_SLEEP) {
         sleep(1);
     }
 }
示例#13
0
 private function recompileInclusionDeps($page)
 {
     // get deps
     $site = $GLOBALS['site'];
     $c = new Criteria();
     $c->add("site_id", $site->getSiteId());
     if (is_string($page)) {
         $c->add("included_page_name", $page);
     } else {
         $c2 = new Criteria();
         $c2->add("included_page_id", $page->getPageId());
         $c2->addOr("included_page_name", $page->getUnixName());
         $c->addCriteriaAnd($c2);
     }
     $dbinclusions = DB_PageInclusionPeer::instance()->select($c);
     foreach ($dbinclusions as $inc) {
         $page = DB_PagePeer::instance()->selectByPrimaryKey($inc->getIncludingPageId());
         // triger source update (recompile)
         $outdater = new Outdater($this->recurrenceLevel);
         $outdater->pageEvent("source_changed", $page);
     }
 }
示例#14
0
 public function deleteFileEvent($runData)
 {
     $pl = $runData->getParameterList();
     $fileId = $pl->getParameterValue("file_id");
     $destinationPageName = $pl->getParameterValue("destination_page_name");
     $site = $runData->getTemp("site");
     $db = Database::connection();
     $db->begin();
     $file = DB_FilePeer::instance()->selectByPrimaryKey($fileId);
     if ($file == null || $file->getSiteId() != $site->getSiteId()) {
         throw new ProcessException("File does not exist.", "no_file");
     }
     $page = DB_PagePeer::instance()->selectByPrimaryKey($file->getPageId());
     if ($page == null) {
         throw new ProcessException(_("Page does not exist."), "no_page");
     }
     $category = $page->getCategory();
     // now check for permissions!!!
     $user = $runData->getUser();
     WDPermissionManager::instance()->hasPagePermission('delete_file', $user, $category, $page);
     // remove file! and create another revision too...
     @unlink($file->getFilePath());
     // delete resized images if exist
     if ($file->getHasResized()) {
         $cmd = "rm -r " . escapeshellarg($file->getResizedDir());
         exec($cmd);
     }
     DB_FilePeer::instance()->deleteByPrimaryKey($file->getFileId());
     // create a new revision
     $revision = $page->getCurrentRevision();
     $revision->setNew(true);
     $revision->setRevisionId(null);
     $revision->resetFlags();
     $revision->setFlagFile(true);
     $revision->setRevisionNumber($revision->getRevisionNumber() + 1);
     $now = new ODate();
     $revision->setDateLastEdited($now);
     $userId = $runData->getUserId();
     if ($userId == null) {
         $userString = $runData->createIpString();
     }
     if ($userId) {
         $revision->setUserId($userId);
         $page->setLastEditUserId($userId);
     } else {
         $revision->setUserId(0);
         $page->setLastEditUserId(0);
         $revision->setUserString($userString);
         $page->setLastEditUserString($userString);
     }
     $revision->setComments('File "' . $file->getFilename() . '" deleted.');
     $revision->save();
     $page->setRevisionId($revision->getRevisionId());
     $page->setDateLastEdited($now);
     $page->setRevisionNumber($revision->getRevisionNumber());
     $page->save();
     $od = new Outdater();
     $od->pageEvent('file_change', $page);
     $db->commit();
 }