dd8077152e259577788d13c5b66a2d6d09d81301
2 # This file is part of my.gpodder.org.
4 # my.gpodder.org is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or (at your
7 # option) any later version.
9 # my.gpodder.org is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
12 # License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
18 from datetime
import datetime
20 from django
.http
import HttpResponse
21 from django
.utils
.datastructures
import MultiValueDictKeyError
22 from django
.views
.decorators
.csrf
import csrf_exempt
23 from django
.views
.decorators
.cache
import never_cache
25 from mygpo
.api
.sanitizing
import sanitize_urls
26 from mygpo
.users
.models
import User
27 from mygpo
.api
.opml
import Importer
, Exporter
28 from mygpo
.core
.models
import Podcast
, SubscriptionException
29 from mygpo
.api
.backend
import get_device
30 from mygpo
.db
.couchdb
.podcast
import podcast_for_url
33 logger
= logging
.getLogger(__name__
)
36 LEGACY_DEVICE_NAME
= 'Legacy Device'
37 LEGACY_DEVICE_UID
= 'legacy'
43 emailaddr
= request
.POST
['username']
44 password
= request
.POST
['password']
45 action
= request
.POST
['action']
46 protocol
= request
.POST
['protocol']
47 opml
= request
.FILES
['opml'].read()
48 except MultiValueDictKeyError
:
49 return HttpResponse("@PROTOERROR", mimetype
='text/plain')
51 user
= auth(emailaddr
, password
)
53 return HttpResponse('@AUTHFAIL', mimetype
='text/plain')
55 dev
= get_device(user
, LEGACY_DEVICE_UID
,
56 request
.META
.get('HTTP_USER_AGENT', ''))
58 existing_urls
= [x
.url
for x
in dev
.get_subscribed_podcasts()]
62 podcast_urls
= [p
['url'] for p
in i
.items
]
63 podcast_urls
= sanitize_urls(podcast_urls
)
64 podcast_urls
= filter(lambda x
: x
, podcast_urls
)
66 new
= [u
for u
in podcast_urls
if u
not in existing_urls
]
67 rem
= [u
for e
in existing_urls
if u
not in podcast_urls
]
74 p
= podcast_for_url(n
, create
=True)
77 p
.subscribe(user
, dev
)
78 except SubscriptionException
as e
:
79 logger
.exception('Legacy API: %(username)s: could not subscribe to podcast %(podcast_url)s on device %(device_id)s' %
80 {'username': user
.username
, 'podcast_url': p
.url
, 'device_id': dev
.id})
83 p
= podcast_for_url(r
, create
=True)
85 p
.unsubscribe(user
, dev
)
86 except SubscriptionException
as e
:
87 logger
.exception('Legacy API: %(username): could not unsubscribe from podcast %(podcast_url) on device %(device_id)' %
88 {'username': user
.username
, 'podcast_url': p
.url
, 'device_id': dev
.id})
90 return HttpResponse('@SUCCESS', mimetype
='text/plain')
95 emailaddr
= request
.GET
.get('username', None)
96 password
= request
.GET
.get('password', None)
98 user
= auth(emailaddr
, password
)
100 return HttpResponse('@AUTHFAIL', mimetype
='text/plain')
102 dev
= get_device(user
, LEGACY_DEVICE_UID
,
103 request
.META
.get('HTTP_USER_AGENT', ''),
105 podcasts
= dev
.get_subscribed_podcasts()
107 title
= "{username}'s subscriptions".format(username
=user
.username
)
108 exporter
= Exporter(title
)
110 opml
= exporter
.generate(podcasts
)
112 return HttpResponse(opml
, mimetype
='text/xml')
115 def auth(emailaddr
, password
):
116 if emailaddr
is None or password
is None:
119 user
= User
.get_user_by_email(emailaddr
)
123 if not user
.check_password(password
):
126 if not user
.is_active
: