Esempio n. 1
0
class SessionStore(requests.Session):
    """A ``requests.Session`` subclass implementing a file-based session store.
    """

    def __init__(self, cookie_file=None):
        super(SessionStore, self).__init__()
        if cookie_file is None:
            cookie_file = conf.DEFAULT_COOKIE_FILE
        cookie_dir = os.path.dirname(cookie_file)
        self.cookies = MozillaCookieJar(cookie_file)
        # Create the $HOME/.slipstream dir if it doesn't exist
        if not os.path.isdir(cookie_dir):
            os.mkdir(cookie_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
        # Load existing cookies if the cookies.txt exists
        if os.path.isfile(cookie_file):
            self.cookies.load(ignore_discard=True)
            self.cookies.clear_expired_cookies()

    def request(self, *args, **kwargs):
        response = super(SessionStore, self).request(*args, **kwargs)
        self.cookies.save(ignore_discard=True)
        return response

    def clear(self, domain):
        """Clear cookies for the specified domain."""
        try:
            self.cookies.clear(domain)
            self.cookies.save()
        except KeyError:
            pass
Esempio n. 2
0
class SessionStore(requests.Session):
    """A ``requests.Session`` subclass implementing a file-based session store.
    """
    def __init__(self, cookie_file=None):
        super(SessionStore, self).__init__()
        if cookie_file is None:
            cookie_file = conf.DEFAULT_COOKIE_FILE
        cookie_dir = os.path.dirname(cookie_file)
        self.cookies = MozillaCookieJar(cookie_file)
        # Create the $HOME/.slipstream dir if it doesn't exist
        if not os.path.isdir(cookie_dir):
            os.mkdir(cookie_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
        # Load existing cookies if the cookies.txt exists
        if os.path.isfile(cookie_file):
            self.cookies.load(ignore_discard=True)
            self.cookies.clear_expired_cookies()

    def request(self, *args, **kwargs):
        response = super(SessionStore, self).request(*args, **kwargs)
        self.cookies.save(ignore_discard=True)
        return response

    def clear(self, domain):
        """Clear cookies for the specified domain."""
        try:
            self.cookies.clear(domain)
            self.cookies.save()
        except KeyError:
            pass
Esempio n. 3
0
 def __init__(self, cookie_file=None):
     super(SessionStore, self).__init__()
     if cookie_file is None:
         cookie_file = conf.DEFAULT_COOKIE_FILE
     cookie_dir = os.path.dirname(cookie_file)
     self.cookies = MozillaCookieJar(cookie_file)
     # Create the $HOME/.slipstream dir if it doesn't exist
     if not os.path.isdir(cookie_dir):
         os.mkdir(cookie_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
     # Load existing cookies if the cookies.txt exists
     if os.path.isfile(cookie_file):
         self.cookies.load(ignore_discard=True)
         self.cookies.clear_expired_cookies()
Esempio n. 4
0
def create_cookie_jar(cookie_file=None):
    """Return a cookie jar backed by cookie_file

    If cooie_file is not provided, we will default it. If the
    cookie_file does not exist, we will create it with the proper
    permissions.

    In the case where we default cookie_file, and it does not exist,
    we will attempt to copy the .post-review-cookies.txt file.
    """
    home_path = get_home_path()

    if not cookie_file:
        cookie_file = os.path.join(home_path, RBTOOLS_COOKIE_FILE)
        post_review_cookies = os.path.join(home_path,
                                           '.post-review-cookies.txt')

        if (not os.path.isfile(cookie_file) and
            os.path.isfile(post_review_cookies)):
                try:
                    shutil.copyfile(post_review_cookies, cookie_file)
                    os.chmod(cookie_file, 0o600)
                except IOError as e:
                    logging.warning("There was an error while copying "
                                    "post-review's cookies: %s", e)

    if not os.path.isfile(cookie_file):
        try:
            open(cookie_file, 'w').close()
            os.chmod(cookie_file, 0o600)
        except IOError as e:
            logging.warning('There was an error while creating a '
                            'cookie file: %s', e)

    return MozillaCookieJar(cookie_file), cookie_file
Esempio n. 5
0
 def __init__(self, endpoint, reauthenticate, cookie_file=None):
     super(SessionStore, self).__init__()
     self.session_base_url = '{}/api/session'.format(endpoint)
     self.reauthenticate = reauthenticate
     self.login_params = None
     if cookie_file is None:
         cookie_file = DEFAULT_COOKIE_FILE
     cookie_dir = os.path.dirname(cookie_file)
     self.cookies = MozillaCookieJar(cookie_file)
     # Create the $HOME/.slipstream dir if it doesn't exist
     if not os.path.isdir(cookie_dir):
         os.mkdir(cookie_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
     # Load existing cookies if the cookies.txt exists
     if os.path.isfile(cookie_file):
         self.cookies.load(ignore_discard=True)
         self.cookies.clear_expired_cookies()
Esempio n. 6
0
def fresh_session(
    url,
    cert_file,
    key_file,
    cookie_filename="cookies.txt",
):
    logger.debug("Setting up fresh session using cert=%s key=%s", cert_file,
                 key_file)

    s = requests.Session()
    s.cert = (cert_file, key_file)
    cookiejar = MozillaCookieJar(cookie_filename)
    s.cookies = cookiejar

    logger.info("Request #1, to get main redirect to authentication: %s", url)
    r1 = s.get(url, timeout=DEFAULT_TIMEOUT_SECONDS, verify=False)

    # Parse out the session keys from the GET arguments:
    redirect_url = urlparse(r1.url)
    logger.debug("Was redirected to SSO URL: %s", str(redirect_url))

    # ...and inject them into the Kerberos authentication URL
    final_auth_url = "{0}?{1}".format(urljoin(r1.url, CERT_AUTH_URL_FRAGMENT),
                                      redirect_url.query)
    logger.info("Request #2, performing SSL Cert authentication against %s",
                final_auth_url)
    r2 = s.get(final_auth_url,
               cookies=cookiejar,
               verify=False,
               timeout=DEFAULT_TIMEOUT_SECONDS)

    # Did it work? Raise Exception otherwise.
    r2.raise_for_status()

    # Get the contents
    try:
        tree = ET.fromstring(r2.content)
    except ET.ParseError as e:
        logger.error("Could not parse response from server! "
                     "The contents returned was:\n{}".format(r2.content))
        raise e

    action = tree.findall("body/form")[0].get("action")

    # Unpack the hidden form data fields
    form_data = {
        elm.get("name"): elm.get("value")
        for elm in tree.findall("body/form/input")
    }

    # ...and submit the form (WHY IS THIS STEP EVEN HERE!?)
    logger.info("Performing final authentication POST to %s", action)
    r3 = s.post(url=action, data=form_data, timeout=DEFAULT_TIMEOUT_SECONDS)
    # Did _that_ work?
    r3.raise_for_status()

    # The session cookie jar should now contain the necessary cookies.
    logger.debug("Cookie jar now contains: %s", str(s.cookies))
    return s
Esempio n. 7
0
 def __init__(self, cookie_file=None):
     super(SessionStore, self).__init__()
     if cookie_file is None:
         cookie_file = conf.DEFAULT_COOKIE_FILE
     cookie_dir = os.path.dirname(cookie_file)
     self.cookies = MozillaCookieJar(cookie_file)
     # Create the $HOME/.slipstream dir if it doesn't exist
     if not os.path.isdir(cookie_dir):
         os.mkdir(cookie_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
     # Load existing cookies if the cookies.txt exists
     if os.path.isfile(cookie_file):
         self.cookies.load(ignore_discard=True)
         self.cookies.clear_expired_cookies()
Esempio n. 8
0
def session_from_cookies_file(
    cert_file,
    key_file,
    cookie_filename="cookies.txt",
):
    logger.debug(
        "Setting up session using cert=%s key=%s based on cookies in %s",
        cert_file,
        key_file,
        cookie_filename,
    )
    s = requests.Session()
    s.cert = (cert_file, key_file)
    s.cookies = MozillaCookieJar(cookie_filename)
    s.cookies.load(ignore_discard=True, ignore_expires=True)
    return s
Esempio n. 9
0
from six.moves.http_cookiejar import Cookie
from six.moves.html_parser import HTMLParser
from six.moves.urllib_error import HTTPError
from six.moves import urllib_request
from six.moves import http_client
from six.moves import urllib_response


CACHE = simplecache.SimpleCache()
CACHE.enable_mem_cache = False
CACHE_ENABLED = True # False for debuging
CACHE_EXPIRATION = datetime.timedelta(minutes=20)
CACHE_PREFIX = ADDON.getAddonInfo('id') + '_' + ADDON_VERSION + '_'

cookies_lock = Lock()
cj = MozillaCookieJar()
cookies_path = os.path.join(DATA_PATH, "cookies.dat")

# Headers por defecto, si no se especifica nada
default_headers = dict()
default_headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"
default_headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
default_headers["Accept-Language"] = "es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3"
default_headers["Accept-Charset"] = "UTF-8"
default_headers["Accept-Encoding"] = "gzip"
default_headers["Upgrade-Insecure-Requests"] = '1'

# No comprobar certificados
if hasattr(ssl, '_create_unverified_context'):
    ssl._create_default_https_context = ssl._create_unverified_context
                            version=__version__)

    args = arg_parser.parse_args()

    # DEBUG takes presedence over VERBOSE:
    if args.debug:
        logger.setLevel(logging.DEBUG)

    elif args.verbose:
        logger.setLevel(logging.INFO)

    cookie_filename = args.cookie_filename

    target_url = args.url

    cookiejar = MozillaCookieJar(cookie_filename)

    if args.kerberos:
        cern_sso.krb_sign_on(target_url, cookiejar=cookiejar)
    elif args.cert:
        cert_file = "%s.pem" % args.cert
        key_file = "%s.key" % args.cert

        logger.info("Using SSL certificate file %s and key %s" %
                    (cert_file, key_file))

        cern_sso.cert_sign_on(target_url,
                              cert_file=cert_file,
                              key_file=key_file,
                              cookiejar=cookiejar)
    else:
Esempio n. 11
0
class SessionStore(requests.Session):
    """A ``requests.Session`` subclass implementing a file-based session store."""

    def __init__(self, endpoint, reauthenticate, cookie_file=None):
        super(SessionStore, self).__init__()
        self.session_base_url = '{}/api/session'.format(endpoint)
        self.reauthenticate = reauthenticate
        self.login_params = None
        if cookie_file is None:
            cookie_file = DEFAULT_COOKIE_FILE
        cookie_dir = os.path.dirname(cookie_file)
        self.cookies = MozillaCookieJar(cookie_file)
        # Create the $HOME/.slipstream dir if it doesn't exist
        if not os.path.isdir(cookie_dir):
            os.mkdir(cookie_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
        # Load existing cookies if the cookies.txt exists
        if os.path.isfile(cookie_file):
            self.cookies.load(ignore_discard=True)
            self.cookies.clear_expired_cookies()

    def need_to_login(self, accessed_url, status_code):
        return self.reauthenticate and status_code in [401, 403] and accessed_url != self.session_base_url


    def request(self, *args, **kwargs):
        super_request = super(SessionStore, self).request
        response = super_request(*args, **kwargs)

        if not self.verify and response.cookies:
            self._unsecure_cookie(args[1], response)
        self.cookies.save(ignore_discard=True)

        url = args[1]
        if self.need_to_login(url, response.status_code):
            login_response = self.cimi_login(self.login_params)
            if login_response is not None and login_response.status_code == 201:
                # retry the call after reauthentication
                response = super_request(*args, **kwargs)

        return response

    def cimi_login(self, login_params):
        self.login_params = login_params
        if self.login_params:
            return self.request('POST', self.session_base_url,
                                headers={'Content-Type': 'application/json',
                                         'Accept': 'application/json'},
                                json={'sessionTemplate': login_params})
        else:
            return None

    def _unsecure_cookie(self, url_str, response):
        url = urlparse(url_str)
        if url.scheme == 'http':
            for cookie in response.cookies:
                cookie.secure = False
                self.cookies.set_cookie_if_ok(cookie, MockRequest(response.request))

    def clear(self, domain):
        """Clear cookies for the specified domain."""
        try:
            self.cookies.clear(domain)
            self.cookies.save()
        except KeyError:
            pass