Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • project/salesforce
  • issue/salesforce-2975914
  • issue/salesforce-3168388
  • issue/salesforce-3169218
  • issue/salesforce-3072830
  • issue/salesforce-3170030
  • issue/salesforce-3170137
  • issue/salesforce-3173210
  • issue/salesforce-3177326
  • issue/salesforce-3181364
  • issue/salesforce-3279290
  • issue/salesforce-3203287
  • issue/salesforce-3204383
  • issue/salesforce-3204704
  • issue/salesforce-3217061
  • issue/salesforce-3217586
  • issue/salesforce-3102133
  • issue/salesforce-3210809
  • issue/salesforce-3221747
  • issue/salesforce-3222661
  • issue/salesforce-3222940
  • issue/salesforce-3226511
  • issue/salesforce-3226070
  • issue/salesforce-3222683
  • issue/salesforce-3120102
  • issue/salesforce-3231850
  • issue/salesforce-3281008
  • issue/salesforce-3213468
  • issue/salesforce-3247923
  • issue/salesforce-3255740
  • issue/salesforce-3257058
  • issue/salesforce-3276564
  • issue/salesforce-3284336
  • issue/salesforce-3310785
  • issue/salesforce-3312317
  • issue/salesforce-3312979
  • issue/salesforce-3320557
  • issue/salesforce-3340664
  • issue/salesforce-3358568
  • issue/salesforce-3404815
  • issue/salesforce-3400562
  • issue/salesforce-3400903
  • issue/salesforce-3400897
  • issue/salesforce-3405570
  • issue/salesforce-3349963
  • issue/salesforce-3389025
  • issue/salesforce-3154024
  • issue/salesforce-3395912
  • issue/salesforce-3396890
  • issue/salesforce-3398897
  • issue/salesforce-3408393
  • issue/salesforce-3410886
  • issue/salesforce-3411280
  • issue/salesforce-3414401
  • issue/salesforce-3414659
  • issue/salesforce-3415336
  • issue/salesforce-3415242
  • issue/salesforce-3417891
  • issue/salesforce-3417994
  • issue/salesforce-3419551
  • issue/salesforce-3419804
  • issue/salesforce-3382005
  • issue/salesforce-3418124
  • issue/salesforce-3427415
  • issue/salesforce-3427904
  • issue/salesforce-3428593
  • issue/salesforce-3443380
  • issue/salesforce-3443506
  • issue/salesforce-3439625
  • issue/salesforce-3442186
  • issue/salesforce-3445088
  • issue/salesforce-3432569
  • issue/salesforce-3449141
  • issue/salesforce-3449163
  • issue/salesforce-3460395
  • issue/salesforce-3472489
  • issue/salesforce-3472706
  • issue/salesforce-3460502
  • issue/salesforce-3477260
  • issue/salesforce-3209120
  • issue/salesforce-3491809
  • issue/salesforce-3495316
  • issue/salesforce-3492972
  • issue/salesforce-3497252
  • issue/salesforce-3502753
  • issue/salesforce-3503227
  • issue/salesforce-3511455
  • issue/salesforce-3512519
  • issue/salesforce-3514383
  • issue/salesforce-3515337
  • issue/salesforce-3516158
