mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	It’s unclear what was supposed to be “safe” about this wrapper. The hashlib API is fine without it, and we don’t want to encourage further use of SHA-1. Signed-off-by: Anders Kaseorg <anders@zulip.com>
		
			
				
	
	
		
			36 lines
		
	
	
		
			832 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			832 B
		
	
	
	
		
			Python
		
	
	
	
	
	
import re
 | 
						|
import secrets
 | 
						|
from typing import Callable, List, Optional, TypeVar
 | 
						|
 | 
						|
T = TypeVar("T")
 | 
						|
 | 
						|
 | 
						|
def generate_api_key() -> str:
 | 
						|
    api_key = ""
 | 
						|
    while len(api_key) < 32:
 | 
						|
        # One iteration suffices 99.4992% of the time.
 | 
						|
        api_key += secrets.token_urlsafe(3 * 9).replace("_", "").replace("-", "")
 | 
						|
    return api_key[:32]
 | 
						|
 | 
						|
 | 
						|
def has_api_key_format(key: str) -> bool:
 | 
						|
    return bool(re.fullmatch(r"([A-Za-z0-9]){32}", key))
 | 
						|
 | 
						|
 | 
						|
def assert_is_not_none(value: Optional[T]) -> T:
 | 
						|
    assert value is not None
 | 
						|
    return value
 | 
						|
 | 
						|
 | 
						|
def process_list_in_batches(
 | 
						|
    lst: List[T], chunk_size: int, process_batch: Callable[[List[T]], None]
 | 
						|
) -> None:
 | 
						|
    offset = 0
 | 
						|
 | 
						|
    while True:
 | 
						|
        items = lst[offset : offset + chunk_size]
 | 
						|
        if not items:
 | 
						|
            break
 | 
						|
        process_batch(items)
 | 
						|
        offset += chunk_size
 |