/**
  * Attempt to login
  * @param {stdClass} $data Data passed from ActionScript
  * @return {array} Returns a standard response array
  */
 public function login($data)
 {
     $response = CodeBank_ClientAPI::responseBase();
     $response['login'] = true;
     //Try to login
     $member = MemberAuthenticator::authenticate(array('Email' => $data->user, 'Password' => $data->pass));
     if ($member instanceof Member && $member->ID != 0 && Permission::check('CODE_BANK_ACCESS', 'any', $member)) {
         try {
             $member->logIn();
             $ipAgrement = CodeBankConfig::CurrentConfig()->IPAgreement;
             //Get preferences
             $prefs = new stdClass();
             $prefs->heartbeat = $member->UseHeartbeat;
             //Set the response to HELO
             $response['status'] = 'HELO';
             $response['message'] = _t('CodeBankAPI.WELCOME_USER', '_Welcome {user}', array('user' => htmlentities($member->Name)));
             //Set the message to "Welcome ...."
             $response['data'] = array('id' => Member::currentUserID(), 'hasIPAgreement' => !empty($ipAgrement), 'preferences' => $prefs, 'isAdmin' => Permission::check('ADMIN') !== false, 'displayName' => trim($member->Name) == '' ? $member->Email : trim($member->Name));
         } catch (Exception $e) {
             //Something happend on the server
             $response['status'] = 'EROR';
             $response['message'] = _t('CodeBankAPI.SERVER_ERROR', '_Server error has occured, please try again later');
         }
     } else {
         //Bad username/pass combo
         $response['status'] = 'EROR';
         $response['message'] = _t('CodeBankAPI.INVALID_LOGIN', '_Invalid Login');
     }
     return $response;
 }
 /**
  * Gets the form used for agreeing or disagreeing to the ip agreement
  * @param {int} $id ID of the record to fetch
  * @param {FieldList} $fields Fields to use
  * @return {Form} Form to be used
  */
 public function getEditForm($id = null, $fields = null)
 {
     $defaultPanel = Config::inst()->get('AdminRootController', 'default_panel');
     if ($defaultPanel == 'CodeBank') {
         $defaultPanel = 'SecurityAdmin';
         $sng = singleton($defaultPanel);
     }
     $fields = new FieldList(new TabSet('Root', new Tab('Main', new HeaderField('IPMessageTitle', _t('CodeBank.IP_MESSAGE_TITLE', '_You must agree to the following terms before using Code Bank'), 2), new LiteralField('IPMessage', '<div class="ipMessage"><div class="middleColumn">' . CodeBankConfig::CurrentConfig()->dbObject('IPMessage')->forTemplate() . '</div></div>'), new HiddenField('RedirectLink', 'RedirectLink', $sng->Link()))));
     if (Session::get('CodeBankIPAgreed') === true) {
         $fields->addFieldToTab('Root.Main', new HiddenField('AgreementAgreed', 'AgreementAgreed', Session::get('CodeBankIPAgreed')));
     }
     $actions = new FieldList(FormAction::create('doDisagree', _t('CodeBankIPAgreement.DISAGREE', '_Disagree'))->addExtraClass('ss-ui-action-destructive'), FormAction::create('doAgree', _t('CodeBankIPAgreement.AGREE', '_Agree'))->addExtraClass('ss-ui-action-constructive'));
     $form = CMSForm::create($this, 'EditForm', $fields, $actions)->setHTMLID('Form_EditForm');
     $form->disableDefaultAction();
     $form->addExtraClass('cms-edit-form');
     $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
     $form->addExtraClass('center ' . $this->BaseCSSClasses());
     $form->setAttribute('data-pjax-fragment', 'CurrentForm');
     //Display message telling user to run dev/build because the version numbers are out of sync
     if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
         $form->setMessage(_t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')), 'error');
     } else {
         if ($this->hasOldTables()) {
             $form->setMessage(_t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')), 'warning');
         }
     }
     $form->Actions()->push(new LiteralField('CodeBankVersion', '<p class="codeBankVersion">Code Bank: ' . $this->getVersion() . '</p>'));
     Requirements::javascript(CB_DIR . '/javascript/CodeBank.IPMessage.js');
     return $form;
 }
 /**
  * Saves the snippet to the database
  * @param {array} $data Data submitted by the user
  * @param {Form} $form Submitting form
  * @return {SS_HTTPResponse} Response
  */
 public function doSave($data, $form)
 {
     $config = CodeBankConfig::CurrentConfig();
     $form->saveInto($config);
     $config->write();
     $this->response->addHeader('X-Status', rawurlencode(_t('LeftAndMain.SAVEDUP', 'Saved.')));
     return $this->getResponseNegotiator()->respond($this->request);
 }
 /**
  * Generates the form used for adding snippets
  * @return {Form} Form used to add snippets
  */
 public function AddForm()
 {
     $sng = singleton('Snippet');
     $fields = $sng->getCMSFields();
     $validator = $sng->getCMSValidator();
     $actions = new FieldList(FormAction::create('doAdd', _t('CodeBank.CREATE', '_Create'))->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept')->setUseButtonTag(true));
     $form = CMSForm::create($this, 'AddForm', $fields, $actions)->setHTMLID('Form_AddForm');
     $form->setValidator($validator);
     $form->disableDefaultAction();
     $form->addExtraClass('cms-add-form cms-edit-form');
     $form->setResponseNegotiator($this->getResponseNegotiator());
     $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
     $form->addExtraClass('center ' . $this->BaseCSSClasses());
     $form->setAttribute('data-pjax-fragment', 'CurrentForm');
     //Handle Language id in url
     if ($this->request->getVar('LanguageID')) {
         $langField = $form->Fields()->dataFieldByName('LanguageID');
         if ($langField && $langField->Value() == '') {
             $langField->setValue(intval(str_replace('language-', '', $this->request->getVar('LanguageID'))));
         }
     }
     //Handle folder id in url (or post)
     if ($this->request->getVar('FolderID')) {
         $folder = SnippetFolder::get()->byID(intval($this->request->getVar('FolderID')));
         if (!empty($folder) && $folder !== false && $folder->ID != 0) {
             $langField = $form->Fields()->dataFieldByName('LanguageID')->setValue($folder->ParentID);
             $form->Fields()->replaceField('LanguageID', $langField->performReadonlyTransformation());
             $form->Fields()->push(new HiddenField('FolderID', 'FolderID', $folder->ID));
         }
     } else {
         if ($this->request->postVar('FolderID')) {
             $folder = SnippetFolder::get()->byID(intval($this->request->postVar('FolderID')));
             if (!empty($folder) && $folder !== false && $folder->ID != 0) {
                 $langField = $form->Fields()->dataFieldByName('LanguageID')->setValue($folder->ParentID);
                 $form->Fields()->replaceField('LanguageID', $langField->performReadonlyTransformation());
                 $form->Fields()->push(new HiddenField('FolderID', 'FolderID', $folder->ID));
             }
         }
     }
     $this->extend('updateAddForm', $form);
     //Display message telling user to run dev/build because the version numbers are out of sync
     if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
         $form->insertBefore(new LiteralField('<p class="message error">' . _t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')) . '</p>'), 'LanguageID');
     } else {
         if ($this->hasOldTables()) {
             $form->insertBefore(new LiteralField('<p class="message warning">' . _t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')) . '</p>'), 'LanguageID');
         }
     }
     $form->Actions()->push(new LiteralField('CodeBankVersion', '<p class="codeBankVersion">Code Bank: ' . $this->getVersion() . '</p>'));
     Requirements::javascript(CB_DIR . '/javascript/CodeBank.EditForm.js');
     return $form;
 }
 /**
  * Saves the IP Message
  * @param {stdClass} $data Data passed from ActionScript
  * @return {array} Returns a standard response array
  */
 public function saveIPMessage($data)
 {
     $response = CodeBank_ClientAPI::responseBase();
     if (!Permission::check('ADMIN')) {
         $response['status'] = 'EROR';
         $response['message'] = _t('CodeBankAPI.PERMISSION_DENINED', '_Permission Denied');
         return $response;
     }
     try {
         $codeBankConfig = CodeBankConfig::CurrentConfig();
         $codeBankConfig->IPMessage = $data->message;
         $codeBankConfig->write();
         $response['status'] = 'HELO';
         $response['message'] = _t('CodeBankAPI.IP_MESSAGE_CHANGE', '_Intellectual Property message changed successfully');
     } catch (Exception $e) {
         $response['status'] = 'EROR';
         $response['message'] = _t('CodeBankAPI.SERVER_ERROR', '_Server error has occured, please try again later');
     }
     return $response;
 }
 /**
  * Gets the form used for viewing snippets
  * @param {int} $id ID of the record to fetch
  * @param {FieldList} $fields Fields to use
  * @return {Form} Form to be used
  */
 public function getEditForm($id = null, $fields = null)
 {
     if (!$id) {
         $id = $this->currentPageID();
     }
     $form = parent::getEditForm($id);
     $record = $this->getRecord($id);
     if ($record && !$record->canView()) {
         return Security::permissionFailure($this);
     }
     if (!$fields) {
         $fields = $form->Fields();
     }
     $actions = $form->Actions();
     if ($record) {
         $fields->push($idField = new HiddenField("ID", false, $id));
         $versions = $record->Versions()->filter('ID:not', $record->CurrentVersionID)->Map('ID', 'Created');
         $actions = new FieldList(new FormAction('doCopy', _t('CodeBank.COPY', '_Copy')), new FormAction('doEditRedirect', _t('CodeBank.EDIT', '_Edit')), new FormAction('doExport', _t('CodeBank.EXPORT', '_Export')), new FormAction('doPrint', _t('CodeBank.PRINT', '_Print')), new LabelField('Revision', _t('CodeBank.REVISION', '_Revision') . ': '), DropdownField::create('RevisionID', '', $versions, $this->urlParams['OtherID'])->setEmptyString('{' . _t('CodeBank.CURRENT_REVISION', '_Current Revision') . '}')->setDisabled($record->Versions()->Count() <= 1)->addExtraClass('no-change-track'), FormAction::create('compareRevision', _t('CodeBank.COMPARE_WITH_CURRENT', '_Compare with Current'))->setDisabled($record->Versions()->Count() <= 1 || empty($this->urlParams['OtherID']) || !is_numeric($this->urlParams['OtherID'])));
         // Use <button> to allow full jQuery UI styling
         $actionsFlattened = $actions->dataFields();
         if ($actionsFlattened) {
             foreach ($actionsFlattened as $action) {
                 if ($action instanceof FormAction) {
                     $action->setUseButtonTag(true);
                 }
             }
         }
         if ($record->hasMethod('getCMSValidator')) {
             $validator = $record->getCMSValidator();
         } else {
             $validator = new RequiredFields();
         }
         if ($record->Package() && $record->Package() !== false && $record->Package()->ID != 0) {
             $package = new ArrayList(array($record->Package()));
         } else {
             $package = null;
         }
         $fields->insertBefore($fields->dataFieldByName('Title'), 'LanguageID');
         $fields->replaceField('PackageID', new PackageViewField('PackageID', _t('Snippet.PACKAGE', '_Package'), $package, $record->ID));
         $fields->replaceField('Text', HighlightedContentField::create('SnippetText', _t('Snippet.CODE', '_Code'), $record->Language()->HighlightCode)->setForm($form));
         $fields->replaceField('Tags', new TagsViewField('Tags', _t('Snippet.TAGS_COLUMN', '_Tags')));
         $fields->addFieldToTab('Root.Main', $creator = ReadonlyField::create('CreatorName', _t('CodeBank.CREATOR', '_Creator'), $record->Creator() && $record->Creator()->ID > 0 ? '<a href="' . $this->Link() . '?creator=' . $record->CreatorID . '">' . $record->Creator()->Name . '</a>' : _t('CodeBank.UNKNOWN_USER', '_Unknown User'))->setForm($form));
         $creator->dontEscape = true;
         $fields->addFieldToTab('Root.Main', ReadonlyField::create('LanguageName', _t('CodeBank.LANGUAGE', '_Language'), $record->Language()->Name)->setForm($form));
         $fields->addFieldToTab('Root.Main', DatetimeField_Readonly::create('LastModified', _t('CodeBank.LAST_MODIFIED', '_Last Modified'), $record->CurrentVersion->LastEdited)->setForm($form));
         $fields->addFieldToTab('Root.Main', ReadonlyField::create('LastEditorName', _t('CodeBank.LAST_EDITED_BY', '_Last Edited By'), $record->LastEditor() && $record->LastEditor()->ID > 0 ? $record->LastEditor()->Name : _t('CodeBank.UNKNOWN_USER', '_Unknown User'))->setForm($form));
         $fields->addFieldToTab('Root.Main', ReadonlyField::create('SnippetID', _t('CodeBank.ID', '_ID'), $record->ID));
         $fields->addFieldToTab('Root.Main', ReadonlyField::create('CurrentVersionID', _t('CodeBank.VERSION', '_Version')));
         $fields->push(new HiddenField('ID', 'ID'));
         $form = new Form($this, 'EditForm', $fields, $actions, $validator);
         $form->loadDataFrom($record);
         $form->disableDefaultAction();
         $form->addExtraClass('cms-edit-form');
         $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
         $form->addExtraClass('center ' . $this->BaseCSSClasses());
         $form->setAttribute('data-pjax-fragment', 'CurrentForm');
         //Swap content for version text
         if (!empty($this->urlParams['OtherID']) && is_numeric($this->urlParams['OtherID'])) {
             $version = $record->Version(intval($this->urlParams['OtherID']));
             if (!empty($version) && $version !== false && $version->ID != 0) {
                 $fields->dataFieldByName('SnippetText')->setValue($version->Text);
                 $fields->dataFieldByName('LastModified')->setValue($version->LastEdited);
                 $fields->dataFieldByName('CurrentVersionID')->setValue($version->ID);
             }
             $form->Fields()->insertBefore(new LiteralField('NotCurrentVersion', '<p class="message warning">' . _t('CodeBank.NOT_CURRENT_VERSION', '_You are viewing a past version of this snippet\'s content, {linkopen}click here{linkclose} to view the current version', array('linkopen' => '<a href="admin/codeBank/show/' . $record->ID . '">', 'linkclose' => '</a>')) . '</p>'), 'Title');
         }
         $readonlyFields = $form->Fields()->makeReadonly();
         $form->setFields($readonlyFields);
         $this->extend('updateEditForm', $form);
         $form->Actions()->push(new LiteralField('CodeBankVersion', '<p class="codeBankVersion">Code Bank: ' . $this->getVersion() . '</p>'));
         Requirements::add_i18n_javascript(CB_DIR . '/javascript/lang');
         Requirements::add_i18n_javascript('mysite/javascript/lang');
         Requirements::javascript(CB_DIR . '/javascript/external/jquery-zclip/jquery.zclip.min.js');
         Requirements::javascript(CB_DIR . '/javascript/CodeBank.ViewForm.js');
         //Display message telling user to run dev/build because the version numbers are out of sync
         if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
             $form->Fields()->insertBefore(new LiteralField('DBUpgrade', '<p class="message error">' . _t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')) . '</p>'), 'Title');
         } else {
             if ($this->hasOldTables()) {
                 $form->Fields()->insertBefore(new LiteralField('DBUpgrade', '<p class="message warning">' . _t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')) . '</p>'), 'Title');
             }
         }
         return $form;
     } else {
         if ($id) {
             $form = CMSForm::create($this, 'EditForm', new FieldList(new TabSet('Root', new Tab('Main', ' ', new LabelField('DoesntExistLabel', _t('CodeBank.SNIPPIT_NOT_EXIST', '_Snippit does not exist'))))), new FieldList())->setHTMLID('Form_EditForm');
             $form->addExtraClass('cms-edit-form');
             $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
             $form->addExtraClass('center ' . $this->BaseCSSClasses());
             $form->setAttribute('data-pjax-fragment', 'CurrentForm');
             //Display message telling user to run dev/build because the version numbers are out of sync
             if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
                 $form->Fields()->insertBefore(new LiteralField('DBUpgrade', '<p class="message error">' . _t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')) . '</p>'), 'DoesntExist');
             } else {
                 if ($this->hasOldTables()) {
                     $form->Fields()->insertBefore(new LiteralField('DBUpgrade', '<p class="message warning">' . _t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')) . '</p>'), 'DoesntExistLabel');
                 }
             }
         } else {
             $form = $this->EmptyForm();
             if (Session::get('CodeBank.deletedSnippetID')) {
                 $form->Fields()->push(new HiddenField('ID', 'ID', Session::get('CodeBank.deletedSnippetID')));
             }
             //Display message telling user to run dev/build because the version numbers are out of sync
             if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
                 $form->Fields()->push(new LiteralField('DBUpgrade', '<p class="message error">' . _t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')) . '</p>'));
             } else {
                 if ($this->hasOldTables()) {
                     $form->Fields()->push(new LiteralField('DBUpgrade', '<p class="message warning">' . _t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')) . '</p>'));
                 }
             }
         }
     }
     $form->disableDefaultAction();
     $form->addExtraClass('cms-edit-form');
     $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
     $form->addExtraClass('center ' . $this->BaseCSSClasses());
     $form->Actions()->push(new LiteralField('CodeBankVersion', '<p class="codeBankVersion">Code Bank: ' . $this->getVersion() . '</p>'));
     return $form;
 }
 /**
  * Gets the form used for viewing snippets
  * @param {int} $id ID of the record to fetch
  * @param {FieldList} $fields Fields to use
  * @return {Form} Form to be used
  */
 public function getEditForm($id = null, $fields = null)
 {
     if (!$id) {
         $id = $this->currentPageID();
     }
     $record = $this->getRecord($id);
     if ($record && !$record->canView()) {
         return Security::permissionFailure($this);
     }
     if ($record) {
         $fields = $record->getCMSFields();
         $actions = new FieldList(FormAction::create('doSave', _t('CodeBank.SAVE', '_Save'))->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept'), FormAction::create('doCancel', _t('CodeBank.CANCEL', '_Cancel')));
         if ($record->canDelete()) {
             $actions->push(FormAction::create('doDelete', _t('CodeBank.DELETE', '_Delete'))->addExtraClass('ss-ui-action-destructive'));
         }
         // Use <button> to allow full jQuery UI styling
         $actionsFlattened = $actions->dataFields();
         if ($actionsFlattened) {
             foreach ($actionsFlattened as $action) {
                 if ($action instanceof FormAction) {
                     $action->setUseButtonTag(true);
                 }
             }
         }
         if ($record->hasMethod('getCMSValidator')) {
             $validator = $record->getCMSValidator();
         } else {
             $validator = new RequiredFields();
         }
         $fields->push(new HiddenField('ID', 'ID'));
         $form = CMSForm::create($this, 'EditForm', $fields, $actions, $validator)->setHTMLID('Form_EditForm');
         $form->loadDataFrom($record);
         $form->disableDefaultAction();
         $form->addExtraClass('cms-edit-form');
         $form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
         $form->addExtraClass('center ' . $this->BaseCSSClasses());
         $form->setResponseNegotiator($this->getResponseNegotiator());
         $form->setAttribute('data-pjax-fragment', 'CurrentForm');
         $this->extend('updateEditForm', $form);
         //Display message telling user to run dev/build because the version numbers are out of sync
         if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
             $form->insertBefore(new LiteralField('<p class="message error">' . _t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')) . '</p>'), 'LanguageID');
         } else {
             if ($this->hasOldTables()) {
                 $form->insertBefore(new LiteralField('<p class="message warning">' . _t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')) . '</p>'), 'LanguageID');
             }
         }
         $form->Actions()->push(new LiteralField('CodeBankVersion', '<p class="codeBankVersion">Code Bank: ' . $this->getVersion() . '</p>'));
         Requirements::javascript(CB_DIR . '/javascript/CodeBank.EditForm.js');
         return $form;
     }
     $form = $this->EmptyForm();
     if (Session::get('CodeBank.deletedSnippetID')) {
         $form->Fields()->push(new HiddenField('ID', 'ID', Session::get('CodeBank.deletedSnippetID')));
     }
     //Display message telling user to run dev/build because the version numbers are out of sync
     if (CB_VERSION != '@@VERSION@@' && CodeBankConfig::CurrentConfig()->Version != CB_VERSION . ' ' . CB_BUILD_DATE) {
         $form->push(new LiteralField('<p class="message error">' . _t('CodeBank.UPDATE_NEEDED', '_A database upgrade is required please run {startlink}dev/build{endlink}.', array('startlink' => '<a href="dev/build?flush=all">', 'endlink' => '</a>')) . '</p>'));
     } else {
         if ($this->hasOldTables()) {
             $form->push(new LiteralField('<p class="message warning">' . _t('CodeBank.MIGRATION_AVAILABLE', '_It appears you are upgrading from Code Bank 2.2.x, your old data can be migrated {startlink}click here to begin{endlink}, though it is recommended you backup your database first.', array('startlink' => '<a href="dev/tasks/CodeBankLegacyMigrate">', 'endlink' => '</a>')) . '</p>'));
         }
     }
     $this->redirect('admin/codeBank/');
     return $form;
 }
 /**
  * Gets the current config
  * @return {CodeBankConfig} Code Bank Config Data
  */
 public static function CurrentConfig()
 {
     if (empty(self::$_currentConfig)) {
         self::$_currentConfig = CodeBankConfig::get()->first();
     }
     return self::$_currentConfig;
 }
 /**
  * Performs the migration
  */
 public function run($request)
 {
     //Check for tables
     $tables = DB::tableList();
     if (!array_key_exists('languages', $tables) || !array_key_exists('snippits', $tables) || !array_key_exists('snippit_history', $tables) || !array_key_exists('preferences', $tables) || !array_key_exists('settings', $tables) || !array_key_exists('snippit_search', $tables) || !array_key_exists('users', $tables)) {
         echo '<b>' . _t('CodeBankLegacyMigrate.TABLES_NOT_FOUND', '_Could not find Code Bank 2.2 database tables, cannot migrate') . '</b>';
         exit;
     }
     //Ensure Empty
     if (Snippet::get()->Count() > 0) {
         echo '<b>' . _t('CodeBankLegacyMigrate.SNIPPETS_PRESENT', '_Already appears to be snippets present in the database, please start with a clean database, cannot migrate.') . '</b>';
         exit;
     }
     //Increase Timeout, since 30s probably won't be enough in huge databases
     increase_time_limit_to(600);
     //Find Other language
     $plainTextID = SnippetLanguage::get()->filter('Name', 'Other')->first();
     if (empty($plainTextID) || $plainTextID == false || $plainTextID->ID == 0) {
         echo _t('CodeBankLegacyMigrate.OTHER_NOT_FOUND', '_Could not find the Other Language, cannot migrate, please run dev/build first');
         exit;
     } else {
         $plainTextID = $plainTextID->ID;
     }
     //Check for users group
     $usersGroup = Group::get()->filter('Code', 'code-bank-api')->first();
     if (empty($usersGroup) || $usersGroup == false || $usersGroup->ID == 0) {
         //Rollback Transaction
         if (DB::getConn()->supportsTransactions()) {
             DB::getConn()->transactionRollback();
         }
         echo _t('CodeBankLegacyMigrate.GROUP_NOT_FOUND', '_Could not find users group, cannot migrate, please run dev/build first');
         exit;
     }
     //Start Transaction
     if (DB::getConn()->supportsTransactions()) {
         DB::getConn()->transactionStart();
     }
     //Migrate Languages
     echo '<b>' . _t('CodeBankLegacyMigrate.MIGRATE_USER_LANGUAGES', '_Migrating User Languages') . '</b>... ';
     $results = DB::query('SELECT * FROM "languages" WHERE "user_language"=1');
     if ($results->numRecords() > 0) {
         foreach ($results as $row) {
             DB::query('INSERT INTO "SnippetLanguage" ("ClassName","Created", "LastEdited", "Name", "FileExtension", "HighlightCode", "UserLanguage") ' . "VALUES('SnippetLanguage','" . date('Y-m-d H:i:s') . "','" . date('Y-m-d H:i:s') . "','" . Convert::raw2sql($row['language']) . "','" . Convert::raw2sql($row['file_extension']) . "','" . Convert::raw2sql($row['sjhs_code']) . "',1)");
         }
         echo _t('CodeBankLegacyMigrate.DONE', '_Done') . '<br/>';
     } else {
         echo _t('CodeBankLegacyMigrate.NOT_FOUND', '_None Found') . '<br/>';
     }
     //Migrate Users
     echo '<b>' . _t('CodeBankLegacyMigrate.MIGRATE_USERS', '_Migrating Users') . '</b>...';
     $results = DB::query('SELECT * FROM "users"');
     if ($results->numRecords() > 0) {
         foreach ($results as $row) {
             if ($row['deleted'] == true) {
                 echo '<br/><i>' . _t('CodeBankLegacyMigrate.DELETED_MEMBER_SKIP', '_WARNING: Skipping deleted member {username}, deleted members in Code Bank 3 are not supported', array('username' => $row['username'])) . '</i><br/>';
                 continue;
             }
             //Get user heartbeat preference
             $useHeartbeat = DB::query('SELECT "value" FROM "preferences" WHERE "code"=\'heartbeat\' AND "fkUser"=' . $row['id'])->value();
             //Insert User
             $member = Member::get()->filter('Email', Convert::raw2sql($row['username']))->first();
             if (empty($member) || $member === false || $member->ID == 0) {
                 $member = new Member();
                 $member->FirstName = $row['username'];
                 $member->Email = $row['username'];
                 $member->Password = $row['password'];
                 $member->PasswordEncryption = 'sha1';
                 $member->Locale = 'en_US';
                 $member->DateFormat = 'MMM d, yyyy';
                 $member->TimeFormat = 'h:mm:ss a';
                 $member->UseHeartbeat = intval($useHeartbeat);
                 $member->write();
                 DB::query('UPDATE "Member" ' . 'SET "Password"=\'' . substr(base_convert($row['password'], 16, 36), 0, 64) . '\', ' . '"Salt"=NULL ' . 'WHERE "ID"=' . $member->ID);
                 //Add to security group
                 if ($row['username'] == 'admin') {
                     //For admin add to administrators group
                     $member->addToGroupByCode('administrators');
                 } else {
                     //For all others add to code-bank-api
                     $member->addToGroupByCode('code-bank-api');
                 }
             } else {
                 //Add to code-bank-api if not admin
                 if ($row['username'] != 'admin') {
                     $member->addToGroupByCode('code-bank-api');
                 }
                 $member->UseHeartbeat = intval($useHeartbeat);
                 $member->write();
                 echo '<br/><i>' . _t('CodeBankLegacyMigrate.MEMBER_EXISTS', '_WARNING: Member {username} already exists in the database, no changes have been made to this member. If you are unsure of the password please ask an administrator to have it reset or use the forgot password link', array('username' => $row['username'])) . '</i><br/>';
             }
         }
         echo _t('CodeBankLegacyMigrate.DONE', '_Done') . '<br/>';
     } else {
         //Rollback Transaction
         if (DB::getConn()->supportsTransactions()) {
             DB::getConn()->transactionRollback();
         }
         echo _t('CodeBankLegacyMigrate.NO_USERS_FOUND', '_No users found, Code Bank 2.2 appears to have not been properly setup cannot continue with migration');
         exit;
     }
     //Migrate IP Message
     echo '<b>Migrating IP Message</b>...';
     $ipMessage = DB::query('SELECT "value" FROM "settings" WHERE "code"=\'ipMessage\'')->value();
     $config = CodeBankConfig::CurrentConfig();
     $config->IPMessage = $ipMessage;
     $config->write();
     echo _t('CodeBankLegacyMigrate.DONE', '_Done') . '<br/>';
     //Migrate Snippets
     echo '<b>' . _t('CodeBankLegacyMigrate.MIGRATE_SNIPPETS', '_Migrating Snippets') . '</b>...';
     $results = DB::query('SELECT "snippits".*, "languages"."language", "creator"."username" AS "creatorUsername", "lastEditor"."username" AS "lastEditorUsername" ' . 'FROM "snippits" ' . 'INNER JOIN "languages" ON "snippits"."fkLanguage"="languages"."id" ' . 'LEFT JOIN "users" "creator" ON "snippits"."fkCreatorUser"="creator"."id" ' . 'LEFT JOIN "users" "lastEditor" ON "snippits"."fkLastEditUser"="lastEditor"."id"');
     if ($results->numRecords() > 0) {
         foreach ($results as $row) {
             //Get Creator ID
             $creator = Member::get()->filter('Email', Convert::raw2sql($row['creatorUsername']))->first();
             if (!empty($creator) && $creator !== false && $creator->ID != 0) {
                 $creatorID = $creator->ID;
             } else {
                 $creatorID = 0;
             }
             //Get Last Editor ID
             $lastEditor = Member::get()->filter('Email', Convert::raw2sql($row['lastEditorUsername']))->first();
             if (!empty($lastEditor) && $lastEditor !== false && $lastEditor->ID != 0) {
                 $lastEditorID = $lastEditor->ID;
             } else {
                 $lastEditorID = 0;
             }
             //Get Language ID
             $language = SnippetLanguage::get()->filter('Name', Convert::raw2sql($row['language']))->first();
             if (!empty($language) && $language !== false && $language->ID != 0) {
                 $languageID = $language->ID;
             } else {
                 $languageID = $plainTextID;
             }
             //Insert Snippet Info
             DB::query('INSERT INTO "Snippet" ("ID", "ClassName", "Created", "LastEdited", "Title", "Description", "Tags", "LanguageID", "CreatorID", "LastEditorID") ' . "VALUES(" . $row['id'] . ",'Snippet','" . date('Y-m-d H:i:s') . "','" . date('Y-m-d H:i:s') . "','" . Convert::raw2sql($row['title']) . "','" . Convert::raw2sql($row['description']) . "','" . Convert::raw2sql($row['tags']) . "'," . $languageID . "," . $creatorID . "," . $lastEditorID . ")");
             //Get History
             $versions = DB::query('SELECT * FROM "snippit_history" WHERE "fkSnippit"=' . $row['id']);
             foreach ($versions as $version) {
                 DB::query('INSERT INTO "SnippetVersion" ("ClassName", "Created", "LastEdited", "Text", "ParentID") ' . "VALUES('SnippetVersion','" . date('Y-m-d H:i:s', strtotime($version['date'])) . "','" . date('Y-m-d H:i:s', strtotime($version['date'])) . "','" . Convert::raw2sql($version['text']) . "'," . $row['id'] . ")");
             }
         }
         echo _t('CodeBankLegacyMigrate.DONE', '_Done') . '<br/>';
     } else {
         echo _t('CodeBankLegacyMigrate.NO_SNIPPETS_FOUND', '_No snippets found') . '<br/>';
     }
     //Rename tables
     DB::getConn()->renameTable('snippits', '_obsolete_snippits');
     DB::getConn()->renameTable('snippit_search', '_obsolete_snippit_search');
     DB::getConn()->renameTable('snippit_history', '_obsolete_snippit_history');
     DB::getConn()->renameTable('languages', '_obsolete_languages');
     DB::getConn()->renameTable('settings', '_obsolete_settings');
     DB::getConn()->renameTable('preferences', '_obsolete_preferences');
     DB::getConn()->renameTable('users', '_obsolete_users');
     //Complete Transaction
     if (DB::getConn()->supportsTransactions()) {
         DB::getConn()->transactionEnd();
     }
     //Mark Migrated
     touch(ASSETS_PATH . '/.codeBankMigrated');
     echo '<br/><h4>' . _t('CodeBankLegacyMigrate.MIGRATION_COMPLETE', '_Migration Completed') . '</h4>';
     exit;
 }