91 results
Show changes
Commits on Source (306)
Showing
with 288 additions and 299 deletions
abcdg
activateable
addtional
adminlink
aggregatable
apexrest
apicalls
atribtary
birthdate
Bject
Chunkify
commandfile
Configurationform
createable
creds
DERP
developerforce
devname
dobj
dprop
elementtype
entup
faultcode
fieldables
fieldmap
fieldmaps
fugly
Giwj
Giwo
gname
govcloud
howsmyssl
ignorefile
lastupdate
layoutable
listviewable
loggable
LONGTERM
mergeable
multipicklist
multipicklists
nillable
notvie
permissionable
picklist
Picklists
Prefilterable
prepull
profilepic
Readby
Reauth
replicateable
resultd
retrieveable
Revisionuser
SDFC
sevent
sfapi
sfco
sfdc
sfdf
sfdo
sfdom
sfdrt
sfeq
sffield
sfid
sfids
sfif
sfiq
sflo
sflp
sflr
sfobj
sfobject
sfobjectid
sfobjects
Sforce
sfpall
sfpd
sfpf
sfpm
sfpmap
sfpq
sfprune
sfpsf
sfpu
sfpushq
sfqo
sfro
sfrq
sfrt
sfrv
sfrvk
singl
sobj
sobject
sobjects
SOQL
soql
Statefull
stringifying
timeframe
timstamp
triggerable
typehint
undeletable
unpushable
unweildy
updateable
vals
webforms
WIAS
WSOD
*.patch
.tags
.vscode
.idea
\ No newline at end of file
.idea
vendor
composer.lock
\ No newline at end of file
include:
- project: $_GITLAB_TEMPLATES_REPO
ref: $_GITLAB_TEMPLATES_REF
file:
- '/includes/include.drupalci.main.yml'
- '/includes/include.drupalci.variables.yml'
- '/includes/include.drupalci.workflows.yml'
variables:
OPT_IN_TEST_MAX_PHP: 1
# Broaden test coverage.
OPT_IN_TEST_NEXT_MINOR: 1
OPT_IN_TEST_NEXT_MAJOR: 1
_CSPELL_IGNORE_PATHS: 'src/Tests/*.json, modules/salesforce_mapping/config/schema/'
\ No newline at end of file
see documentation https://www.drupal.org/docs/contributed-modules/salesforce-suite/quick-start
ABOUT
-----
This module suite implements a mapping functionality between Salesforce
objects and Drupal entities. In other words, for each of your supported Drupal
entities (e.g. node, user, or entities supported by extensions), you can
assign Salesforce objects that will be created / updated when the entity is
saved. For each such assignment, you choose which Drupal and Salesforce fields
should be mapped to one another.
This suite also includes an API architecture which allows for additional
modules to be easily plugged in (e.g. for webforms, contact form submits,
etc).
For a more detailed description of each component module, see below.
REQUIREMENTS
------------
1) You need a Salesforce account. Developers can register here:
http://www.developerforce.com/events/regular/registration.php
2) You will need to create a remote application/connected app for
authorization. In Salesforce go to Your Name > Setup > Create > Apps then
create a new Connected App. Set the callback URL to:
https://<your site>/salesforce/oauth_callback (must use SSL)
Select at least 'Perform requests on your behalf at any time' for OAuth Scope
as well as the appropriate other scopes for your application.
Additional information:
https://help.salesforce.com/help/doc/en/remoteaccess_about.htm
3) Your site needs to be SSL enabled to authorize the remote application using
OAUTH.
4) If using the SOAP API, PHP to have been compiled with SOAP web services and
OpenSSL support, as per:
http://php.net/soap
http://php.net/openssl
5) Required modules
Entity API - http://drupal.org/project/entity
Libraries, only for SOAP API - http://drupal.org/project/libraries
AUTHORIZATION / CONNECTED APP CONFIGURATION
-------------------------------------------
You can supply your connected app's consumer key, consumer secret, and login
URL to the Salesforce Authorization form found at
admin/config/salesforce/authorize. This information will be stored into
your site's mutable/exportable configuration and used to authorize your site
with Salesforce.
Alternately you can supply or override this configuration using your site's
settings.php file. For example, a developer might add the following to
his/her settings.local.php file to connect his/her development environment to
a Salesforce sandbox:
$config['salesforce.settings']['consumer_key'] = 'foo';
$config['salesforce.settings']['consumer_secret'] = 'bar';
$config['salesforce.settings']['login_url'] = 'https://test.salesforce.com';
Supplying your connected app configuration exclusively by way of settings.php
has additional benefits in terms of security and flexibility:
- Keeps this sensitive configuration out of the database (and out of version
control if the site's configuration is tracked in code).
- Allows for easily substituting environment-specific overrides for these
values. If you track your site's settings.php file in version control, you
can create a settings.local.php file for each of your Salesforce-conencted
environments with the connected app configuration appropriate for the
specific environment (see default.settings.php for the code to enable this
core feature).
- Reduces the likelihood of a development or staging environment accidentally
connecting to your production Salesforce instance.
If you choose the settings.php route, you'll need to supply dummy-values to
the form at admin/config/salesforce/authorize. Rest assured the real values
you've specified via settings.php will be used to establish the connection to
Salesforce, even though you cannot see them in the configuration form.
MODULES:
--------
Salesforce (salesforce):
OAUTH2 authorization and wrapper around the Salesforce REST API.
Salesforce Mapping (salesforce_mapping)
Map Drupal entities to Salesforce fields, including field level mapping.
Salesforce Push (salesforce_push):
Push Drupal entity updates into Salesforce.
Salesforce Pull (salesforce_pull):
Pull Salesforce object updates into Drupal.
Salesforce Soap (salesforce_soap):
Lightweight wrapper around the SOAP API, using the OAUTH access token, to
fill in functional gaps missing in the REST API. Requires the Salesforce PHP
Toolkit.
or project page https://www.drupal.org/project/salesforce
......@@ -13,6 +13,11 @@
"name": "Alexander Rhodes (ironsizide)",
"homepage": "https://www.drupal.org/u/ironsizide",
"role": "Maintainer"
},
{
"name": "Colin Corrigan",
"homepage": "https://www.drupal.org/u/cwcorrigan",
"role": "Maintainer"
}
],
"support": {
......@@ -22,17 +27,30 @@
"extra": {
"drush": {
"services": {
"drush.services.yml": "^9"
"drush.services.yml": ">=9"
}
}
},
"require": {
"consolidation/output-formatters": "^3.2.0",
"drupal/dynamic_entity_reference": "^2.0@alpha",
"drupal/key": "^1.7",
"drupal/encrypt": "^3.0@rc",
"firebase/php-jwt": "^5.0",
"consolidation/output-formatters": "^3.2.0 || ^4.5",
"lusitanian/oauth": "^0.8.11",
"messageagency/force.com-toolkit-for-php": "^1.0.0"
"firebase/php-jwt": "^5.0 || ^6.0",
"drupal/address": "^2.0",
"drupal/key": "^1",
"drupal/dynamic_entity_reference": "^3 || ^4",
"drupal/typed_data": "^2",
"messageagency/force.com-toolkit-for-php": "^1.0.2",
"ext-soap": "*",
"ext-json": "*"
},
"suggest": {
"drupal/address": "Required for salesforce_address",
"drupal/dynamic_entity_reference": "Required for salesforce_mapping.",
"drupal/typed_data": "Required for salesforce_mapping.",
"drupal/key": "Required to use salesforce_jwt, recommended auth provider.",
"firebase/php-jwt": "Required for salesforce_jwt, recommended auth provider.",
"lusitanian/oauth": "Required for salesforce_jwt, recommended auth provider.",
"consolidation/output-formatters": "Required for drush 10 commands.",
"messageagency/force.com-toolkit-for-php": "Required for salesforce_soap."
}
}
rest_api_version:
label: ""
url: ""
version: "39.0"
version: "52.0"
use_latest: true
global_push_limit: 100000
pull_max_queue_size: 100000
......@@ -9,3 +9,5 @@ show_all_objects: false
standalone: false
limit_mapped_object_revisions: 10
salesforce_auth_provider: ''
short_term_cache_lifetime: 3600
long_term_cache_lifetime: 604800
......@@ -2,18 +2,6 @@ salesforce.settings:
type: config_object
label: 'Salesforce Settings'
mapping:
consumer_key:
type: string
label: 'Salesforce consumer key'
description: 'Consumer key of the Salesforce remote application you want to grant access to.'
consumer_secret:
type: string
label: 'Salesforce consumer secret'
description: 'Consumer secret of the Salesforce remote application you want to grant access to.'
login_url:
type: string
label: 'Login URL'
description: 'API login URL, either https://login.salesforce.com or https://test.salesforce.com.'
global_push_limit:
type: integer
label: 'Global push queue limit'
......@@ -24,8 +12,8 @@ salesforce.settings:
description: 'Set the maximum number of items which can be enqueued for pull at any given time. Note this setting is not exactly analogous to the push queue limit, since Drupal Cron API does not offer such granularity. Use 0 for no limit.'
standalone:
type: boolean
label: 'Provide standalone push queue processing endpoint'
description: 'Enable standalone push processing, and do not process push mappings during cron. Note: when enabled, you must set up your own service to query this endpoint.'
label: 'Provide standalone queue processing endpoint and disable cron processing.'
description: 'Enable standalone queue processing, and do not process push mappings during cron. Pull queue will be populated and processed via standalone endpoint, and may also be processed during cron. Note: when enabled, you must set up your own service to query this endpoint.'
show_all_objects:
type: boolean
label: 'Show all Salesforce objects in mapping UI, including system and non-writeable tables'
......@@ -42,6 +30,14 @@ salesforce.settings:
type: string
label: 'Default authorization provider id'
description: 'A salesforce_auth config entity id which provides API authorization.'
short_term_cache_lifetime:
type: integer
label: "Short term cache lifetime"
description: "Value, in seconds, to store short term meta data. This is used for, e.g., the list of Object Types, Object Descriptions, and Record Types."
long_term_cache_lifetime:
type: integer
label: "Long term cache lifetime"
description: "Value, in seconds, to store long term meta data. This is used for, e.g., the list of API versions."
rest_api_version:
type: mapping
label: 'REST API Version'
......
......@@ -5,10 +5,14 @@
.salesforce-mapping-fields-form .field_mapping_field > .form-item {
float: left;
width: 23%;
width: 25%;
padding-left: 1em;
}
.salesforce-mapping-fields-form .field_mapping_field > .narrow {
width: 10%;
}
.salesforce-mapping-fields-form .field_mapping_field {
clear: left;
}
......@@ -16,3 +20,7 @@
.salesforce-mapping-fields-form #edit-buttons {
clear: both;
}
.salesforce-mapping-fields-form .field_mapping_field > .form-item .drupal-field-value {
width: initial;
}
build:
assessment:
validate_codebase:
# Static analysis of code for @deprecated uses.
phpstan:
halt-on-fail: false
testing:
run_tests.standard:
types: 'Simpletest,PHPUnit-Unit,PHPUnit-Kernel,PHPUnit-Functional'
# Fails on trigger_error(..., E_USER_DEPRECATED) calls encountered.
suppress-deprecations: false
\ No newline at end of file
services:
salesforce.commands:
class: \Drupal\salesforce\Commands\SalesforceCommands
arguments: ['@salesforce.client', '@entity_type.manager']
arguments: ['@salesforce.client', '@entity_type.manager', '@plugin.manager.salesforce.auth_providers', '@salesforce.auth_token_storage']
tags:
- { name: drush.command }
name: Salesforce Address
type: module
description: A custom Address Field Widget for Salesforce compatibility.
core_version_requirement: ^10.3 || ^11
package: Salesforce
dependencies:
- address:address
<?php
/**
* @file
* Contains salesforce_address.module.
*/
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Implements hook_help().
*/
function salesforce_address_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.salesforce_address':
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('Salesforce Address provides a tweaked version
of the Address Field widget from the Address module, which is compatible
with Salesforce address formatting, which uses a single, multi-line
field for the street address rather than multiple lines. If you are
syncing Address fields with Salesforce addresses, you can save a lot of
sync trouble by enabling this widget on your Form configurations for
your Address fields.') . '</p>';
return $output;
default:
}
}
<?php
namespace Drupal\salesforce_address\Element;
use Drupal\address\Element\Address;
/**
* Replaces the address line(s) on an address form element with a textarea.
*
* Salesforce has a textarea for the Street field, this matches that in Drupal
* so we can sync easier.
*
* @FormElement("address_street_as_textarea")
*/
class AddressStreetAsTextArea extends Address {
/**
* {@inheritdoc}
*/
protected static function addressElements(array $element, array $value) {
$element = Address::addressElements($element, $value);
$element["address_line1"]["#type"] = "textarea";
$element["address_line1"]["#rows"] = "2";
$element["address_line1"]["#maxlength"] = "255";
$element["address_line2"]["#access"] = FALSE;
return $element;
}
}
<?php
namespace Drupal\salesforce_address\Plugin\Field\FieldWidget;
use Drupal\address\Plugin\Field\FieldWidget\AddressDefaultWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
/**
* Changes the 'address_default' widget so it uses a different type.
*
* @FieldWidget(
* id = "salesforce_ready_address",
* label = @Translation("Salesforce-ready Address"),
* field_types = {
* "address"
* },
* )
*/
class AddressDefaultWidgetStreetAsTextArea extends AddressDefaultWidget {
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$element['address']['#type'] = 'address_street_as_textarea';
return $element;
}
}
#Salesforce Encrypt
Salesforce Encrypt relies on [Encrypt](http://drupal.org/project/encrypt) to
obfuscate sensitive stateful information stored by Salesforce module: OAuth
Access and Refresh Tokens, as well as Salesforce Identity.
# Dependencies
- http://drupal.org/project/encrypt
- http://drupal.org/project/key
- https://www.drupal.org/project/real_aes (or encryption method provider of your
choice)
# Install
- Enable Encrypt, Key, and an encryption method provider like Real AES
- Create a Key and Encryption Profile according to instructions in those modules
- Enable Salesforce Encrypt module
- Assign the encryption profile to be used at admin/config/salesforce/encrypt
- Assign "administer salesforce encryption" permission to any roles who need it
That's it - your tokens and identity are now encrypted.
# Note
As long as this module is enabled and encryption is not enabled, you'll get a
runtime requirement error on admin/reports/status.
name: Salesforce Encrypted Keys
type: module
description: Adds encryption support for auth providers.
package: Salesforce
core: 8.x
dependencies:
- key:key
- encrypt:encrypt
- salesforce:salesforce
<?php
/**
* @file
* Requirements and uninstall hooks.
*/
use Drupal\Core\Url;
use Drupal\salesforce\EntityNotFoundException;
/**
* Throw a runtime error if Salesforce encryption profile is not selected.
*
* Implements hook_requirements().
*/
function salesforce_encrypt_requirements($phase) {
$requirements = [];
if ($phase == 'runtime') {
$profile_id = NULL;
try {
$profile = \Drupal::service('salesforce.client')->getEncryptionProfile();
}
catch (EntityNotFoundException $e) {
// Noop.
}
$requirements['salesforce_encrypt'] = [
'title' => t('Salesforce Encrypt'),
'value' => t('Encryption Profile'),
];
if (empty($profile)) {
$requirements['salesforce_encrypt'] += [
'severity' => REQUIREMENT_ERROR,
'description' => t('You need to <a href="@url">select an encryption profile</a> in order to fully enable Salesforce Encrypt and protect sensitive information.', ['@url' => Url::fromRoute('salesforce_encrypt.settings')->toString()]),
];
}
else {
$requirements['salesforce_encrypt'] += [
'severity' => REQUIREMENT_OK,
'description' => t('Profile id: <a href=":url">%profile</a>', ['%profile' => $profile->id(), ':url' => $profile->url()]),
];
}
}
return $requirements;
}
salesforce_encrypt.settings:
route_name: salesforce_encrypt.settings
parent: salesforce.admin_config_salesforce
title: Salesforce Encrypt
description: 'Encrypt sensitive Salesforce OAuth credentials and identity.'
weight: 10
<?php
/**
* @file
* Salesforce encrypt module.
*/
use Drupal\encrypt\EncryptionProfileInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Entity\EntityInterface;
/**
* Implements hook_encryption_profile_predelete().
*
* If the assigned Encryption profile gets deleted, reset encryption settings.
*/
function salesforce_encrypt_encryption_profile_predelete(EncryptionProfileInterface $entity) {
\Drupal::service('salesforce.client')->hookEncryptionProfileDelete($entity);
}
/**
* Implements hook_form_alter().
*/
function salesforce_encrypt_form_salesforce_auth_form_alter(&$form, FormStateInterface $form_state, $form_id) {
/** @var \Drupal\Core\Config\ImmutableConfig $config */
$config = $form_state->getBuildInfo()['auth_config'];
if (!$config->hasOverrides('provider_settings')) {
return;
}
foreach (Element::children($form['settings']['provider_settings']) as $key) {
if ($config->hasOverrides("provider_settings.$key")) {
$value = &$form['settings']['provider_settings'][$key];
$value['#disabled'] = TRUE;
$value['#title'] .= ' <em>' . t('(Overridden)') . '</em>';
$value['#description'] .= '<br /><strong>' . t('This value is overridden, you cannot edit it here.') . '</strong>';
}
}
}
/**
* Implements hook_entity_type_alter().
*/
function salesforce_encrypt_entity_type_alter(array &$entity_types) {
/** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
$entity_type = &$entity_types['salesforce_auth'];
$entity_type->setLinkTemplate('encryption',
"/admin/config/salesforce/authorize/encryption/{salesforce_auth}");
$handlers = $entity_type->getHandlerClasses();
$handlers['form']['encryption'] = 'Drupal\salesforce_encrypt\Form\SalesforceAuthEncryptForm';
$entity_type->setHandlerClass('form', $handlers['form']);
}
/**
* Implements hook_local_tasks_alter().
*/
function salesforce_encrypt_local_tasks_alter(&$local_tasks) {
// Clone an existing salesforce_auth local task to create our new tab.
$local_tasks['entity.salesforce_auth.encryption'] =
array_merge($local_tasks['entity.salesforce_auth.revoke'], [
'route_name' => 'entity.salesforce_auth.encryption',
'title' => t('Encryption'),
'base_route' => 'entity.salesforce_auth.edit_form',
'provider' => 'salesforce_encrypt',
'id' => 'entity.salesforce_auth.encryption',
]);
}
/**
* Implements hook_entity_operation().
*/
function salesforce_encrypt_entity_operation(EntityInterface $entity) {
$operations = [];
if ($entity->getEntityTypeId() == 'salesforce_auth') {
$operations['encryption'] = [
'title' => t('Encryption'),
'weight' => 200,
'url' => $entity->toUrl('encryption'),
];
}
return $operations;
}
administer salesforce encryption:
title: 'administer salesforce encryption'
description: 'Administer Salesforce integration'
restrict access: TRUE