public function run($userId, $mode = 'test') { $testMode = $mode != 'run'; $message = "Ensure DB Indexes\n"; $numberOfIndexesCreated = 0; $website = Website::get(); $onDevMachine = strpos($website->domain, 'dev.') !== false; $onLocalMachine = strrpos($website->domain, '.local') !== false; $message .= "\n------------- Main Database:\n"; $mainCollectionName = ProjectModelMongoMapper::instance()->getCollectionName(); $mainIndexes = ProjectModelMongoMapper::instance()->INDEXES_REQUIRED; $mainIndexesToCreate = MongoStore::getIndexesNotSetInCollection(SF_DATABASE, $mainCollectionName, $mainIndexes); $numberOfIndexesCreated += count($mainIndexesToCreate); $message .= count($mainIndexesToCreate) . " main indexes created.\n"; if (($onDevMachine || $onLocalMachine) && MongoStore::hasDB(SF_TEST_DATABASE)) { $message .= "\n------------- Test Database:\n"; $mainIndexesToCreate = MongoStore::getIndexesNotSetInCollection(SF_TEST_DATABASE, $mainCollectionName, $mainIndexes); $numberOfIndexesCreated += count($mainIndexesToCreate); $message .= count($mainIndexesToCreate) . " test indexes created.\n"; } if (!$testMode) { MongoStore::ensureIndexesInCollection(SF_DATABASE, $mainCollectionName, $mainIndexes); if (($onDevMachine || $onLocalMachine) && MongoStore::hasDB(SF_TEST_DATABASE)) { MongoStore::ensureIndexesInCollection(SF_TEST_DATABASE, $mainCollectionName, $mainIndexes); } } // loop over every project $projectList = new ProjectListModel(); $projectList->read(); foreach ($projectList->entries as $projectParams) { $project = ProjectModel::getById($projectParams['id']); if ($project->appName == 'lexicon') { $message .= "\n------------- {$project->projectName} project:\n"; $lexiconCollectionName = LexEntryModel::mapper($project->databaseName())->getCollectionName(); $lexiconIndexes = LexEntryModel::mapper($project->databaseName())->INDEXES_REQUIRED; $lexiconIndexesToCreate = MongoStore::getIndexesNotSetInCollection($project->databaseName(), $lexiconCollectionName, $lexiconIndexes); $numberOfIndexesCreated += count($lexiconIndexesToCreate); $optionListCollectionName = LexOptionListModel::mapper($project->databaseName())->getCollectionName(); $optionListIndexes = LexOptionListModel::mapper($project->databaseName())->INDEXES_REQUIRED; $optionListIndexesToCreate = MongoStore::getIndexesNotSetInCollection($project->databaseName(), $optionListCollectionName, $optionListIndexes); $numberOfIndexesCreated += count($optionListIndexesToCreate); if (count($lexiconIndexesToCreate) + count($optionListIndexesToCreate) > 0) { $message .= count($lexiconIndexesToCreate) . " lexicon indexes created.\n"; $message .= count($optionListIndexesToCreate) . " option list indexes created.\n"; } else { $message .= "No indexes needed creating.\n"; } if (!$testMode) { MongoStore::ensureIndexesInCollection($project->databaseName(), $lexiconCollectionName, $lexiconIndexes); MongoStore::ensureIndexesInCollection($project->databaseName(), $optionListCollectionName, $optionListIndexes); } } } if ($numberOfIndexesCreated > 0) { $message .= "\nCreated {$numberOfIndexesCreated} DB Indexes.\n\n"; } else { $message .= "\nAll indexes were present.\n\n"; } return $message; }
public function run($userId, $mode = 'test') { $testMode = $mode != 'run'; $message = "Import Other Language Semantic Domain Projects\n\n"; $languages = array('es', 'fa', 'hi', 'id', 'km', 'ko', 'ne', 'pt', 'ru', 'te', 'th', 'ur', 'zh-CN'); //$languages = array('es', 'fa'); $languageData = new LanguageData(); $languageData->read(); foreach ($languages as $lang) { $projectCode = SemDomTransProjectModel::projectCode($lang); $languageName = $languageData->getLanguage($lang)->name; $projectName = SemDomTransProjectModel::projectName($lang, $languageName); $existingProject = new SemDomTransProjectModel(); $existingProject->readByCode($lang); if ($existingProject->id->asString() != '') { $message .= "{$projectName} already exists! Removing...\n"; if (!$testMode) { $existingProject->remove(); } } if (!$testMode) { $projectId = self::_createEmptyProject($lang, $languageName, $userId); $projectModel = ProjectModel::getById($projectId); $xmlFilePath = APPPATH . "resources/languageforge/semdomtrans/LocalizedLists-{$lang}.xml"; $projectModel->importFromFile($xmlFilePath); } $message .= "Finished importing the {$projectName} \n"; } return $message; }
/** * @param string $projectId * @param string $userId * @returns array - the DTO array */ public static function encode($projectId) { $projectModel = ProjectModel::getById($projectId); $list = $projectModel->listUsers(); $data = array(); $data['userCount'] = $list->count; $data['users'] = $list->entries; $data['project'] = array('roles' => $projectModel->getRolesList(), 'ownerRef' => $projectModel->ownerRef, 'name' => $projectModel->projectName, 'appLink' => "/app/{$projectModel->appName}/{$projectId}/"); return $data; }
public function testInitializeNewProject_defaultPartOfSpeechOptionListExists() { $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE); $optionLists = new LexOptionListListModel($project); $optionLists->read(); $this->assertCount(0, $optionLists->entries); $project = ProjectModel::getById($project->id->asString()); $project->initializeNewProject(); $optionLists->read(); $this->assertTrue(count($optionLists->entries) > 0); $this->assertEquals('adj', $optionLists->entries[0]['items'][0]['key']); }
public function testUserCanAccessMethod_projectPageDto_NotAMember_false() { $userId = self::$environ->createUser('user', 'user', '*****@*****.**', SystemRoles::USER); $project = self::$environ->createProject('projectForTest', 'projTestCode'); $project->appName = 'sfchecks'; $project->write(); $projectId = $project->id->asString(); $project = ProjectModel::getById($projectId); $rh = new RightsHelper($userId, $project, self::$environ->website); $result = $rh->userCanAccessMethod('project_pageDto', array()); $this->assertFalse($result); }
public static function encode($projectId) { $dto = array(); $project = ProjectModel::getById($projectId); $methodPrefix = 'project_management_report_' . $project->appName . '_'; $reports = array(); foreach (get_class_methods('\\Api\\Service\\Sf') as $methodName) { if (strpos($methodName, $methodPrefix) !== FALSE) { $reportId = explode($methodPrefix, $methodName)[1]; $displayName = ucwords(preg_replace('/([A-Z])/', ' $1', $reportId)); $reportId = $project->appName . '_' . $reportId; array_push($reports, array('id' => $reportId, 'name' => $displayName)); } } $dto['reports'] = $reports; return $dto; }
public function onAuthenticationSuccess(Request $request, TokenInterface $token) { $username = $token->getUser()->getUsername(); $user = new UserModel(); $website = Website::get(); // automatically logout if 1) the user doesn't exist or 2) the user is not a system admin and has no site rights on the current site if (!$user->readByUserName($username) or $user->role != SystemRoles::SYSTEM_ADMIN and !($user->siteRole->offsetExists($website->domain) and $user->siteRole[$website->domain] != SiteRoles::NONE)) { return $this->httpUtils->createRedirectResponse($request, '/app/logout'); } $projectId = $user->getCurrentProjectId($website->domain); // redirect to page before the login screen was presented, or to the default project for this user $referer = $this->determineTargetUrl($request); $url = '/app/projects'; if ($referer and strpos($referer, '/app/') !== false) { $url = $referer; } elseif ($projectId && ProjectModel::projectExistsOnWebsite($projectId, $website)) { $project = ProjectModel::getById($projectId); if ($project->userIsMember($user->id->asString())) { $url = '/app/' . $project->appName . '/' . $projectId; } } return $this->httpUtils->createRedirectResponse($request, $url); }
/** * @param string $projectId * @param string $userId * @param Website $website * @param string $appName - refers to the application being used by the user * @return array */ public static function getSessionData($projectId, $userId, $website, $appName = '') { $sessionData = array(); $sessionData['userId'] = (string) $userId; $sessionData['baseSite'] = $website->base; // Rights $user = new UserModel($userId); $sessionData['userSiteRights'] = $user->getRightsArray($website); $sessionData['username'] = $user->username; if ($projectId) { $project = ProjectModel::getById($projectId); $sessionData['project'] = array(); $sessionData['project']['id'] = (string) $projectId; $sessionData['project']['projectName'] = $project->projectName; if ($project->isArchived) { $sessionData['project']['projectName'] .= " [ARCHIVED]"; } $sessionData['project']['appName'] = $project->appName; $sessionData['project']['appLink'] = "/app/{$project->appName}/{$projectId}/"; $sessionData['project']['ownerRef'] = $project->ownerRef->asString(); $sessionData['project']['userIsProjectOwner'] = $project->isOwner($userId); $sessionData['project']['slug'] = $project->databaseName(); $sessionData['project']['isArchived'] = $project->isArchived; $sessionData['userProjectRights'] = $project->getRightsArray($userId); $sessionData['projectSettings'] = $project->getPublicSettings($userId); } if ($appName) { $sessionData['helps'] = HelpContentCommands::getSessionData($appName, $website); } // File Size $postMax = self::fromValueWithSuffix(ini_get("post_max_size")); $uploadMax = self::fromValueWithSuffix(ini_get("upload_max_filesize")); $fileSizeMax = min(array($postMax, $uploadMax)); $sessionData['fileSizeMax'] = $fileSizeMax; //return JsonEncoder::encode($sessionData); // This is handled elsewhere return $sessionData; }
public function checkPermissions($methodName, $params) { if (!self::isAnonymousMethod($methodName)) { if (!$this->userId) { throw new UserNotAuthenticatedException("Your session has timed out. Please login again."); } try { $projectModel = ProjectModel::getById($this->projectId); } catch (\Exception $e) { $projectModel = null; } $rightsHelper = new RightsHelper($this->userId, $projectModel, $this->website); if (!$rightsHelper->userCanAccessMethod($methodName, $params)) { throw new UserUnauthorizedException("Insufficient privileges accessing API method '{$methodName}'"); } } }
/** * Update the user project role in the project * @param string $projectId * @param string $userId * @param string $projectRole * @throws \Exception * @return string $userId */ public static function updateUserRole($projectId, $userId, $projectRole = ProjectRoles::CONTRIBUTOR) { CodeGuard::checkNotFalseAndThrow($projectId, '$projectId'); CodeGuard::checkNotFalseAndThrow($userId, 'userId'); //CodeGuard::assertInArrayOrThrow($role, array(ProjectRoles::CONTRIBUTOR, ProjectRoles::MANAGER)); // Add the user to the project $user = new UserModel($userId); $project = ProjectModel::getById($projectId); if ($project->userIsMember($userId) && $projectRole == $project->users[$userId]->role) { return $userId; } if ($userId == $project->ownerRef->asString()) { throw new \Exception("Cannot update role for project owner"); } ProjectCommands::usersDto($projectId); if (!$project->userIsMember($userId)) { ActivityCommands::addUserToProject($project, $userId); } $project->addUser($userId, $projectRole); $user->addProject($projectId); $project->write(); $user->write(); return $userId; }
public static function UserEngagementReport($projectId) { $project = ProjectModel::getById($projectId); $output = str_pad('**** User Engagement Report ****', 120, " ", STR_PAD_BOTH) . "\n"; $output .= str_pad(date(DATE_RFC2822), 120, " ", STR_PAD_BOTH) . "\n\n"; $data = array(); $activeUsers = array(); $managerUsers = array(); $inactiveUsers = array(); $invalidUsers = array(); $listModel = new UserListProjectModel($projectId); $listModel->read(); if ($listModel->count > 0) { $textListModel = new TextListModel($project); $textListModel->read(); $questions = array(); foreach ($textListModel->entries as $text) { $questionListModel = new QuestionAnswersListModel($project, $text['id']); $questionListModel->read(); $questions = array_merge($questions, array_map(function ($q) use($text) { $q['textRef'] = $text['id']; return $q; }, $questionListModel->entries)); } $answerCtr = 0; $commentCtr = 0; foreach ($listModel->entries as $user) { $userModel = new UserModel($user['id']); $user['isActive'] = $userModel->active; $user['questions'] = 0; $user['texts'] = 0; $user['answers'] = 0; $user['comments'] = 0; $user['responses'] = 0; $user['textIds'] = array(); if (!$user['isActive']) { if (!$user['email']) { $user['email'] = $userModel->emailPending; } array_push($invalidUsers, $user); continue; } if ($project->users->offsetExists($user['id'])) { $user['role'] = $project->users[$user['id']]->role; } else { $user['role'] = ProjectRoles::NONE; } $answerCtr = 0; $commentCtr = 0; foreach ($questions as $question) { $responses = 0; foreach ($question['answers'] as $answer) { if (!$answer['content']) { continue; } $answerCtr++; foreach ($answer['comments'] as $comment) { if (!$comment['content']) { continue; } $commentCtr++; if ($comment['userRef'] && strval($comment['userRef']) == $user['id']) { $user['comments']++; $user['responses']++; array_push($user['textIds'], $question['textRef']); $responses++; } } if ($answer['userRef'] && strval($answer['userRef']) == $user['id']) { $user['answers']++; $user['responses']++; array_push($user['textIds'], $question['textRef']); $responses++; } } if ($responses > 0) { $user['questions']++; } } $user['texts'] = count(array_unique($user['textIds'])); if ($user['role'] == ProjectRoles::MANAGER) { array_push($managerUsers, $user); } elseif ($user['responses'] > 0) { array_push($activeUsers, $user); } else { array_push($inactiveUsers, $user); } } $output .= $project->projectName . " Project\n"; $output .= "Texts (T's) in Project: " . $textListModel->count . "\n"; $output .= "Questions (Q's) in Project: " . count($questions) . "\n"; $output .= "Responses (R's) in Project (Answers + Comments): " . ($answerCtr + $commentCtr) . "\n"; $output .= "Answers (A's) in Project: " . $answerCtr . "\n"; $output .= "Comments (C's) in Project: " . $commentCtr . "\n"; } else { $output .= "This project has no users\n\n"; } $sortByResponses = function ($a, $b) { if ($a['responses'] > $b['responses']) { return -1; } elseif ($a['responses'] < $b['responses']) { return 1; } else { if ($a['answers'] > $b['answers']) { return -1; } elseif ($a['answers'] < $b['answers']) { return 1; } else { if ($a['comments'] > $b['comments']) { return -1; } elseif ($a['comments'] < $b['comments']) { return 1; } else { return strcmp($a['username'], $b['username']); } } } }; $sortByName = function ($a, $b) { return strcasecmp($a['name'], $b['name']); }; usort($activeUsers, $sortByResponses); usort($managerUsers, $sortByResponses); usort($inactiveUsers, $sortByName); usort($invalidUsers, $sortByName); $output .= "\n\nManagers: " . count($managerUsers) . "\n" . str_pad("Name", 30) . str_pad("Email", 35) . str_pad("Username", 25) . str_pad("R's", 5) . str_pad("A's", 5) . str_pad("C's", 5) . str_pad("Q's", 5) . str_pad("T's", 5) . "\n\n"; foreach ($managerUsers as $user) { $output .= str_pad($user['name'], 30) . str_pad($user['email'], 35) . str_pad($user['username'], 25) . str_pad($user['responses'], 5) . str_pad($user['answers'], 5) . str_pad($user['comments'], 5) . str_pad($user['questions'], 5) . str_pad($user['texts'], 5) . "\n"; } $output .= "\n\nActive Users: " . count($activeUsers) . "\n" . str_pad("Name", 30) . str_pad("Email", 35) . str_pad("Username", 25) . str_pad("R's", 5) . str_pad("A's", 5) . str_pad("C's", 5) . str_pad("Q's", 5) . str_pad("T's", 5) . "\n\n"; foreach ($activeUsers as $user) { $output .= str_pad($user['name'], 30) . str_pad($user['email'], 35) . str_pad($user['username'], 25) . str_pad($user['responses'], 5) . str_pad($user['answers'], 5) . str_pad($user['comments'], 5) . str_pad($user['questions'], 5) . str_pad($user['texts'], 5) . "\n"; } $output .= "\n\nInactive Users (never engaged): " . count($inactiveUsers) . "\n" . str_pad("Name", 30) . str_pad("Email", 35) . str_pad("Username", 25) . "\n\n"; foreach ($inactiveUsers as $user) { $output .= str_pad($user['name'], 30) . str_pad($user['email'], 35) . str_pad($user['username'], 25) . "\n"; } $output .= "\n\nInvited Users (but never validated or logged in): " . count($invalidUsers) . "\n" . str_pad("Name", 30) . str_pad("Email", 35) . str_pad("Username", 25) . "\n\n"; foreach ($invalidUsers as $user) { $output .= str_pad($user['name'], 30) . str_pad($user['email'], 35) . str_pad($user['username'], 25) . "\n"; } $data['output'] = $output; $data['result'] = array('managerUsers' => $managerUsers, 'activeUsers' => $activeUsers, 'inactiveUsers' => $inactiveUsers, 'invitedUsers' => $invalidUsers); return $data; }
<?php require_once 'e2eTestConfig.php'; use Api\Model\Languageforge\Lexicon\Command\SendReceiveCommands; use Api\Model\Languageforge\Lexicon\LexProjectModel; use Api\Model\Shared\ProjectModel; use Palaso\Utilities\FileUtilities; $constants = json_decode(file_get_contents(TestPath . 'app/testConstants.json'), true); // cleanup test assets folder $project = new ProjectModel(); $project->readByProperties(array('projectCode' => $constants['testProjectCode'])); $testProject = ProjectModel::getById($project->id->asString()); $assetsFolderPath = $testProject->getAssetsFolderPath(); FileUtilities::removeFolderAndAllContents($assetsFolderPath); // cleanup other assets folders $otherAssetsFolderPath = str_replace($constants['testProjectCode'], $constants['otherProjectCode'], $assetsFolderPath); FileUtilities::removeFolderAndAllContents($otherAssetsFolderPath); $otherAssetsFolderPath = str_replace($constants['testProjectCode'], $constants['thirdProjectCode'], $assetsFolderPath); FileUtilities::removeFolderAndAllContents($otherAssetsFolderPath); $otherAssetsFolderPath = str_replace($constants['testProjectCode'], $constants['fourthProjectCode'], $assetsFolderPath); FileUtilities::removeFolderAndAllContents($otherAssetsFolderPath); $otherAssetsFolderPath = str_replace($constants['testProjectCode'], $constants['newProjectCode'], $assetsFolderPath); FileUtilities::removeFolderAndAllContents($otherAssetsFolderPath); $otherAssetsFolderPath = str_replace($constants['testProjectCode'], $constants['emptyProjectCode'], $assetsFolderPath); FileUtilities::removeFolderAndAllContents($otherAssetsFolderPath); $otherAssetsFolderPath = str_replace($constants['testProjectCode'], $constants['srProjectCode'], $assetsFolderPath); FileUtilities::removeFolderAndAllContents($otherAssetsFolderPath); $otherAssetsFolderPath = str_replace($constants['testProjectCode'], 'mock-id4', $assetsFolderPath); if (file_exists($otherAssetsFolderPath)) { // glob doesn't list broken links, manually remove them first foreach (array_diff(scandir($otherAssetsFolderPath), array('.', '..')) as $filename) {
public function setupNgView(Application $app, $appName, $projectId = '') { $siteFolder = NG_BASE_FOLDER . $this->website->base; $parentAppFolder = ''; $appFolder = $this->website->base . '/' . $appName; if ($projectId == 'favicon.ico') { $projectId = ''; } $possibleSubFolder = "{$siteFolder}/{$appName}/{$projectId}"; if ($projectId != '' && file_exists($possibleSubFolder) && file_exists("{$possibleSubFolder}/{$appName}-{$projectId}.html") && file_exists("{$possibleSubFolder}/views")) { $parentAppFolder = $appFolder; $appFolder .= "/{$projectId}"; $appName .= "-{$projectId}"; $projectId = ''; } if (!file_exists(NG_BASE_FOLDER . $appFolder)) { $appFolder = 'bellows/apps/' . $appName; if (!file_exists(NG_BASE_FOLDER . $appFolder)) { $app->abort(404, $this->website->base); // this terminates PHP } } $this->data['appName'] = $appName; $this->data['appFolder'] = $appFolder; $this->_userId = SilexSessionHelper::getUserId($app); // update the projectId in the session if it is not empty if (!$projectId) { $projectId = SilexSessionHelper::getProjectId($app, $this->website); } if ($projectId && ProjectModel::projectExistsOnWebsite($projectId, $this->website)) { $projectModel = ProjectModel::getById($projectId); if (!$projectModel->userIsMember($this->_userId)) { $projectId = ''; } else { $user = new UserModel($this->_userId); $user->lastUsedProjectId = $projectId; $user->write(); if ($projectModel->isArchived and $user->role != SystemRoles::SYSTEM_ADMIN) { // Forbidden access to archived projects $projectId = ''; $user->lastUsedProjectId = $projectId; $user->write(); $app->abort(403, "Forbidden access to archived project"); } } } else { $projectId = ''; } $app['session']->set('projectId', $projectId); $this->_projectId = $projectId; // determine help menu button visibility // placeholder for UI language 'en' to support translation of helps in the future $helpsFolder = NG_BASE_FOLDER . $appFolder . "/helps/en/page"; if (file_exists($helpsFolder) && iterator_count(new \FilesystemIterator($helpsFolder, \FilesystemIterator::SKIP_DOTS)) > 0) { $this->_showHelp = true; // there is an implicit dependency on bellows JS here using the jsonRpc module $this->addJavascriptFiles(NG_BASE_FOLDER . 'container/js', array('vendor/', 'assets/')); } // Other session data $sessionData = SessionCommands::getSessionData($this->_projectId, $this->_userId, $this->website, $appName); $this->data['jsonSession'] = json_encode($sessionData, JSON_UNESCAPED_SLASHES); $this->addJavascriptFiles(NG_BASE_FOLDER . 'bellows/js', array('vendor/', 'assets/')); $this->addJavascriptFiles(NG_BASE_FOLDER . 'bellows/directive'); $this->addJavascriptFiles($siteFolder . '/js', array('vendor/', 'assets/')); if ($parentAppFolder) { $this->addJavascriptFiles(NG_BASE_FOLDER . $parentAppFolder, array('vendor/', 'assets/')); $this->addJavascriptNotMinifiedFiles(NG_BASE_FOLDER . $parentAppFolder . '/js/vendor'); $this->addJavascriptNotMinifiedFiles(NG_BASE_FOLDER . $parentAppFolder . '/js/assets'); } $this->addJavascriptFiles(NG_BASE_FOLDER . $appFolder, array('vendor/', 'assets/')); if ($appName == 'semdomtrans' || $appName == 'semdomtrans-new-project') { // special case for semdomtrans app // add lexicon JS files since the semdomtrans app depends upon these JS files $this->addJavascriptFiles($siteFolder . '/lexicon', array('vendor/', 'assets/')); } $this->addJavascriptNotMinifiedFiles(NG_BASE_FOLDER . 'bellows/js/vendor'); $this->addJavascriptNotMinifiedFiles(NG_BASE_FOLDER . 'bellows/js/assets'); $this->addJavascriptNotMinifiedFiles($siteFolder . '/js/vendor'); $this->addJavascriptNotMinifiedFiles($siteFolder . '/js/assets'); $this->addJavascriptNotMinifiedFiles(NG_BASE_FOLDER . $appFolder . '/js/vendor'); $this->addJavascriptNotMinifiedFiles(NG_BASE_FOLDER . $appFolder . '/js/assets'); $this->addCssFiles(NG_BASE_FOLDER . 'bellows'); $this->addCssFiles(NG_BASE_FOLDER . $appFolder); }
/** * @param string $projectId * @param Website $website * @return bool */ public static function projectExistsOnWebsite($projectId, $website) { $projectExists = false; $projectModel = new ProjectModel(); if ($projectModel->exists($projectId)) { $projectModel = ProjectModel::getById($projectId); $projectExists = $website->domain == $projectModel->siteName; } return $projectExists; }