Archive for Сентябрь, 2009

Скрыть/показать несколько элементов — примеры jQuery

Одновременно выводит несколько скрывающихся/появляющихся блоков. Я использовал при создании своей карты сайта.

// Andy Langton's show/hide/mini-accordion - updated 18/03/2009
// Latest version @ http://andylangton.co.uk/jquery-show-hide

// this tells jquery to run the function below once the DOM is ready
$(document).ready(function() {

// choose text for the show/hide link - can contain HTML (e.g. an image)
var showText='Show';
var hideText='Hide';

// append show/hide links to the element directly preceding the element with a class of "toggle"
$('.toggle').prev().append(' (<a href="#">'+showText+'</a>)');

// hide all of the elements with a class of 'toggle'
$('.toggle').hide();

// capture clicks on the toggle links
$('a.toggleLink').click(function() {

// change the link depending on whether the element is shown or hidden
$(this).html ($(this).html()==hideText ? showText : hideText);

// toggle the display - uncomment the next line for a basic "accordion" style
//$('.toggle').hide();$('a.toggleLink').html(showText);
$(this).parent().next('.toggle').toggle('slow');

// return false so any link destination is not followed
return false;

});
});

Section one: a div with a paragraph

You can show/hide an entire div by giving it a class of «toggle». Links and other child elements will work fine too. The element directly before this one is a heading, so it gets a show/hide link appended.

Section two: single paragraph

A single paragraph can be hidden by giving it a class of toggle too. I can’t help but be impressed by how easy it is to use jquery — even for someone with limited programming and javascript experience like me. Again, the preceding element is a heading.

Now: a list

  • You can even hide a list
  • Just give the <ul> the toggle class
  • This time the preceding element is a paragraph
  • Подсмотрел тут

Загрузка изображений на imageshost по курлу

Загружает по курлу указанный урл (грузит с веба, не с локального компа), возвращает ссылку на картинку.

