[options] Correctly hide login info from debug outputs (#13696)
Iterate over opts instead of PRIVATE_OPTS for both performance and correctness
This commit is contained in:
		
							parent
							
								
									0db492c02a
								
							
						
					
					
						commit
						905d18a7aa
					
				
					 3 changed files with 50 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,9 @@
 | 
			
		|||
version <unreleased>
 | 
			
		||||
 | 
			
		||||
Core
 | 
			
		||||
* [options] Correctly hide login info from debug outputs (#13696)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
version 2017.07.23
 | 
			
		||||
 | 
			
		||||
Core
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										26
									
								
								test/test_options.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								test/test_options.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
# coding: utf-8
 | 
			
		||||
 | 
			
		||||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
# Allow direct execution
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import unittest
 | 
			
		||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 | 
			
		||||
 | 
			
		||||
from youtube_dl.options import _hide_login_info
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestOptions(unittest.TestCase):
 | 
			
		||||
    def test_hide_login_inf(self):
 | 
			
		||||
        self.assertEqual(_hide_login_info(['-u', 'foo', '-p', 'bar']),
 | 
			
		||||
                         ['-u', 'PRIVATE', '-p', 'PRIVATE'])
 | 
			
		||||
        self.assertEqual(_hide_login_info(['-u']), ['-u'])
 | 
			
		||||
        self.assertEqual(_hide_login_info(['-u', 'foo', '-u', 'bar']),
 | 
			
		||||
                         ['-u', 'PRIVATE', '-u', 'PRIVATE'])
 | 
			
		||||
        self.assertEqual(_hide_login_info(['--username=foo']),
 | 
			
		||||
                         ['--username=PRIVATE'])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
| 
						 | 
				
			
			@ -20,6 +20,24 @@ from .utils import (
 | 
			
		|||
from .version import __version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _hide_login_info(opts):
 | 
			
		||||
    PRIVATE_OPTS = set(['-p', '--password', '-u', '--username', '--video-password', '--ap-password', '--ap-username'])
 | 
			
		||||
    eqre = re.compile('^(?P<key>' + ('|'.join(re.escape(po) for po in PRIVATE_OPTS)) + ')=.+$')
 | 
			
		||||
 | 
			
		||||
    def _scrub_eq(o):
 | 
			
		||||
        m = eqre.match(o)
 | 
			
		||||
        if m:
 | 
			
		||||
            return m.group('key') + '=PRIVATE'
 | 
			
		||||
        else:
 | 
			
		||||
            return o
 | 
			
		||||
 | 
			
		||||
    opts = list(map(_scrub_eq, opts))
 | 
			
		||||
    for idx, opt in enumerate(opts):
 | 
			
		||||
        if opt in PRIVATE_OPTS and idx + 1 < len(opts):
 | 
			
		||||
            opts[idx + 1] = 'PRIVATE'
 | 
			
		||||
    return opts
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def parseOpts(overrideArguments=None):
 | 
			
		||||
    def _readOptions(filename_bytes, default=[]):
 | 
			
		||||
        try:
 | 
			
		||||
| 
						 | 
				
			
			@ -93,26 +111,6 @@ def parseOpts(overrideArguments=None):
 | 
			
		|||
    def _comma_separated_values_options_callback(option, opt_str, value, parser):
 | 
			
		||||
        setattr(parser.values, option.dest, value.split(','))
 | 
			
		||||
 | 
			
		||||
    def _hide_login_info(opts):
 | 
			
		||||
        PRIVATE_OPTS = ['-p', '--password', '-u', '--username', '--video-password', '--ap-password', '--ap-username']
 | 
			
		||||
        eqre = re.compile('^(?P<key>' + ('|'.join(re.escape(po) for po in PRIVATE_OPTS)) + ')=.+$')
 | 
			
		||||
 | 
			
		||||
        def _scrub_eq(o):
 | 
			
		||||
            m = eqre.match(o)
 | 
			
		||||
            if m:
 | 
			
		||||
                return m.group('key') + '=PRIVATE'
 | 
			
		||||
            else:
 | 
			
		||||
                return o
 | 
			
		||||
 | 
			
		||||
        opts = list(map(_scrub_eq, opts))
 | 
			
		||||
        for private_opt in PRIVATE_OPTS:
 | 
			
		||||
            try:
 | 
			
		||||
                i = opts.index(private_opt)
 | 
			
		||||
                opts[i + 1] = 'PRIVATE'
 | 
			
		||||
            except ValueError:
 | 
			
		||||
                pass
 | 
			
		||||
        return opts
 | 
			
		||||
 | 
			
		||||
    # No need to wrap help messages if we're on a wide console
 | 
			
		||||
    columns = compat_get_terminal_size().columns
 | 
			
		||||
    max_width = columns if columns else 80
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue