From 4f7ddcefe79d33fdc44c7991cde49cd19c45a31a Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Sat, 24 Mar 2018 03:36:07 +0200 Subject: [PATCH] Added checksum validation for VDM packages and improved the JCB package import area --- README.md | 4 +- admin/README.txt | 4 +- admin/access.xml | 1 - .../assets/images/icons/importjcbpackages.png | Bin 0 -> 12303 bytes admin/assets/images/icons/snippet_add.png | Bin 11569 -> 0 bytes admin/helpers/compiler/a_Get.php | 1 + .../en-GB/en-GB.com_componentbuilder.ini | 22 +- .../en-GB/en-GB.com_componentbuilder.sys.ini | 2 - admin/models/componentbuilder.php | 3 +- admin/models/import_joomla_components.php | 442 ++++++------------ .../import_joomla_components/tmpl/default.php | 93 +--- .../import_joomla_components/view.html.php | 13 +- componentbuilder.xml | 2 +- 13 files changed, 197 insertions(+), 390 deletions(-) create mode 100644 admin/assets/images/icons/importjcbpackages.png delete mode 100644 admin/assets/images/icons/snippet_add.png diff --git a/README.md b/README.md index cbd247b0e..2a11f9e30 100644 --- a/README.md +++ b/README.md @@ -126,11 +126,11 @@ Component Builder is mapped as a component in itself on my local development env + *Author*: [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) + *Name*: [Component Builder](http://joomlacomponentbuilder.com) + *First Build*: 30th April, 2015 -+ *Last Build*: 21st March, 2018 ++ *Last Build*: 24th March, 2018 + *Version*: 2.7.0 + *Copyright*: Copyright (C) 2015. All Rights Reserved + *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html -+ *Line count*: **186511** ++ *Line count*: **186317** + *Field count*: **994** + *File count*: **1171** + *Folder count*: **189** diff --git a/admin/README.txt b/admin/README.txt index cbd247b0e..2a11f9e30 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -126,11 +126,11 @@ Component Builder is mapped as a component in itself on my local development env + *Author*: [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) + *Name*: [Component Builder](http://joomlacomponentbuilder.com) + *First Build*: 30th April, 2015 -+ *Last Build*: 21st March, 2018 ++ *Last Build*: 24th March, 2018 + *Version*: 2.7.0 + *Copyright*: Copyright (C) 2015. All Rights Reserved + *License*: GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html -+ *Line count*: **186511** ++ *Line count*: **186317** + *Field count*: **994** + *File count*: **1171** + *Folder count*: **189** diff --git a/admin/access.xml b/admin/access.xml index b9769fd7d..a4f8040d9 100644 --- a/admin/access.xml +++ b/admin/access.xml @@ -344,7 +344,6 @@ - diff --git a/admin/assets/images/icons/importjcbpackages.png b/admin/assets/images/icons/importjcbpackages.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaa924270fda8e81406a86a72334c2b259f65ea GIT binary patch literal 12303 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

<4F#?1WQikMw->sRbFK?(<*@IRKCrzV%KH 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 hyM<3)(hFlBfI7}`@roW9?XQ#0N^ $lineContent) { // we musk keep last few lines to dynamic find target entry later diff --git a/admin/language/en-GB/en-GB.com_componentbuilder.ini b/admin/language/en-GB/en-GB.com_componentbuilder.ini index 2b738099d..05b67d0ec 100644 --- a/admin/language/en-GB/en-GB.com_componentbuilder.ini +++ b/admin/language/en-GB/en-GB.com_componentbuilder.ini @@ -902,8 +902,9 @@ COM_COMPONENTBUILDER_BACKUP_FAILED_PLEASE_TRY_AGAIN_IF_THE_ERROR_CONTINUE_PLEASE COM_COMPONENTBUILDER_BACKUP_LOCAL_DATA_FIRST="Backup Local Data First" COM_COMPONENTBUILDER_BACKUP_WAS_DONE_SUCCESSFULLY="Backup was done successfully" COM_COMPONENTBUILDER_BACK_TO_LIBRARIES="Back to Libraries" -COM_COMPONENTBUILDER_BASIC_METHOD="Basic Method" COM_COMPONENTBUILDER_BASIC_TUTORIAL_ON_GIT_BSB="Basic Tutorial on git: %s" +COM_COMPONENTBUILDER_BBEST_TO_NOT_CONTINUEBBR_THIS_PACKAGE_BFAILEDB_CHECKSUM_VALIDATION_THIS_COULD_BE_A_SERIOUS_SECURITY_BREACH_DO_NOT_CONTINUE="Best to not continue!
This package FAILED checksum validation, this could be a serious security breach! DO NOT CONTINUE!!!" +COM_COMPONENTBUILDER_BBEST_TO_NOT_CONTINUEBBR_WE_COULD_NOT_LOAD_THE_CHECKSUM_FOR_THIS_PACKAGE_AND_SO_NO_VALIDATION_WAS_POSSIBLE_THIS_MAY_BE_DUE_TO_YOUR_NETWORK_OR_A_CHANGE_TO_THAT_PACKAGE_NAME="Best to not continue!
We could not load the checksum for this package, and so no validation was possible. This may be due to your network, or a change to that package name." COM_COMPONENTBUILDER_BCUSTOM_FILESB_NOT_MOVE_TO_CORRECT_LOCATION="Custom files not move to correct location!" COM_COMPONENTBUILDER_BEHIND="Behind" COM_COMPONENTBUILDER_BEHIND_MEANS_YOUR_BLOCAL_SNIPPETB_WITH_THE_SAME_NAME_LIBRARY_AND_TYPE_HAS_A_BOLDER_MODIFIED_DATEB_THEN_THE_COMMUNITY_SNIPPET_WITH_THE_SAME_NAME_LIBRARY_AND_TYPE="Behind means your local snippet (with the same name, library and type) has a older modified date then the community snippet (with the same name, library and type)." @@ -929,6 +930,7 @@ COM_COMPONENTBUILDER_BULK_UPDATE_ALL_AVAILABLE_SNIPPETS="Bulk Update All Availab COM_COMPONENTBUILDER_BULK_UPDATE_ALL_DIVERGED_SNIPPETS="Bulk Update All Diverged Snippets" COM_COMPONENTBUILDER_BULK_UPDATE_ALL_OUT_DATED_SNIPPETS="Bulk Update All Out Dated Snippets" COM_COMPONENTBUILDER_BUTTON_TO_CREATE_S_WILL_SHOW_ONCE_S_IS_SAVED_FOR_THE_FIRST_TIME="Button to create %s will show once %s is saved for the first time." +COM_COMPONENTBUILDER_CANCEL="Cancel" COM_COMPONENTBUILDER_CHAIN="Chain" COM_COMPONENTBUILDER_CHECK_YOUR_OWNER_DETAILS_IT_HAS_NOT_BEEN_SET_OPEN_THE_JCB_GLOBAL_OPTIONS_GO_TO_THE_COMPANY_TAB_AND_ADD_THE_CORRECT_COMPANY_DETAILS_THERE="Check your owner details, it has not been set. Open the JCB Global Options, go to the Company tab and add the correct company details there." COM_COMPONENTBUILDER_CLEAR_TMP="Clear tmp" @@ -3191,6 +3193,7 @@ COM_COMPONENTBUILDER_DASHBOARD_FIELD_ADD="Add Field

" COM_COMPONENTBUILDER_DASHBOARD_GETSNIPPETS="Get Snippets

" COM_COMPONENTBUILDER_DASHBOARD_HELP_DOCUMENTS="Help Documents

" COM_COMPONENTBUILDER_DASHBOARD_HELP_DOCUMENT_ADD="Add Help Document

" +COM_COMPONENTBUILDER_DASHBOARD_IMPORTJCBPACKAGES="Import JCB Packages

" COM_COMPONENTBUILDER_DASHBOARD_JOOMLA_COMPONENTS="Joomla Components

" COM_COMPONENTBUILDER_DASHBOARD_JOOMLA_COMPONENT_ADD="Add Joomla Component

" COM_COMPONENTBUILDER_DASHBOARD_LANGUAGE_TRANSLATIONS="Language Translations

" @@ -3202,7 +3205,6 @@ COM_COMPONENTBUILDER_DASHBOARD_SERVERS="Servers

" COM_COMPONENTBUILDER_DASHBOARD_SITE_VIEWS="Site Views

" COM_COMPONENTBUILDER_DASHBOARD_SITE_VIEW_ADD="Add Site View

" COM_COMPONENTBUILDER_DASHBOARD_SNIPPETS="Snippets

" -COM_COMPONENTBUILDER_DASHBOARD_SNIPPET_ADD="Add Snippet

" COM_COMPONENTBUILDER_DASHBOARD_TEMPLATES="Templates

" COM_COMPONENTBUILDER_DASHBOARD_TEMPLATE_ADD="Add Template

" COM_COMPONENTBUILDER_DATE="Date" @@ -3879,10 +3881,14 @@ COM_COMPONENTBUILDER_FIELD_XML_LABEL="XML field definition (Please set the field COM_COMPONENTBUILDER_FIELD_YES="Yes" COM_COMPONENTBUILDER_FIELD_ZERO="0" COM_COMPONENTBUILDER_FILE="File" -COM_COMPONENTBUILDER_FILE_BSB_WAS_NOT_MOVE_TO_S="File %s was not move to (%s)!" +COM_COMPONENTBUILDER_FILE_BSB_COULD_NOT_BE_UNLOCKED="File %s could not be unlocked!" +COM_COMPONENTBUILDER_FILE_BSB_WAS_MOVED_TO_BSB="File %s was moved to %s" +COM_COMPONENTBUILDER_FILE_BSB_WAS_NOT_MOVE_TO_BSB="File %s was not move to %s" +COM_COMPONENTBUILDER_FILE_BSB_WAS_SUCCESSFULLY_UNLOCKED="File %s was successfully unlocked!" COM_COMPONENTBUILDER_FILTER="Filter" COM_COMPONENTBUILDER_FOLDER="Folder" -COM_COMPONENTBUILDER_FOLDER_BSB_WAS_NOT_MOVE_TO_S="Folder %s was not move to (%s)!" +COM_COMPONENTBUILDER_FOLDER_BSB_WAS_MOVED_TO_BSB="Folder %s was moved to %s" +COM_COMPONENTBUILDER_FOLDER_BSB_WAS_NOT_MOVE_TO_BSB="Folder %s was not move to %s" COM_COMPONENTBUILDER_FORCE_LOCAL_UPDATE="Force Local Update" COM_COMPONENTBUILDER_FULL_WIDTH_IN_TAB="Full Width in Tab" COM_COMPONENTBUILDER_GENERAL_OVERVIEW_OF_HOW_THINGS_WORK_BSB="General overview of how things work: %s" @@ -5271,6 +5277,7 @@ COM_COMPONENTBUILDER_PERMISSIONS="Permissions" COM_COMPONENTBUILDER_PLEASE_ADD_FILES_TO_S="Please add files to (%s)" COM_COMPONENTBUILDER_PLEASE_ADD_FOLDERS_TO_S="Please add folders to (%s)" COM_COMPONENTBUILDER_PLEASE_CHECK_AGAIN_LATTER="Please check again latter." +COM_COMPONENTBUILDER_PLEASE_NOTE_THAT_THIS_PACKAGE_BHAS_NOB_CHECKSUM_VALIDATION="Please note that this package has no checksum validation!" COM_COMPONENTBUILDER_PLEASE_SELECT_A_COMPONENT_THAT_YOU_WOULD_LIKE_TO_COMPILE="Please select a component that you would like to compile." COM_COMPONENTBUILDER_PLEASE_TRY_AGAIN_LATER="Please try again later" COM_COMPONENTBUILDER_PLEASE_WAIT_CLEARING_THE_TMP_FOLDER="Please wait! Clearing the tmp folder" @@ -5927,8 +5934,6 @@ COM_COMPONENTBUILDER_SNIPPETS_BATCH_USE_DESC="Allows users in this group to use COM_COMPONENTBUILDER_SNIPPETS_COULD_NOT_BE_UPDATEDSAVED="Snippets could not be updated/saved" COM_COMPONENTBUILDER_SNIPPETS_CREATE="Snippets Create" COM_COMPONENTBUILDER_SNIPPETS_CREATE_DESC="Allows the users in this group to create create snippets" -COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_ADD="Snippets Dashboard Add" -COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_ADD_DESC="Allows the users in this group to update the dashboard add of the snippet" COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_LIST="Snippets Dashboard List" COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the snippet" COM_COMPONENTBUILDER_SNIPPETS_DELETE="Snippets Delete" @@ -6109,6 +6114,8 @@ COM_COMPONENTBUILDER_SNIPPET_USAGE_HINT="Add Usage Here" COM_COMPONENTBUILDER_SNIPPET_USAGE_LABEL="Usage" COM_COMPONENTBUILDER_SNIPPET_VERSION_DESC="A count of the number of times this Snippet has been revised." COM_COMPONENTBUILDER_SNIPPET_VERSION_LABEL="Revision" +COM_COMPONENTBUILDER_SOME_BCUSTOM_FILESB_WERE_MOVED_TO_BSB="Some Custom files were moved to %s" +COM_COMPONENTBUILDER_SOME_BIMAGESB_WERE_MOVED_TO_BSB="Some Images were moved to %s" COM_COMPONENTBUILDER_SORRY_THIS_FUNCTION_NAME_IS_ALREADY_IN_USE="Sorry this function name is already in use!" COM_COMPONENTBUILDER_SORTABLE="Sortable" COM_COMPONENTBUILDER_SUBMENU="Submenu" @@ -6263,6 +6270,7 @@ COM_COMPONENTBUILDER_THERE_ARE_NO_NEW_SNIPPETS_AT_THIS_TIME="There are no new sn COM_COMPONENTBUILDER_THERE_ARE_NO_OUT_OF_DATE_SNIPPETS_AT_THIS_TIME="There are no out of date snippets at this time" COM_COMPONENTBUILDER_THERE_ARE_NO_SNIPPETS_TO_UPDATE_AT_THIS_TIME="There are no snippets to update at this time" COM_COMPONENTBUILDER_THERE_HAS_BEEN_AN_ERROR_IF_THIS_CONTINUES_PLEASE_INFORM_YOUR_SYSTEM_ADMINISTRATOR_OF_A_TYPE_ERROR_IN_THE_FIELDS_DISPLAY_REQUEST="There has been an error, if this continues please inform your system administrator of a type error in the fields display request!" +COM_COMPONENTBUILDER_THERE_WAS_AN_ERROR_GETTING_THE_PACKAGE_INFO="There was an error getting the package info." COM_COMPONENTBUILDER_THERE_WAS_A_PROBLEM_BNO_VIEW_OR_ID_FOUND_IN_SESSION_OR_VIEW_NOT_ALLOWED_TO_ACCESS_AREAB_WE_COULD_NOT_LOAD_ANY_LINKED_TO_VALUES_PLEASE_INFORM_YOUR_SYSTEM_ADMINISTRATOR="There was a problem, no view or id found in session or view not allowed to access area, we could not load any linked to values. Please inform your system administrator!" COM_COMPONENTBUILDER_THESE_ARE_THE_SAME_PACKAGES_FOUND_ON_A_S_GITHUBA_AND_CAN_BE_IMPORTED_BY_SIMPLY_MAKING_A_SELECTION_AND_THEN_CLICKING_THE_GET_PACKAGE_BUTTONBR_SOME_OF_THESE_PACKAGES_WOULD_REQUIRE_A_KEY_SINCE_THEY_ARE_NOT_FREE_A_S_GET_A_KEY_TODAYA="These are the same packages found on gitHub and can be imported by simply making a selection and then clicking the [Get Package] button.
Some of these packages would require a key, since they are not free. Get a key today!." COM_COMPONENTBUILDER_THE_BPHPSECLIBNETSFTPB_LIBRARYCLASS_IS_NOT_AVAILABLE_THIS_LIBRARYCLASS_SHOULD_HAVE_BEEN_ADDED_TO_YOUR_BLIBRARIESVDM_IOVENDORB_FOLDER_PLEASE_CONTACT_YOUR_SYSTEM_ADMINISTRATOR_FOR_MORE_INFO="The phpseclib\NET\SFTP library\class is not available! This library\class should have been added to your libraries/vdm_io/vendor folder. Please contact your system administrator for more info" @@ -6299,6 +6307,7 @@ COM_COMPONENTBUILDER_THE_SNIPPET_WAS_SUCCESSFULLY_EXPORTED="The Snippet Was Succ COM_COMPONENTBUILDER_THE_URL_S_SET_TO_RETRIEVE_THE_PACKAGES_DOES_NOT_EXIST="The url (%s) set to retrieve the packages does not exist!" COM_COMPONENTBUILDER_THE_WIKI_IS_LOADING="The wiki is loading" COM_COMPONENTBUILDER_THIS_BSB_IS_NOT_LINKED_TO_ANY_OTHER_AREAS_OF_JCB_AT_THIS_TIME="This %s is not linked to any other areas of JCB at this time!" +COM_COMPONENTBUILDER_THIS_PACKAGE_BPASSEDB_CHECKSUM_VALIDATION_PLEASE_VALIDATE_THIS_CHECKSUM_BSB_TO_BE_THE_SAME_AS_THE_ONE_FOUND_A_S_SA="This package PASSED checksum validation! Please validate this checksum: %s to be the same as the one found @ " COM_COMPONENTBUILDER_THIS_PACKAGE_HAS_NO_KEY="This package has no key." COM_COMPONENTBUILDER_TITLE="Title" COM_COMPONENTBUILDER_TOTAL_DOWNLOADS="total downloads" @@ -6342,6 +6351,7 @@ COM_COMPONENTBUILDER_WEBSITE="Website" COM_COMPONENTBUILDER_WEBSITE_S="Website: %s" COM_COMPONENTBUILDER_WE_DID_NOT_CHECK_THE_SNIPPET_IT_SELF_TO_SEE_IF_IT_CHANGED_WE_ONLY_WORK_ON_DATES="We did not check the snippet it self, to see if it changed. We only work on dates." COM_COMPONENTBUILDER_WE_FAILED_TO_MOVE_BSB="We failed to move %s!" +COM_COMPONENTBUILDER_WE_SUCCESSFULLY_MOVED_BSB="We successfully moved %s!" COM_COMPONENTBUILDER_YES="Yes" COM_COMPONENTBUILDER_YOUR_DATA_IS_ENCRYPTED_WITH_A_AES_ONE_HUNDRED_AND_TWENTY_EIGHT_BIT_ENCRYPTION_USING_THE_ABOVE_THIRTY_TWO_CHARACTER_KEYBR_WITHOUT_THIS_KEY_IT_WILL_TAKE_THE_CURRENT_TECHNOLOGY_WITH_A_BRUTE_FORCE_ATTACK_METHOD_MORE_THEN_A_HREFHTTPRANDOMIZECOMHOWLONGTOHACKPASS_TARGET_BLANK_TITLEHOW_LONG_TO_HACK_PASSSEVEN_HUNDRED_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZEROA_YEARS_TO_CRACK_THEORETICALLY="Your data is encrypted with a AES 128 bit encryption using the above 32 character key.
Without this key it will take the current technology with a brute force attack method more then
700 000 000 000 000 000 000 000 000 000 000 years to crack theoretically." COM_COMPONENTBUILDER_YOUR_DATA_IS_ENCRYPTED_WITH_A_AES_ONE_HUNDRED_AND_TWENTY_EIGHT_BIT_ENCRYPTION_USING_THE_ABOVE_THIRTY_TWO_CHARACTER_KEY_WITHOUT_THIS_KEY_IT_WILL_TAKE_THE_CURRENT_TECHNOLOGY_WITH_A_BRUTE_FORCE_ATTACK_METHOD_MORE_THEN_A_HREFHTTPRANDOMIZECOMHOWLONGTOHACKPASS_TARGET_BLANK_TITLEHOW_LONG_TO_HACK_PASSSEVEN_HUNDRED_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZERO_ZEROA_YEARS_TO_CRACK_THEORETICALLY_UNLESS_THEY_HAVE_THIS_KEY_ABOVE_SO_DO_KEEP_IT_SAFE="Your data is encrypted with a AES 128 bit encryption using the above 32 character key. Without this key it will take the current technology with a brute force attack method more then 700 000 000 000 000 000 000 000 000 000 000 years to crack theoretically. Unless they have this key above, so do keep it safe." diff --git a/admin/language/en-GB/en-GB.com_componentbuilder.sys.ini b/admin/language/en-GB/en-GB.com_componentbuilder.sys.ini index 4c001d1ce..43cb5b05c 100644 --- a/admin/language/en-GB/en-GB.com_componentbuilder.sys.ini +++ b/admin/language/en-GB/en-GB.com_componentbuilder.sys.ini @@ -696,8 +696,6 @@ COM_COMPONENTBUILDER_SNIPPETS_BATCH_USE="Snippets Batch Use" COM_COMPONENTBUILDER_SNIPPETS_BATCH_USE_DESC="Allows users in this group to use batch copy/update method of batch snippets" COM_COMPONENTBUILDER_SNIPPETS_CREATE="Snippets Create" COM_COMPONENTBUILDER_SNIPPETS_CREATE_DESC="Allows the users in this group to create create snippets" -COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_ADD="Snippets Dashboard Add" -COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_ADD_DESC="Allows the users in this group to update the dashboard add of the snippet" COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_LIST="Snippets Dashboard List" COM_COMPONENTBUILDER_SNIPPETS_DASHBOARD_LIST_DESC="Allows the users in this group to update the dashboard list of the snippet" COM_COMPONENTBUILDER_SNIPPETS_DELETE="Snippets Delete" diff --git a/admin/models/componentbuilder.php b/admin/models/componentbuilder.php index 932c065e9..edec1b78e 100644 --- a/admin/models/componentbuilder.php +++ b/admin/models/componentbuilder.php @@ -43,7 +43,7 @@ class ComponentbuilderModelComponentbuilder extends JModelList $icons = array(); // view groups array $viewGroups = array( - 'main' => array('png.compiler', 'png.joomla_component.add', 'png.joomla_components', 'png.admin_view.add', 'png.admin_views', 'png.custom_admin_view.add', 'png.custom_admin_views', 'png.site_view.add', 'png.site_views', 'png.template.add', 'png.templates', 'png.layout.add', 'png.layouts', 'png.dynamic_get.add', 'png.dynamic_gets', 'png.custom_codes', 'png.libraries', 'png.snippet.add', 'png.snippets', 'png||getsnippets||index.php?option=com_componentbuilder&view=get_snippets', 'png.field.add', 'png.fields', 'png.fields.catid', 'png.fieldtype.add', 'png.fieldtypes', 'png.fieldtypes.catid', 'png.language_translations', 'png.servers', 'png.help_document.add', 'png.help_documents') + 'main' => array('png.compiler', 'png.joomla_component.add', 'png.joomla_components', 'png.admin_view.add', 'png.admin_views', 'png||importjcbpackages||index.php?option=com_componentbuilder&view=import_joomla_components&target=smartPackage', 'png.custom_admin_view.add', 'png.custom_admin_views', 'png.site_view.add', 'png.site_views', 'png.template.add', 'png.templates', 'png.layout.add', 'png.layouts', 'png.dynamic_get.add', 'png.dynamic_gets', 'png.custom_codes', 'png.libraries', 'png.snippets', 'png||getsnippets||index.php?option=com_componentbuilder&view=get_snippets', 'png.field.add', 'png.fields', 'png.fields.catid', 'png.fieldtype.add', 'png.fieldtypes', 'png.fieldtypes.catid', 'png.language_translations', 'png.servers', 'png.help_document.add', 'png.help_documents') ); // view access array $viewAccess = array( @@ -101,7 +101,6 @@ class ComponentbuilderModelComponentbuilder extends JModelList 'snippet.access' => 'snippet.access', 'snippets.submenu' => 'snippet.submenu', 'snippets.dashboard_list' => 'snippet.dashboard_list', - 'snippet.dashboard_add' => 'snippet.dashboard_add', 'field.create' => 'field.create', 'fields.access' => 'field.access', 'field.access' => 'field.access', diff --git a/admin/models/import_joomla_components.php b/admin/models/import_joomla_components.php index de71c6545..7d5558c76 100644 --- a/admin/models/import_joomla_components.php +++ b/admin/models/import_joomla_components.php @@ -93,6 +93,8 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy protected $fieldTypes = array(); protected $isMultiple = array(); protected $specialValue = false; + protected $checksum = null; + protected $checksumURLs = array('vdm' => 'https://raw.githubusercontent.com/vdm-io/JCB-Packages/master/'); /** * Import an spreadsheet from either folder, url or upload. @@ -102,24 +104,30 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy */ public function import() { + // set the state to import $this->setState('action', 'import'); - $this->app = JFactory::getApplication(); - $session = JFactory::getSession(); - $package = null; - $continue = false; + // get App + $this->app = JFactory::getApplication(); + // get session + $session = JFactory::getSession(); + // some defaults + $package = null; + $continue = false; // get import type - $this->getType = $this->app->input->getString('gettype', NULL); + $this->getType = $this->app->input->getString('gettype', NULL); + // do checksum validation + $this->checksum = $this->app->input->getString('checksum', NULL); // get import type - $this->getType = $this->app->input->getString('gettype', NULL); - // get import type - $this->dataType = $session->get('dataType_VDM_IMPORTINTO', NULL); - + $this->dataType = $session->get('dataType_VDM_IMPORTINTO', NULL); + // if we have no package if ($package === null) { + // we must allow unsafe with smart import since it is code being imported. if ($this->dataType === 'smart_package') { $this->allow_unsafe = true; } + // action based on get Type switch ($this->getType) { case 'folder': @@ -136,7 +144,6 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $package = $this->_getPackageFromUrl(); break; - case 'continue-basic': case 'continue-ext': $continue = true; $package = $session->get('package', null); @@ -149,7 +156,39 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy break; default: - $this->app->setUserState('com_componentbuilder.message', JText::_('COM_COMPONENTBUILDER_IMPORT_NO_IMPORT_TYPE_FOUND')); + $package = $session->get('package', null); + if (ComponentbuilderHelper::checkJson($package)) + { + // get package + $package = json_decode($package, true); + // remove zip file + if (isset($package['packagename'])) + { + $this->remove($package['packagename']); + } + // check if dir is set + if (isset($package['dir'])) + { + // set auto loader + ComponentbuilderHelper::autoLoader('smart'); + // get install folder + $dir = JFile::stripExt($package['dir']); + // remove unziped folder + ComponentbuilderHelper::removeFolder($dir); + } + } + // clear session + $session->clear('package'); + $session->clear('dataType'); + $session->clear('hasPackage'); + $session->clear('smart_package_info'); + $back = $session->get('backto_VDM_IMPORT', NULL); + $session->clear('backto_VDM_IMPORT'); + if ($back) + { + $this->app->setUserState('com_componentbuilder.redirect_url', 'index.php?option=com_componentbuilder&view='.$back); + } + $session->clear('backto_VDM_IMPORT'); return false; break; } @@ -170,35 +209,28 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy if(!$continue) { // check if this a smart package, if true then get info - if ($this->dataType === 'smart_package') + if ($this->dataType !== 'smart_package' || !$this->getInfo($package, $session)) { - $this->getInfo($package, $session); + $this->app->setUserState('com_componentbuilder.message', JText::_('COM_COMPONENTBUILDER_THERE_WAS_AN_ERROR_GETTING_THE_PACKAGE_INFO')); + return false; } - $package = json_encode($package); + // set package to session + $package = json_encode($package); $session->set('package', $package); $session->set('dataType', $this->dataType); $session->set('hasPackage', true); return true; } - - // set the data - if ('continue-basic' == $this->getType) - { - $headerList = json_decode($session->get($this->dataType.'_VDM_IMPORTHEADERS', false), true); - } - else - { - $headerList = null; - // force update - $this->forceUpdate = $this->app->input->getInt('force_update', 0); - // show more information - $this->moreInfo = $this->app->input->getInt('more_info', 0); - // has a key - $this->hasKey = $this->app->input->getInt('haskey', 0); - // die sleutle - $this->sleutle = $this->app->input->getString('sleutle', NULL); - } - if (!$this->setData($package, $headerList)) + // force update + $this->forceUpdate = $this->app->input->getInt('force_update', 0); + // show more information + $this->moreInfo = $this->app->input->getInt('more_info', 0); + // has a key + $this->hasKey = $this->app->input->getInt('haskey', 0); + // die sleutle + $this->sleutle = $this->app->input->getString('sleutle', NULL); + // try to store/set data + if (!$this->setData($package)) { // There was an error importing the package $msg = JText::_('COM_COMPONENTBUILDER_IMPORT_ERROR'); @@ -219,8 +251,8 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $back = $session->get('backto_VDM_IMPORT', NULL); if ($back) { - $this->app->setUserState('com_componentbuilder.redirect_url', 'index.php?option=com_componentbuilder&view='.$back); - $session->clear('backto_VDM_IMPORT'); + $this->app->setUserState('com_componentbuilder.redirect_url', 'index.php?option=com_componentbuilder&view='.$back); + $session->clear('backto_VDM_IMPORT'); } $result = true; } @@ -230,7 +262,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // remove file after import $this->remove($package['packagename']); - $session->clear($this->getType.'_VDM_IMPORTHEADERS'); + return $result; } @@ -244,6 +276,49 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // extract the package if (JFile::exists($package['dir'])) { + // does this package pass a checksum + $checksum = false; + $checksumStatus = 'warning'; + $checksumMessage = JText::_('COM_COMPONENTBUILDER_PLEASE_NOTE_THAT_THIS_PACKAGE_BHAS_NOB_CHECKSUM_VALIDATION'); + // do hash validation here for git repos + if (ComponentbuilderHelper::checkString($this->checksum) && isset($this->checksumURLs[$this->checksum])) + { + // get packages checksums + $checksums = ComponentbuilderHelper::getFileContents($this->checksumURLs[$this->checksum].'checksum.json'); + if (ComponentbuilderHelper::checkJson($checksums)) + { + // convert to array + $checksums = json_decode($checksums, true); + // get package name + $packageName = basename($package['dir']); + // check if package is found + if (isset($checksums[$packageName])) + { + // validate checksum + if ($checksums[$packageName] === sha1_file($package['dir'])) + { + $validator = $this->checksumURLs[$this->checksum].str_replace('.zip', '.sha', $packageName); + $checksumMessage = JText::sprintf('COM_COMPONENTBUILDER_THIS_PACKAGE_BPASSEDB_CHECKSUM_VALIDATION_PLEASE_VALIDATE_THIS_CHECKSUM_BSB_TO_BE_THE_SAME_AS_THE_ONE_FOUND_A_S_SA', $checksums[$packageName], 'href="'.$validator.'" target="_blank" title="verify checksum">', $validator); + $checksumStatus = 'Success'; + $checksum = true; + } + } + // set error + if (!$checksum) + { + $checksumMessage = JText::_('COM_COMPONENTBUILDER_BBEST_TO_NOT_CONTINUEBBR_THIS_PACKAGE_BFAILEDB_CHECKSUM_VALIDATION_THIS_COULD_BE_A_SERIOUS_SECURITY_BREACH_DO_NOT_CONTINUE'); + $checksumStatus = 'error'; + } + } + // set error + else + { + $checksumMessage = JText::_('COM_COMPONENTBUILDER_BBEST_TO_NOT_CONTINUEBBR_WE_COULD_NOT_LOAD_THE_CHECKSUM_FOR_THIS_PACKAGE_AND_SO_NO_VALIDATION_WAS_POSSIBLE_THIS_MAY_BE_DUE_TO_YOUR_NETWORK_OR_A_CHANGE_TO_THAT_PACKAGE_NAME'); + $checksumStatus = 'error'; + } + } + // do not have check sum validation + $this->app->enqueueMessage($checksumMessage, $checksumStatus); // get the zip adapter $zip = JArchive::getAdapter('zip'); // set the directory name @@ -469,11 +544,6 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // check the extension switch(strtolower(pathinfo($file, PATHINFO_EXTENSION))) { - case 'xls': - case 'ods': - case 'csv': - return true; - break; case 'zip': if ($this->dataType === 'smart_package') { @@ -519,32 +589,11 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy * @return boolean false on failure * **/ - protected function setData($package, $target_headers) + protected function setData($package) { $jinput = JFactory::getApplication()->input; // set the data based on the type of import being done - if ('continue-basic' === $this->getType && ComponentbuilderHelper::checkArray($target_headers)) - { - foreach($target_headers as $header) - { - $data['target_headers'][$header] = $jinput->getString($header, null); - } - // make sure the file is loaded - JLoader::import('PHPExcel', JPATH_COMPONENT_ADMINISTRATOR . '/helpers'); - // set the data - if(isset($package['dir'])) - { - $inputFileType = PHPExcel_IOFactory::identify($package['dir']); - $excelReader = PHPExcel_IOFactory::createReader($inputFileType); - $excelReader->setReadDataOnly(true); - $excelObj = $excelReader->load($package['dir']); - $data['array'] = $excelObj->getActiveSheet()->toArray(null, true,true,true); - $excelObj->disconnectWorksheets(); - unset($excelObj); - return $this->saveBasic($data); - } - } - elseif ('continue-ext' === $this->getType) + if ('continue-ext' === $this->getType) { // set the data if(isset($package['dir'])) @@ -685,14 +734,13 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy **/ protected function saveSmartItems($table) { - $success = true; if (isset($this->data[$table]) && ComponentbuilderHelper::checkArray($this->data[$table])) { // get global action permissions - $canDo = ComponentbuilderHelper::getActions($table); - $canEdit = $canDo->get('core.edit'); - $canState = $canDo->get('core.edit.state'); - $canCreate = $canDo->get('core.create'); + $canDo = ComponentbuilderHelper::getActions($table); + $canEdit = $canDo->get('core.edit'); + $canState = $canDo->get('core.edit.state'); + $canCreate = $canDo->get('core.create'); // set id keeper if (!isset($this->newID[$table])) { @@ -770,7 +818,7 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy } } } - return $success; + return true; } /** @@ -799,6 +847,11 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $this->app->enqueueMessage(JText::_('COM_COMPONENTBUILDER_BCUSTOM_FILESB_NOT_MOVE_TO_CORRECT_LOCATION'), 'error'); $success = false; } + // display more import info + elseif ($this->moreInfo) + { + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_SOME_BCUSTOM_FILESB_WERE_MOVED_TO_BSB', $customPath), 'success'); + } } // check if we have images $imageDir = str_replace('//', '/', $this->dir . '/images'); @@ -810,6 +863,11 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $this->app->enqueueMessage(JText::_('COM_COMPONENTBUILDER_BIMAGESB_NOT_MOVE_TO_CORRECT_LOCATION'), 'error'); $success = false; } + // display more import info + elseif ($this->moreInfo) + { + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_SOME_BIMAGESB_WERE_MOVED_TO_BSB', $imagesPath), 'success'); + } } // now move the dynamic files if found $dynamicDir = str_replace('//', '/', $this->dir . '/dynamic'); @@ -826,9 +884,14 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $fullPath = str_replace('//', '/', $dynamicDir . '/' . $folder); if (!JFolder::exists($fullPath) || !JFolder::copy($fullPath, $destination,'',true)) { - $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FOLDER_BSB_WAS_NOT_MOVE_TO_S', $folder, $destination), 'error'); + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FOLDER_BSB_WAS_NOT_MOVE_TO_BSB', $folder, $destination), 'error'); $success = false; } + // display more import info + elseif ($this->moreInfo) + { + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FOLDER_BSB_WAS_MOVED_TO_BSB', $folder, $destination), 'success'); + } } } // get a list of files @@ -842,9 +905,14 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy $fullPath = str_replace('//', '/', $dynamicDir . '/' . $file); if (!JFile::exists($fullPath) || !JFile::copy($fullPath, $destination)) { - $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FILE_BSB_WAS_NOT_MOVE_TO_S', $file, $destination), 'error'); + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FILE_BSB_WAS_NOT_MOVE_TO_BSB', $file, $destination), 'error'); $success = false; } + // display more import info + elseif ($this->moreInfo) + { + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FILE_BSB_WAS_MOVED_TO_BSB', $file, $destination), 'success'); + } } } } @@ -902,7 +970,13 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy // write the decrypted data back to file if (!ComponentbuilderHelper::writeFile($file, rtrim($unlocker->decryptString($data), "\0"))) { - // we should add error handler here in case file could not be unlocked + // in case file could not be unlocked + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FILE_BSB_COULD_NOT_BE_UNLOCKED', $file), 'error'); + } + // display more import info + elseif ($this->moreInfo) + { + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_FILE_BSB_WAS_SUCCESSFULLY_UNLOCKED', $file), 'success'); } } @@ -1978,6 +2052,11 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy } // add the data to the mover $this->divergedDataMover[$table][$uniqueKey]->{$type} = $values; + // display more import info + if ($this->moreInfo) + { + $this->app->enqueueMessage(JText::sprintf('COM_COMPONENTBUILDER_WE_SUCCESSFULLY_MOVED_BSB', ComponentbuilderHelper::safeString($type, 'Ww') . ' to ('.ComponentbuilderHelper::safeString($table, 'w').')'), 'success'); + } // success return true; } @@ -2442,223 +2521,6 @@ class ComponentbuilderModelImport_joomla_components extends JModelLegacy return false; } - /** - * Save the data from the file to the database - * - * @param array $data The values to save - * - * @return boolean false on failure - * - **/ - protected function saveBasic($data) - { - // import the data if there is any - if(ComponentbuilderHelper::checkArray($data['array'])) - { - // get user object - $this->user = JFactory::getUser(); - // remove header if it has headers - $id_key = $data['target_headers']['id']; - $published_key = $data['target_headers']['published']; - $ordering_key = $data['target_headers']['ordering']; - // get the first array set - $firstSet = reset($data['array']); - - // check if first array is a header array and remove if true - if($firstSet[$id_key] == 'id' || $firstSet[$published_key] == 'published' || $firstSet[$ordering_key] == 'ordering') - { - array_shift($data['array']); - } - - // make sure there is still values in array and that it was not only headers - if(ComponentbuilderHelper::checkArray($data['array']) && $this->user->authorise($this->dataType.'.import', 'com_componentbuilder') && $this->user->authorise('core.import', 'com_componentbuilder')) - { - // set target. - $target = array_flip($data['target_headers']); - // set some defaults - $todayDate = JFactory::getDate()->toSql(); - // get global action permissions - $canDo = ComponentbuilderHelper::getActions($this->dataType); - $canEdit = $canDo->get('core.edit'); - $canState = $canDo->get('core.edit.state'); - $canCreate = $canDo->get('core.create'); - $hasAlias = $this->getAliasesUsed($this->dataType); - // prosses the data - foreach($data['array'] as $row) - { - $found = false; - if (isset($row[$id_key]) && is_numeric($row[$id_key]) && $row[$id_key] > 0) - { - // raw items import & update! - $query = $this->_db->getQuery(true); - $query - ->select('version') - ->from($this->_db->quoteName('#__componentbuilder_'.$this->dataType)) - ->where($this->_db->quoteName('id') . ' = '. $this->_db->quote($row[$id_key])); - // Reset the query using our newly populated query object. - $this->_db->setQuery($query); - $this->_db->execute(); - $found = $this->_db->getNumRows(); - } - - if($found && $canEdit) - { - // update item - $id = $row[$id_key]; - $version = $this->_db->loadResult(); - // reset all buckets - $query = $this->_db->getQuery(true); - $fields = array(); - // Fields to update. - foreach($row as $key => $cell) - { - // ignore column - if ('IGNORE' == $target[$key]) - { - continue; - } - // update modified - if ('modified_by' == $target[$key]) - { - continue; - } - // update modified - if ('modified' == $target[$key]) - { - continue; - } - // update version - if ('version' == $target[$key]) - { - $cell = (int) $version + 1; - } - // verify publish authority - if ('published' == $target[$key] && !$canState) - { - continue; - } - // set to update array - if(in_array($key, $data['target_headers']) && is_numeric($cell)) - { - $fields[] = $this->_db->quoteName($target[$key]) . ' = ' . $cell; - } - elseif(in_array($key, $data['target_headers']) && is_string($cell)) - { - $fields[] = $this->_db->quoteName($target[$key]) . ' = ' . $this->_db->quote($cell); - } - elseif(in_array($key, $data['target_headers']) && is_null($cell)) - { - // if import data is null then set empty - $fields[] = $this->_db->quoteName($target[$key]) . " = ''"; - } - } - // load the defaults - $fields[] = $this->_db->quoteName('modified_by') . ' = ' . $this->_db->quote($this->user->id); - $fields[] = $this->_db->quoteName('modified') . ' = ' . $this->_db->quote($todayDate); - // Conditions for which records should be updated. - $conditions = array( - $this->_db->quoteName('id') . ' = ' . $id - ); - $query->update($this->_db->quoteName('#__componentbuilder_' . $this->dataType))->set($fields)->where($conditions); - $this->_db->setQuery($query); - $this->_db->execute(); - } - elseif ($canCreate) - { - // insert item - $query = $this->_db->getQuery(true); - // reset all buckets - $columns = array(); - $values = array(); - $version = false; - // Insert columns. Insert values. - foreach($row as $key => $cell) - { - // ignore column - if ('IGNORE' == $target[$key]) - { - continue; - } - // remove id - if ('id' == $target[$key]) - { - continue; - } - // update created - if ('created_by' == $target[$key]) - { - continue; - } - // update created - if ('created' == $target[$key]) - { - continue; - } - // Make sure the alias is incremented - if ('alias' == $target[$key]) - { - $cell = $this->getAlias($cell,$this->dataType); - } - // update version - if ('version' == $target[$key]) - { - $cell = 1; - $version = true; - } - // set to insert array - if(in_array($key, $data['target_headers']) && is_numeric($cell)) - { - $columns[] = $target[$key]; - $values[] = $cell; - } - elseif(in_array($key, $data['target_headers']) && is_string($cell)) - { - $columns[] = $target[$key]; - $values[] = $this->_db->quote($cell); - } - elseif(in_array($key, $data['target_headers']) && is_null($cell)) - { - // if import data is null then set empty - $columns[] = $target[$key]; - $values[] = "''"; - } - } - // load the defaults - $columns[] = 'created_by'; - $values[] = $this->_db->quote($this->user->id); - $columns[] = 'created'; - $values[] = $this->_db->quote($todayDate); - if (!$version) - { - $columns[] = 'version'; - $values[] = 1; - } - // Prepare the insert query. - $query - ->insert($this->_db->quoteName('#__componentbuilder_'.$this->dataType)) - ->columns($this->_db->quoteName($columns)) - ->values(implode(',', $values)); - // Set the query using our newly populated query object and execute it. - $this->_db->setQuery($query); - $done = $this->_db->execute(); - if ($done) - { - $aId = $this->_db->insertid(); - // make sure the access of asset is set - ComponentbuilderHelper::setAsset($aId,$this->dataType); - } - } - else - { - return false; - } - } - return true; - } - } - return false; - } - /** * Update constant path with real full path value * diff --git a/admin/views/import_joomla_components/tmpl/default.php b/admin/views/import_joomla_components/tmpl/default.php index b1fd6c283..af8eb6dc5 100644 --- a/admin/views/import_joomla_components/tmpl/default.php +++ b/admin/views/import_joomla_components/tmpl/default.php @@ -32,48 +32,20 @@ JHtml::_('script', 'system/core.js', false, true); JHtml::_('behavior.keepalive'); ?> -dataType === 'smart_package') ? '.zip' : '.csv .xls .ods'; ?> +dataType === 'smart_package') ? '.zip' : 'none'; ?>

@@ -173,39 +146,7 @@ jQuery(document).ready(function($) {
- hasPackage && ComponentbuilderHelper::checkArray($this->headerList) && ComponentbuilderHelper::checkArray($this->headers)) : ?> - $this->activeTab)); ?> - - -
- -
- -
- -
-
- headerList as $name => $title): ?> -
- -
- -
-
- -
- -
-
- - hasPackage && $this->dataType === 'smart_package') : ?> + hasPackage && $this->dataType === 'smart_package') : ?> packageInfo['name']) && ComponentbuilderHelper::checkArray($this->packageInfo['name'])) { @@ -237,7 +178,10 @@ jQuery(document).ready(function($) {
- +
+ + +
@@ -418,6 +362,7 @@ jQuery(document).ready(function($) { + diff --git a/admin/views/import_joomla_components/view.html.php b/admin/views/import_joomla_components/view.html.php index b89ed2569..5d16c4c24 100644 --- a/admin/views/import_joomla_components/view.html.php +++ b/admin/views/import_joomla_components/view.html.php @@ -72,16 +72,9 @@ class ComponentbuilderViewImport_joomla_components extends JViewLegacy // get the session object $session = JFactory::getSession(); // check if it has package - $this->hasPackage = $session->get('hasPackage', false); - $this->dataType = $session->get('dataType', false); - if($this->hasPackage && $this->dataType && $this->dataType !== 'smart_package') - { - $this->headerList = json_decode($session->get($this->dataType.'_VDM_IMPORTHEADERS', false),true); - $this->headers = ComponentbuilderHelper::getFileHeaders($this->dataType); - // clear the data type - $session->clear('dataType'); - } - elseif (!$this->dataType) + $this->hasPackage = $session->get('hasPackage', false); + $this->dataType = $session->get('dataType', false); + if (!$this->dataType) { $this->dataType = $session->get('dataType_VDM_IMPORTINTO', null); } diff --git a/componentbuilder.xml b/componentbuilder.xml index c1903f007..44e4ba64d 100644 --- a/componentbuilder.xml +++ b/componentbuilder.xml @@ -1,7 +1,7 @@ COM_COMPONENTBUILDER - 21st March, 2018 + 24th March, 2018 Llewellyn van der Merwe llewellyn@joomlacomponentbuilder.com http://joomlacomponentbuilder.com