From 388e58bf1e33c1caea1ce9bfb266c2ade4103a34 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Thu, 28 Mar 2019 13:43:40 -0500 Subject: [PATCH] Update handling for preferences --- src/invidious.cr | 17 ++--- src/invidious/helpers/macros.cr | 11 +++ src/invidious/users.cr | 122 ++++++++++++------------------- src/invidious/views/template.ecr | 3 +- 4 files changed, 63 insertions(+), 90 deletions(-) diff --git a/src/invidious.cr b/src/invidious.cr index a5f5196d..b576148e 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -160,7 +160,12 @@ proxies = PROXY_LIST before_all do |env| env.response.headers["X-XSS-Protection"] = "1; mode=block;" env.response.headers["X-Content-Type-Options"] = "nosniff" - preferences = DEFAULT_USER_PREFERENCES.dup + + begin + preferences = Preferences.from_json(env.request.cookies["PREFS"]?.try &.value || "{}") + rescue + preferences = Preferences.from_json("{}") + end if env.request.cookies.has_key? "SID" headers = HTTP::Headers.new @@ -201,10 +206,6 @@ before_all do |env| end end - if env.request.cookies.has_key? "PREFS" - preferences = Preferences.from_json(env.request.cookies["PREFS"].value) - end - dark_mode = env.params.query["dark_mode"]? || preferences.dark_mode.to_s dark_mode = dark_mode == "true" @@ -1082,12 +1083,6 @@ post "/login" do |env| next templated "error" end - user = PG_DB.query_one?("SELECT * FROM users WHERE LOWER(email) = LOWER($1) AND password IS NOT NULL", email, as: User) - if user - error_message = translate(locale, "Please sign in") - next templated "error" - end - sid = Base64.urlsafe_encode(Random::Secure.random_bytes(32)) user, sid = create_user(sid, email, password) user_array = user.to_a diff --git a/src/invidious/helpers/macros.cr b/src/invidious/helpers/macros.cr index 977b1fbc..5991faaf 100644 --- a/src/invidious/helpers/macros.cr +++ b/src/invidious/helpers/macros.cr @@ -9,6 +9,17 @@ macro add_mapping(mapping) DB.mapping({{mapping}}) end +macro json_mapping(mapping) + def initialize({{*mapping.keys.map { |id| "@#{id}".id }}}) + end + + def to_a + return [{{*mapping.keys.map { |id| "@#{id}".id }}}] + end + + JSON.mapping({{mapping}}) +end + macro templated(filename, template = "template") render "src/invidious/views/#{{{filename}}}.ecr", "src/invidious/views/#{{{template}}}.ecr" end diff --git a/src/invidious/users.cr b/src/invidious/users.cr index 747b72d8..8a994795 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -6,7 +6,7 @@ class User begin Preferences.from_json(rs.read(String)) rescue ex - DEFAULT_USER_PREFERENCES + Preferences.from_json("{}") end end end @@ -18,7 +18,6 @@ class User email: String, preferences: { type: Preferences, - default: DEFAULT_USER_PREFERENCES, converter: PreferencesConverter, }, password: String?, @@ -27,30 +26,30 @@ class User }) end -DEFAULT_USER_PREFERENCES = Preferences.from_json({ - "video_loop" => false, - "autoplay" => false, - "continue" => false, - "local" => false, - "listen" => false, - "speed" => 1.0, - "quality" => "hd720", - "volume" => 100, - "comments" => ["youtube", ""], - "captions" => ["", "", ""], - "related_videos" => true, - "redirect_feed" => false, - "locale" => "en-US", - "dark_mode" => false, - "thin_mode" => false, - "max_results" => 40, - "sort" => "published", - "latest_only" => false, - "unseen_only" => false, - "notifications_only" => false, -}.to_json) +DEFAULT_USER_PREFERENCES = Preferences.new( + video_loop: false, + autoplay: false, + continue: false, + local: false, + listen: false, + speed: 1.0_f32, + quality: "hd720", + volume: 100, + comments: ["youtube", ""], + captions: ["", "", ""], + related_videos: true, + redirect_feed: false, + locale: "en-US", + dark_mode: false, + thin_mode: false, + max_results: 40, + sort: "published", + latest_only: false, + unseen_only: false, + notifications_only: false, +) -class Preferences +struct Preferences module StringToArray def self.to_json(value : Array(String), json : JSON::Builder) json.array do @@ -74,58 +73,27 @@ class Preferences end end - JSON.mapping({ - video_loop: Bool, - autoplay: Bool, - continue: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.continue, - }, - local: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.local, - }, - listen: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.listen, - }, - speed: Float32, - quality: String, - volume: Int32, - comments: { - type: Array(String), - default: DEFAULT_USER_PREFERENCES.comments, - converter: StringToArray, - }, - captions: { - type: Array(String), - default: DEFAULT_USER_PREFERENCES.captions, - }, - redirect_feed: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.redirect_feed, - }, - related_videos: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.related_videos, - }, - dark_mode: Bool, - thin_mode: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.thin_mode, - }, - max_results: Int32, - sort: String, - latest_only: Bool, - unseen_only: Bool, - notifications_only: { - type: Bool, - default: DEFAULT_USER_PREFERENCES.notifications_only, - }, - locale: { - type: String, - default: DEFAULT_USER_PREFERENCES.locale, - }, + json_mapping({ + video_loop: {type: Bool, default: DEFAULT_USER_PREFERENCES.video_loop}, + autoplay: {type: Bool, default: DEFAULT_USER_PREFERENCES.autoplay}, + continue: {type: Bool, default: DEFAULT_USER_PREFERENCES.continue}, + local: {type: Bool, default: DEFAULT_USER_PREFERENCES.local}, + listen: {type: Bool, default: DEFAULT_USER_PREFERENCES.listen}, + speed: {type: Float32, default: DEFAULT_USER_PREFERENCES.speed}, + quality: {type: String, default: DEFAULT_USER_PREFERENCES.quality}, + volume: {type: Int32, default: DEFAULT_USER_PREFERENCES.volume}, + comments: {type: Array(String), default: DEFAULT_USER_PREFERENCES.comments, converter: StringToArray}, + captions: {type: Array(String), default: DEFAULT_USER_PREFERENCES.captions, converter: StringToArray}, + redirect_feed: {type: Bool, default: DEFAULT_USER_PREFERENCES.redirect_feed}, + related_videos: {type: Bool, default: DEFAULT_USER_PREFERENCES.related_videos}, + dark_mode: {type: Bool, default: DEFAULT_USER_PREFERENCES.dark_mode}, + thin_mode: {type: Bool, default: DEFAULT_USER_PREFERENCES.thin_mode}, + max_results: {type: Int32, default: DEFAULT_USER_PREFERENCES.max_results}, + sort: {type: String, default: DEFAULT_USER_PREFERENCES.sort}, + latest_only: {type: Bool, default: DEFAULT_USER_PREFERENCES.latest_only}, + unseen_only: {type: Bool, default: DEFAULT_USER_PREFERENCES.unseen_only}, + notifications_only: {type: Bool, default: DEFAULT_USER_PREFERENCES.notifications_only}, + locale: {type: String, default: DEFAULT_USER_PREFERENCES.locale}, }) end diff --git a/src/invidious/views/template.ecr b/src/invidious/views/template.ecr index 01e9c355..df5b94f4 100644 --- a/src/invidious/views/template.ecr +++ b/src/invidious/views/template.ecr @@ -46,8 +46,7 @@ <% if env.get? "user" %>
" class="pure-menu-heading"> - <% preferences = env.get("user").as(User).preferences %> - <% if preferences.dark_mode %> + <% if env.get("preferences").as(Preferences).dark_mode %> <% else %>