88 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| assert node.has_bundle('postfix')
 | |
| assert node.has_bundle('opendkim')
 | |
| assert node.has_bundle('dovecot')
 | |
| assert node.has_bundle('letsencrypt')
 | |
| assert node.has_bundle('roundcube')
 | |
| assert node.has_bundle('rspamd')
 | |
| assert node.has_bundle('redis')
 | |
| 
 | |
| from hashlib import md5
 | |
| from shlex import quote
 | |
| 
 | |
| db_data = node.metadata.get('mailserver/database')
 | |
| test_password = str(node.metadata.get('mailserver/test_password'))
 | |
| setup = f"""
 | |
|     CREATE TABLE domains (
 | |
|         "id" BIGSERIAL PRIMARY KEY,
 | |
|         "name" varchar(255) UNIQUE NOT NULL
 | |
|     );
 | |
|     CREATE INDEX ON domains ("name");
 | |
| 
 | |
|     CREATE TABLE users (
 | |
|         "id" BIGSERIAL PRIMARY KEY,
 | |
|         "name" varchar(255) NULL,
 | |
|         "domain_id" BIGSERIAL REFERENCES domains(id),
 | |
|         "password" varchar(255) NULL,
 | |
|         "redirect" varchar(255) DEFAULT NULL
 | |
|     );
 | |
|     CREATE UNIQUE INDEX ON users ("name", "domain_id") WHERE "redirect" IS NULL;
 | |
|     ALTER TABLE users
 | |
|     	ADD CONSTRAINT name_unless_redirect
 | |
|         CHECK (name IS NOT null OR redirect IS NOT null);
 | |
|     ALTER TABLE users
 | |
|     	ADD CONSTRAINT no_password_for_redirects
 | |
|         CHECK (redirect IS null OR password IS null);
 | |
|     ALTER TABLE users
 | |
|     	ADD CONSTRAINT name_is_not_empty_string
 | |
|         CHECK (name <> '');
 | |
| 
 | |
|     -- OWNERSHIPS
 | |
|     
 | |
|     ALTER TABLE domains OWNER TO {db_data['user']};
 | |
|     ALTER TABLE users OWNER TO {db_data['user']};
 | |
| 
 | |
|     -- TEST DATA
 | |
|     
 | |
|     INSERT INTO domains (name) VALUES ('example.com');
 | |
|     
 | |
|     INSERT INTO users (name, domain_id, password)
 | |
|     SELECT 'bw_test_user', domains.id, MD5('{test_password}')
 | |
|     FROM domains
 | |
|     WHERE domains.name = 'example.com';
 | |
| 
 | |
|     INSERT INTO users (name, domain_id, redirect)
 | |
|     SELECT 'bw_test_alias', domains.id, 'somewhere@example.com'
 | |
|     FROM domains
 | |
|     WHERE domains.name = 'example.com';
 | |
| """
 | |
| 
 | |
| actions['initialize_mailserver_db'] = {
 | |
|     'command': f"psql -d {db_data['name']} -c {quote(setup)}",
 | |
|     'unless': f"psql -At -d {db_data['name']} -c \"SELECT to_regclass(\'public.users\')\" | grep -q '^users$'",
 | |
|     'needs': [
 | |
|         'postgres_db:mailserver',
 | |
|     ],
 | |
| }
 | |
| 
 | |
| # testuser
 | |
| 
 | |
| test_password_md5 = md5(str(test_password).encode()).hexdigest()
 | |
| check_query = """
 | |
|     SELECT password
 | |
|     FROM users
 | |
|     WHERE name = 'bw_test_user'
 | |
|     AND domain_id = (SELECT id FROM domains WHERE name = 'example.com')
 | |
| """
 | |
| update_query = f"""
 | |
|     UPDATE users
 | |
|     SET password = MD5('{test_password}')
 | |
|     WHERE name = 'bw_test_user'
 | |
|     AND domain_id = (SELECT id FROM domains WHERE name = 'example.com')
 | |
| """
 | |
| actions['mailserver_update_test_pw'] = {
 | |
|     'command': f"psql -d {db_data['name']} -c {quote(update_query)}",
 | |
|     'unless': f"psql -At -d {db_data['name']} -c {quote(check_query)} | grep -q '^{test_password_md5}$\'",
 | |
|     'needs': [
 | |
|         'action:initialize_mailserver_db',
 | |
|     ],
 | |
| }
 | 
