diff options
author | friendica <info@friendica.com> | 2012-05-21 16:40:11 -0700 |
---|---|---|
committer | friendica <info@friendica.com> | 2012-05-21 16:40:11 -0700 |
commit | 54e2c1ca81b99d4ac418e9287e00440de1fdc664 (patch) | |
tree | e5c9e19d7cd70cde350e47d19d31e3ecee9c1df2 | |
parent | 71fe34332454e6dab239f8af27a1dcac3ba4b2e5 (diff) | |
download | volse-hubzilla-54e2c1ca81b99d4ac418e9287e00440de1fdc664.tar.gz volse-hubzilla-54e2c1ca81b99d4ac418e9287e00440de1fdc664.tar.bz2 volse-hubzilla-54e2c1ca81b99d4ac418e9287e00440de1fdc664.zip |
rev update, bug 428, 429, and ability to block globaldir submissions from demo sites
-rw-r--r-- | INSTALL.txt | 47 | ||||
-rw-r--r-- | boot.php | 2 | ||||
-rw-r--r-- | include/directory.php | 10 | ||||
-rw-r--r-- | mod/admin.php | 2 | ||||
-rw-r--r-- | mod/photos.php | 14 | ||||
-rw-r--r-- | util/messages.po | 102 | ||||
-rw-r--r-- | view/photo_album.tpl | 2 | ||||
-rw-r--r-- | view/photo_top.tpl | 4 | ||||
-rw-r--r-- | view/photos_recent.tpl | 1 | ||||
-rw-r--r-- | view/theme/duepuntozero/style.css | 25 | ||||
-rw-r--r-- | view/theme/slackr/style.css | 62 |
11 files changed, 205 insertions, 66 deletions
diff --git a/INSTALL.txt b/INSTALL.txt index 574e90975..86076a09a 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -222,3 +222,50 @@ Retry the installation. As soon as the database has been created, % chmod 755 .htconfig.php +##################################################################### +- Some congiurations with "suhosin" security are configured without +an ability to run external processes. Friendica requires this ability. +Following are some notes provided by one of our members. +##################################################################### + +On my server I use the php protection system Suhosin +[http://www.hardened-php.net/suhosin/]. One of the things it does is to block +certain functions like proc_open, as configured in /etc/php5/conf.d/suhosin.ini: + + suhosin.executor.func.blacklist = proc_open, ... + +For those sites like Friendica that really need these functions they can be +enabled, e.g. in /etc/apache2/sites-available/friendica: + + <Directory /var/www/friendica/> + php_admin_value suhosin.executor.func.blacklist none + php_admin_value suhosin.executor.eval.blacklist none + </Directory> + +This enables every function for Friendica if accessed via browser, but not for +the cronjob that is called via php command line. I attempted to enable it for +cron by using something like + + */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php +-d suhosin.executor.func.blacklist=none -d suhosin.executor.eval.blacklist=none +-f include/poller.php + +This worked well for simple test cases, but the friendica-cron still failed with +a fatal error: +suhosin[22962]: ALERT - function within blacklist called: proc_open() (attacker +'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php', line 1341) + +After a while I noticed, that include/poller.php calls further php script via +proc_open. These scripts themselves also use proc_open and fail, because they +are NOT called with -d suhosin.executor.func.blacklist=none. + +So the simple solution is to put the correct parameters into .htconfig.php: + // Location of PHP command line processor + $a->config['php_path'] = '/usr/bin/php -d suhosin.executor.func.blacklist=none +-d suhosin.executor.eval.blacklist=none'; + + +This is obvious as soon as you notice that the friendica-cron uses proc_open to +execute php-scripts that also use proc_open, but it took me quite some time to +find that out. I hope this saves some time for other people using suhosin with +function blacklists. @@ -9,7 +9,7 @@ require_once('include/nav.php'); require_once('include/cache.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1348' ); +define ( 'FRIENDICA_VERSION', '3.0.1349' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DB_UPDATE_VERSION', 1144 ); diff --git a/include/directory.php b/include/directory.php index cae78adb4..45386183c 100644 --- a/include/directory.php +++ b/include/directory.php @@ -24,6 +24,9 @@ function directory_run($argv, $argc){ load_config('system'); + load_hooks(); + + $a->set_baseurl(get_config('system','url')); $dir = get_config('system','directory_submit_url'); @@ -31,7 +34,12 @@ function directory_run($argv, $argc){ if(! strlen($dir)) return; - fetch_url($dir . '?url=' . bin2hex($argv[1])); + $arr = array('url' => $argv[1]); + + call_hooks('globaldir_update', $arr); + + if(strlen($arr['url'])) + fetch_url($dir . '?url=' . bin2hex($arr['url'])); return; } diff --git a/mod/admin.php b/mod/admin.php index 2810c8a8a..1f53f112d 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -417,7 +417,7 @@ function admin_page_site(&$a) { '$maximagesize' => array('maximagesize', t("Maximum image size"), get_config('system','maximagesize'), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")), '$register_policy' => array('register_policy', t("Register policy"), $a->config['register_policy'], "", $register_choices), - '$register_text' => array('register_text', t("Register text"), htmlentities($a->config['register_text'], ENT_QUOTES), t("Will be displayed prominently on the registration page.")), + '$register_text' => array('register_text', t("Register text"), htmlentities($a->config['register_text'], ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")), '$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')), '$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")), '$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")), diff --git a/mod/photos.php b/mod/photos.php index 8da94841e..082947bdb 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -977,9 +977,16 @@ function photos_content(&$a) { $tpl = get_markup_template('photo_album.tpl'); if(count($r)) + $twist = 'rotright'; foreach($r as $rr) { + if($twist == 'rotright') + $twist = 'rotleft'; + else + $twist = 'rotright'; + $o .= replace_macros($tpl,array( '$id' => $rr['id'], + '$twist' => ' ' . $twist . rand(2,4), '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], '$phototitle' => t('View Photo'), '$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.jpg', @@ -1400,9 +1407,16 @@ function photos_content(&$a) { $photos = array(); if(count($r)) { + $twist = 'rotright'; foreach($r as $rr) { + if($twist == 'rotright') + $twist = 'rotleft'; + else + $twist = 'rotright'; + $photos[] = array( 'id' => $rr['id'], + 'twist' => ' ' . $twist . rand(2,4), 'link' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], 'title' => t('View Photo'), 'src' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.jpg', diff --git a/util/messages.po b/util/messages.po index 65674774a..2edd9c281 100644 --- a/util/messages.po +++ b/util/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.0.1348\n" +"Project-Id-Version: 3.0.1349\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-05-20 10:00-0700\n" +"POT-Creation-Date: 2012-05-21 10:00-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -123,8 +123,8 @@ msgstr "" #: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107 #: ../../mod/events.php:428 ../../mod/photos.php:900 ../../mod/photos.php:958 -#: ../../mod/photos.php:1193 ../../mod/photos.php:1233 -#: ../../mod/photos.php:1273 ../../mod/photos.php:1304 +#: ../../mod/photos.php:1200 ../../mod/photos.php:1240 +#: ../../mod/photos.php:1280 ../../mod/photos.php:1311 #: ../../mod/install.php:251 ../../mod/install.php:289 #: ../../mod/localtime.php:45 ../../mod/contacts.php:322 #: ../../mod/settings.php:553 ../../mod/settings.php:699 @@ -220,7 +220,7 @@ msgid "link to source" msgstr "" #: ../../mod/events.php:324 ../../view/theme/diabook/theme.php:126 -#: ../../include/nav.php:52 ../../boot.php:1503 +#: ../../include/nav.php:52 ../../boot.php:1522 msgid "Events" msgstr "" @@ -345,18 +345,18 @@ msgstr "" msgid "No" msgstr "" -#: ../../mod/photos.php:43 ../../boot.php:1497 +#: ../../mod/photos.php:43 ../../boot.php:1516 msgid "Photo Albums" msgstr "" #: ../../mod/photos.php:51 ../../mod/photos.php:151 ../../mod/photos.php:879 -#: ../../mod/photos.php:950 ../../mod/photos.php:965 ../../mod/photos.php:1382 -#: ../../mod/photos.php:1394 ../../addon/communityhome/communityhome.php:110 +#: ../../mod/photos.php:950 ../../mod/photos.php:965 ../../mod/photos.php:1389 +#: ../../mod/photos.php:1401 ../../addon/communityhome/communityhome.php:110 #: ../../view/theme/diabook/theme.php:593 msgid "Contact Photos" msgstr "" -#: ../../mod/photos.php:58 ../../mod/photos.php:975 ../../mod/photos.php:1424 +#: ../../mod/photos.php:58 ../../mod/photos.php:975 ../../mod/photos.php:1438 msgid "Upload New Photos" msgstr "" @@ -387,7 +387,7 @@ msgstr "" msgid "Delete Album" msgstr "" -#: ../../mod/photos.php:242 ../../mod/photos.php:1194 +#: ../../mod/photos.php:242 ../../mod/photos.php:1201 msgid "Delete Photo" msgstr "" @@ -455,7 +455,7 @@ msgstr "" msgid "Do not show a status post for this upload" msgstr "" -#: ../../mod/photos.php:914 ../../mod/photos.php:1189 +#: ../../mod/photos.php:914 ../../mod/photos.php:1196 msgid "Permissions" msgstr "" @@ -463,108 +463,108 @@ msgstr "" msgid "Edit Album" msgstr "" -#: ../../mod/photos.php:984 ../../mod/photos.php:1407 +#: ../../mod/photos.php:991 ../../mod/photos.php:1421 msgid "View Photo" msgstr "" -#: ../../mod/photos.php:1019 +#: ../../mod/photos.php:1026 msgid "Permission denied. Access to this item may be restricted." msgstr "" -#: ../../mod/photos.php:1021 +#: ../../mod/photos.php:1028 msgid "Photo not available" msgstr "" -#: ../../mod/photos.php:1071 +#: ../../mod/photos.php:1078 msgid "View photo" msgstr "" -#: ../../mod/photos.php:1071 +#: ../../mod/photos.php:1078 msgid "Edit photo" msgstr "" -#: ../../mod/photos.php:1072 +#: ../../mod/photos.php:1079 msgid "Use as profile photo" msgstr "" -#: ../../mod/photos.php:1078 ../../include/conversation.php:483 +#: ../../mod/photos.php:1085 ../../include/conversation.php:483 msgid "Private Message" msgstr "" -#: ../../mod/photos.php:1100 +#: ../../mod/photos.php:1107 msgid "View Full Size" msgstr "" -#: ../../mod/photos.php:1168 +#: ../../mod/photos.php:1175 msgid "Tags: " msgstr "" -#: ../../mod/photos.php:1171 +#: ../../mod/photos.php:1178 msgid "[Remove any tag]" msgstr "" -#: ../../mod/photos.php:1182 +#: ../../mod/photos.php:1189 msgid "New album name" msgstr "" -#: ../../mod/photos.php:1185 +#: ../../mod/photos.php:1192 msgid "Caption" msgstr "" -#: ../../mod/photos.php:1187 +#: ../../mod/photos.php:1194 msgid "Add a Tag" msgstr "" -#: ../../mod/photos.php:1191 +#: ../../mod/photos.php:1198 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" msgstr "" -#: ../../mod/photos.php:1211 ../../include/conversation.php:532 +#: ../../mod/photos.php:1218 ../../include/conversation.php:532 msgid "I like this (toggle)" msgstr "" -#: ../../mod/photos.php:1212 ../../include/conversation.php:533 +#: ../../mod/photos.php:1219 ../../include/conversation.php:533 msgid "I don't like this (toggle)" msgstr "" -#: ../../mod/photos.php:1213 ../../include/conversation.php:967 +#: ../../mod/photos.php:1220 ../../include/conversation.php:967 msgid "Share" msgstr "" -#: ../../mod/photos.php:1214 ../../mod/editpost.php:104 +#: ../../mod/photos.php:1221 ../../mod/editpost.php:104 #: ../../mod/wallmessage.php:145 ../../mod/message.php:214 #: ../../mod/message.php:408 ../../include/conversation.php:364 #: ../../include/conversation.php:709 ../../include/conversation.php:986 msgid "Please wait" msgstr "" -#: ../../mod/photos.php:1230 ../../mod/photos.php:1270 -#: ../../mod/photos.php:1301 ../../include/conversation.php:555 +#: ../../mod/photos.php:1237 ../../mod/photos.php:1277 +#: ../../mod/photos.php:1308 ../../include/conversation.php:555 msgid "This is you" msgstr "" -#: ../../mod/photos.php:1232 ../../mod/photos.php:1272 -#: ../../mod/photos.php:1303 ../../include/conversation.php:557 +#: ../../mod/photos.php:1239 ../../mod/photos.php:1279 +#: ../../mod/photos.php:1310 ../../include/conversation.php:557 #: ../../boot.php:516 msgid "Comment" msgstr "" -#: ../../mod/photos.php:1234 ../../mod/editpost.php:125 +#: ../../mod/photos.php:1241 ../../mod/editpost.php:125 #: ../../include/conversation.php:567 ../../include/conversation.php:1004 msgid "Preview" msgstr "" -#: ../../mod/photos.php:1331 ../../mod/settings.php:616 +#: ../../mod/photos.php:1338 ../../mod/settings.php:616 #: ../../mod/settings.php:697 ../../mod/group.php:168 ../../mod/admin.php:647 #: ../../include/conversation.php:321 ../../include/conversation.php:587 msgid "Delete" msgstr "" -#: ../../mod/photos.php:1413 +#: ../../mod/photos.php:1427 msgid "View Album" msgstr "" -#: ../../mod/photos.php:1422 +#: ../../mod/photos.php:1436 msgid "Recent Photos" msgstr "" @@ -1692,7 +1692,7 @@ msgstr "" #: ../../addon/facebook/facebook.php:688 #: ../../addon/facebook/facebook.php:1178 #: ../../addon/public_server/public_server.php:62 -#: ../../addon/testdrive/testdrive.php:61 ../../include/items.php:2738 +#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:2738 #: ../../boot.php:696 msgid "Administrator" msgstr "" @@ -2369,7 +2369,7 @@ msgstr "" msgid "Invalid contact." msgstr "" -#: ../../mod/notes.php:44 ../../boot.php:1509 +#: ../../mod/notes.php:44 ../../boot.php:1528 msgid "Personal Notes" msgstr "" @@ -2620,7 +2620,7 @@ msgstr "" #: ../../mod/profperm.php:103 ../../view/theme/diabook/theme.php:123 #: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74 -#: ../../include/nav.php:50 ../../boot.php:1488 +#: ../../include/nav.php:50 ../../boot.php:1507 msgid "Profile" msgstr "" @@ -2835,7 +2835,7 @@ msgid "Access denied." msgstr "" #: ../../mod/fbrowser.php:23 ../../view/theme/diabook/theme.php:125 -#: ../../include/nav.php:51 ../../boot.php:1494 +#: ../../include/nav.php:51 ../../boot.php:1513 msgid "Photos" msgstr "" @@ -4864,7 +4864,7 @@ msgid "Enable Geonames Plugin" msgstr "" #: ../../addon/public_server/public_server.php:126 -#: ../../addon/testdrive/testdrive.php:88 +#: ../../addon/testdrive/testdrive.php:94 #, php-format msgid "Your account on %s will expire in a few days." msgstr "" @@ -5141,11 +5141,11 @@ msgstr "" msgid "Gravatar settings updated." msgstr "" -#: ../../addon/testdrive/testdrive.php:89 +#: ../../addon/testdrive/testdrive.php:95 msgid "Your Friendica test account is about to expire." msgstr "" -#: ../../addon/testdrive/testdrive.php:90 +#: ../../addon/testdrive/testdrive.php:96 #, php-format msgid "" "Hi %1$s,\n" @@ -6221,12 +6221,12 @@ msgstr "" msgid "Finishes:" msgstr "" -#: ../../include/delivery.php:455 ../../include/notifier.php:659 +#: ../../include/delivery.php:455 ../../include/notifier.php:677 msgid "(no subject)" msgstr "" #: ../../include/delivery.php:462 ../../include/enotify.php:23 -#: ../../include/notifier.php:666 +#: ../../include/notifier.php:684 msgid "noreply" msgstr "" @@ -6449,7 +6449,7 @@ msgstr "" msgid "End this session" msgstr "" -#: ../../include/nav.php:49 ../../boot.php:1482 +#: ../../include/nav.php:49 ../../boot.php:1501 msgid "Status" msgstr "" @@ -7278,18 +7278,18 @@ msgstr "" msgid "Events this week:" msgstr "" -#: ../../boot.php:1485 +#: ../../boot.php:1504 msgid "Status Messages and Posts" msgstr "" -#: ../../boot.php:1491 +#: ../../boot.php:1510 msgid "Profile Details" msgstr "" -#: ../../boot.php:1506 +#: ../../boot.php:1525 msgid "Events and Calendar" msgstr "" -#: ../../boot.php:1512 +#: ../../boot.php:1531 msgid "Only You Can See This" msgstr "" diff --git a/view/photo_album.tpl b/view/photo_album.tpl index 3ab9fe723..cc3dcfb9c 100644 --- a/view/photo_album.tpl +++ b/view/photo_album.tpl @@ -1,6 +1,6 @@ <div class="photo-album-image-wrapper" id="photo-album-image-wrapper-$id"> <a href="$photolink" class="photo-album-photo-link" id="photo-album-photo-link-$id" title="$phototitle"> - <img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo lframe resize" id="photo-album-photo-$id" /> + <img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo lframe resize$twist" id="photo-album-photo-$id" /> <p class='caption'>$desc</p> </a> </div> diff --git a/view/photo_top.tpl b/view/photo_top.tpl index 04a054b52..155cab51d 100644 --- a/view/photo_top.tpl +++ b/view/photo_top.tpl @@ -1,7 +1,7 @@ -<div class="photo-top-image-wrapper lframe" id="photo-top-image-wrapper-$id"> +<div class="photo-top-image-wrapper lframe" id="photo-top-image-wrapper-$photo.id"> <a href="$photo.link" class="photo-top-photo-link" id="photo-top-photo-link-$photo.id" title="$photo.title"> - <img src="$photo.src" alt="$photo.alt" title="$photo.title" class="photo-top-photo" id="photo-top-photo-$photo.id" /> + <img src="$photo.src" alt="$photo.alt" title="$photo.title" class="photo-top-photo$photo.twist" id="photo-top-photo-$photo.id" /> </a> <div class="photo-top-album-name"><a href="$photo.album.link" class="photo-top-album-link" title="$photo.album.alt" >$photo.album.name</a></div> </div> diff --git a/view/photos_recent.tpl b/view/photos_recent.tpl index b8cb924b7..1df78cb7b 100644 --- a/view/photos_recent.tpl +++ b/view/photos_recent.tpl @@ -8,3 +8,4 @@ {{ inc photo_top.tpl }}{{ endinc }} {{ endfor }} </div> +<div class="photos-end"></div> diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 826acc7ef..c556dcead 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -1963,23 +1963,29 @@ aside input[type='text'] { } -.photos { +/*.photos { height: auto; overflow: auto; +}*/ + +.photos-end { + clear: both; + margin-bottom: 25px; } .photo-album-image-wrapper { float: left; margin-top: 15px; margin-right: 15px; - width: 200px; height: 200px; + margin-left: 15px; +/* width: 200px; height: 200px; overflow: hidden; - position: relative; + position: relative; */ } .photo-album-image-wrapper .caption { display: none; width: 100%; - position: absolute; +/* position: absolute; */ bottom: 0px; padding: 0.5em 0.5em 0px 0.5em; background-color: rgba(245, 245, 255, 0.8); @@ -1992,20 +1998,23 @@ aside input[type='text'] { #photo-album-end { clear: both; + margin-bottom: 25px; } .photo-top-image-wrapper { - position: relative; +/* position: relative; */ float: left; margin-top: 15px; margin-right: 15px; - width: 200px; height: 200px; - overflow: hidden; + margin-left: 15px; + margin-bottom: 15px; +/* width: 200px; height: 200px; + overflow: hidden; */ } .photo-top-album-name { width: 100%; min-height: 2em; - position: absolute; +/* position: absolute; */ bottom: 0px; padding: 0px 3px; padding-top: 0.5em; diff --git a/view/theme/slackr/style.css b/view/theme/slackr/style.css index abb431ab9..41f4e58ee 100644 --- a/view/theme/slackr/style.css +++ b/view/theme/slackr/style.css @@ -52,10 +52,70 @@ nav #site-location { box-shadow: 3px 3px 10px -2px #000000; } -.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img { +.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo { border-radius: 3px; -moz-border-radius: 3px; box-shadow: 3px 3px 10px 0 #000000; } +.photo-top-photo, .photo-album-photo { + padding: 10px; + max-width: 300px; +} + +.rotleft1 { +-webkit-transform: rotate(-1deg); +-moz-transform: rotate(-1deg); +-ms-transform: rotate(-1deg); +-o-transform: rotate(-1deg); +} + +.rotleft2 { +-webkit-transform: rotate(-2deg); +-moz-transform: rotate(-2deg); +-ms-transform: rotate(-2deg); +-o-transform: rotate(-2deg); +} + +.rotleft3 { +-webkit-transform: rotate(-3deg); +-moz-transform: rotate(-3deg); +-ms-transform: rotate(-3deg); +-o-transform: rotate(-3deg); +} + +.rotleft4 { +-webkit-transform: rotate(-4deg); +-moz-transform: rotate(-4deg); +-ms-transform: rotate(-4deg); +-o-transform: rotate(-4deg); +} + +.rotright1 { +-webkit-transform: rotate(1deg); +-moz-transform: rotate(1deg); +-ms-transform: rotate(1deg); +-o-transform: rotate(1deg); +} + +.rotright2 { +-webkit-transform: rotate(2deg); +-moz-transform: rotate(2deg); +-ms-transform: rotate(2deg); +-o-transform: rotate(2deg); +} + +.rotright3 { +-webkit-transform: rotate(3deg); +-moz-transform: rotate(3deg); +-ms-transform: rotate(3deg); +-o-transform: rotate(3deg); +} + +.rotright4 { +-webkit-transform: rotate(4deg); +-moz-transform: rotate(4deg); +-ms-transform: rotate(4deg); +-o-transform: rotate(4deg); +} |