Updated apps
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
"""Config flow for Amazon Order Status integration."""
|
||||
|
||||
from homeassistant import config_entries
|
||||
import voluptuous as vol
|
||||
import imaplib
|
||||
import socket
|
||||
|
||||
from .const import DOMAIN, CONF_IMAP_FOLDER
|
||||
from .options_flow import AmazonOrderStatusOptionsFlow
|
||||
|
||||
|
||||
def _select_folder_quoted(imap, folder: str) -> None:
|
||||
"""Select IMAP mailbox using quoted name (IMAP4rev2-compatible)."""
|
||||
quoted = '"' + folder.replace("\\", "\\\\").replace('"', '\\"') + '"'
|
||||
imap._simple_command("SELECT", quoted.encode("utf-8"))
|
||||
|
||||
|
||||
async def validate_imap_config(hass, host, port, username, password, folder=None):
|
||||
"""Test connection to IMAP server."""
|
||||
def _validate():
|
||||
try:
|
||||
imap = imaplib.IMAP4_SSL(host, port)
|
||||
imap.login(username, password)
|
||||
folder_to_test = folder.strip() if folder and folder.strip() else "INBOX"
|
||||
_select_folder_quoted(imap, folder_to_test)
|
||||
imap.logout()
|
||||
return None
|
||||
except imaplib.IMAP4.error:
|
||||
return "invalid_auth"
|
||||
except (OSError, socket.gaierror):
|
||||
return "cannot_connect"
|
||||
|
||||
return await hass.async_add_executor_job(_validate)
|
||||
|
||||
|
||||
class AmazonOrdersConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||
"""Handle a config flow for Amazon Orders."""
|
||||
|
||||
VERSION = 1
|
||||
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL
|
||||
|
||||
async def async_step_user(self, user_input=None):
|
||||
"""Handle the initial step of the config flow."""
|
||||
errors = {}
|
||||
|
||||
if user_input is not None:
|
||||
# Validate IMAP connection
|
||||
error = await validate_imap_config(
|
||||
self.hass,
|
||||
user_input["imap_server"],
|
||||
user_input.get("imap_port", 993),
|
||||
user_input["username"],
|
||||
user_input["password"],
|
||||
user_input.get(CONF_IMAP_FOLDER),
|
||||
)
|
||||
|
||||
if error is None:
|
||||
# Create config entry with initial options including mark_as_read
|
||||
return self.async_create_entry(
|
||||
title="Amazon Orders",
|
||||
data={
|
||||
"email": user_input["email"],
|
||||
"imap_server": user_input["imap_server"],
|
||||
"username": user_input["username"],
|
||||
"password": user_input["password"],
|
||||
"imap_port": user_input.get("imap_port", 993),
|
||||
},
|
||||
options={
|
||||
"update_interval": user_input.get("poll_interval", 5),
|
||||
"delivered_retention_days": 30,
|
||||
"mark_as_read": user_input.get("mark_as_read", True),
|
||||
CONF_IMAP_FOLDER: user_input.get(CONF_IMAP_FOLDER, ""),
|
||||
},
|
||||
)
|
||||
|
||||
errors["base"] = error
|
||||
|
||||
# Show the form with mark_as_read option
|
||||
schema = vol.Schema(
|
||||
{
|
||||
vol.Required("email"): str,
|
||||
vol.Required("imap_server"): str,
|
||||
vol.Required("username"): str,
|
||||
vol.Required("password"): str,
|
||||
vol.Optional("imap_port", default=993): int,
|
||||
vol.Optional("poll_interval", default=5): int,
|
||||
vol.Optional("mark_as_read", default=True): bool,
|
||||
vol.Optional(CONF_IMAP_FOLDER, default=""): str,
|
||||
}
|
||||
)
|
||||
|
||||
return self.async_show_form(
|
||||
step_id="user",
|
||||
data_schema=schema,
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def async_get_options_flow(config_entry):
|
||||
"""Return the options flow handler for this config entry."""
|
||||
return AmazonOrderStatusOptionsFlow(config_entry)
|
||||
Reference in New Issue
Block a user