def _single_validate(typ, value, key): """Validate a single element.""" try: # if required argument if value is None: raise vol.Invalid("Missing required option '{}'.".format(key)) if typ == V_STR: return str(value) elif typ == V_INT: return int(value) elif typ == V_FLOAT: return float(value) elif typ == V_BOOL: return vol.Boolean()(value) elif typ == V_EMAIL: return vol.Email()(value) elif typ == V_URL: return vol.Url()(value) elif typ == V_PORT: return NETWORK_PORT(value) raise vol.Invalid("Fatal error for {} type {}".format(key, typ)) except ValueError: raise vol.Invalid("Type {} error for '{}' on {}.".format( typ, value, key)) from None
def _single_validate(typ, value, key): """Validate a single element.""" # if required argument if value is None: raise vol.Invalid(f"Missing required option '{key}'") # parse extend data from type match = RE_SCHEMA_ELEMENT.match(typ) # prepare range range_args = {} for group_name in ('i_min', 'i_max', 'f_min', 'f_max'): group_value = match.group(group_name) if group_value: range_args[group_name[2:]] = float(group_value) if typ.startswith(V_STR): return str(value) elif typ.startswith(V_INT): return vol.All(vol.Coerce(int), vol.Range(**range_args))(value) elif typ.startswith(V_FLOAT): return vol.All(vol.Coerce(float), vol.Range(**range_args))(value) elif typ.startswith(V_BOOL): return vol.Boolean()(value) elif typ.startswith(V_EMAIL): return vol.Email()(value) elif typ.startswith(V_URL): return vol.Url()(value) elif typ.startswith(V_PORT): return NETWORK_PORT(value) elif typ.startswith(V_MATCH): return vol.Match(match.group('match'))(str(value)) raise vol.Invalid(f"Fatal error for {key} type {typ}")
class Login(Resource): LOGIN_VALIDATOR = v.Schema({ 'email': v.Email(), 'password': str }, required=True) @api.doc(responses={ 200: 'Token generated', 400: 'Validation error', 401: 'Unauthorized', }, body=login_model) @api.marshal_with(token_model) def post(self): try: vhum.validate_with_humanized_errors(request.json, self.LOGIN_VALIDATOR) except verr.Error as invalid: raise BadRequest(str(invalid)) try: user = UserAccount.query.filter_by( email=request.json.get('email')).one() except NoResultFound: raise Unauthorized('Email or password incorrect') if not user.verify_password(request.json.get('password')): raise Unauthorized('Email or password incorrect') token = user.generate_auth_token() return {'access_token': token.decode('ascii')}
async def async_step_user(self, user_input=None): """Handle a user initiated config flow.""" errors = {} if user_input is not None: self._username = user_input[CONF_USERNAME] self._password = user_input[CONF_PASSWORD] self._spin = user_input.get(CONF_SPIN) self._region = user_input.get(CONF_REGION) self._scan_interval = user_input[CONF_SCAN_INTERVAL] try: # pylint: disable=no-value-for-parameter session = async_get_clientsession(self.hass) connection = AudiConnectAccount( session=session, username=vol.Email()(self._username), password=self._password, country=self._region, spin=self._spin, ) if await connection.try_login(False) == False: raise Exception( "Unexpected error communicating with the Audi server") except vol.Invalid: errors[CONF_USERNAME] = "invalid_username" except Exception: errors["base"] = "invalid_credentials" else: if self._username in configured_accounts(self.hass): errors["base"] = "user_already_configured" else: return self.async_create_entry( title=f"{self._username}", data={ CONF_USERNAME: self._username, CONF_PASSWORD: self._password, CONF_SPIN: self._spin, CONF_REGION: self._region, CONF_SCAN_INTERVAL: self._scan_interval, }, ) data_schema = OrderedDict() data_schema[vol.Required(CONF_USERNAME, default=self._username)] = str data_schema[vol.Required(CONF_PASSWORD, default=self._password)] = str data_schema[vol.Optional(CONF_SPIN, default=self._spin)] = str data_schema[vol.Optional(CONF_REGION, default=self._region)] = str data_schema[vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_UPDATE_INTERVAL)] = int return self.async_show_form( step_id="user", data_schema=vol.Schema(data_schema), errors=errors, )
async def async_step_user(self, user_input=None): """Handle a user initiated config flow.""" errors = {} if user_input is not None: self._username = user_input[CONF_USERNAME] self._password = user_input[CONF_PASSWORD] try: # pylint: disable=no-value-for-parameter session = async_get_clientsession(self.hass) connection = AudiConnectAccount(session=session, username=vol.Email()( self._username), password=self._password) if connection.try_login(False) == False: raise Exception( 'Unexpected error communicating with the Audi server') except vol.Invalid: errors[CONF_USERNAME] = "invalid_username" except Exception: errors["base"] = "invalid_credentials" else: if self._username in self.configured_usernames: errors["base"] = "user_already_configured" else: return self.async_create_entry( title=self._username, data={ CONF_USERNAME: self._username, CONF_PASSWORD: self._password, }, description_placeholders={"docs_url": DOCS_URL}, ) data_schema = OrderedDict() data_schema[vol.Required(CONF_USERNAME, default=self._username)] = str data_schema[vol.Required(CONF_PASSWORD, default=self._password)] = str return self.async_show_form( step_id="user", data_schema=vol.Schema(data_schema), errors=errors, description_placeholders={"docs_url": DOCS_URL}, )
async def async_step_user(self, user_input=None): """Handle a user initiated config flow.""" errors = {} if user_input is not None: self._username = user_input[CONF_USERNAME] self._password = user_input[CONF_PASSWORD] try: # pylint: disable=no-value-for-parameter vol.Email()(self._username) authorization = await self.hass.async_add_executor_job( self._api.get_authorization, self._username, self._password) except vol.Invalid: errors[CONF_USERNAME] = "invalid_username" except LoginError: errors["base"] = "invalid_credentials" except Life360Error as error: _LOGGER.error( "Unexpected error communicating with Life360 server: %s", error) errors["base"] = "unexpected" else: if self._username in self.configured_usernames: errors["base"] = "user_already_configured" else: return self.async_create_entry( title=self._username, data={ CONF_USERNAME: self._username, CONF_PASSWORD: self._password, CONF_AUTHORIZATION: authorization, }, description_placeholders={"docs_url": DOCS_URL}, ) data_schema = OrderedDict() data_schema[vol.Required(CONF_USERNAME, default=self._username)] = str data_schema[vol.Required(CONF_PASSWORD, default=self._password)] = str return self.async_show_form( step_id="user", data_schema=vol.Schema(data_schema), errors=errors, description_placeholders={"docs_url": DOCS_URL}, )
def _single_validate(coresys: CoreSys, typ: str, value: Any, key: str): """Validate a single element.""" # if required argument if value is None: raise vol.Invalid(f"Missing required option '{key}'") # Lookup secret if str(value).startswith("!secret "): secret: str = value.partition(" ")[2] value = coresys.secrets.get(secret) if value is None: raise vol.Invalid(f"Unknown secret {secret}") # parse extend data from type match = RE_SCHEMA_ELEMENT.match(typ) if not match: raise vol.Invalid(f"Unknown type {typ}") # prepare range range_args = {} for group_name in _SCHEMA_LENGTH_PARTS: group_value = match.group(group_name) if group_value: range_args[group_name[2:]] = float(group_value) if typ.startswith(V_STR) or typ.startswith(V_PASSWORD): return vol.All(str(value), vol.Range(**range_args))(value) elif typ.startswith(V_INT): return vol.All(vol.Coerce(int), vol.Range(**range_args))(value) elif typ.startswith(V_FLOAT): return vol.All(vol.Coerce(float), vol.Range(**range_args))(value) elif typ.startswith(V_BOOL): return vol.Boolean()(value) elif typ.startswith(V_EMAIL): return vol.Email()(value) elif typ.startswith(V_URL): return vol.Url()(value) elif typ.startswith(V_PORT): return network_port(value) elif typ.startswith(V_MATCH): return vol.Match(match.group("match"))(str(value)) elif typ.startswith(V_LIST): return vol.In(match.group("list").split("|"))(str(value)) raise vol.Invalid(f"Fatal error for {key} type {typ}")
class Users(Resource): USER_VALIDATOR = v.Schema({ 'first_name': v.All(str, v.Length(min=1)), v.Optional('middle_name'): str, 'father_surname': v.All(str, v.Length(min=1)), 'mother_surname': v.All(str, v.Length(min=1)), 'gender': v.In(['M', 'F', 'O', 'U'], "Allowed values 'M', 'F', 'O', 'U'"), 'email': v.Email(), 'birth_date': v.Date(), 'cellphone': v.All(str, v.Length(min=10, max=10)), }, required=True) @api.marshal_with(user_model, skip_none=True, as_list=True) def get(self): users = UserAccount.query.all() return users
async def async_step_user(self, user_input=None): """Handle a user initiated config flow.""" errors = {} if user_input is not None: self._username = user_input[CONF_USERNAME] self._password = user_input[CONF_PASSWORD] try: # pylint: disable=no-value-for-parameter vol.Email()(self._username) authorization = self._api.get_authorization( self._username, self._password) except vol.Invalid: errors[CONF_USERNAME] = 'invalid_username' except LoginError: errors['base'] = 'invalid_credentials' else: if self._username in self.configured_usernames: errors['base'] = 'user_already_configured' else: return self.async_create_entry( title=self._username, data={ CONF_USERNAME: self._username, CONF_PASSWORD: self._password, CONF_AUTHORIZATION: authorization }, description_placeholders={'docs_url': DOCS_URL} ) data_schema = OrderedDict() data_schema[vol.Required(CONF_USERNAME, default=self._username)] = str data_schema[vol.Required(CONF_PASSWORD, default=self._password)] = str return self.async_show_form( step_id='user', data_schema=vol.Schema(data_schema), errors=errors, description_placeholders={'docs_url': DOCS_URL} )
BaseNotificationService, ) from homeassistant.const import CONF_API_KEY, CONF_DOMAIN, CONF_RECIPIENT, CONF_SENDER from . import CONF_SANDBOX, DOMAIN as MAILGUN_DOMAIN _LOGGER = logging.getLogger(__name__) # Images to attach to notification ATTR_IMAGES = "images" DEFAULT_SANDBOX = False # pylint: disable=no-value-for-parameter PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Required(CONF_RECIPIENT): vol.Email(), vol.Optional(CONF_SENDER): vol.Email()} ) def get_service(hass, config, discovery_info=None): """Get the Mailgun notification service.""" data = hass.data[MAILGUN_DOMAIN] mailgun_service = MailgunNotificationService( data.get(CONF_DOMAIN), data.get(CONF_SANDBOX), data.get(CONF_API_KEY), config.get(CONF_SENDER), config.get(CONF_RECIPIENT), ) if mailgun_service.connection_is_valid(): return mailgun_service
import datetime import bcrypt import voluptuous as schema from authd import models USER_SCHEMA = schema.Schema({ schema.Required("email"): schema.Email(), schema.Required("password"): schema.All(str, schema.Length(min=6)) }) PASSWORD = schema.Schema({ schema.Required("password"): schema.All(str, schema.Length(min=6)) }) EMAIL = schema.Schema({schema.Required("email"): schema.Email()}) def create_date_time(config): now = datetime.datetime.utcnow() expires = now + config["security"]["ttl"] return now, expires def email_password_correct(data): try: USER_SCHEMA(data)
def _single_validate(self, typ: str, value: Any, key: str): """Validate a single element.""" # if required argument if value is None: raise vol.Invalid( f"Missing required option '{key}' in {self._name} ({self._slug})" ) from None # Lookup secret if str(value).startswith("!secret "): secret: str = value.partition(" ")[2] value = self.sys_homeassistant.secrets.get(secret) if value is None: raise vol.Invalid( f"Unknown secret '{secret}' in {self._name} ({self._slug})" ) from None # parse extend data from type match = RE_SCHEMA_ELEMENT.match(typ) if not match: raise vol.Invalid( f"Unknown type '{typ}' in {self._name} ({self._slug})" ) from None # prepare range range_args = {} for group_name in _SCHEMA_LENGTH_PARTS: group_value = match.group(group_name) if group_value: range_args[group_name[2:]] = float(group_value) if typ.startswith(_STR) or typ.startswith(_PASSWORD): if typ.startswith(_PASSWORD) and value: self.pwned.add(hashlib.sha1(str(value).encode()).hexdigest()) return vol.All(str(value), vol.Range(**range_args))(value) elif typ.startswith(_INT): return vol.All(vol.Coerce(int), vol.Range(**range_args))(value) elif typ.startswith(_FLOAT): return vol.All(vol.Coerce(float), vol.Range(**range_args))(value) elif typ.startswith(_BOOL): return vol.Boolean()(value) elif typ.startswith(_EMAIL): return vol.Email()(value) elif typ.startswith(_URL): return vol.Url()(value) elif typ.startswith(_PORT): return network_port(value) elif typ.startswith(_MATCH): return vol.Match(match.group("match"))(str(value)) elif typ.startswith(_LIST): return vol.In(match.group("list").split("|"))(str(value)) elif typ.startswith(_DEVICE): try: device = self.sys_hardware.get_by_path(Path(value)) except HardwareNotFound: raise vol.Invalid( f"Device '{value}' does not exist in {self._name} ({self._slug})" ) from None # Have filter if match.group("filter"): str_filter = match.group("filter") device_filter = _create_device_filter(str_filter) if device not in self.sys_hardware.filter_devices( **device_filter): raise vol.Invalid( f"Device '{value}' don't match the filter {str_filter}! in {self._name} ({self._slug})" ) # Device valid self.devices.add(device) return str(device.path) raise vol.Invalid( f"Fatal error for option '{key}' with type '{typ}' in {self._name} ({self._slug})" ) from None
CONF_DEBUG = "debug" CONF_SERVER = "server" CONF_SENDER_NAME = "sender_name" DEFAULT_HOST = "localhost" DEFAULT_PORT = 587 DEFAULT_TIMEOUT = 5 DEFAULT_DEBUG = False DEFAULT_ENCRYPTION = "starttls" ENCRYPTION_OPTIONS = ["tls", "starttls", "none"] # pylint: disable=no-value-for-parameter PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_RECIPIENT): vol.All(cv.ensure_list, [vol.Email()]), vol.Required(CONF_SENDER): vol.Email(), vol.Optional(CONF_SERVER, default=DEFAULT_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_ENCRYPTION, default=DEFAULT_ENCRYPTION): vol.In(ENCRYPTION_OPTIONS), vol.Optional(CONF_USERNAME): cv.string, vol.Optional(CONF_PASSWORD): cv.string, vol.Optional(CONF_SENDER_NAME):
from homeassistant.components.notify import (ATTR_TITLE, ATTR_TITLE_DEFAULT, PLATFORM_SCHEMA, BaseNotificationService) from homeassistant.const import (CONF_API_KEY, CONF_SENDER, CONF_RECIPIENT) import homeassistant.helpers.config_validation as cv REQUIREMENTS = ['sendgrid==3.6.3'] _LOGGER = logging.getLogger(__name__) # pylint: disable=no-value-for-parameter PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_SENDER): vol.Email(), vol.Required(CONF_RECIPIENT): vol.Email(), }) def get_service(hass, config): """Get the SendGrid notification service.""" api_key = config.get(CONF_API_KEY) sender = config.get(CONF_SENDER) recipient = config.get(CONF_RECIPIENT) return SendgridNotificationService(api_key, sender, recipient) class SendgridNotificationService(BaseNotificationService):
MIN_SCAN_TIME_LOCAL = timedelta(seconds=1) MIN_SCAN_TIME_REMOTE = timedelta(seconds=5) MIN_SCAN_TIME_FORCED = timedelta(milliseconds=100) PLATFORM_SCHEMA = vol.Schema( vol.All( cv.has_at_least_one_key(CONF_IP_ADDRESS, CONF_EMAIL), { vol.Required(CONF_PLATFORM): cv.string, vol.Optional(CONF_SCAN_INTERVAL): cv.time_period, vol.Exclusive(CONF_IP_ADDRESS, 'auth'): cv.string, vol.Exclusive(CONF_EMAIL, 'auth'): vol.Email(), # pylint: disable=no-value-for-parameter vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, vol.Optional(CONF_ZONE_RUN_TIME, default=DEFAULT_ZONE_RUN_SECONDS): cv.positive_int }), extra=vol.ALLOW_EXTRA) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set this component up under its platform."""
CONF_DEBUG = "debug" CONF_SERVER = "server" CONF_SENDER_NAME = "sender_name" DEFAULT_HOST = "localhost" DEFAULT_PORT = 587 DEFAULT_TIMEOUT = 5 DEFAULT_DEBUG = False DEFAULT_ENCRYPTION = "starttls" ENCRYPTION_OPTIONS = ["tls", "starttls", "none"] # pylint: disable=no-value-for-parameter PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_RECIPIENT): vol.All(cv.ensure_list, [vol.Email()]), vol.Required(CONF_SENDER): vol.Email(), vol.Optional(CONF_SERVER, default=DEFAULT_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_ENCRYPTION, default=DEFAULT_ENCRYPTION): vol.In( ENCRYPTION_OPTIONS ), vol.Optional(CONF_USERNAME): cv.string, vol.Optional(CONF_PASSWORD): cv.string, vol.Optional(CONF_SENDER_NAME): cv.string, vol.Optional(CONF_DEBUG, default=DEFAULT_DEBUG): cv.boolean, } )
from homeassistant.components.notify import ( ATTR_TITLE, ATTR_TITLE_DEFAULT, PLATFORM_SCHEMA, BaseNotificationService) REQUIREMENTS = ['sendgrid==5.6.0'] _LOGGER = logging.getLogger(__name__) CONF_SENDER_NAME = 'sender_name' DEFAULT_SENDER_NAME = 'Home Assistant' # pylint: disable=no-value-for-parameter PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_SENDER): vol.Email(), vol.Required(CONF_RECIPIENT): vol.Email(), vol.Optional(CONF_SENDER_NAME, default=DEFAULT_SENDER_NAME): cv.string, }) def get_service(hass, config, discovery_info=None): """Get the SendGrid notification service.""" return SendgridNotificationService(config) class SendgridNotificationService(BaseNotificationService): """Implementation the notification service for email via Sendgrid.""" def __init__(self, config): """Initialize the service."""
import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( VOLUME_GALLONS, VOLUME_LITERS, CONF_USERNAME, CONF_PASSWORD, CONF_UNIT_OF_MEASUREMENT) from homeassistant.helpers.entity import Entity from homeassistant.util.volume import convert _LOGGER = logging.getLogger(__name__) CONF_CLIENT_ID = 'client_id' CONF_CLIENT_SECRET = 'client_secret' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_USERNAME): vol.Email(), vol.Required(CONF_PASSWORD): str, vol.Required(CONF_CLIENT_ID): str, vol.Required(CONF_CLIENT_SECRET): str, vol.Required(CONF_UNIT_OF_MEASUREMENT, default=VOLUME_GALLONS): vol.In([VOLUME_GALLONS, VOLUME_LITERS]) }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Flume sensor.""" from . flume_homeassistant import FlumeClient flume = FlumeClient(creds={ CONF_USERNAME: str(config.get(CONF_USERNAME)), CONF_PASSWORD: config.get(CONF_PASSWORD),