Skip to content

Commit

Permalink
Use a hash for events instead of url
Browse files Browse the repository at this point in the history
  • Loading branch information
SamuelmdLow committed Aug 27, 2024
1 parent 2c29717 commit 80006cb
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 12 deletions.
49 changes: 45 additions & 4 deletions events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,16 @@
import asyncio
from asgiref.sync import sync_to_async
import aiohttp
import hashlib
import base64

# Create your models here.

class EventManager(models.Manager):

def hashing(self, string):
return base64.b64encode(hashlib.blake2b(string.encode(), digest_size=6).hexdigest().encode()).decode()

async def read_ical(self, name, file, create_function):
try:
#print("Requesting " + name)
Expand Down Expand Up @@ -63,13 +68,18 @@ async def wp_events_api_create_event(self, event_json, api, host, categorize):
event = await self.acreate(
title=event_json['title'],
event_url=event_json['link'],
hash=self.hashing(event_json['link'] + str(event_json['start']))
)
else:
event = await self.filter(event_url=event_json['link'], start_time=datetime.fromisoformat(event_json['start']).astimezone(timezone.get_current_timezone())).afirst()
if event.update_mode != 2:
return None

event.title = str(event_json['title']['rendered'].encode('utf-8'), 'UTF-8')

if event.hash == "":
event.hash = self.hashing(event_json['link'] + str(event_json['start']))

event.description = str(event_json['excerpt']['rendered'].encode('utf-8'), 'UTF-8')

event.start_time = datetime.fromisoformat(event_json['start']).astimezone(timezone.get_current_timezone())
Expand Down Expand Up @@ -157,12 +167,17 @@ async def ubcevents_create_event(self, ical_component):
event = await self.acreate(
title=ical_component.get('summary'),
event_url=ical_component.decoded('url'),
hash=self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))
)
else:
event = await self.filter(event_url=ical_component.get('url')).afirst()
if event.update_mode != 2:
return None


if event.hash == "":
event.hash = self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))

# Split location and address
location = ical_component.get('location')
address = ""
Expand Down Expand Up @@ -299,16 +314,22 @@ def ubcevents_category(self, event):

async def gothunderbirds_create_event(self, ical_component):

if not await self.filter(event_url=ical_component.get('url').replace("&", "__AND__")).aexists():
if not await self.filter(event_url=ical_component.get('url')).aexists():
event = await self.acreate(
title=ical_component.get('summary'),
event_url=ical_component.decoded('url').replace("&", "__AND__"),
event_url=ical_component.decoded('url'),
hash=self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))
)
else:
event = await self.filter(event_url=ical_component.get('url').replace("&", "__AND__")).afirst()
event = await self.filter(event_url=ical_component.get('url')).afirst()
if event.update_mode != 2:
return None


if event.hash == "":
event.hash = self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))


# Split location and address
address = ical_component.get('location')
location = address.replace('Vancouver, B.C., ', '')
Expand Down Expand Up @@ -345,7 +366,7 @@ async def gothunderbirds_create_event(self, ical_component):

event.address=address
event.location=location
event.event_url=ical_component.decoded('url').replace("&", "__AND__")
event.event_url=ical_component.decoded('url')
event.category='sports'
event.hidden=self.gothunderbirds_judge_hidden(ical_component)

Expand Down Expand Up @@ -419,12 +440,16 @@ async def phas_ubc_create_event(self, event_component):
event = await self.acreate(
title=title,
event_url=event_url,
hash=self.hashing(title + str(event_component.find('span', class_='start').get_text(strip=True)))
)
else:
event = await self.filter(event_url=event_url).afirst()
if event.update_mode != 2:
return None

if event.hash == "":
event.hash = self.hashing(title + str(event_component.find('span', class_='start').get_text(strip=True)))

# Extract start time
start_time_str = event_component.find('span', class_='start').get_text(strip=True)
parsed_start_time = datetime.fromisoformat(start_time_str)
Expand Down Expand Up @@ -474,13 +499,18 @@ async def cs_ubc_create_event(self, ical_component):
event = await self.acreate(
title=ical_component.get('summary'),
event_url=ical_component.decoded('url'),
hash=self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))
)
else:
event = await self.filter(event_url=ical_component.get('url')).afirst()
if event.update_mode != 2:
return None

event.title=ical_component.get('summary')

if event.hash == "":
event.hash = self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))

event.description= "<br>" + ical_component.get('description').replace("&amp;", "&")
if "<br>Name:" in event.description and "\nTitle" in event.description:
if event.description.index("<br>Name:") < event.description.index("\nTitle"):
Expand Down Expand Up @@ -550,6 +580,7 @@ async def stats_ubc_create_event(self, ical_component):
event = await self.acreate(
title=ical_component.get('summary'),
event_url=ical_component.decoded('url'),
hash=self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))
)
else:
event = await self.filter(event_url=ical_component.get('url')).afirst()
Expand All @@ -560,6 +591,9 @@ async def stats_ubc_create_event(self, ical_component):

