From 3865a8e8cd7fb1c83f00c1c5099d3f590875590a Mon Sep 17 00:00:00 2001 From: Jonathan Labreuille Date: Mon, 14 Nov 2016 15:20:18 +0100 Subject: [PATCH] protect some fields from being edit when subscribing --- lib/Models/Subscriber.php | 18 ++++++++++++++ tests/unit/Models/SubscriberTest.php | 36 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index a872d90ec3..6f5334b17c 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -156,6 +156,24 @@ class Subscriber extends Model { } static function subscribe($subscriber_data = array(), $segment_ids = array()) { + // filter out keys from the subscriber_data array + // that should not be editable when subscribing + $reserved_columns = array( + 'id', + 'wp_user_id', + 'status', + 'subscribed_ip', + 'confirmed_ip', + 'confirmed_at', + 'created_at', + 'updated_at', + 'deleted_at' + ); + $subscriber_data = array_diff_key( + $subscriber_data, + array_flip($reserved_columns) + ); + $signup_confirmation_enabled = (bool)Setting::getValue( 'signup_confirmation.enabled' ); diff --git a/tests/unit/Models/SubscriberTest.php b/tests/unit/Models/SubscriberTest.php index 011bd96a7a..7dfa7df0af 100644 --- a/tests/unit/Models/SubscriberTest.php +++ b/tests/unit/Models/SubscriberTest.php @@ -314,6 +314,42 @@ class SubscriberTest extends MailPoetTest { expect($subscriber->deleted_at)->equals(null); } + function testItCannotSubscribeWithReservedColumns() { + $segment = Segment::create(); + $segment->hydrate(array('name' => 'List #1')); + $segment->save(); + + $subscriber = Subscriber::subscribe( + array( + 'email' => 'donald@mailpoet.com', + 'first_name' => 'Donald', + 'last_name' => 'Trump', + // the fields below should NOT be taken into account + 'id' => 1337, + 'wp_user_id' => 7331, + 'status' => Subscriber::STATUS_SUBSCRIBED, + 'created_at' => '1984-03-09 00:00:01', + 'updated_at' => '1984-03-09 00:00:02', + 'deleted_at' => '1984-03-09 00:00:03' + ), + array($segment->id()) + ); + + expect($subscriber->id > 0)->equals(true); + expect($subscriber->id)->notEquals(1337); + expect($subscriber->segments()->count())->equals(1); + expect($subscriber->email)->equals('donald@mailpoet.com'); + expect($subscriber->first_name)->equals('Donald'); + expect($subscriber->last_name)->equals('Trump'); + + expect($subscriber->wp_user_id)->equals(null); + expect($subscriber->status)->equals(Subscriber::STATUS_UNCONFIRMED); + expect($subscriber->created_at)->notEquals('1984-03-09 00:00:01'); + expect($subscriber->updated_at)->notEquals('1984-03-09 00:00:02'); + expect($subscriber->created_at)->equals($subscriber->updated_at); + expect($subscriber->deleted_at)->equals(null); + } + function testItCanBeUpdatedByEmail() { $subscriber_updated = Subscriber::createOrUpdate(array( 'email' => $this->data['email'],