/** * @brief Find an attachment by hash and revision. * * Returns the entire attach structure excluding data. * * @see attach_by_hash() * @param $hash * @param $rev revision default 0 * @return associative array with everything except data * * \e boolean \b success boolean true or false * * \e string \b message (optional) only when success is false * * \e array \b data array of attach DB entry without data component */ function attach_by_hash_nodata($hash, $rev = 0) { $ret = array('success' => false); // Check for existence, which will also provide us the owner uid $sql_extra = ''; if ($rev == -1) { $sql_extra = " order by revision desc "; } elseif ($rev) { $sql_extra = " and revision = " . intval($rev) . " "; } $r = q("SELECT uid FROM attach WHERE hash = '%s' {$sql_extra} LIMIT 1", dbesc($hash)); if (!$r) { $ret['message'] = t('Item was not found.'); return $ret; } if (!perm_is_allowed($r[0]['uid'], get_observer_hash(), 'view_storage')) { $ret['message'] = t('Permission denied.'); return $ret; } $sql_extra = permissions_sql($r[0]['uid']); // Now we'll see if we can access the attachment $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_photo, is_dir, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' {$sql_extra} limit 1", intval($r[0]['uid']), dbesc($hash)); if (!$r) { $ret['message'] = t('Permission denied.'); return $ret; } if ($r[0]['folder']) { $x = attach_can_view_folder($r[0]['uid'], get_observer_hash(), $r[0]['folder']); if (!$x) { $ret['message'] = t('Permission denied.'); return $ret; } } $ret['success'] = true; $ret['data'] = $r[0]; return $ret; }
function widget_album($args) { $owner_uid = get_app()->profile_uid; $sql_extra = permissions_sql($owner_uid); if (!perm_is_allowed($owner_uid, get_observer_hash(), 'view_storage')) { return ''; } if ($args['album']) { $album = $args['album']; } if ($args['title']) { $title = $args['title']; } /** * This may return incorrect permissions if you have multiple directories of the same name. * It is a limitation of the photo table using a name for a photo album instead of a folder hash */ if ($album) { $x = q("select hash from attach where filename = '%s' and uid = %d limit 1", dbesc($album), intval($owner_uid)); if ($x) { $y = attach_can_view_folder($owner_uid, get_observer_hash(), $x[0]['hash']); if (!$y) { return ''; } } } $order = 'DESC'; $r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.scale, p.description, p.created FROM photo p INNER JOIN\n\t\t(SELECT resource_id, max(scale) scale FROM photo WHERE uid = %d AND album = '%s' AND scale <= 4 AND photo_usage IN ( %d, %d ) {$sql_extra} GROUP BY resource_id) ph \n\t\tON (p.resource_id = ph.resource_id AND p.scale = ph.scale)\n\t\tORDER BY created {$order} ", intval($owner_uid), dbesc($album), intval(PHOTO_NORMAL), intval(PHOTO_PROFILE)); //edit album name $album_edit = null; $photos = array(); if ($r) { $twist = 'rotright'; foreach ($r as $rr) { if ($twist == 'rotright') { $twist = 'rotleft'; } else { $twist = 'rotright'; } $ext = $phototypes[$rr['type']]; $imgalt_e = $rr['filename']; $desc_e = $rr['description']; $imagelink = z_root() . '/photos/' . get_app()->profile['channel_address'] . '/image/' . $rr['resource_id']; $photos[] = array('id' => $rr['id'], 'twist' => ' ' . $twist . rand(2, 4), 'link' => $imagelink, 'title' => t('View Photo'), 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' . $ext, 'alt' => $imgalt_e, 'desc' => $desc_e, 'ext' => $ext, 'hash' => $rr['resource_id'], 'unknown' => t('Unknown')); } } $tpl = get_markup_template('photo_album.tpl'); $o .= replace_macros($tpl, array('$photos' => $photos, '$album' => $title ? $title : $album, '$album_id' => rand(), '$album_edit' => array(t('Edit Album'), $album_edit), '$can_post' => false, '$upload' => array(t('Upload'), z_root() . '/photos/' . get_app()->profile['channel_address'] . '/upload/' . bin2hex($album)), '$order' => false, '$upload_form' => $upload_form, '$usage' => $usage_message)); return $o; }