From 16c63ff3b93ee3fe40bf230e7a61d67451f942d9 Mon Sep 17 00:00:00 2001 From: Pinga <121483313+getpinga@users.noreply.github.com> Date: Mon, 4 Sep 2023 00:36:16 +0300 Subject: [PATCH] Added contact create page --- cp/app/Controllers/ContactsController.php | 452 ++++++++++++++++++ cp/resources/views/admin/contacts/create.twig | 34 +- 2 files changed, 485 insertions(+), 1 deletion(-) diff --git a/cp/app/Controllers/ContactsController.php b/cp/app/Controllers/ContactsController.php index bcc5707..674beef 100644 --- a/cp/app/Controllers/ContactsController.php +++ b/cp/app/Controllers/ContactsController.php @@ -17,6 +17,458 @@ class ContactsController extends Controller public function create(Request $request, Response $response) { + if ($request->getMethod() === 'POST') { + // Retrieve POST data + $data = $request->getParsedBody(); + $db = $this->container->get('db'); + $iso3166 = new ISO3166(); + $countries = $iso3166->all(); + $contactID = $data['contactid'] ?? null; + $registrar_id = $data['registrar'] ?? null; + $registrars = $db->select("SELECT id, clid, name FROM registrar"); + + $postalInfoIntName = $data['intName'] ?? null; + $postalInfoIntOrg = $data['org'] ?? null; + $postalInfoIntStreet1 = $data['street1'] ?? null; + $postalInfoIntStreet2 = $data['street2'] ?? null; + $postalInfoIntStreet3 = $data['street3'] ?? null; + $postalInfoIntCity = $data['city'] ?? null; + $postalInfoIntSp = $data['sp'] ?? null; + $postalInfoIntPc = $data['pc'] ?? null; + $postalInfoIntCc = $data['cc'] ?? null; + + $postalInfoLocName = $data['locName'] ?? null; + $postalInfoLocOrg = $data['locOrg'] ?? null; + $postalInfoLocStreet1 = $data['locStreet1'] ?? null; + $postalInfoLocStreet2 = $data['locStreet2'] ?? null; + $postalInfoLocStreet3 = $data['locStreet3'] ?? null; + $postalInfoLocCity = $data['locCity'] ?? null; + $postalInfoLocSp = $data['locSP'] ?? null; + $postalInfoLocPc = $data['locPC'] ?? null; + $postalInfoLocCc = $data['locCC'] ?? null; + + $voice = $data['voice'] ?? null; + $fax = $data['fax'] ?? null; + $email = $data['email'] ?? null; + $authInfo_pw = $data['authInfo'] ?? null; + + if (!$contactID) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Please provide a contact ID', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + // Validation for contact ID + $invalid_identifier = validate_identifier($contactID); + if ($invalid_identifier) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact ID', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + $contact = $db->select('SELECT * FROM contact WHERE identifier = ?', [$contactID]); + if ($contact) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Contact ID already exists', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + $result = $db->select('SELECT registrar_id FROM registrar_users WHERE user_id = ?', [$_SESSION['auth_user_id']]); + + if (is_array($result)) { + $clid = $result['registrar_id']; + } else if (is_object($result) && method_exists($result, 'fetch')) { + $clid = $result->fetch(); + } else { + $clid = $registrar_id; + } + + if ($postalInfoIntName) { + if (!$postalInfoIntName) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Missing contact name', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntName)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact name', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if ($postalInfoIntOrg) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntOrg)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact org', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoIntStreet1) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet1)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact street', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoIntStreet2) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet2)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact street', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoIntStreet3) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoIntStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoIntStreet3)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact street', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoIntCity)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact city', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if ($postalInfoIntSp) { + if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoIntSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoIntSp)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact state/province', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoIntPc) { + if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoIntPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoIntPc)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid contact postal code', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + } + + if ($postalInfoLocName) { + if (!$postalInfoLocName) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Missing loc contact name', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocName) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocName)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact name', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if ($postalInfoLocOrg) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocOrg) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocOrg)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact org', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoLocStreet1) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet1) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet1)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact street', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoLocStreet2) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet2) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet2)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact street', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoLocStreet3) { + if (preg_match('/(^\-)|(^\,)|(^\.)|(\-\-)|(\,\,)|(\.\.)|(\-$)/', $postalInfoLocStreet3) || !preg_match('/^[a-zA-Z0-9\-\&\,\.\/\s]{5,}$/', $postalInfoLocStreet3)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact street', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocCity) || !preg_match('/^[a-z][a-z\-\.\s]{3,}$/i', $postalInfoLocCity)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact city', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if ($postalInfoLocSp) { + if (preg_match('/(^\-)|(^\.)|(\-\-)|(\.\.)|(\.\-)|(\-\.)|(\-$)|(\.$)/', $postalInfoLocSp) || !preg_match('/^[A-Z][a-zA-Z\-\.\s]{1,}$/', $postalInfoLocSp)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact state/province', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + if ($postalInfoLocPc) { + if (preg_match('/(^\-)|(\-\-)|(\-$)/', $postalInfoLocPc) || !preg_match('/^[A-Z0-9\-\s]{3,}$/', $postalInfoLocPc)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Invalid loc contact postal code', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + } + + if ($voice && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $voice) || strlen($voice) > 17)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Voice must be (\+[0-9]{1,3}\.[0-9]{1,14})', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if ($fax && (!preg_match('/^\+\d{1,3}\.\d{1,14}$/', $fax) || strlen($fax) > 17)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Fax must be (\+[0-9]{1,3}\.[0-9]{1,14})', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Email address failed check', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if (!$authInfo_pw) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Email contact authinfo', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if ((strlen($authInfo_pw) < 6) || (strlen($authInfo_pw) > 16)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Password needs to be at least 6 and up to 16 characters long', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + if (!preg_match('/[A-Z]/', $authInfo_pw)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'Password should have both upper and lower case characters', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + + $disclose_voice = (isset($data['disclose_voice']) && ($data['disclose_voice'] === 1 || $data['disclose_voice'] === 0)) ? $data['disclose_voice'] : 0; + $disclose_fax = (isset($data['disclose_fax']) && ($data['disclose_fax'] === 1 || $data['disclose_fax'] === 0)) ? $data['disclose_fax'] : 0; + $disclose_email = (isset($data['disclose_email']) && ($data['disclose_email'] === 1 || $data['disclose_email'] === 0)) ? $data['disclose_email'] : 0; + $disclose_name_int = (isset($data['disclose_name_int']) && ($data['disclose_name_int'] === 1 || $data['disclose_name_int'] === 0)) ? $data['disclose_name_int'] : 0; + $disclose_name_loc = (isset($data['disclose_name_loc']) && ($data['disclose_name_loc'] === 1 || $data['disclose_name_loc'] === 0)) ? $data['disclose_name_loc'] : 0; + $disclose_org_int = (isset($data['disclose_org_int']) && ($data['disclose_org_int'] === 1 || $data['disclose_org_int'] === 0)) ? $data['disclose_org_int'] : 0; + $disclose_org_loc = (isset($data['disclose_org_loc']) && ($data['disclose_org_loc'] === 1 || $data['disclose_org_loc'] === 0)) ? $data['disclose_org_loc'] : 0; + $disclose_addr_int = (isset($data['disclose_addr_int']) && ($data['disclose_addr_int'] === 1 || $data['disclose_addr_int'] === 0)) ? $data['disclose_addr_int'] : 0; + $disclose_addr_loc = (isset($data['disclose_addr_loc']) && ($data['disclose_addr_loc'] === 1 || $data['disclose_addr_loc'] === 0)) ? $data['disclose_addr_loc'] : 0; + + if ($data['nin']) { + $nin = $data['nin']; + $nin_type = (isset($data['isBusiness']) && $data['isBusiness'] === 1) ? 'business' : 'personal'; + + if (!preg_match('/\d/', $nin)) { + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => 'NIN should contain one or more numbers', + 'registrars' => $registrars, + 'countries' => $countries, + ]); + } + } + + $db->beginTransaction(); + + try { + $db->insert( + 'contact', + [ + 'identifier' => $contactID, + 'voice' => $voice, + 'voice_x' => null, + 'fax' => $fax ?? null, + 'fax_x' => null, + 'email' => $email, + 'nin' => $nin ?? null, + 'nin_type' => $nin_type ?? null, + 'clid' => $clid, + 'crid' => $clid, + 'crdate' => date('Y-m-d H:i:s'), + 'disclose_voice' => $disclose_voice, + 'disclose_fax' => $disclose_fax, + 'disclose_email' => $disclose_email + ] + ); + $contact_id = $db->getLastInsertId(); + + $db->insert( + 'contact_postalInfo', + [ + 'contact_id' => $contact_id, + 'type' => 'int', + 'name' => $postalInfoIntName ?? null, + 'org' => $postalInfoIntOrg ?? null, + 'street1' => $postalInfoIntStreet1 ?? null, + 'street2' => $postalInfoIntStreet2 ?? null, + 'street3' => $postalInfoIntStreet3 ?? null, + 'city' => $postalInfoIntCity ?? null, + 'sp' => $postalInfoIntSp ?? null, + 'pc' => $postalInfoIntPc ?? null, + 'cc' => $postalInfoIntCc ?? null, + 'disclose_name_int' => $disclose_name_int, + 'disclose_org_int' => $disclose_org_int, + 'disclose_addr_int' => $disclose_addr_int + ] + ); + + if ($postalInfoLocName) { + $db->insert( + 'contact_postalInfo', + [ + 'contact_id' => $contact_id, + 'type' => 'loc', + 'name' => $postalInfoLocName ?? null, + 'org' => $postalInfoLocOrg ?? null, + 'street1' => $postalInfoLocStreet1 ?? null, + 'street2' => $postalInfoLocStreet2 ?? null, + 'street3' => $postalInfoLocStreet3 ?? null, + 'city' => $postalInfoLocCity ?? null, + 'sp' => $postalInfoLocSp ?? null, + 'pc' => $postalInfoLocPc ?? null, + 'cc' => $postalInfoLocCc ?? null, + 'disclose_name_loc' => $disclose_name_loc, + 'disclose_org_loc' => $disclose_org_loc, + 'disclose_addr_loc' => $disclose_addr_loc + ] + ); + } + + $db->insert( + 'contact_authInfo', + [ + 'contact_id' => $contact_id, + 'authtype' => 'pw', + 'authinfo' => $authInfo_pw + ] + ); + + $db->insert( + 'contact_status', + [ + 'contact_id' => $contact_id, + 'status' => 'ok' + ] + ); + + $db->commit(); + } catch (Exception $e) { + $db->rollBack(); + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'error' => $e->getMessage(), + 'registrars' => $registrars, + 'countries' => $countries + ]); + } + + $crdate = $db->selectValue( + "SELECT crdate FROM contact WHERE id = ? LIMIT 1", + [$contact_id] + ); + + return view($response, 'admin/contacts/create.twig', [ + 'contactID' => $contactID, + 'crdate' => $crdate, + 'registrars' => $registrars, + 'countries' => $countries + ]); + } + $iso3166 = new ISO3166(); $db = $this->container->get('db'); $countries = $iso3166->all(); diff --git a/cp/resources/views/admin/contacts/create.twig b/cp/resources/views/admin/contacts/create.twig index fca3f3e..c24757a 100644 --- a/cp/resources/views/admin/contacts/create.twig +++ b/cp/resources/views/admin/contacts/create.twig @@ -24,9 +24,35 @@
+ {% if contactID is defined and crdate is defined %} + + {% elseif error is defined %} + + {% endif %}
-
+ + {{ csrf.field | raw }}
@@ -107,6 +133,12 @@
Contact Details
+ + +
+ + +