Skip to content
This repository has been archived by the owner on Mar 15, 2018. It is now read-only.

Commit

Permalink
allow authors to download premium addons, watermarked from the detail…
Browse files Browse the repository at this point in the history
…s page (bug 694183)
  • Loading branch information
Andy McKay committed Oct 28, 2011
1 parent 363b45a commit 1abccf5
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 29 deletions.
5 changes: 4 additions & 1 deletion apps/addons/templates/addons/impala/details.html
Expand Up @@ -45,7 +45,10 @@
{{ sharing_widget(addon) }}
</div>
{% if request.check_ownership(addon, require_owner=False) %}
<a href="{{ url('devhub.addons.edit', addon.slug) }}" class="button developer prominent"><span>{{ _('Manage') }}</span></a>
<p><a href="{{ url('devhub.addons.edit', addon.slug) }}" class="button developer prominent"><span>{{ _('Manage') }}</span></a></p>
{% if waffle.switch('marketplace') and addon.is_premium() and not addon.is_webapp() %}
<p><a href="{{ url('downloads.latest', addon.slug) }}" class="button developer prominent"><span>{{ _('Download') }}</span></a></p>
{% endif %}
{% endif %}
</aside>

Expand Down
33 changes: 28 additions & 5 deletions apps/addons/tests/test_views.py
Expand Up @@ -427,6 +427,13 @@ def test_split(self, get_paykey):
assert 'chains' in get_paykey.call_args_list[0][0][0].keys()


def setup_premium(addon):
price = Price.objects.create(price='0.99')
AddonPremium.objects.create(addon=addon, price=price)
addon.update(premium_type=amo.ADDON_PREMIUM)
return addon, price


# TODO: remove when the marketplace is live.
@patch.object(waffle, 'switch_is_active', lambda x: True)
# TODO: figure out why this is being set
Expand All @@ -442,12 +449,8 @@ def setUp(self):
self.data = {'username': 'jbalogh@mozilla.com',
'password': 'foo'}
self.addon = Addon.objects.all()[0]

self.url = addon_url('addons.purchase.start', self.addon)

self.price = Price.objects.create(price='0.99')
AddonPremium.objects.create(addon=self.addon, price=self.price)
self.addon.update(premium_type=amo.ADDON_PREMIUM)
self.addon, self.price = setup_premium(self.addon)

def test_loggedout_purchased(self):
# "Buy" the add-on
Expand Down Expand Up @@ -1160,6 +1163,26 @@ def test_other_addons_by_others(self):
def test_other_addons_none(self):
eq_(self.get_more_pq()('#author-addons').length, 0)

# TODO: remove when the marketplace is live.
@patch.object(waffle, 'switch_is_active', lambda x: True)
def test_author_watermarked(self):
# Test that an author can get a watermarked addon.
self.addon, self.price = setup_premium(self.addon)
assert self.client.login(username=self.addon.authors.all()[0].email,
password='password')
res = self.client.get(self.url)
eq_(pq(res.content)('.prominent').eq(1).attr('href'),
reverse('downloads.latest', args=[self.addon.slug]))

@patch.object(waffle, 'switch_is_active', lambda x: True)
def test_not_author(self):
# A non-author should not see the download link.
self.addon, self.price = setup_premium(self.addon)
assert self.client.login(username='regular@mozilla.com',
password='password')
res = self.client.get(self.url)
eq_(len(pq(res.content)('.prominent')), 1)


class TestStatus(amo.tests.TestCase):
fixtures = ['base/apps', 'base/addon_3615']
Expand Down
12 changes: 12 additions & 0 deletions apps/files/tests/test_views.py
Expand Up @@ -489,6 +489,7 @@ def setUp(self):
self.xpi_copy_over(self.file, 'firefm')
self.url = reverse('downloads.watermarked', args=[self.file.pk])
self.user = UserProfile.objects.get(pk=999)
self.author = self.addon.authors.all()[0]
self.purchase = AddonPurchase.objects.create(addon=self.addon,
user=self.user)
self.client.login(username='regular@mozilla.com', password='password')
Expand Down Expand Up @@ -550,3 +551,14 @@ def test_not_purchased(self):
self.purchase.delete()
res = self.client.get(self.url)
eq_(res.status_code, 403)

