Spade
Mini Shell
actionlogs/actionlogs.php000064400000003334151170013520011557
0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Privacy.actionlogs
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR .
'/components/com_actionlogs/helpers/actionlogs.php');
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/plugin.php');
/**
* Privacy plugin managing Joomla actionlogs data
*
* @since 3.9.0
*/
class PlgPrivacyActionlogs extends PrivacyPlugin
{
/**
* Processes an export request for Joomla core actionlog data
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyExportDomain[]
*
* @since 3.9.0
*/
public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser
$user = null)
{
if (!$user)
{
return array();
}
$domain = $this->createDomain('user_action_logs',
'joomla_user_action_logs_data');
$query = $this->db->getQuery(true)
->select('a.*, u.name')
->from('#__action_logs AS a')
->innerJoin('#__users AS u ON a.user_id = u.id')
->where($this->db->quoteName('a.user_id') . ' =
' . (int) $user->id);
$this->db->setQuery($query);
$data = $this->db->loadObjectList();
if (!count($data))
{
return array();
}
$data = ActionlogsHelper::getCsvData($data);
$isFirst = true;
foreach ($data as $item)
{
if ($isFirst)
{
$isFirst = false;
continue;
}
$domain->addItem($this->createItemFromArray($item));
}
return array($domain);
}
}
actionlogs/actionlogs.xml000064400000001437151170013520011572
0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin"
group="privacy" method="upgrade">
<name>plg_privacy_actionlogs</name>
<author>Joomla! Project</author>
<creationDate>July 2018</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.9.0</version>
<description>PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION</description>
<files>
<filename
plugin="actionlogs">actionlogs.php</filename>
</files>
<languages>
<language
tag="en-GB">en-GB.plg_privacy_actionlogs.ini</language>
<language
tag="en-GB">en-GB.plg_privacy_actionlogs.sys.ini</language>
</languages>
</extension>
consents/consents.php000064400000002761151170013520010746 0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Privacy.consents
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/plugin.php');
/**
* Privacy plugin managing Joomla user consent data
*
* @since 3.9.0
*/
class PlgPrivacyConsents extends PrivacyPlugin
{
/**
* Processes an export request for Joomla core user consent data
*
* This event will collect data for the core `#__privacy_consents` table
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyExportDomain[]
*
* @since 3.9.0
*/
public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser
$user = null)
{
if (!$user)
{
return array();
}
$domain = $this->createDomain('consents',
'joomla_consent_data');
$query = $this->db->getQuery(true)
->select('*')
->from($this->db->quoteName('#__privacy_consents'))
->where($this->db->quoteName('user_id') . ' =
' . (int) $user->id)
->order($this->db->quoteName('created') . '
ASC');
$items = $this->db->setQuery($query)->loadAssocList();
foreach ($items as $item)
{
$domain->addItem($this->createItemFromArray($item));
}
return array($domain);
}
}
consents/consents.xml000064400000001423151170013520010751 0ustar00<?xml
version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin"
group="privacy" method="upgrade">
<name>plg_privacy_consents</name>
<author>Joomla! Project</author>
<creationDate>July 2018</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.9.0</version>
<description>PLG_PRIVACY_CONSENTS_XML_DESCRIPTION</description>
<files>
<filename plugin="consents">consents.php</filename>
</files>
<languages>
<language
tag="en-GB">en-GB.plg_privacy_consents.ini</language>
<language
tag="en-GB">en-GB.plg_privacy_consents.sys.ini</language>
</languages>
</extension>
contact/contact.php000064400000003457151170013530010350 0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Privacy.contact
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/plugin.php');
/**
* Privacy plugin managing Joomla user contact data
*
* @since 3.9.0
*/
class PlgPrivacyContact extends PrivacyPlugin
{
/**
* Processes an export request for Joomla core user contact data
*
* This event will collect data for the contact core tables:
*
* - Contact custom fields
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyExportDomain[]
*
* @since 3.9.0
*/
public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser
$user = null)
{
if (!$user && !$request->email)
{
return array();
}
$domains = array();
$domain = $this->createDomain('user_contact',
'joomla_user_contact_data');
$domains[] = $domain;
$query = $this->db->getQuery(true)
->select('*')
->from($this->db->quoteName('#__contact_details'))
->order($this->db->quoteName('ordering') . '
ASC');
if ($user)
{
$query->where($this->db->quoteName('user_id') .
' = ' . (int) $user->id);
}
else
{
$query->where($this->db->quoteName('email_to') .
' = ' . $this->db->quote($request->email));
}
$items = $this->db->setQuery($query)->loadObjectList();
foreach ($items as $item)
{
$domain->addItem($this->createItemFromArray((array) $item));
}
$domains[] =
$this->createCustomFieldsDomain('com_contact.contact',
$items);
return $domains;
}
}
contact/contact.xml000064400000001415151170013530010351 0ustar00<?xml
version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin"
group="privacy" method="upgrade">
<name>plg_privacy_contact</name>
<author>Joomla! Project</author>
<creationDate>July 2018</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.9.0</version>
<description>PLG_PRIVACY_CONTACT_XML_DESCRIPTION</description>
<files>
<filename plugin="contact">contact.php</filename>
</files>
<languages>
<language
tag="en-GB">en-GB.plg_privacy_contact.ini</language>
<language
tag="en-GB">en-GB.plg_privacy_contact.sys.ini</language>
</languages>
</extension>
content/content.php000064400000003210151170013530010371 0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Privacy.content
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/plugin.php');
/**
* Privacy plugin managing Joomla user content data
*
* @since 3.9.0
*/
class PlgPrivacyContent extends PrivacyPlugin
{
/**
* Processes an export request for Joomla core user content data
*
* This event will collect data for the content core table
*
* - Content custom fields
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyExportDomain[]
*
* @since 3.9.0
*/
public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser
$user = null)
{
if (!$user)
{
return array();
}
$domains = array();
$domain = $this->createDomain('user_content',
'joomla_user_content_data');
$domains[] = $domain;
$query = $this->db->getQuery(true)
->select('*')
->from($this->db->quoteName('#__content'))
->where($this->db->quoteName('created_by') . ' =
' . (int) $user->id)
->order($this->db->quoteName('ordering') . '
ASC');
$items = $this->db->setQuery($query)->loadObjectList();
foreach ($items as $item)
{
$domain->addItem($this->createItemFromArray((array) $item));
}
$domains[] =
$this->createCustomFieldsDomain('com_content.article',
$items);
return $domains;
}
}
content/content.xml000064400000001415151170013530010407 0ustar00<?xml
version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin"
group="privacy" method="upgrade">
<name>plg_privacy_content</name>
<author>Joomla! Project</author>
<creationDate>July 2018</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.9.0</version>
<description>PLG_PRIVACY_CONTENT_XML_DESCRIPTION</description>
<files>
<filename plugin="content">content.php</filename>
</files>
<languages>
<language
tag="en-GB">en-GB.plg_privacy_content.ini</language>
<language
tag="en-GB">en-GB.plg_privacy_content.sys.ini</language>
</languages>
</extension>
message/message.php000064400000003045151170013530010323 0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Privacy.message
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/plugin.php');
/**
* Privacy plugin managing Joomla user messages
*
* @since 3.9.0
*/
class PlgPrivacyMessage extends PrivacyPlugin
{
/**
* Processes an export request for Joomla core user message
*
* This event will collect data for the message table
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyExportDomain[]
*
* @since 3.9.0
*/
public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser
$user = null)
{
if (!$user)
{
return array();
}
$domain = $this->createDomain('user_messages',
'joomla_user_messages_data');
$query = $this->db->getQuery(true)
->select('*')
->from($this->db->quoteName('#__messages'))
->where($this->db->quoteName('user_id_from') . '
= ' . (int) $user->id)
->orWhere($this->db->quoteName('user_id_to') . '
= ' . (int) $user->id)
->order($this->db->quoteName('date_time') . '
ASC');
$items = $this->db->setQuery($query)->loadAssocList();
foreach ($items as $item)
{
$domain->addItem($this->createItemFromArray($item));
}
return array($domain);
}
}
message/message.xml000064400000001415151170013530010333 0ustar00<?xml
version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin"
group="privacy" method="upgrade">
<name>plg_privacy_message</name>
<author>Joomla! Project</author>
<creationDate>July 2018</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.9.0</version>
<description>PLG_PRIVACY_MESSAGE_XML_DESCRIPTION</description>
<files>
<filename plugin="message">message.php</filename>
</files>
<languages>
<language
tag="en-GB">en-GB.plg_privacy_message.ini</language>
<language
tag="en-GB">en-GB.plg_privacy_message.sys.ini</language>
</languages>
</extension>
user/user.php000064400000013507151170013540007214 0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Privacy.user
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\User\UserHelper;
use Joomla\Utilities\ArrayHelper;
JLoader::register('PrivacyPlugin', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/plugin.php');
JLoader::register('PrivacyRemovalStatus', JPATH_ADMINISTRATOR .
'/components/com_privacy/helpers/removal/status.php');
/**
* Privacy plugin managing Joomla user data
*
* @since 3.9.0
*/
class PlgPrivacyUser extends PrivacyPlugin
{
/**
* Performs validation to determine if the data associated with a remove
information request can be processed
*
* This event will not allow a super user account to be removed
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyRemovalStatus
*
* @since 3.9.0
*/
public function onPrivacyCanRemoveData(PrivacyTableRequest $request, JUser
$user = null)
{
$status = new PrivacyRemovalStatus;
if (!$user)
{
return $status;
}
if ($user->authorise('core.admin'))
{
$status->canRemove = false;
$status->reason =
JText::_('PLG_PRIVACY_USER_ERROR_CANNOT_REMOVE_SUPER_USER');
}
return $status;
}
/**
* Processes an export request for Joomla core user data
*
* This event will collect data for the following core tables:
*
* - #__users (excluding the password, otpKey, and otep columns)
* - #__user_notes
* - #__user_profiles
* - User custom fields
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return PrivacyExportDomain[]
*
* @since 3.9.0
*/
public function onPrivacyExportRequest(PrivacyTableRequest $request, JUser
$user = null)
{
if (!$user)
{
return array();
}
/** @var JTableUser $userTable */
$userTable = JUser::getTable();
$userTable->load($user->id);
$domains = array();
$domains[] = $this->createUserDomain($userTable);
$domains[] = $this->createNotesDomain($userTable);
$domains[] = $this->createProfileDomain($userTable);
$domains[] =
$this->createCustomFieldsDomain('com_users.user',
array($userTable));
return $domains;
}
/**
* Removes the data associated with a remove information request
*
* This event will pseudoanonymise the user account
*
* @param PrivacyTableRequest $request The request record being
processed
* @param JUser $user The user account associated
with this request if available
*
* @return void
*
* @since 3.9.0
*/
public function onPrivacyRemoveData(PrivacyTableRequest $request, JUser
$user = null)
{
// This plugin only processes data for registered user accounts
if (!$user)
{
return;
}
$pseudoanonymisedData = array(
'name' => 'User ID ' . $user->id,
'username' => bin2hex(random_bytes(12)),
'email' => 'UserID' . $user->id .
'removed@email.invalid',
'block' => true,
);
$user->bind($pseudoanonymisedData);
$user->save();
// Destroy all sessions for the user account
UserHelper::destroyUserSessions($user->id);
}
/**
* Create the domain for the user notes data
*
* @param JTableUser $user The JTableUser object to process
*
* @return PrivacyExportDomain
*
* @since 3.9.0
*/
private function createNotesDomain(JTableUser $user)
{
$domain = $this->createDomain('user_notes',
'joomla_user_notes_data');
$query = $this->db->getQuery(true)
->select('*')
->from($this->db->quoteName('#__user_notes'))
->where($this->db->quoteName('user_id') . ' =
' . $this->db->quote($user->id));
$items = $this->db->setQuery($query)->loadAssocList();
// Remove user ID columns
foreach (array('user_id', 'created_user_id',
'modified_user_id') as $column)
{
$items = ArrayHelper::dropColumn($items, $column);
}
foreach ($items as $item)
{
$domain->addItem($this->createItemFromArray($item,
$item['id']));
}
return $domain;
}
/**
* Create the domain for the user profile data
*
* @param JTableUser $user The JTableUser object to process
*
* @return PrivacyExportDomain
*
* @since 3.9.0
*/
private function createProfileDomain(JTableUser $user)
{
$domain = $this->createDomain('user_profile',
'joomla_user_profile_data');
$query = $this->db->getQuery(true)
->select('*')
->from($this->db->quoteName('#__user_profiles'))
->where($this->db->quoteName('user_id') . ' =
' . $this->db->quote($user->id))
->order($this->db->quoteName('ordering') . '
ASC');
$items = $this->db->setQuery($query)->loadAssocList();
foreach ($items as $item)
{
$domain->addItem($this->createItemFromArray($item));
}
return $domain;
}
/**
* Create the domain for the user record
*
* @param JTableUser $user The JTableUser object to process
*
* @return PrivacyExportDomain
*
* @since 3.9.0
*/
private function createUserDomain(JTableUser $user)
{
$domain = $this->createDomain('users',
'joomla_users_data');
$domain->addItem($this->createItemForUserTable($user));
return $domain;
}
/**
* Create an item object for a JTableUser object
*
* @param JTableUser $user The JTableUser object to convert
*
* @return PrivacyExportItem
*
* @since 3.9.0
*/
private function createItemForUserTable(JTableUser $user)
{
$data = array();
$exclude = array('password', 'otpKey',
'otep');
foreach (array_keys($user->getFields()) as $fieldName)
{
if (!in_array($fieldName, $exclude))
{
$data[$fieldName] = $user->$fieldName;
}
}
return $this->createItemFromArray($data, $user->id);
}
}
user/user.xml000064400000001372151170013540007222 0ustar00<?xml
version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin"
group="privacy" method="upgrade">
<name>plg_privacy_user</name>
<author>Joomla! Project</author>
<creationDate>May 2018</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.9.0</version>
<description>PLG_PRIVACY_USER_XML_DESCRIPTION</description>
<files>
<filename plugin="user">user.php</filename>
</files>
<languages>
<language
tag="en-GB">en-GB.plg_privacy_user.ini</language>
<language
tag="en-GB">en-GB.plg_privacy_user.sys.ini</language>
</languages>
</extension>