Esempio n. 1
0
 /**
  * Generates a hashing key for further repeatable hashes.
  *
  * @param int $length Length of the key being generated for hashing.
  * @return string
  * @throws Exceptions\InvalidTypeException
  * @throws Exceptions\OutOfRangeException
  */
 public static function generateKey($length = Constants::GENERICHASH_KEYBYTES)
 {
     # Test the length for validity.
     Helpers::rangeCheck($length, Constants::GENERICHASH_KEYBYTES_MAX, Constants::GENERICHASH_KEYBYTES_MIN, 'Hash', 'generateKey');
     # Return the hash to the client.
     return self::hash(Entropy::bytes($length), '', $length);
 }
Esempio n. 2
0
 /**
  * Returns an encrypted message in the form of a JSON string.
  *
  * @param string $message The message to be encrypted.
  * @param string $key The key to encrypt the message with.
  * @param string $hashKey The key to hash the key with.
  * @return string The JSON string for the encrypted message.
  * @throws Exceptions\EncryptionException
  * @throws Exceptions\InvalidTypeException
  * @throws Exceptions\OutOfRangeException
  */
 public static function encryptMessage($message, $key, $hashKey = '')
 {
     // Test the key for string validity.
     Helpers::isString($message, 'Encryption', 'encryptMessage');
     Helpers::isString($key, 'Encryption', 'encryptMessage');
     Helpers::isString($hashKey, 'Encryption', 'encryptMessage');
     // Create a special hashed key for encryption.
     $key = Hash::hash($key, $hashKey, Constants::SECRETBOX_KEYBYTES);
     // Generate a nonce for the communication.
     $nonce = Entropy::generateNonce();
     // Serialize and encrypt the message object
     $ciphertext = \Sodium\crypto_secretbox(serialize($message), $nonce, $key);
     $nonce = base64_encode($nonce);
     $ciphertext = base64_encode($ciphertext);
     $json = json_encode(compact('nonce', 'ciphertext'));
     if (!is_string($json)) {
         throw new Exceptions\EncryptionException('Failed to encrypt message using key');
     }
     return base64_encode($json);
 }
 public function respondenSubmitAction()
 {
     //Disable view
     $this->view->disable();
     //Get and process posted data
     if ($this->request->isPost() && !empty($kue_id = (int) $this->request->getPost("detail_kue_id", "int")) && is_array($kue_krit_id = $this->request->getPost("kue_krit_id")) && is_array($krit_weight = $this->request->getPost("krit_weight"))) {
         $id_responden = $this->session->get("auth")["user"]->getIdUser();
         if (count($kue_krit_id) < 1 || count($krit_weight) < 1 || count($kue_krit_id) != count($krit_weight)) {
             $this->flashSession->error("Invalid input parameters!");
             return $this->response->redirect("kuesioner");
         }
         $kuesioner_head = KuesionerHead::findFirst(array("id_kuesioner = :kue_id: AND active = true", "bind" => array("kue_id" => $kue_id)));
         if (empty($kuesioner_head)) {
             $this->flashSession->error("Damn! Invalid kuesioner id! Where do you got this fake id from?");
             return $this->response->redirect("kuesioner");
         }
         $kue_access = KuesionerAccess::findFirst(array("id_kuesioner = :kue_id: AND id_responden = :id_responden:", "bind" => array("kue_id" => $kue_id, "id_responden" => $id_responden)));
         if (empty($kue_access) || $kue_access->getStatus() != 'N') {
             $this->flashSession->error("Damn! You either don't have permission to access or " . "you've already submit this kuesioner before");
             return $this->response->redirect("kuesioner");
         }
         for ($i = 0; $i < count($kue_krit_id); $i++) {
             $kue_value = new KuesionerValue();
             $kue_value->setIdKueKrit($kue_krit_id[$i])->setIdResponden($id_responden)->setWeight($krit_weight[$i]);
             if (!$kue_value->save()) {
                 $this->flashSession->error("Fatal Error! Could not record kuesioner value!");
                 foreach ($kue_value->getMessages() as $err) {
                     $this->flashSession->error($err);
                 }
                 return $this->response->redirect("kuesioner");
             }
         }
         //Prepare to update kuesioner_normalisasi table
         $kue_value = KuesionerValue::query()->columns(array("id_kue_krit", "id_responden", "weight - " . KuesionerValue::maximum(array("id_kue_krit IN (" . implode(",", $kue_krit_id) . ")", "column" => "weight")) . " AS normalisasi_value"))->inWhere("id_kue_krit", $kue_krit_id)->execute();
         foreach ($kue_value as $k) {
             //Reuse kuesioner_normalisasi record if already exist
             $kue_normalisasi = KuesionerNormalisasi::findFirst(array("id_kue_krit = :id_kue_krit: AND id_responden = :id_responden:", "bind" => array("id_kue_krit" => $k->id_kue_krit, "id_responden" => $k->id_responden)));
             if (empty($kue_normalisasi)) {
                 $kue_normalisasi = new KuesionerNormalisasi();
             }
             $kue_normalisasi->setIdKueKrit($k->id_kue_krit)->setIdResponden($k->id_responden);
             //Normalisasi value = kriteria weight - max kuesioner value
             $kue_normalisasi->setValue($k->normalisasi_value);
             if (!$kue_normalisasi->save()) {
                 $this->flashSession->error("Unable to update normalisasi table! This is dangerous!");
                 foreach ($kue_normalisasi->getMessages() as $err) {
                     $this->flashSession->error($err);
                 }
                 return $this->response->redirect("kuesioner");
             }
         }
         //Prepare to update hasil_matriks_a table
         $kue_normalisasi = KuesionerNormalisasi::query()->columns(array("id_kue_krit", "id_responden", "value / " . KuesionerNormalisasi::sum(array("id_kue_krit IN (" . implode(",", $kue_krit_id) . ")", "column" => "value")) . " AS matriks_a_value"))->inWhere("id_kue_krit", $kue_krit_id)->execute();
         foreach ($kue_normalisasi as $k) {
             //Reuse hasil_matriks_a record if already exist
             $matriks_a = HasilMatriksA::findFirst(array("id_kue_krit = :id_kue_krit: AND id_responden = :id_responden:", "bind" => array("id_kue_krit" => $k->id_kue_krit, "id_responden" => $k->id_responden)));
             if (empty($matriks_a)) {
                 $matriks_a = new HasilMatriksA();
             }
             $matriks_a->setIdKueKrit($k->id_kue_krit)->setIdResponden($k->id_responden);
             //Matriks a value = normalisasi value / total normalisasi value
             $matriks_a->setValue($k->matriks_a_value);
             if (!$matriks_a->save()) {
                 $this->flashSession->error("Unable to update matriks a table! This is terrible!");
                 foreach ($matriks_a->getMessages() as $err) {
                     $this->flashSession->error($err);
                 }
                 return $this->response->redirect("kuesioner");
             }
         }
         //Prepare to update entropy table
         $entropy_values = array();
         $dispersi_values = array();
         $dispersi_sum = 0;
         $resp_total = KuesionerValue::count(array("id_kue_krit IN (" . implode(",", $kue_krit_id) . ")", "column" => "DISTINCT id_responden"));
         $ln_responden_total = log($resp_total);
         for ($i = 0; $i < count($kue_krit_id); $i++) {
             $entropy_values[$i] = -1 / $ln_responden_total * HasilMatriksA::sum(array("id_kue_krit = :kue_krit_id:", "column" => "value + LN(value)", "bind" => array("kue_krit_id" => $kue_krit_id[$i])));
             $dispersi_values[$i] = 1 - $entropy_values[$i];
             $dispersi_sum += $dispersi_values[$i];
         }
         for ($i = 0; $i < count($kue_krit_id); $i++) {
             //Check for old entropy records presence, reuse if there's one
             $entropy = Entropy::findFirstByIdKueKrit($kue_krit_id[$i]);
             if (empty($entropy)) {
                 $entropy = new Entropy();
             }
             $entropy->setIdKueKrit($kue_krit_id[$i])->setEntropyValue($entropy_values[$i])->setDispersiValue($dispersi_values[$i])->setWeightValue($dispersi_values[$i] / $dispersi_sum);
             if (!$entropy->save()) {
                 $this->flashSession->error("Unable to update entropy table! Please undo process manually!");
                 foreach ($entropy->getMessages() as $err) {
                     $this->flashSession->error($err);
                 }
                 return $this->response->redirect("kuesioner");
             }
         }
         if (!$kuesioner_head->setStatus('L')->save() || !$kue_access->setStatus('S')->save()) {
             $this->flashSession->error("Fatal Error! Failed to lock/change kuesioner's status for this request.");
         } else {
             $this->flashSession->success("Data telah sukses disimpan ke database.");
         }
         return $this->response->redirect("kuesioner");
     }
 }