Beispiel #1
0
 /**
  * Method to cleanup the Cron database from old entries.
  */
 public static function _CleanupDatabase()
 {
     $date = new \Core\Date\DateTime();
     $date->modify('-2 hours');
     $hours = $date->format('U');
     $date->modify('-1 day');
     $day = $date->format('U');
     $date->modify('-1 week');
     $week = $date->format('U');
     $date->modify('-3 weeks');
     $month = $date->format('U');
     $date->modify('-5 months');
     $half = $date->format('U');
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 1-minute')->where('created <= ' . $hours)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 5-minute')->where('created <= ' . $hours)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 15-minute')->where('created <= ' . $hours)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 30-minute')->where('created <= ' . $hours)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = hourly')->where('created <= ' . $week)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 2-hour')->where('created <= ' . $week)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 3-hour')->where('created <= ' . $week)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 6-hour')->where('created <= ' . $week)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = 12-hour')->where('created <= ' . $week)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = daily')->where('created <= ' . $week)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = weekly')->where('created <= ' . $month)->execute();
     \Core\Datamodel\Dataset::Init()->delete()->table('cron_log')->where('cron = monthly')->where('created <= ' . $half)->execute();
     return true;
 }
	/**
	 * Test that the Execute method properly handles a generic Dataset object.
	 */
	public function testExecute(){
		$ds = \Core\Datamodel\Dataset::Init()
			->select('*')
			->table('component');

		$this->dmi->execute($ds);

		$this->assertGreaterThan(0, sizeof($ds->num_rows));
	}
 public function index()
 {
     $request = $this->getPageRequest();
     $view = $this->getView();
     $isAdmin = \Core\user()->checkAccess('g:admin');
     $serverid = isset($_SERVER['HTTP_X_CORE_SERVER_ID']) ? $_SERVER['HTTP_X_CORE_SERVER_ID'] : null;
     // If the server ID is set, it should be a 32-digit character.
     // Anything else and omit.
     if (strlen($serverid) != 32) {
         $serverid = null;
     } elseif (!preg_match('/^[A-Z0-9]*$/', $serverid)) {
         // Invalid string.
         $serverid = null;
     }
     $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
     if (strpos($ua, '(http://corepl.us)') !== false) {
         /** @var string $uav ex: "Core Plus 1.2.3" */
         $uav = str_replace(' (http://corepl.us)', '', $ua);
         /** @var string $version Just the version, ex: "1.2.3" */
         $version = str_replace('Core Plus ', '', $uav);
         // The set of logic to compare the current version of Core against the version connecting.
         // This is used primarily to set a class name onto the graphs so that they can be coloured specifically.
         $v = Core::VersionSplit($version);
         // These two values are used in the historical map, (as revision may be a bit useless at this scale).
         $briefVersion = $v['major'] . '.' . $v['minor'];
     } elseif ($request->getParameter('packager')) {
         $briefVersion = $request->getParameter('packager');
     } else {
         $briefVersion = null;
     }
     // Record this key as connected.
     if ($serverid) {
         $licmod = PackageRepositoryLicenseModel::Construct($serverid);
         $licmod->set('datetime_last_checkin', Core\Date\DateTime::NowGMT());
         $licmod->set('ip_last_checkin', REMOTE_IP);
         $licmod->set('referrer_last_checkin', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
         $licmod->set('useragent_last_checkin', isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '');
         $licmod->save();
     }
     if ($request->ctype == 'application/xml') {
         // This is a repo.xml request, usually for debugging purposes, (as the app requests gz compressed versions).
         $xml = PackageRepositoryPackageModel::GetAsRepoXML($serverid, $briefVersion);
         $view->mode = View::MODE_NOOUTPUT;
         $view->contenttype = 'application/xml';
         $view->render();
         echo $xml->asMinifiedXML();
         return;
     } elseif ($request->ext == 'xml.gz') {
         // This is a normal from-client request; a compressed repo.xml structure.
         $xml = PackageRepositoryPackageModel::GetAsRepoXML($serverid, $briefVersion);
         $view->mode = View::MODE_NOOUTPUT;
         $view->contenttype = 'application/gzip';
         $view->render();
         $c = $xml->asMinifiedXML();
         echo gzencode($c);
         return;
     } else {
         // This is a browse request.
         $packages = [];
         $where = [];
         if ($briefVersion) {
             $where[] = 'packager LIKE ' . $briefVersion . '%';
         }
         $allPackages = PackageRepositoryPackageModel::Find($where);
         foreach ($allPackages as $pkg) {
             /** @var PackageRepositoryPackageModel $pkg */
             $pkgKey = $pkg->get('type') . '-' . $pkg->get('key');
             $pkgPackager = $pkg->get('packager');
             $pkgVersion = $pkg->get('version');
             if (!isset($packages[$pkgKey])) {
                 $packages[$pkgKey] = ['package' => $pkg, 'check' => $pkgVersion, 'min' => $pkgPackager, 'max' => $pkgPackager];
             }
             if (\Core\version_compare($pkgPackager, $packages[$pkgKey]['min'], 'lt')) {
                 // Record the lowest supported Core version for this package
                 $packages[$pkgKey]['min'] = $pkgPackager;
             }
             if (\Core\version_compare($pkgPackager, $packages[$pkgKey]['max'], 'gt')) {
                 // Record the higest supported Core version for this package
                 $packages[$pkgKey]['max'] = $pkgPackager;
             }
             if (\Core\version_compare($pkgVersion, $packages[$pkgKey]['check'], 'gt')) {
                 // Save the newest component as the reference package for all the display data.
                 $packages[$pkgKey]['check'] = $pkgVersion;
                 $packages[$pkgKey]['package'] = $pkg;
             }
         }
         // Build a list of all supported versions of Core in the database.
         $allCoreVersions = [];
         $packagerVersions = \Core\Datamodel\Dataset::Init()->unique(true)->select('packager')->table('package_repository_package')->order('packager')->executeAndGet();
         foreach ($packagerVersions as $pkg) {
             $pkgObject = new \Core\VersionString($pkg);
             $pkgBase = $pkgObject->major . '.' . $pkgObject->minor;
             if (!isset($allCoreVersions[$pkgBase])) {
                 $allCoreVersions[$pkgBase] = 'Core Plus ' . $pkgBase;
             }
         }
         krsort($allCoreVersions, SORT_NATURAL);
         $allCoreVersions = array_merge(['' => '-- All Versions --'], $allCoreVersions);
         $versionSelector = new Form();
         $versionSelector->set('method', 'get');
         $versionSelector->addElement('select', ['name' => 'packager', 'options' => $allCoreVersions, 'value' => $briefVersion]);
         $versionSelector->addElement('submit', ['value' => 'Filter']);
         $view->assign('version_selector', $versionSelector);
         $view->assign('packages', $packages);
         $view->assign('version_selected', $briefVersion);
     }
     if ($isAdmin) {
         $view->addControl(['title' => t('STRING_PACKAGE_REPOSITORY_REBUILD'), 'link' => '/packagerepository/rebuild']);
     }
     $view->title = 'Package Repository';
     $view->templatename = 'pages/packagerepository/index.tpl';
     $view->assign('is_admin', $isAdmin);
 }
 /**
  * This will check and see how many 404 requests there have been recently.
  *
  * @return bool
  */
 public static function Check404Pages()
 {
     // How long back do I want to check the logs?
     $time = new DateTime();
     $time->modify('-30 seconds');
     $ds = Dataset::Init()->table('user_activity')->where(['status = 404', 'ip_addr = ' . REMOTE_IP, 'datetime > ' . $time->format('U')])->count()->execute();
     if ($ds->num_rows > 30) {
         // CHILL THAR F****R!
         $time->modify('+6 minutes');
         $blacklist = new \IpBlacklistModel();
         $blacklist->setFromArray(['ip_addr' => REMOTE_IP . '/24', 'expires' => $time->format('U'), 'message' => 'You have requested too many "404" pages recently, please go get some coffee and wait for a short bit.  If you are a bot and/or spammer, please bugger off.', 'comment' => '5-minute auto-ban for too many 404 requests in 30 seconds']);
         $blacklist->save();
         \SystemLogModel::LogSecurityEvent('/security/blocked', 'Blocking IP due to too many 404 requests in 30 seconds.');
         die($blacklist->get('message'));
     }
 }
<?php

/**
 * Upgrade file for migrating user data from the user user configs to the new supplemental user table.
 */
// The migrations for source (user_user_config) to destination (user).
$migrations = ['first_name' => 'first_name', 'last_name' => 'last_name', 'phone' => 'phone', 'bio' => 'bio', 'username' => 'username'];
// Lookup each key and the corresponding user attached.
$sources = \Core\Datamodel\Dataset::Init()->select(['user_id', 'key', 'value'])->table('user_user_config')->where('key IN ' . implode(',', array_keys($migrations)))->executeAndGet();
$users = [];
foreach ($sources as $s) {
    if (!isset($users[$s['user_id']])) {
        $users[$s['user_id']] = UserModel::Construct($s['user_id']);
    }
    /** @var UserModel $u */
    $u = $users[$s['user_id']];
    $nk = $migrations[$s['key']];
    $nv = $s['value'];
    $u->set($nk, $nv);
}
// Now save each user loaded into the array.
foreach ($users as $u) {
    /** @var UserModel $u */
    $u->save();
}
	/**
	 * Display a list of system logs that have been recorded.
	 *
	 * @return int
	 */
	public function log(){
		$view = $this->getView();
		$request = $this->getPageRequest();

		if(!\Core\user()->checkAccess('p:/core/systemlog/view')){
			return View::ERROR_ACCESSDENIED;
		}

		$codes = ['' => '-- All --'];
		$ds = Dataset::Init()
			->table('system_log')
			->select('code')
			->unique(true)
			->order('code')
			->execute();

		foreach($ds as $row){
			$codes[$row['code']] = $row['code'];
		}

		$listings = new Core\ListingTable\Table();
		$listings->setModelName('SystemLogModel');
		$listings->setName('system-log');
		$listings->setDefaultSort('datetime');

		$listings->addFilter(
			'select',
			array(
				'title' => 'Type',
				'name' => 'type',
				'options' => array(
					'' => '-- All --',
					'info' => 'Informative',
					'error' => 'Warning/Error',
					'security' => 'Security',
				),
				'link' => FilterForm::LINK_TYPE_STANDARD,
			)
		);

		$listings->addFilter(
			'select',
			[
				'title' => 'Code',
				'name' => 'code',
				'options' => $codes,
				'link' => FilterForm::LINK_TYPE_STANDARD,
			]
		);

		$listings->addFilter(
			'date',
			[
				'title' => 'On or After',
				'name' => 'datetime_onafter',
				'linkname' => 'datetime',
				'link' => FilterForm::LINK_TYPE_GE,
			]
		);
		$listings->addFilter(
			'date',
			[
				'title' => 'On or Before',
				'name' => 'datetime_onbefore',
				'linkname' => 'datetime',
				'link' => FilterForm::LINK_TYPE_LE,
				'linkvaluesuffix' => ' 23:59:59'
			]
		);

		/*$filters->addElement(
			'select',
			array(
				'title' => 'Cron',
				'name' => 'cron',
				'options' => array(
					'' => '-- All --',
					'hourly' => 'hourly',
					'daily' => 'daily',
					'weekly' => 'weekly',
					'monthly' => 'monthly'
				),
				'link' => FilterForm::LINK_TYPE_STANDARD,
			)
		);
		$filters->addElement(
			'select',
			array(
				'title' => 'Status',
				'name' => 'status',
				'options' => array(
					'' => '-- All --',
					'pass' => 'pass',
					'fail' => 'fail'
				),
				'link' => FilterForm::LINK_TYPE_STANDARD,
			)
		);*/

		$listings->addFilter(
			'hidden',
			array(
				'title' => 'Session',
				'name' => 'session_id',
				'link' => FilterForm::LINK_TYPE_STANDARD,
			)
		);
		$listings->addFilter(
			'user',
			array(
				'title' => 'User',
				'name' => 'affected_user_id',
				'linkname' => [
					'affected_user_id',
					'user_id',
				]
				//'link' => FilterForm::LINK_TYPE_STANDARD,
			)
		);
		$listings->addFilter(
			'text',
			[
				'title' => 'IP Address',
				'name' => 'ip_addr',
				'link' => FilterForm::LINK_TYPE_STARTSWITH,
			]
		);

		$listings->addColumn('Type', 'type');
		$listings->addColumn('Date/Time', 'datetime');
		$listings->addColumn('IP Address', 'ip_addr');
		$listings->addColumn('Message', 'message');
		//$listings->addColumn('Session', 'session_id');
		$listings->addColumn('User', 'user_id', false);
		$listings->addColumn('Affected User', 'affected_user_id', false);

		$listings->loadFiltersFromRequest($request);

		$view->mastertemplate = 'admin';
		$view->title = 't:STRING_SYSTEM_LOG';
		$view->assign('listings', $listings);
	}
Beispiel #7
0
CLI::PrintHeader('Cleaning up non-existent pages');
$pageremovecount = 0;
foreach(\Core\Datamodel\Dataset::Init()->select('baseurl')->table('page')->where('admin = 1')->execute() as $row){
	$baseurl = $row['baseurl'];

	// This page existed already, no need to do anything :)
	if(isset($allpages[$baseurl])) continue;

	++$pageremovecount;

	// Otherwise, this page was deleted or for some reason doesn't exist in the component list.....
	// BUH BAI
	CLI::PrintActionStart('Deleting page ' . $baseurl);
	$changes[] = "Deleted page " . $baseurl;
	\Core\Datamodel\Dataset::Init()->delete()->table('page')->where('baseurl = ' . $baseurl)->execute();
	\Core\Datamodel\Dataset::Init()->delete()->table('page_meta')->where('baseurl = ' . $baseurl)->execute();
	CLI::PrintActionStatus('ok');
}
if($pageremovecount == 0){
	CLI::PrintLine('No pages flushed');
}

CLI::PrintHeader('Synchronizing Searchable Models');
foreach(\Core::GetComponents() as $c){
	/** @var Component_2_1 $c */

	foreach($c->getClassList() as $class => $file){
		if($class == 'model'){
			continue;
		}
		if(strrpos($class, 'model') !== strlen($class) - 5){
 /**
  * View controller for a blog article listing page.
  * This will only display articles under this same blog.
  *
  * @param BlogModel $blog
  */
 private function _viewBlog(BlogModel $blog)
 {
     $view = $this->getView();
     $page = $blog->getLink('Page');
     $request = $this->getPageRequest();
     $manager = \Core\user()->checkAccess('p:/blog/manage_all');
     $editor = \Core\user()->checkAccess($blog->get('manage_articles_permission ')) || $manager;
     $viewer = \Core\user()->checkAccess($blog->get('access')) || $editor;
     // Get the latest published article's update date.  This will be used for the blog updated timestamp.
     // (This doesn't have a whole lot of benefit above the ModelFactory, simply illustrating a different way to query data).
     $latest = \Core\Datamodel\Dataset::Init()->select('*')->table('page')->where('parenturl = ' . $blog->get('baseurl'))->where('published_status = published')->order('published DESC')->limit(1)->current();
     $filters = new FilterForm();
     $filters->haspagination = true;
     // Allow different type of requests to come in here.
     switch ($request->ctype) {
         case 'application/atom+xml':
             $view->templatename = 'pages/blog/view-blog.atom.tpl';
             $view->contenttype = $request->ctype;
             $view->mastertemplate = false;
             $filters->setLimit(200);
             break;
         case 'application/rss+xml':
             $view->templatename = 'pages/blog/view-blog.rss.tpl';
             $view->contenttype = $request->ctype;
             $view->mastertemplate = false;
             $filters->setLimit(200);
             break;
         default:
             $view->templatename = 'pages/blog/view-blog.tpl';
             $filters->setLimit(20);
             break;
     }
     $filters->load($this->getPageRequest());
     $factory = new ModelFactory('PageModel');
     if ($request->getParameter('q')) {
         $query = $request->getParameter('q');
         $factory->where(\Core\Search\Helper::GetWhereClause($request->getParameter('q')));
     } else {
         $query = null;
     }
     $factory->where('parenturl = ' . $blog->get('baseurl'));
     $factory->order('published DESC');
     if (!$editor) {
         // Limit these to published articles.
         $factory->where('published_status = published');
         // And where the published date is >= now.
         $factory->where('published <= ' . CoreDateTime::Now('U', Time::TIMEZONE_GMT));
     }
     $filters->applyToFactory($factory);
     $articles = $factory->get();
     $view->mode = View::MODE_PAGEORAJAX;
     $view->assign('blog', $blog);
     $view->assign('articles', $articles);
     $view->assign('page', $page);
     $view->assign('filters', $filters);
     $view->assign('canonical_url', \Core\resolve_link($blog->get('baseurl')));
     $view->assign('last_updated', $latest ? $latest['updated'] : 0);
     $view->assign('servername', SERVERNAME_NOSSL);
     $view->assign('editor', $editor);
     $view->assign('add_article_link', '/content/create?page_template=blog-article.tpl&parenturl=' . $blog->get('baseurl'));
     // Add the extra view types for this page
     $view->addHead('<link rel="alternate" type="application/atom+xml" title="' . $page->get('title') . ' Atom Feed" href="' . \Core\resolve_link($blog->get('baseurl')) . '.atom"/>');
     $view->addHead('<link rel="alternate" type="application/rss+xml" title="' . $page->get('title') . ' RSS Feed" href="' . \Core\resolve_link($blog->get('baseurl')) . '.rss"/>');
     if ($editor) {
         if ($blog->get('type') == 'remote') {
             $view->addControl('Import Feed', '/blog/import/' . $blog->get('id'), 'exchange');
         } else {
             $view->addControl('Add Article', '/content/create?page_template=blog-article.tpl&parenturl=' . $blog->get('baseurl'), 'add');
         }
     }
     if ($manager) {
         $view->addControl('Edit Blog', '/blog/update/' . $blog->get('id'), 'edit');
         $view->addControl('All Articles', '/admin/pages/?filter[parenturl]=' . $blog->get('baseurl'), 'tasks');
     }
     $view->addControl('RSS Feed', \Core\resolve_link($blog->get('baseurl')) . '.rss', 'rss');
     //$view->addControl('Atom Feed', \Core\resolve_link($blog->get('baseurl')) . '.atom', 'rss');
 }
$fac->where('groups != ');

while(($user = $fac->getNext())){
	/** @var UserModel $user */
	// datamodel backed users have the groups listed in their column "groups".
	$g = json_decode($user->get('groups'), true);
	if(!$g) $g = array();

	$gids = [];

	foreach($g as $gid){
		if(is_array($gid)){
			$gids = array_merge($gids, $gid);
		}
		else{
			$gids[] = $gid;
		}
	}
	$gids = array_unique($gids);

	$user->setGroups($gids);
	$user->save();
}

// Now wipe out this temporary column data.
\Core\Datamodel\Dataset::Init()
	->update(['groups' => ''])
	->table('user')
	->where('groups != ')
	->execute();
Beispiel #10
0
 /**
  * Extract all possible keywords from the content along with their current scores.
  *
  * @return array
  */
 public function getKeywords()
 {
     $s = strtolower($this->content);
     $s = strip_tags($s);
     $s = preg_replace('/[^a-z0-9 ]/', '', $s);
     $stopwords = \Core\get_stop_words();
     // Add on a few more custom stop words that don't necessarily belong in upstream.
     $stopwords[] = 'id';
     $stopwords[] = 'like';
     $exploded = explode(' ', $s);
     $nt = [];
     foreach ($exploded as $i => $w) {
         if ($w == '') {
             continue;
         }
         if (in_array($w, $stopwords)) {
             continue;
         }
         $nt[] = $w;
         if (isset($exploded[$i + 1])) {
             $nt[] = $w . ' ' . $exploded[$i + 1];
         }
         if (isset($exploded[$i + 2])) {
             $nt[] = $w . ' ' . $exploded[$i + 1] . ' ' . $exploded[$i + 2];
         }
     }
     $nt = array_unique($nt);
     sort($nt);
     $all = Dataset::Init()->select('*')->table('spam_ham_keyword')->execute();
     // Convert this to something I can quickly check through.
     $keywords = [];
     foreach ($all as $row) {
         $keywords[$row['keyword']] = $row['score'];
     }
     $ret = [];
     foreach ($nt as $w) {
         if (isset($keywords[$w])) {
             $score = $keywords[$w];
         } else {
             $score = 0;
         }
         $ret[] = ['keyword' => $w, 'score' => $score];
     }
     return $ret;
 }
<?php
/**
 * Upgrade file for migrating user data from the user user configs to the new supplemental user table.
 */

// The migrations for source (user_user_config) to destination (user).
$migrations = [
	'/user/gpgauth/pubkey' => 'gpgauth_pubkey',
	'json:profiles' => 'external_profiles',
];

// Lookup each key and the corresponding user attached.
$sources = \Core\Datamodel\Dataset::Init()
	->select(['user_id', 'key', 'value'])
	->table('user_user_config')
	->where('key IN ' . implode(',', array_keys($migrations)))
	->executeAndGet();

$users = [];

foreach($sources as $s){
	if(!isset($users[ $s['user_id'] ])){
		$users[ $s['user_id'] ] = UserModel::Construct($s['user_id']);
	}
	
	/** @var UserModel $u */
	$u = $users[ $s['user_id'] ];
	$nk = $migrations[ $s['key'] ];
	$nv = $s['value'];
	
	$u->set($nk, $nv);