/** * Hook executed before saving url_preview user type value. Checks and removes signature of the $value. * If signature is correct, checks current user's access to $value. * * @param array $userField Array containing parameters of the user field. * @param string $value Signed value of the user field. * @return int Unsigned value of the user field, or null in case of errors. */ public static function onBeforeSave($userField, $value) { $imageUrl = null; if (strpos($value, ';') !== false) { list($value, $imageUrl) = explode(';', $value); } $signer = new Signer(); try { $value = $signer->unsign($value, UrlPreview::SIGN_SALT); } catch (SystemException $e) { return null; } $metadata = UrlMetadataTable::getById($value)->fetch(); if (!is_array($metadata)) { return null; } if ($metadata['TYPE'] === UrlMetadataTable::TYPE_STATIC) { if ($imageUrl && is_array($metadata['EXTRA']['IMAGES']) && in_array($imageUrl, $metadata['EXTRA']['IMAGES'])) { UrlPreview::setMetadataImage((int) $value, $imageUrl); } return $value; } else { if ($metadata['TYPE'] === UrlMetadataTable::TYPE_DYNAMIC && UrlPreview::checkDynamicPreviewAccess($metadata['URL'])) { return $value; } } return null; }
/** * Fetches and stores metadata for temporary record, created by UrlPreview::reserveIdForUrl. If metadata could * not be fetched, deletes record. * @param int $id Metadata record's id. * @param bool $checkAccess Should method check current user's access to the entity, or not. * @return array|false Metadata if fetched, false otherwise. */ public static function resolveTemporaryMetadata($id, $checkAccess = true) { $metadata = UrlMetadataTable::getById($id)->fetch(); if (!is_array($metadata)) { return false; } if ($metadata['TYPE'] == UrlMetadataTable::TYPE_TEMPORARY) { $metadata['URL'] = static::normalizeUrl($metadata['URL']); $metadata = static::fetchUrlMetadata($metadata['URL']); if ($metadata === false) { UrlMetadataTable::delete($id); return false; } UrlMetadataTable::update($id, $metadata); return $metadata; } else { if ($metadata['TYPE'] == UrlMetadataTable::TYPE_STATIC || $metadata['TYPE'] == UrlMetadataTable::TYPE_FILE) { return $metadata; } else { if ($metadata['TYPE'] == UrlMetadataTable::TYPE_DYNAMIC) { if ($preview = static::getDynamicPreview($metadata['URL'], $checkAccess)) { $metadata['HTML'] = $preview; return $metadata; } } } } return false; }