event.title=ical_component.get('summary')

if event.hash == "":
event.hash = self.hashing(ical_component.get('summary') + str(ical_component.decoded('dtstart')))

# Clean up event description because they are so messy and have unnecessary information
description = str(ical_component.decoded('description'), 'UTF-8')
safety = 10
Expand Down Expand Up @@ -663,6 +697,12 @@ class Event(models.Model):
null=True,
blank=True,
)
hash = models.CharField(
max_length=50,
blank=False,
null=True,
default=''
)
image = models.CharField(
max_length=255,
blank=True,
Expand Down Expand Up @@ -696,6 +736,7 @@ class Event(models.Model):
FieldPanel("address"),
FieldPanel("host"),
FieldPanel("event_url"),
FieldPanel("hash"),
FieldPanel("image"),
FieldPanel(
"category",
Expand Down
14 changes: 13 additions & 1 deletion events/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,18 @@ def react(self, request):
'description': "Events Around Campus collected by The Ubyssey",
'url': 'https://ubyssey.ca/events/',
}

if request.GET.get("event"):
if Event.objects.filter(hash=request.GET.get("event")).exists():
event = Event.objects.filter(hash=request.GET.get("event")).first()

meta = {
'title': event.title,
'description': event.description,
'url': "https://ubyssey.ca/events/?event=" + event.hash,
'noindex': True,
}

return render(request, "events/event_page_react.html", {'ical':ical, 'rss':rss, 'meta':meta})

def landing(self, request):
Expand Down Expand Up @@ -593,7 +605,7 @@ def item_link(self, item):
class EventsSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Event
fields = ['id', 'title', 'description', 'start_time', 'end_time', 'location', 'address', 'host', 'email', 'event_url', 'category']
fields = ['id', 'title', 'description', 'start_time', 'end_time', 'location', 'address', 'host', 'email', 'event_url', 'hash', 'category']

class EventsViewSet(viewsets.ModelViewSet):
serializer_class = EventsSerializer
Expand Down
4 changes: 2 additions & 2 deletions home/templates/home/stream_blocks/links.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

<div class="events-sidebar">
<h2><a href="/events/?hidden=seminar">Events Around Campus</a></h2>
<a class="featured_event" href="/events/?event={{events.0.event_url}}" title="{{events.0.title}}">
<a class="featured_event" href="/events/?event={{events.0.hash}}" title="{{events.0.title}}">
<p class="featured_event__time">{{events.0.display_time}} - {{events.0.location}}</p>
<p class="featured_event__title">{{events.0.title}}</p>
</a>
Expand All @@ -30,7 +30,7 @@ <h3>Upcoming</h3>
{% for event in events %}
{% if not forloop.counter0 == 0 %}
<li>
<a href="/events/?event={{event.event_url}}&hidden=seminar" title="{{event.title}}">
<a href="/events/?event={{event.hash}}&hidden=seminar" title="{{event.title}}">
<b>{{event.display_time}}</b> {{event.title}}
</a>
</li>
Expand Down
12 changes: 7 additions & 5 deletions ubyssey/static_src/src/js/components/Events/calendar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,10 @@ function EventsOptions() {
'description': capitalize(category) + " Around Campus collected by The Ubyssey",
'url': 'https://ubyssey.ca/events/?category=' + category,
};

}

document.getElementsByTagName("title")[0].innerHTML = meta.title

Check failure

Code scanning / CodeQL

Client-side cross-site scripting High

Cross-site scripting vulnerability due to
user-provided value
.

return (
<>
<div class="events-calendar--categories">
Expand Down Expand Up @@ -428,11 +429,11 @@ function EventsCalendar({events}) {
<span className="events-calendar--number-dayOfWeek">{day.day_of_week} </span>{day.day}.
</button>
<ul>{day.events.map((event) =>
<li className={(eventHash==event.event_url && "selected") + " " + eventsTags(event)}>
<Link title={event.title.replace("<br>", ", ")} className="calendar-item" to={"?event=" + event.event_url} event-url={event.event_url}
<li className={(eventHash==event.hash && "selected") + " " + eventsTags(event)}>
<Link title={event.title.replace("<br>", ", ")} className="calendar-item" to={"?event=" + event.hash} event-url={event.event_url}
onClick={(e) => {
e.preventDefault();
searchParams.set("event", event.event_url);
searchParams.set("event", event.hash);
setSearchParams(searchParams);
}}
dangerouslySetInnerHTML={
Expand Down Expand Up @@ -468,8 +469,9 @@ function EventInfo({events}) {
if (query.get("event") != null){
let eventHash = query.get("event");
for (let i=0; i<events.length; i++) {
if (events[i].event_url == eventHash) {
if (events[i].hash == eventHash) {
event = events[i];
document.getElementsByTagName("title")[0].innerHTML = event.title;
break;
}
}
Expand Down

0 comments on commit 80006cb

Please sign in to comment.