diff --git a/seahub/api2/endpoints/send_share_link_email.py b/seahub/api2/endpoints/send_share_link_email.py index c7f2e831ba..a5e3aafc23 100644 --- a/seahub/api2/endpoints/send_share_link_email.py +++ b/seahub/api2/endpoints/send_share_link_email.py @@ -12,9 +12,10 @@ from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error from seahub.utils import IS_EMAIL_CONFIGURED, is_valid_username, \ - string2list, gen_shared_link, send_html_email + is_valid_email, string2list, gen_shared_link, send_html_email from seahub.share.models import FileShare from seahub.settings import REPLACE_FROM_EMAIL, ADD_REPLY_TO_HEADER, SITE_NAME +from seahub.profile.models import Profile logger = logging.getLogger(__name__) @@ -60,11 +61,13 @@ class SendShareLinkView(APIView): result['failed'] = [] result['success'] = [] to_email_list = string2list(email) + # use contact_email, if present + useremail = Profile.objects.get_contact_email_by_user(request.user.username) for to_email in to_email_list: failed_info = {} - if not is_valid_username(to_email): + if not is_valid_email(to_email): failed_info['email'] = to_email failed_info['error_msg'] = 'email invalid.' result['failed'].append(failed_info) @@ -78,12 +81,12 @@ class SendShareLinkView(APIView): } if REPLACE_FROM_EMAIL: - from_email = username + from_email = useremail else: from_email = None # use default from email if ADD_REPLY_TO_HEADER: - reply_to = username + reply_to = useremail else: reply_to = None diff --git a/seahub/api2/endpoints/send_upload_link_email.py b/seahub/api2/endpoints/send_upload_link_email.py index 2fe30ca311..23dffd108e 100644 --- a/seahub/api2/endpoints/send_upload_link_email.py +++ b/seahub/api2/endpoints/send_upload_link_email.py @@ -11,9 +11,10 @@ from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error from seahub.utils import IS_EMAIL_CONFIGURED, is_valid_username, \ - string2list, gen_shared_upload_link, send_html_email + is_valid_email, string2list, gen_shared_upload_link, send_html_email from seahub.share.models import UploadLinkShare from seahub.settings import REPLACE_FROM_EMAIL, ADD_REPLY_TO_HEADER, SITE_NAME +from seahub.profile.models import Profile logger = logging.getLogger(__name__) @@ -59,10 +60,13 @@ class SendUploadLinkView(APIView): result['failed'] = [] result['success'] = [] to_email_list = string2list(email) + # use contact_email, if present + useremail = Profile.objects.get_contact_email_by_user(request.user.username) for to_email in to_email_list: failed_info = {} - if not is_valid_username(to_email): + + if not is_valid_email(to_email): failed_info['email'] = to_email failed_info['error_msg'] = 'email invalid.' result['failed'].append(failed_info) @@ -76,12 +80,12 @@ class SendUploadLinkView(APIView): } if REPLACE_FROM_EMAIL: - from_email = username + from_email = useremail else: from_email = None # use default from email if ADD_REPLY_TO_HEADER: - reply_to = username + reply_to = useremail else: reply_to = None diff --git a/tests/api/endpoints/test_send_share_link.py b/tests/api/endpoints/test_send_share_link.py index a76bc49e73..1f8fbf3637 100644 --- a/tests/api/endpoints/test_send_share_link.py +++ b/tests/api/endpoints/test_send_share_link.py @@ -1,8 +1,14 @@ #coding: UTF-8 import json +from mock import patch +from django.core import mail from django.core.urlresolvers import reverse +from django.test import override_settings + from seahub.utils import IS_EMAIL_CONFIGURED from seahub.share.models import FileShare +from seahub.profile.models import Profile +from seahub.profile.utils import refresh_cache from seahub.test_utils import BaseTestCase @@ -13,11 +19,15 @@ class SendShareLinkApiTest(BaseTestCase): self.repo.id, self.file, None) self.token = fs.token + mail.outbox = [] def tearDown(self): self.remove_repo() - def test_can_send_email(self): + @override_settings(DEFAULT_FROM_EMAIL='from_noreply@seafile.com') + @patch('seahub.utils.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_share_link_email.IS_EMAIL_CONFIGURED', True) + def test_can_send_email_configured(self): self.login_as(self.user) invalid_email = 'invalid' url = reverse("api2-send-share-link") @@ -27,13 +37,78 @@ class SendShareLinkApiTest(BaseTestCase): } resp = self.client.post(url, data) - if not IS_EMAIL_CONFIGURED: - self.assertEqual(403, resp.status_code) - else: - self.assertEqual(200, resp.status_code) - json_resp = json.loads(resp.content) - assert json_resp['success'][0] == self.admin.email - assert json_resp['failed'][0]['email'] == invalid_email + self.assertEqual(200, resp.status_code) + self.assertEqual(len(mail.outbox), 1) + json_resp = json.loads(resp.content) + assert json_resp['success'][0] == self.admin.email + assert json_resp['failed'][0]['email'] == invalid_email + assert 'test.txt' in mail.outbox[0].body + assert mail.outbox[0].from_email == 'from_noreply@seafile.com' + + @patch('seahub.utils.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_share_link_email.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_share_link_email.REPLACE_FROM_EMAIL', True) + @patch('seahub.api2.endpoints.send_share_link_email.ADD_REPLY_TO_HEADER', True) + def test_can_send_email_rewrite(self): + self.login_as(self.user) + url = reverse("api2-send-share-link") + data = { + "token": self.token, + "email": self.admin.email, + } + + resp = self.client.post(url, data) + self.assertEqual(200, resp.status_code) + self.assertEqual(len(mail.outbox), 1) + json_resp = json.loads(resp.content) + assert json_resp['success'][0] == self.admin.email + assert 'test.txt' in mail.outbox[0].body + assert mail.outbox[0].from_email == self.user.email + assert mail.outbox[0].extra_headers['Reply-to'] == self.user.email + + @patch('seahub.utils.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_share_link_email.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_share_link_email.REPLACE_FROM_EMAIL', True) + @patch('seahub.api2.endpoints.send_share_link_email.ADD_REPLY_TO_HEADER', True) + def test_can_send_email_rewrite_contact_email(self): + self.login_as(self.user) + nickname = 'Testuser' + contact_email= 'contact_email@test.com' + p = Profile.objects.add_or_update(self.user.email, nickname=nickname) + p.contact_email = contact_email + p.save() + + refresh_cache(self.user.email) + + url = reverse("api2-send-share-link") + data = { + "token": self.token, + "email": self.admin.email, + } + + resp = self.client.post(url, data) + self.assertEqual(200, resp.status_code) + self.assertEqual(len(mail.outbox), 1) + json_resp = json.loads(resp.content) + assert json_resp['success'][0] == self.admin.email + assert 'test.txt' in mail.outbox[0].body + assert mail.outbox[0].from_email == contact_email + assert mail.outbox[0].extra_headers['Reply-to'] == contact_email + + @patch('seahub.utils.IS_EMAIL_CONFIGURED', False) + @patch('seahub.api2.endpoints.send_share_link_email.IS_EMAIL_CONFIGURED', False) + def test_can_send_email_not_configured(self): + self.login_as(self.user) + invalid_email = 'invalid' + url = reverse("api2-send-share-link") + data = { + "token": self.token, + "email": self.admin.email + ',' + invalid_email, + } + + resp = self.client.post(url, data) + self.assertEqual(403, resp.status_code) + self.assertEqual(len(mail.outbox), 0) def test_can_not_send_email_if_not_link_owner(self): self.login_as(self.admin) @@ -45,3 +120,4 @@ class SendShareLinkApiTest(BaseTestCase): resp = self.client.post(url, data) self.assertEqual(403, resp.status_code) + self.assertEqual(len(mail.outbox), 0) diff --git a/tests/api/endpoints/test_send_upload_link.py b/tests/api/endpoints/test_send_upload_link.py index 4bd41f88aa..456459ae6c 100644 --- a/tests/api/endpoints/test_send_upload_link.py +++ b/tests/api/endpoints/test_send_upload_link.py @@ -1,9 +1,15 @@ #coding: UTF-8 import json +from mock import patch +from django.core import mail from django.core.urlresolvers import reverse +from django.test import override_settings + from seahub.utils import IS_EMAIL_CONFIGURED -from seahub.test_utils import BaseTestCase from seahub.share.models import UploadLinkShare +from seahub.profile.models import Profile +from seahub.profile.utils import refresh_cache +from seahub.test_utils import BaseTestCase class SendUploadLinkApiTest(BaseTestCase): @@ -16,7 +22,10 @@ class SendUploadLinkApiTest(BaseTestCase): def tearDown(self): self.remove_repo() - def test_can_send_email(self): + @override_settings(DEFAULT_FROM_EMAIL='from_noreply@seafile.com') + @patch('seahub.utils.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_upload_link_email.IS_EMAIL_CONFIGURED', True) + def test_can_send_email_configured(self): self.login_as(self.user) invalid_email = 'invalid' url = reverse("api2-send-upload-link") @@ -26,13 +35,75 @@ class SendUploadLinkApiTest(BaseTestCase): } resp = self.client.post(url, data) - if not IS_EMAIL_CONFIGURED: - self.assertEqual(403, resp.status_code) - else: - self.assertEqual(200, resp.status_code) - json_resp = json.loads(resp.content) - assert json_resp['success'][0] == self.admin.email - assert json_resp['failed'][0]['email'] == invalid_email + self.assertEqual(200, resp.status_code) + self.assertEqual(len(mail.outbox), 1) + json_resp = json.loads(resp.content) + assert json_resp['success'][0] == self.admin.email + assert json_resp['failed'][0]['email'] == invalid_email + assert mail.outbox[0].from_email == 'from_noreply@seafile.com' + + @patch('seahub.utils.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_upload_link_email.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_upload_link_email.REPLACE_FROM_EMAIL', True) + @patch('seahub.api2.endpoints.send_upload_link_email.ADD_REPLY_TO_HEADER', True) + def test_can_send_email_rewrite(self): + self.login_as(self.user) + url = reverse("api2-send-upload-link") + data = { + "token": self.token, + "email": self.admin.email, + } + + resp = self.client.post(url, data) + self.assertEqual(200, resp.status_code) + self.assertEqual(len(mail.outbox), 1) + json_resp = json.loads(resp.content) + assert json_resp['success'][0] == self.admin.email + assert mail.outbox[0].from_email == self.user.email + assert mail.outbox[0].extra_headers['Reply-to'] == self.user.email + + @patch('seahub.utils.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_upload_link_email.IS_EMAIL_CONFIGURED', True) + @patch('seahub.api2.endpoints.send_upload_link_email.REPLACE_FROM_EMAIL', True) + @patch('seahub.api2.endpoints.send_upload_link_email.ADD_REPLY_TO_HEADER', True) + def test_can_send_email_rewrite_contact_email(self): + self.login_as(self.user) + nickname = 'Testuser' + contact_email= 'contact_email@test.com' + p = Profile.objects.add_or_update(self.user.email, nickname=nickname) + p.contact_email = contact_email + p.save() + + refresh_cache(self.user.email) + + url = reverse("api2-send-upload-link") + data = { + "token": self.token, + "email": self.admin.email, + } + + resp = self.client.post(url, data) + self.assertEqual(200, resp.status_code) + self.assertEqual(len(mail.outbox), 1) + json_resp = json.loads(resp.content) + assert json_resp['success'][0] == self.admin.email + assert mail.outbox[0].from_email == contact_email + assert mail.outbox[0].extra_headers['Reply-to'] == contact_email + + @patch('seahub.utils.IS_EMAIL_CONFIGURED', False) + @patch('seahub.api2.endpoints.send_upload_link_email.IS_EMAIL_CONFIGURED', False) + def test_can_send_email_not_configured(self): + self.login_as(self.user) + invalid_email = 'invalid' + url = reverse("api2-send-upload-link") + data = { + "token": self.token, + "email": self.admin.email + ',' + invalid_email, + } + + resp = self.client.post(url, data) + self.assertEqual(403, resp.status_code) + self.assertEqual(len(mail.outbox), 0) def test_can_not_send_email_if_not_link_owner(self): self.login_as(self.admin) @@ -44,3 +115,4 @@ class SendUploadLinkApiTest(BaseTestCase): resp = self.client.post(url, data) self.assertEqual(403, resp.status_code) + self.assertEqual(len(mail.outbox), 0)