function UploadImage($iurl){
 echo date("r")." fetching $url\r\n";
 echo date("r")." sending $postvars\r\n";
 $ch = curl_init();
 $postvars = "type=3&qnt=1&isurl=1&userimg1=$iurl&to_size_w=&to_size_h=&to_angle=0&pvs1=350&quality=100&pr_text=Увеличить&text=description=rules=on&submit_button=Загрузить";
curl_setopt($ch, CURLOPT_POST      ,1);
curl_setopt($ch, CURLOPT_POSTFIELDS    , $postvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
curl_setopt($ch, CURLOPT_HEADER      ,1);
curl_setopt($ch, CURLOPT_TIMEOUT,15);
//    curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt($ch, CURLOPT_COOKIEJAR, "c1.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "c1.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "http://imageshost.ru/upload.php");
curl_setopt($ch, CURLOPT_USERAGENT, "Firefox/3.0");
$result = curl_exec($ch);
curl_close($ch);
preg_match("!img=(.*?)\]!i", $result, $out);
$result = $out[0];
return $result;
}

Библиотека для инвертирования hex-кодов цвета на php

<?php
/**
 * Inverses a provided hex color. If you pass a hex string with a 
 * hash(#), the function will return a string with a hash prepended
 * @param string $color Hex color to flip
 * @return string Reversed hex color
 * @author Koncept
 * 
 * Last Update: 2008-10-05
 */
function inverseHex( $color )
{
 $color       = trim($color);
 $prependHash = FALSE;

 if(strpos($color,'#')!==FALSE) {
 $prependHash = TRUE;
 $color       = str_replace('#',NULL,$color);
 }

 switch($len=strlen($color)) {
 case 3:
 $color=preg_replace("/(.)(.)(.)/","\\1\\1\\2\\2\\3\\3",$color);
 break;
 case 6:
 break;
 default:
 trigger_error("Invalid hex length ($len). Must be a minimum length of (3) or maxium of (6) characters", E_USER_ERROR);
 }

 if(!preg_match('/^[a-f0-9]{6}$/i',$color)) {
 $color = htmlentities($color);
 trigger_error( "Invalid hex string #$color", E_USER_ERROR );
 }

 $r = dechex(255-hexdec(substr($color,0,2)));
 $r = (strlen($r)>1)?$r:'0'.$r;
 $g = dechex(255-hexdec(substr($color,2,2)));
 $g = (strlen($g)>1)?$g:'0'.$g;
 $b = dechex(255-hexdec(substr($color,4,2)));
 $b = (strlen($b)>1)?$b:'0'.$b;

 return ($prependHash?'#':NULL).$r.$g.$b;
}

// Demo
echo inverseHex('#000000'); // #ffffff
?>

Несколько блогов на одном движке вордпресса.

Уже писал про скрипт массовой установки вордпресса, но вот появилось более оптимальное решение, как это сделать. При установке 100 штук вп моим скриптом, занимается очень много места на сами дистрибутивы + логи, поэтому найти решение как спасти интернеты дисковое пространство.
kretin015 Read On…

Небольшой хак для навигации

Немного подправил свой код постраничной навигации для вп. Теперь выводится название месяца, если листать архивы и название категории, если листать категорию.
[audio:http://alexvolkov.ru/wp-content/uploads/2009/09/70c7b985a0e0.mp3]

<?php if(!is_single()){?>                                                         
 <?php                                                                   
 $max_page = $wp_query->max_num_pages;                             
 if(empty($paged) || $paged == 0) {                                
 $paged = 1;                                               
 }                                                                 
 ?>                                                                      
<div id="alt_nav">                                                                
 <div>                                                           
<?php if(!is_paged()){ ?>                                                         
<?php if(is_category()){  single_cat_title(); }?>                                 
<?php if(is_archive()){  the_time('F'); }?>                                       
 <?php } else { ?>                                                          
 Page <?php echo $paged; }?></div>                                     

 <ul id="mycarousel">                               
 <?php
 for($i=1; $i<$max_page+1; $i++){
 if($i == $paged){ ?><li><?php echo $i;?></li>
 <?php } else { ?>
 <li><a href="<?php echo clean_url(get_pagenum_link($i));?>"><?php echo $i;?></a></li>
 <?php } }?>
 </ul>
</div>
<?php }?>

У Neolota заметил полезную штучку — подсказки по вп в пдф.

Календарь в стиле iCal для архивов в wordpress

Давно пылится в черновиках красивый примерчик для календаря. В оригинале календарь под хтмл, я приладил для вордпресса, на страницу архивов по месяцам.
Вот тут можно посмотреть календарь в действии, скрин
calendar Read On…

Установка eAccelerator на CentOS

Приближается предел ресурсов на моем сервер. Висит там порядка 200 всевозможных сайтов + мои скрипты. Я этот предел, есстественно, стараюсь отдалить, потому как лень переносить сайты на новый| охота повозиться | не хочу покупать новый серв (ненужное потом зачеркну). Еще и пыхыпеЧувак его тут пиарит, ну как не установить )
Акселератор требует autoconf, automake, libtool, m4. Также весьма желателен пакет php-devel, а именно утилита phpize, дабы не пересобирать пхп руками.
Исходная ось — CentOS 5.3(Final)

# cat /etc/redhat-release
CentOS release 5.3 (Final)

Качаем сам акселератор:

 wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2

Доставляем необходимые пакет

yum install autoconf automake libtool php-devel

Далее по порядочку:

phpize 
./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config
make
make install
vi /etc/php.ini

extension="eaccelerator.so"
eaccelerator.shm_size = "160"
eaccelerator.cache_dir = "/var/cache/php-eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "1"
eaccelerator.debug = 0
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.name_space = ""
eaccelerator.check_mtime = "1"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "3600"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"
eaccelerator.keys = "none"
eaccelerator.sessions = "none"
eaccelerator.content = "none"
eaccelerator.allowed_admin_path = ""

Создаются папки для временных файлов:

  
mkdir /var/cache/php-eaccelerator
chmod 777 /var/cache/php-eaccelerator

Все. Осталось только перезагрузить апача.

Если yum отказывается работать с родными репозиториями

И выдает вот такой бред

Traceback (most recent call last):
File "/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 229, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 145, in main
(result, resultmsgs) = base.buildTransaction()
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 647, in buildTransaction
(rescode, restring) = self.resolveDeps()
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 704, in resolveDeps
for po, dep in self._checkFileRequires():
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 939, in _checkFileRequires
if not self.tsInfo.getOldProvides(filename) and not self.tsInfo.getNewProvides(filename):
File "/usr/lib/python2.4/site-packages/yum/transactioninfo.py", line 414, in getNewProvides
for pkg, hits in self.pkgSack.getProvides(name, flag, version).iteritems():
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 300, in getProvides
return self._computeAggregateDictResult("getProvides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 470, in _computeAggregateDictResult
sackResult = apply(method, args)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 861, in getProvides
return self._search("provides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 837, in _search
for pkg in self.searchFiles(name, strict=True):
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 586, in searchFiles
self._sql_pkgKey2po(rep, cur, pkgs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 470, in _sql_pkgKey2po
pkg = self._packageByKey(repo, ob['pkgKey'])
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 413, in _packageByKey
po = self.pc(repo, cur.fetchone())
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 68, in __init__
self._read_db_obj(db_obj)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 94, in _read_db_obj
setattr(self, item, _share_data(db_obj[item]))
TypeError: unsubscriptable object

помогает вот это заклинание:

yum clean all
rm -f /var/lib/rpm/__db*
rpm --rebuilddb
yum update

Критическая уязвимость в wordpress

На секлабе проскальзывала новость о том, как удаленно скинуть пароль админа в вп.
Если кратко, то вот так:

wp-login.php?action=rp&key[]=

И вот уже червячок появился.
Что делает. Подставляет свой код, расположенный на другом сервере и выполняет его. Уязвимы версии до 2.8.4

Проверяемся

Беглый осмотр.
Если все ссылки или фид стали со странными дополнениями вида

eval(base64_decode($_SERVER[HTTP_REFERER]))

или вроде, в админке в разделе пользователи появилась такая картина
wp-hacked, т.е. пользователей два, а вверху показывается три, это не глюк вп, это хитрый яваскрипт скрывает третьего пользователя от вас. На скрине и второй пользователь тоже через дырку добавлен ))
Далее проверяем на иньекцию в базе:

grep -H -r “eval(base64_decode” /var/lib/mysql
grep -H -r “var setUserName = function” /var/lib/mysql

Если есть совпадение, то значит база заражена. Также можно проверить папки на инлюд функции:

grep -r -i "function gpc_" ./*

У себя три блога нашел взломанных. Проверить наличие левых администраторов в блоге

Лечимся.

  • Правим пермалинки.
  • Далее из таблицы wp-usermeta.php запоминаем все id юзеров с meta_key — ‘first_name’.
  • Потом сносим их из wp_users.
  • Удаляем их также и из wp-usermeta.php
12
css.php