def test_watermark_latest_redirects(self):
url = reverse('downloads.latest', args=[self.addon.slug])
res = self.client.get(url, follow=False)
self.assertRedirects(res, '%s/%s' % (self.url, self.file.filename))

def test_author_can_get(self):
self.client.logout()
self.client.login(username=self.author.email, password='password')
res = self.client.get(self.url)
assert os.path.exists(res['X-SENDFILE'])
2 changes: 1 addition & 1 deletion apps/versions/urls.py
Expand Up @@ -24,6 +24,6 @@
'(?:platform:(?P<platform>\d+)/)?.*' % ADDON_ID,
views.download_latest, name='downloads.latest'),

url('^watermarked/(?P<file_id>\d+)',
url('^watermarked/(?P<file_id>\d+)?(?:/.*)?',
views.download_watermarked, name='downloads.watermarked'),
)
45 changes: 23 additions & 22 deletions apps/versions/views.py
Expand Up @@ -80,27 +80,29 @@ def download_watermarked(request, file_id):

file = get_object_or_404(File.objects, pk=file_id)
addon = get_object_or_404(Addon.objects, pk=file.version.addon_id)
author = request.check_ownership(addon, require_owner=False)
user = request.amo_user

if (not addon.is_premium() or addon.is_disabled
or file.status == amo.STATUS_DISABLED):
raise http.Http404()
if not author:
if (not addon.is_premium() or addon.is_disabled
or file.status == amo.STATUS_DISABLED):
raise http.Http404()

user = request.amo_user
if request.user.is_anonymous():
log.debug('Anonymous user, checking hash: %s' % file_id)
email = request.GET.get(amo.WATERMARK_KEY, None)
hsh = request.GET.get(amo.WATERMARK_KEY_HASH, None)

user = addon.get_user_from_hash(email, hsh)
if not user:
log.debug('Watermarking denied, no user: %s, %s, %s'
% (file_id, email, hsh))
return http.HttpResponseForbidden()
if request.user.is_anonymous():
log.debug('Anonymous user, checking hash: %s' % file_id)
email = request.GET.get(amo.WATERMARK_KEY, None)
hsh = request.GET.get(amo.WATERMARK_KEY_HASH, None)

if not addon.has_purchased(user):
log.debug('Watermarking denied, not purchased: %s, %s'
% (file_id, user.id))
return http.HttpResponseForbidden()
user = addon.get_user_from_hash(email, hsh)
if not user:
log.debug('Watermarking denied, no user: %s, %s, %s'
% (file_id, email, hsh))
return http.HttpResponseForbidden()

if not addon.has_purchased(user):
log.debug('Watermarking denied, not purchased: %s, %s'
% (file_id, user.id))
return http.HttpResponseForbidden()

dest = file.watermark(user)
if not dest:
Expand Down Expand Up @@ -144,9 +146,6 @@ def download_file(request, file_id, type=None):

@addon_view_factory(guard)
def download_latest(request, addon, type='xpi', platform=None):
if addon.is_premium():
return http.HttpResponseForbidden()

platforms = [amo.PLATFORM_ALL.id]
if platform is not None and int(platform) in amo.PLATFORMS:
platforms.append(int(platform))
Expand All @@ -158,7 +157,9 @@ def download_latest(request, addon, type='xpi', platform=None):
except IndexError:
raise http.Http404()
args = [file.id, type] if type else [file.id]
url = posixpath.join(reverse('downloads.file', args=args), file.filename)
pattern = ('downloads.watermarked' if addon.is_premium()
else 'downloads.file')
url = posixpath.join(reverse(pattern, args=args), file.filename)
if request.GET:
url += '?' + request.GET.urlencode()
return redirect(url)

0 comments on commit 1abccf5

Please sign in to comment.