about summary refs log tree commit homepage
path: root/lib/dtas/tracklist.rb
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-12-07 09:50:26 +0000
committerEric Wong <e@80x24.org>2015-12-07 09:50:26 +0000
commitb08fe09e296524daf4de7ed16e0bed224f5008a2 (patch)
treec349b14b6e72f168469e3a8a732099d5bd5d681a /lib/dtas/tracklist.rb
parent3e013d3f24f0f935dce985d4c6bd155889e05dbb (diff)
downloaddtas-b08fe09e296524daf4de7ed16e0bed224f5008a2.tar.gz
This defaults to 16384?  This is what mpd uses by default as well.
Of course folks interacting with dtas-player directly can override
this:

	dtas-tl max INTEGER
	dtas-tl max

This is NOT meant to be a hard security measure for local users
talking to dtas-player directly.  It is only to prevent
accidentally stupid things like flooding the playlist with
a broken script and to prevent remote users from DoS-ing
us via the to-be-written mpd proxy/emulation layer.

Remember: dtas-player itself will ALWAYS remain capable of
executing arbitrary code :)
Diffstat (limited to 'lib/dtas/tracklist.rb')
-rw-r--r--lib/dtas/tracklist.rb23
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/dtas/tracklist.rb b/lib/dtas/tracklist.rb
index f3dca31..d3db4e9 100644
--- a/lib/dtas/tracklist.rb
+++ b/lib/dtas/tracklist.rb
@@ -10,20 +10,27 @@ class DTAS::Tracklist # :nodoc:
   include DTAS::Serialize
   attr_accessor :repeat # true, false, 1
   attr_reader :shuffle  # false or shuffled @list
+  attr_accessor :max # integer
 
-  SIVS = %w(list pos repeat)
   TL_DEFAULTS = {
-    "list" => [],
-    "pos" => -1,
-    "repeat" => false,
+    'list' => [],
+    'pos' => -1,
+    'repeat' => false,
+    'max' => 20_000,
   }
+  SIVS = TL_DEFAULTS.keys
 
   def self.load(hash)
     obj = new
     obj.instance_eval do
-      list = hash["list"] and @list.replace(list.map { |s| new_track(s) })
-      @pos = hash["pos"] || -1
-      @repeat = hash["repeat"] || false
+      list = hash['list'] and @list.replace(list.map { |s| new_track(s) })
+      %w(pos repeat max).each do |k|
+        instance_variable_set("@#{k}", hash[k] || TL_DEFAULTS[k])
+      end
+
+      # n.b.: we don't check @list.size against max here in case people
+      # are migrating
+
       if hash['shuffle']
         @shuffle = @list.shuffle
         @pos = _idx_of(@shuffle, @list[@pos].track_id) if @pos >= 0
@@ -121,6 +128,8 @@ class DTAS::Tracklist # :nodoc:
   end
 
   def add_track(track, after_track_id = nil, set_as_current = false)
+    return false if @list.size >= @max
+
     track = new_track(track)
     if after_track_id
       idx = _idx_of(@list, after_track_id) or