diff --git a/lib/API/MP/v1/API.php b/lib/API/MP/v1/API.php index b42520d58b..af991f0a64 100644 --- a/lib/API/MP/v1/API.php +++ b/lib/API/MP/v1/API.php @@ -13,6 +13,7 @@ use MailPoet\Subscribers\NewSubscriberNotificationMailer; use MailPoet\Subscribers\RequiredCustomFieldValidator; use MailPoet\Subscribers\Source; use MailPoet\Tasks\Sending; +use MailPoet\Util\Helpers; use MailPoet\WP\Functions as WPFunctions; class API { @@ -262,11 +263,15 @@ class API { ); } + if (empty($subscriber['subscribed_ip'])) { + $subscriber['subscribed_ip'] = Helpers::getIP(); + } + // separate data into default and custom fields list($default_fields, $custom_fields) = Subscriber::extractCustomFieldsFromFromObject($subscriber); - // filter out all incoming data that we don't want to change, like status, ip address, ... - $default_fields = array_intersect_key($default_fields, array_flip(['email', 'first_name', 'last_name'])); + // filter out all incoming data that we don't want to change, like status ... + $default_fields = array_intersect_key($default_fields, array_flip(['email', 'first_name', 'last_name', 'subscribed_ip'])); // if some required default fields are missing, set their values $default_fields = Subscriber::setRequiredFieldsDefaultValues($default_fields); diff --git a/tests/integration/API/MP/APITest.php b/tests/integration/API/MP/APITest.php index fca0dfd85e..f4479d2a69 100644 --- a/tests/integration/API/MP/APITest.php +++ b/tests/integration/API/MP/APITest.php @@ -471,14 +471,26 @@ class APITest extends \MailPoetTest { 'cf_' . $custom_field->id => 'test', ]; + $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; $result = $this->getApi()->addSubscriber($subscriber); expect($result['id'])->greaterThan(0); expect($result['email'])->equals($subscriber['email']); expect($result['cf_' . $custom_field->id])->equals('test'); expect($result['source'])->equals('api'); + expect($result['subscribed_ip'])->equals($_SERVER['REMOTE_ADDR']); expect(strlen($result['unsubscribe_token']))->equals(15); } + function testItAllowsToOverrideSubscriberIPAddress() { + $subscriber = [ + 'email' => 'test-ip-2@example.com', + 'subscribed_ip' => '1.2.3.4', + ]; + + $result = $this->getApi()->addSubscriber($subscriber); + expect($result['subscribed_ip'])->equals($subscriber['subscribed_ip']); + } + function testItChecksForMandatoryCustomFields() { CustomField::createOrUpdate([ 'name' => 'custom field',