File: //usr/local/CyberCP/plogical/__pycache__/sslUtilities.cpython-310.pyc
o
��h� � @ s� d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlm Z z
d dl
mZmZ W n Y d dl
mZ G dd� d�Zdd d
�ZdS )� N)�CyberCPLogFileWriter)�ProcessUtilities)�ChildDomains�Websites��
ACLManagerc @ s� e Zd ZdZdZedd� �Zedd� �ZdZdZ d Z
ed
d� �Zedd
� �Zedd� �Z
edd� �Zedd� �Zedd� �Zedd� �Zeddd��Zed dd��ZdS )!�sslUtilitiesz/usr/local/lswsz&/usr/local/lsws/conf/dvhost_redis.confc C s� | sdS t | �} i dd�dd�dd�dd �d
d�dd
�dd�dd�dd�dd�dd�dd�dd�dd�dd�d d!�d"d#�d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3��}d4d5l}|�� D ]1\}}|�|| |j�r�| �d6�}|D ]}d7|v r�|d8|�d7�d9 �� � �7 } | S qj| S qWd:| v r�d;| v r�d4d5l}|�d<| �}|r�|d= }t|�d>kr�d?|� �S | �d6�}|D ]}|�� � d@�s�dA|�
� v r�|�� S q�t| �dBkr�dC| dDd5� � �S d?| � �S )Ez<Parse ACME error output to extract meaningful error messageszUnknown error occurred�rateLimitedz_Rate limit exceeded. Too many certificates issued for this domain. Please wait before retrying.z&urn:ietf:params:acme:error:rateLimitedz1Rate limit exceeded. Please wait before retrying.ztoo many certificatesz2Rate limit: Too many certificates issued recently.zDNS problem: NXDOMAINz7DNS Error: Domain does not exist or DNS not propagated.zDNS problemz;DNS validation failed. Ensure domain points to this server.zConnection refusedz?Cannot connect to ACME server. Check firewall/network settings.zConnection timeoutz@Connection to ACME server timed out. Check network connectivity.zTimeout during connectz7Connection timeout. The ACME server may be unreachable.�unauthorizedz5Authorization failed. Domain validation unsuccessful.z'urn:ietf:params:acme:error:unauthorizedz5Domain authorization failed. Verify domain ownership.zInvalid response fromz/Invalid response from domain during validation.�404z9Challenge file not found. Check web server configuration.�403z=Access forbidden. Check file permissions and .htaccess rules.z
CAA recordzACAA record prevents certificate issuance. Update DNS CAA records.zurn:ietf:params:acme:error:caaz4CAA record forbids issuance. Check DNS CAA settings.zChallenge failedz4ACME challenge failed. Ensure port 80 is accessible.zNo valid IP addressesz'No valid IP addresses found for domain.z(Cannot connect to domain for validation.zGA conflicting request exists. Previous request may still be processing.z'Malformed request. Check domain format.z,ACME server internal error. Try again later.z.Order not ready. Domain validation incomplete.z9Bad nonce error. This is usually temporary, please retry.z(Invalid nonce. Please retry the request.z1Account registration failed. Check email address.z1Cannot create ACME account. Check email validity.z Certificate verification failed.z/HTTP validation failed. Ensure port 80 is open.z HTTPS validation issue detected.z0Invalid email address provided for registration.z3Domain is blacklisted by the certificate authority.z>Certificate authority policy forbids issuance for this domain.)zCould not connect to�conflictingRequestz$urn:ietf:params:acme:error:malformedz)urn:ietf:params:acme:error:serverInternalz(urn:ietf:params:acme:error:orderNotReady�badNoncez$JWS has an invalid anti-replay noncezAccount registration errorzError creating new accountzVerify errorzFetching http://zFetching https://zInvalid email address�blacklisted�
PolicyForbidsr N�
zDetail:z Detail: � �[�]z\[([^\]]+)\]����
zSSL issuance failed: zError:zerror:�� zSSL issuance failed: ...i8���)�str�re�items�search�
IGNORECASE�split�strip�findall�len�
startswith�lower) �error_output�error_patternsr �pattern�message�lines�line�bracket_content�potential_error� r+ �+/usr/local/CyberCP/plogical/sslUtilities.py�parseACMEError s� �������� �
���
������$
��
�
zsslUtilities.parseACMEErrorc
C s� zad| � d�}zt j|dddd�}W n ty' t j|dt jt jdd�}Y nw |j�� r0W dS d| � d�}zt j|dddd�}W n tyV t j|dt jt jdd�}Y nw |j�� r_W dS W dS z t�| � W Y dS Y Y dS )z>Check if domain has valid DNS records using external DNS queryzdig +short z A @8.8.8.8T)�shell�capture_output�text)r. �stdout�stderr�universal_newlinesz AAAA @8.8.8.8F)�
subprocess�run� TypeError�PIPEr1 r �socket�
gethostbyname)�domain�command�resultr+ r+ r, �checkDNSRecordse s8
��
��
zsslUtilities.checkDNSRecordsr r � c
C s� z`ddl m} ddlm} t| d��D}|�� }|�||� �}|j�|j �}|rL|j
�|j�}z
t
j�dt|�� �� W n Y d|fW d � W S W d � W dS 1 sYw Y W d S tyx } zdt|�fW Y d }~S d }~ww )Nr )�x509)�default_backend�rbzCovered domains: r )r N)�cryptographyr? �cryptography.hazmat.backendsr@ �open�read�load_pem_x509_certificate�
extensions�get_extension_for_class�SubjectAlternativeName�value�get_values_for_type�DNSName�loggingr �writeToFiler �
BaseException) � cert_pathr? r@ � cert_file� cert_data�cert�
san_extension�san_domains�msgr+ r+ r, �getDomainsCovered� s* �(���zsslUtilities.getDomainsCoveredc C s� d| }t j�|�r�dd l}|j�|jjt|d��� �}|� � �
� d d �d�}t j�tj
�r=tj�d| � d|� d�� |d krDtjS |d
krdt�|�\}}|rdt|�dkratj�d| d� ntjS |�� �d�}dd
lm} |�|d�} |�� }
| |
}t|j�dkr�|dkr�tj�d| d� tjS |dkr�tj�d| � �d� tjS |d
kr�tj�d| � �d� tjS tj�d| � �d� tjS tj�d| � �d� tjS )N�&/etc/letsencrypt/live/%s/fullchain.pemr �rr �utf-8zSSL provider for z is �.z(STAGING) Let's Encryptz
Let's Encryptz�[CheckIfSSLNeedsToBeIssued] SSL exists for %s and both versions are covered, just need to ensure if SSL is valid for less then 15 days.�ascii��datetime�
%Y%m%d%H%M%SZ� �Denialz\[CheckIfSSLNeedsToBeIssued] SSL exists for %s and is not ready to fetch new SSL., skipping..zJ[CheckIfSSLNeedsToBeIssued] Self-signed SSL found, lets issue new SSL for z1[CheckIfSSLNeedsToBeIssued] Custom SSL found for z2[CheckIfSSLNeedsToBeIssued] We will issue SSL for )�os�path�exists�OpenSSL�crypto�load_certificate�FILETYPE_PEMrD rE �
get_issuer�get_components�decoder � debugPathrM r rN r � ISSUE_SSLrW r �get_notAfterr^ �strptime�now�int�days�
DONT_ISSUE)�virtualHostName�filePathre r? �SSLProvider�status�domains�
expireDatar^ � finalDaterp �diffr+ r+ r, �CheckIfSSLNeedsToBeIssued� sh ����
�
�
�
�z&sslUtilities.CheckIfSSLNeedsToBeIssuedc
C s� zOt d��� }d}|D ]A}|�d�dkr|�d�dkrd}q|dkr-|�d�dkr- W dS |�| �dkrL|dkrLdd � |�d
�D �}|d | krL W dS qW d S tyl } ztj�t|�d � W Y d }~dS d }~ww )N�&/usr/local/lsws/conf/httpd_config.confr �listenerr �SSLr �}c S s g | ]}|r|�qS r+ r+ )�.0�_fr+ r+ r, �
<listcomp>� s z.sslUtilities.checkIfSSLMap.<locals>.<listcomp>� z1 [IO Error with main config file [checkIfSSLMap]]) rD � readlines�findr rO rM r rN r )rt �data�sslCheckr rV r+ r+ r, �
checkIfSSLMap� s* ����zsslUtilities.checkIfSSLMapc
C �t zt d��� } | D ]
}|�d�dkr W dS q W dS ty9 } ztj�t|�d � t|�W Y d }~S d }~ww )Nr} zlistener SSLr r z4 [IO Error with main config file [checkSSLListener]]r �rD r� r� rO rM r rN r �r� r rV r+ r+ r, �checkSSLListener� s �����zsslUtilities.checkSSLListenerc
C r� )Nr} zlistener SSL IPv6r r z8 [IO Error with main config file [checkSSLIPv6Listener]]r r� r� r+ r+ r, �checkSSLIPv6Listener s ���
���z!sslUtilities.checkSSLIPv6Listenerc
C s^ zt �| �}t �d| �}d||gW S ty. } zddt|� d gW Y d }~S d }~ww )N�www.r r �347 � [issueSSLForDomain])r8 r9 rO r )rt �
withoutWWW�withWWWrV r+ r+ r, �
getDNSRecords s
��zsslUtilities.getDNSRecordsc
C s� �z+t j�tjdd| �}t j�|d�}t j�|�s*tj�d|� �� dd|� �fW S zt |d��}|�
� }W d � n1 s?w Y W n' tyl } ztj�dt|�� �� ddt|�� �fW Y d}~W S d}~ww g }|�
d �d
kr�tj�d| � �� W dS |�
d
�d
kr�|�
d�d
kr�|�d� |�
d�d
kr�|�d� |�
d�d
kr�|�d� |�
d�d
kr�|�d� |�
d�d
kr�|�
d�d
kr�|�d� |r�dd�|� }tj�d| � d|� �� d|fW S d}zt j|dd� t �|d � W n( t�y } ztj�d!t|�� �� dd!t|�� �fW Y d}~W S d}~ww t�� tjk�rpzt |d"��}d#} |�| � W d � n 1 �sAw Y W n� t�yo } ztj�d$t|�� �� dd$t|�� �fW Y d}~W S d}~ww zSt |d��}|�� }
W d � n 1 �s�w Y t |d%��)}d}|
D ]}|�|� |�
d&�d
k�r�|dk�r�|�d'� d(}�q�W d � n 1 �s�w Y W n( t�y� } ztj�d)t|�� �� dd)t|�� �fW Y d}~W S d}~ww zdd*lm}
|
j�� tj�d+| � �� W W d,S t�y, } ztj�d-t|�� �� dd-t|�� �fW Y d}~W S d}~ww t�yS } ztj�d.t|�� �� dd/t|�� �fW Y d}~S d}~ww )0a� Patch the virtual host configuration to add ACME challenge support
This function adds the necessary configuration to handle ACME challenges
for both OpenLiteSpeed (OLS) and Apache configurations. It also checks
for potential configuration conflicts before making changes.
Args:
virtualHostName (str): The domain name to configure
Returns:
tuple: (status, message) where status is 1 for success, 0 for failure
�conf�vhostsz
vhost.confzConfiguration file not found: r rY Nz"Error reading configuration file: z/.well-known/acme-challenger z&ACME challenge already configured for )r z!ACME challenge already configured�rewritezenable 1zDActive rewrite rules found that might interfere with ACME challengeszlocation /.well-knownz.Existing location block for /.well-known foundzAlias /.well-knownz%Existing alias for /.well-known foundzcontext /.well-knownz-Existing context block for /.well-known foundz
deny from all�locationz8Global deny rules found that might block ACME challengeszConfiguration conflicts found: z; zConfiguration conflicts for �: �7/usr/local/lsws/Example/html/.well-known/acme-challengeT)�exist_oki� z$Error creating challenge directory: �az�
context /.well-known/acme-challenge {
location /usr/local/lsws/Example/html/.well-known/acme-challenge
allowBrowse 1
rewrite {
enable 0
}
addDefaultCharset off
phpIniOverride {
}
}
z!Error writing OLS configuration: �wzDocumentRoot /home/z^ Alias /.well-known/acme-challenge /usr/local/lsws/Example/html/.well-known/acme-challenge
r z$Error writing Apache configuration: )�installUtilitiesz+Successfully configured ACME challenge for )r z&Successfully configured ACME challengezError restarting LiteSpeed: z$Unexpected error in PatchVhostConf: zUnexpected error: )rb rc �joinr �Server_rootrd rM r rN rD rE �IOErrorr r� �append�makedirs�chmod�OSErrorr �decideServer�OLS�writer� �plogicalr� �reStartLiteSpeed� Exception)rt �confPath�completePathToConfigFile�f� DataVhost�e� conflicts�conflict_message�
challenge_dir�contentr'