Implements an image recognition captcha.

"; break; case 'admin/modules#description': case 'admin/modules/textimage': case 'admin/textimage': $output = t('Implements an image recognition captcha.'); break; } return $output; } function textimage_captchachallenge(&$form) { $form['captcha_response'] = array ( '#type' => 'textfield', '#title' => t('Captcha Validation'), '#default_value' => '', '#required' => TRUE, '#validate' => array('_captcha_validate' => array()), '#description' => t('Please type in the letters/numbers that are shown in the image above.'), '#prefix' => 'Captcha Image: you will need to recognize the text in it.', ); return $form; } function textimage_captchavalidate(&$captcha_word, &$correct) { $captcha_word = drupal_strtolower($captcha_word); if (($_SESSION['captcha'] != '') && $captcha_word == $_SESSION['captcha']) { $correct = true; } else { $correct = false; form_set_error('captcha_response', t('The image verification code you entered is incorrect.')); } } /** * Implementation of hook_menu(). */ function textimage_menu($may_cache) { $items = array(); $suffix = ''; if (arg(2)!=null) $suffix='/'.arg(2); $items[] = array( 'path' => '_textimage/image'.$suffix, 'title' => t('textimage'), 'callback' => '_textimage_image', 'access' => user_access('access textimages'), 'type' => MENU_CALLBACK ); return $items; } function textimage_perm() { return array('access textimages'); } function textimage_settings() { $fonts_path = variable_get("textimage_fonts_path", ""); $images_path = variable_get("textimage_images_path", ""); //check for GD if (!function_exists(imagecreate)) drupal_set_message(t('Image library not available. Textimage needs the GD library extension to be installed. Please install GD.')); //check for TTF support elseif (!function_exists(imagettftext)) drupal_set_message(t('Your image library does not seem to have TrueType font support. Textimage will work, but will use the default inbuilt font.'),'status'); //check for valid font path elseif ($fonts_path!="" && !is_dir($fonts_path)) drupal_set_message(t('The current font path is invalid. The default font will be used.')); //check for valid image path if ($images_path!="" && !is_dir($images_path)) drupal_set_message(t('The current images path is invalid. No images will be used.')); //Fonts settings $form['fonts'] = array( '#type' => 'fieldset', '#title' => t('Fonts settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['fonts']['textimage_use_only_upper'] = array( '#type' => 'checkbox', '#title' => t('Use only Uppercase'), '#default_value' => variable_get('textimage_use_only_upper',0) ); $form['fonts']['textimage_fonts_path'] = array( '#type' => 'textfield', '#title' => t('TrueType Fonts Path'), '#default_value' => $fonts_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the Truetype (.ttf) fonts are stored. If you do not provide any fonts, the module will use the default font for text. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['fonts']['textimage_font_size'] = array( '#type' => 'textfield', '#title' => t('Font Size'), '#default_value' => variable_get('textimage_font_size',24), '#size' => 5, '#maxlength' => 2, '#description' => t('Font size of Captcha text (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_font_size")), ); $form['fonts']['textimage_char_spacing_max'] = array( '#type' => 'textfield', '#title' => t('Character Spacing'), '#default_value' => variable_get('textimage_char_spacing_max',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the kerning between letters in Captcha. Higher numbers indicate more spacing.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_spacing_max")), ); $form['fonts']['textimage_char_jiggle_amount'] = array( '#type' => 'textfield', '#title' => t('Character Jiggle'), '#default_value' => variable_get('textimage_char_jiggle_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of up and down movement in the Captcha letters. Higher numbers indicate more jiggling.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_jiggle_amount")), ); $form['fonts']['textimage_char_rotate_amount'] = array( '#type' => 'textfield', '#title' => t('Character Rotation'), '#default_value' => variable_get('textimage_char_rotate_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of rotation in the Captcha letters (in degrees, only works with non-default fonts).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_rotate_amount")), ); $form['fonts']['textimage_char_size_amount'] = array( '#type' => 'textfield', '#title' => t('Character Size Adjustment'), '#default_value' => variable_get('textimage_char_size_amount',2), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of variation in size between the different letters in the Captcha (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_size_amount")), ); //Image settings $form['images'] = array( '#type' => 'fieldset', '#title' => t('Image settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['images']['textimage_images_path'] = array( '#type' => 'textfield', '#title' => t('Background Images Path'), '#default_value' => $images_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the background images are stored. If you do not provide a directory, solid colors will be used. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['images']['textimage_image_noise'] = array( '#type' => 'textfield', '#title' => t('Image Noise (pixels)'), '#default_value' => variable_get('textimage_image_noise',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random pixels) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_noise")), ); $form['images']['textimage_image_lines'] = array( '#type' => 'textfield', '#title' => t('Image Noise (lines)'), '#default_value' => variable_get('textimage_image_lines',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random lines) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_lines")), ); $form['images']['textimage_image_margin'] = array( '#type' => 'textfield', '#title' => t('Image Margin'), '#default_value' => variable_get('textimage_image_margin',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Set a distance between the Captcha letters and the edges of the image.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_margin")), ); $form['info'] = array( '#type' => 'fieldset', '#title' => t('Image and font information'), '#collapsible' => TRUE, '#collapsed' => FALSE ); if (isset($fonts_path)) { $imagefontinfo .= t('Number of fonts found: ').count(_textimage_font_list()); } if (isset($images_path)) { $imagefontinfo .= '
'.t('Number of background images found: ').count(_textimage_image_list()); } $gdinfo = gd_info(); $imagefontinfo .= '
'.t('GD Version: ').$gdinfo["GD Version"]; $imagefontinfo .= '
'.t(' FreeType Support: '); $imagefontinfo .= ($gdinfo["FreeType Support"]==true) ? 'True' : 'False'; $imagefontinfo .= '
'; $form['info']['captcha_info'] = array ( '#type' => 'item', '#value' => $imagefontinfo, ); return $form; } function textimage_settings_form_validate ($form_id,$form) { //check for valid font path if ($form['textimage_fonts_path'] !="" && !is_dir($form['textimage_fonts_path'])) form_set_error('textimage_fonts_path', t('The entered font path is invalid')); //check for valid image path if ($form['textimage_images_path'] !="" && !is_dir($form['textimage_images_path'])) form_set_error('textimage_images_path', t('The entered image path is invalid')); } function _textimage_number_validate ($field,$fieldName) { if (!is_numeric($field['#value'])) { form_set_error($fieldName,t("The value for")." ".t($field['#title'])." ".t("must be a number")); } } /** * Prints an image containing a textimage code. */ function _textimage_image() { //if we don't have GD2 functions, we can't generate the image if (!function_exists('imagecreatetruecolor')) return; // Set headers header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); header('Content-type: image/png'); $string = _textimage_code(); // Get truetype font list $fonts = _textimage_font_list(); // Get the background images list $images = _textimage_image_list(); // Randomization amounts: $charSpacingMax = variable_get('textimage_char_spacing_max',10); // Letter spacing max (pixels) $charSpacingMin = max($charSpacingMax*.5,0); // Letter spacing minimum (pixels) $charJiggleAmount = variable_get('textimage_char_jiggle_amount',5); // Up and down randomization (pixels) $charRotateAmount = variable_get('textimage_char_rotate_amount',5); // Character rotation amount (degrees) $charSizeAmount = variable_get('textimage_char_size_amount',2); // Character size amount (pixels) $imageRotateAmount = variable_get('captcha_image_rotate_amount',12); // Image rotation amount (degrees) // Static amounts: $charInitialSize = variable_get('textimage_font_size',24); // Initial Font $imageNoise = variable_get('textimage_image_noise',4); // Amount of noise added to image $imageLines = variable_get('textimage_image_lines',4); // Amount of noise added to image $imageMargin = variable_get('textimage_image_margin',10); // Margin around image (pixels) // write text using a truetype font if (function_exists(imagettftext) && count($fonts) > 0) { // Initialize variables for the loop $characterDetails = array(); // contains the final info about each character // Build a list of character settings for the captcha string for ($i=0;$i $charSize, "angle" => $charAngle, "x" => $x, "y" => $y, "color" => $foreground, "font" => $font, "char" => $char ); // Increment the image size $imageWidth = $x + $charWidth; $imageHeight = max($imageHeight,$y+$charJiggleAmount); } // Create the image based off the string length and margin if (count($images) > 0) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Specify colors to be used in the image $foreground = imagecolorallocate($im, rand(0, 80), rand(0, 80), rand(0, 80)); foreach($characterDetails as $char) { // draw character imagettftext($im,$char['size'],$char['angle'],$char['x']+$imageMargin,$char['y']+$imageMargin,$foreground,$char['font'],$char['char']); } } else { // write text using a built-in font $x = 0; $y = 0; $imageWidth = 60 + drupal_strlen($string)*$charSpacingMax*.35; $imageHeight = 30 + $charJiggleAmount; // Create the image if (count($images) > 0 && function_exists(imagecolorallocatealpha)) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth, $imageHeight); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth, $imageHeight); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Add the text for ($i=0;$i 0) { // Prepare a larger image with a background image $im2 = _textimage_create_transparent_image($imageWidth, $imageHeight); } else { // Prepare a larger image with a solid color $im2 = imagecreatetruecolor($imageWidth, $imageHeight); imagefill($im2, 0, 0, $background); } $result = imagecopyresampled ($im2, $im, $imageMargin, $imageMargin, 0, 0, $imageWidth, $imageHeight, imagesx($im), imagesy($im)); $im = $im2; } // strikethrough imageline($im, rand(0, 120), rand(0, 120), rand(0, 120), rand(0, 120), $foreground); // Add Noise for ($x=0; $x<$imageWidth; $x++) { for ($row=0; $row<$imageNoise;$row++) { $y = rand(0,$imageHeight); imagesetpixel($im, $x, $y, $noisecolor); } } // Add Lines and Ellipses for ($x=0; $x<$imageLines;$x++) { imageline($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); imageellipse($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); } // Fill image with a random background image if available if (count($images) > 0) { $image = $images[rand(0,count($images)-1)]; _textimage_apply_background_image($im,$image); } //output to browser imagepng($im); imagedestroy($im); } /** * Returns a random string for use in a captcha */ function _textimage_code() { $consts='bcdgjxvmnprst'; $vowels='aeiou'; for ($x=0; $x < 6; $x++) { mt_srand ((double) microtime() * 1000000); $const[$x] = drupal_substr($consts,mt_rand(0,drupal_strlen($consts)-1),1); $vow[$x] = drupal_substr($vowels,mt_rand(0,drupal_strlen($vowels)-1),1); } $string = $const[0] . $vow[0] .$const[2] . $const[1] . $vow[1] . $const[3] . $vow[3] . $const[4]; $string = drupal_substr($string,0,rand(4,6)); //everytime we create a new code, we write it to session $_SESSION['captcha'] = drupal_strtolower($string); if(variable_get('textimage_use_only_upper',0)) $string = drupal_strtoupper($string); return $string; } /** * Returns an array of files with TTF extensions in the specified directory. */ function _textimage_font_list() { $fontdir = variable_get("textimage_fonts_path", ""); $filelist = array(); if (is_dir($fontdir) && $handle = opendir($fontdir)) { while ($file = readdir($handle)) { if (preg_match("/\.ttf$/i",$file) == 1) $filelist[] = $fontdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Returns an array of files with jpg, png, and gif extensions in the specified directory. */ function _textimage_image_list() { $imagesdir = variable_get("textimage_images_path", ""); $filelist = array(); if (is_dir($imagesdir) && $handle = opendir($imagesdir)) { while ($file = readdir($handle)) { if (preg_match("/\.gif|\.png|\.jpg$/i",$file) == 1) $filelist[] = $imagesdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Overlays an image to the supplied image resource */ function _textimage_apply_background_image (&$imageResource,$imageFile) { $backgroundResource = image_gd_open($imageFile,substr($imageFile,-3)); // Copy the text onto the background $backX = imagesx($backgroundResource); $backY = imagesy($backgroundResource); $textX = imagesx($imageResource); $textY = imagesy($imageResource); $randomBackX = rand(0,$backX-$textX); $randomBackY = rand(0,$backY-$textY); // Place the text onto a random location of the background image imagecopyresampled($backgroundResource,$imageResource,$randomBackX,$randomBackY,0,0,$textX,$textY,$textX,$textY); // Crop the background image to the original image size imagecopyresampled($imageResource,$backgroundResource,0,0,$randomBackX,$randomBackY,$textX,$textY,$textX,$textY); } /** * Creates transparent image resources for images with graphic backgrounds */ function _textimage_create_transparent_image($x, $y) { $i = imagecreatetruecolor($x, $y); $b = imagecreatefromstring(base64_decode(_text_image_blankpng())); imagealphablending($i, false); imagesavealpha($i, true); imagecopyresized($i, $b ,0 ,0 ,0 ,0 ,$x, $y, imagesx($b), imagesy($b)); return $i; } function _text_image_blankpng() { $c = "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m"; $c .= "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg"; $c .= "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN"; $c .= "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ"; $c .= "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA"; $c .= "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII="; return $c; } ?> Tallahassee Network for Justice & Peace - Iraq Iraq en Eternal Peace Vigil Against the Iraq War <p><a href=""><img src="" align="right" height="320" width="150" alt="Click on Pic To See Full Sized Version"></a><br /> <B>Twice Weekly Vigil Against War With Iraq</B></p> <p>Join the Tallahassee Network for Justice and Peace, Veterans for Peace, Vietnam Veterans Against the War, &amp; Military Families Speak Out</p> <p><B>Every Thursday 4 to 6 pm</p> <p>Every Sunday 12:30 to 2:30 pm</B></p> <p>At the Old Capitol - Corner of Monroe St. and Apalachee Parkway </p> <p>Dubya Bush counter-demonstrating at our Sunday peace witness ---------------&gt;&gt;&gt;</p> Iraq Local Actions Fri, 20 Apr 2007 10:05:57 -0400 tnjp 4 at People's Hearing on the Lasting Impacts of the Iraq War <p><A HREF="" TARGET="_blank">Watch the hearing</A> - Right to Heal Initiative for a People's Hearing on the Lasting Impacts of the Iraq War, Phil Donahue moderating Speakers: Yanar Mohammed is president and co-founder of the Organization of Women's Freedom in Iraq (OWFI). Falah Alwan is President of the Federation of Workers Councils and Unions in Iraq (FWCUI), one of Iraq’s largest labor unions. Iraq Veterans Against the War.</p> <p><iframe width="640" height="360" src="" frameborder="0" allowfullscreen></iframe></p> <p><a href="">read more</a></p> Activism Environment Human Rights Iraq Militarism Politics Veterans Video Fri, 28 Mar 2014 18:15:05 -0400 tnjp 459 at Wikileaks Has the Goods on the Deaths of Innocent Iraqis Killed by the US <p>May 1, 2013<br /> <A href="" target="_blank">Julian Assange: Wikileaks Has the Goods on the Deaths of Innocent Iraqis Killed by the US</A><br /> By <A href="">Medea Benjamin</A></p> <p>The government doesn't even claim that Bradley passed information directly to "the enemy" or that he had any intent to do so. But they are nonetheless making the absurd claim that merely informing the public about classified government activities makes someone a traitor because it "indirectly informs the enemy."</p> <p>Source: <A href="" target="_blank">AlterNet</A></p> <p>The WikiLeaks founder talks Bush and <A href="" target="_blank">Bradley Manning</A>.</p> <p>George W. Bush's new presidential library at Southern Methodist University in Texas has opened with great fanfare, including the attendance of Presidents Obama and former Presidents Carter, Bush Sr. and Clinton. George Bush has said that the library is "a place to lay out facts." What facts would you like to see displayed at his library?</p> <p><B>A good place to start would be laying out the number of deaths caused by the invasions of Iraq and Afghanistan. At Wikileaks, we documented that from 2004-2009, the US had records of over 100,000 individual deaths of Iraqis due to violence unleashed by that invasion, roughly 80% of them civilians. These are the recorded deaths, but many more died. And in Afghanistan, the US recorded about 20,000 deaths from 2004-2010. These would be good facts to include in the presidential library.</p> <p>And perhaps the library could document how people around the world protested against the invasion of Iraq, including the historic February 15, 2003 mobilization of millions of people around the globe.</B></p> <p>Many people worked hard during the Bush years to protest the wars, but the Bush administration refused to listen. It was very demoralizing for people to think that their efforts were for naught.</p> <p><B>They should not be demoralized. I believe that the opposition to the Iraq war was very important, and that it actually altered the behavior of US forces during the initial invasion of Iraq. Compare it to the 1991 Gulf War, when massive numbers of Iraqis, both soldiers and civilians, were killed. In the 2003 invasion there was a lot more concern about casualties. The protests rattled their cage....</B></p> <p><a href="">read more</a></p> Activism George Bush Iraq Politics Wikileaks Fri, 03 May 2013 16:44:00 -0400 tnjp 437 at Peace Activist Carlos Arredondo Hailed as Hero <p><A HREF="" TARGET="_blank">Peace Activist Carlos Arredondo Hailed as Hero for Aid to Boston Marathon Bombing Victims</A> -<br /> "the man in the hat".<br /> <iframe width="400" height="225" src="" frameborder="0"></iframe><br /> <A HREF="" TARGET="_blank">Peace activist Carlos Arredondo</A> has come to be known as "the man in the hat" and widely described as a hero for a viral image of him in a cowboy hat pinching the severed artery of a bloodied, wheelchair-bound victim in the aftermath of the Boston Marathon bombings. Arredondo is no stranger to tragedy: He became a prominent opponent of the Iraq War after his son, Lance Cpl. Alexander Arredondo, was killed in Iraq in 2004. His surviving son, Brian, committed suicide in 2011. Carlos and his wife Mélida, join us to describe witnessing the Boston Marathon bombings and the immediate response to aid the victims....</p> <p><a href="">read more</a></p> Activism Iraq Peace &amp; Justice Politics Video Thu, 18 Apr 2013 23:33:16 -0400 tnjp 429 at Baghdad Burning Ten Years On <p><A href="" target="_blank">Baghdad Burning Ten Years On</A>...</p> <p>... I'll meet you 'round the bend my friend, where hearts can heal and souls can mend...<br /> Tuesday, April 09, 2013</p> <p>April 9, 2013 marks ten years since the fall of Baghdad. Ten years since the invasion. Since the lives of millions of Iraqis changed forever. It’s difficult to believe. It feels like only yesterday I was sharing day to day activities with the world. I feel obliged today to put my thoughts down on the blog once again, probably for the last time.</p> <p>In 2003, we were counting our lives in days and weeks. Would we make it to next month? Would we make it through the summer? Some of us did and many of us didn't. </p> <p>Back in 2003, one year seemed like a lifetime ahead. The idiots said, “Things will improve immediately.” The optimists were giving our occupiers a year, or two… The realists said, “Things won’t improve for at least five years.” And the pessimists? The pessimists said, “It will take ten years. It will take a decade.”</p> <p>Looking back at the last ten years, what have our occupiers and their Iraqi governments given us in ten years? What have our puppets achieved in this last decade? What have we learned?</p> <p>We learned a lot.</p> <p>We learned that while life is not fair, death is even less fair- it takes the good people. Even in death you can be unlucky. Lucky ones die a ‘normal’ death… A familiar death of cancer, or a heart-attack, or stroke. Unlucky ones have to be collected in bits and pieces. Their families trying to bury what can be salvaged and scraped off of streets that have seen so much blood, it is a wonder they are not red....</p> <p><a href="">read more</a></p> Fascism USA Iraq Militarism Politics Wed, 10 Apr 2013 19:50:00 -0400 tnjp 442 at A Pledge to Iraq Veteran Tomas Young <p><A href="" target="_blank">A Pledge to Iraq Veteran Tomas Young</A><br /> By John Bruhns </p> <p><A href="" target="_blank"><IMG src="" align="left" title="Dying Iraq War Veteran Tomas Young"></A>I never met Tomas Young. However, I strongly identify with his story as he and I joined the military for the same reason -- to fight those responsible for 9/11 . However, I was far luckier than Tomas Young as I never had to endure the crippling, and ultimately fatal wounds, he received in Sadr City in 2004. There is no real way for me to put myself in such a situation as it would be surreal to anyone who will never face such hardships. Tomas Young has now reached a point where his pain is too unbearable to continue living. Before he goes, we should all show him a bit of recognition. It is crucial that we let him know that <A href="" target="_blank">his voice was heard and his message will echo on for long after he is gone</A>.</p> <p>From what I have read, Tomas Young is a patriotic man who loves the United States. His outrage with the 9/11 attacks motivated him to join the military to pursue the real culprits. </p> <p>After all, it was our generation's Pearl Harbor. After the attacks, many brave Americans were standing in military recruiting lines ready and eager to seek retribution for their fellow citizens who died on that fateful day. Tomas Young was one of them. </p> <p>I enlisted for active duty in the U.S. Army in an effort to deploy to Afghanistan and fight those who actually attacked us on 9/11. Like Tomas Young, I found my patriotism used for an unrelated and unnecessary military conflict -- <A href="" target="_blank">the Iraq War</A>. </p> <p>In a recent letter written to George W. Bush and Dick Cheney, Iraq veteran Young clarifies the misuse of his patriotism.</p> <p><A href="" target="_blank">Young writes</A>:<BLOCKQUOTE>"I would not be writing this letter if I had been wounded fighting in Afghanistan against those forces that carried out the attacks of 9/11. Had I been wounded there I would still be miserable because of my physical deterioration and imminent death, but I would at least have the comfort of knowing that my injuries were a consequence of my own decision to defend the country I love."</BLOCKQUOTE><br /> When I returned home from Iraq, I spoke out strongly against the war. I was able to do so without any handicaps or bodily limitations. Tomas Young fought the same fight while being confined to a wheelchair. Even with his extreme physical limitations, Tomas Young was able to convey <A href="" target="_blank">the true, harsh realities of the Iraq war</A> to the American people. </p> <p>The power of his message came from his experience, vision, and, sadly, his crippling and now mortal injuries. His testimony is unimpeachable, as he gave his body to a needless agenda-driven war that left most of us concluding 10 years later that <A href="" target="_blank">the Iraq war was a mistake</A>...</p> <p><a href="">read more</a></p> Activism Dick Cheney George Bush Healthcare Iraq Militarism Peace &amp; Justice Politics Veterans Wars of Aggression Sun, 07 Apr 2013 19:36:51 -0400 tnjp 427 at Ann Wright - 10 Years Later and I’m Still Protesting War <p><A href="" target="_blank">10 Years Later and I’m Still Protesting War</A><br /> Posted on Mar 19, 2013<br /> By Col. Ann Wright</p> <p>Ten years ago, I resigned my post in opposition to President George W. Bush’s war on Iraq. I had worked in the U.S. government for most of my life, first in the Army and Army Reserves, retiring as a colonel, and then as a diplomat. I served in U.S. embassies in Nicaragua, Grenada, Somalia, Uzbekistan, Kyrgyzstan, Sierra Leone and Micronesia. I helped reopen the U.S. Embassy in Kabul, Afghanistan, in December 2001.</p> <p>Yet after serving in eight presidential administrations, beginning under Lyndon Johnson during the war on Vietnam, I ended my career in the U.S. government in opposition to another conflict—the war on Iraq.</p> <p>A decade after I stepped down as the deputy ambassador in the U.S. Embassy in Mongolia, the war in Iraq is over for Americans, but continues for Iraqis. The whirlwind of sectarian violence brought on by the U.S. invasion and occupation continues to blow there.</p> <p>The war on Afghanistan is now in its 13th year and as the anniversary of my resignation day approaches, I find myself outside the gates of Creech Air Force Base in Nevada, protesting war and, in particular, President Obama’s killer drone programs in Afghanistan, Pakistan, Yemen and Somalia.</p> <p>Although Obama’s kill list, the CIA drone attacks in the undeclared war on Pakistan and the assassination of three American citizens by drone in Yemen receive most of the media and congressional attention, the incredibly large number of drone strikes in Afghanistan has gotten scant coverage—and that is why I am at Creech...</p> <p><a href="">read more</a></p> Activism Afghanistan Dick Cheney Drones George Bush Iraq Militarism Obama Pakistan Peace &amp; Justice Politics Veterans Wars of Aggression Women Wed, 20 Mar 2013 23:25:00 -0400 tnjp 425 at Last Letter: A Message to George W. Bush and Dick Cheney from a Dying Veteran <p><A HREF="" TARGET="_blank">The Last Letter: A Message to George W. Bush and Dick Cheney from a Dying Veteran</A></p> <p> To: George W. Bush and Dick Cheney</p> <p> From: Tomas Young</p> <p>“I write this letter on the 10th anniversary of the Iraq War on behalf of my fellow Iraq veterans. I write this letter on behalf of the 4,488 soldiers and Marines who died in Iraq. I write this letter on behalf of the hundreds of thousands of veterans who have been wounded and on behalf of [those who bear those wounds. I am one of those.] I am one of the gravely injured. I [am] paralyzed in an insurgent ambush in 2004 in Sadr City. My life is coming to an end. I am living under hospice care.</p> <p>“I write this letter on behalf of husbands and wives who have lost spouses, on behalf of children who have lost parents, on behalf of the fathers and mothers who have lost sons and daughters and on behalf of those who care for the many thousands of my fellow veterans who have brain injuries. I write this letter on behalf of those veterans whose trauma and self-revulsion for what they have [done, witnessed, endured] in Iraq have led to suicide and on behalf of the active-duty soldiers and Marines who commit, on average, a suicide a day. I write this letter on behalf of the some 1 million Iraqi dead and on behalf of the countless Iraqi wounded. I write this letter on behalf of us all—the human detritus your war has left behind, those who will spend their lives in unending pain and grief.</p> <p><a href="">Exclusive: Tomas Young Reads in Full His Letter to Bush &amp; Cheney, "A Message From a Dying Veteran" | Democracy Now!</a><br /> <iframe width="400" height="225" src="" frameborder="0"></iframe></p> <p>“Your positions of authority, your millions of dollars of personal wealth, your public relations consultants, [and your privilege and power] cannot mask the hollowness of your character. You sent us to fight and die in Iraq after you, Mr. Cheney, dodged the draft in Vietnam, and you, Mr. Bush, went AWOL from your National Guard unit. Your cowardice and selfishness were established decades ago. You were not willing to risk yourselves for our nation but you sent hundreds of thousands of young men and women to be sacrificed in a senseless war with no more thought than it takes to put out the garbage...</p> <p><a href="">read more</a></p> Activism Dick Cheney George Bush Iraq Militarism Politics Veterans Video Wed, 20 Mar 2013 12:52:09 -0400 tnjp 424 at Iraq Tenth Anniversary - Cost 2.2 Trillion Dollars and Hundreds of Thousands of Lives <p>This week marks ten years since Bush/Cheney lied America into invading and occupying Iraq. No one from the Bush mis-administration has been indicted for war crimes or any other criminal acts, Gitmo is still open, and the Patriot Act(among other Acts) still enslaves us. </p> <p>Here's a few conclusions of fact to remind of the devastation done in our name - care of the <A href="" target="_blank">Costs of War</A> project of <A href="" target="_blank">The Watson Institute for International Studies</A> at <A href="" target="_blank">Brown University</A>.<br /> <UL><br /> <LI>The Iraq War will ultimately cost U.S. taxpayers at least $2.2 trillion. Because the Iraq war appropriations were funded by borrowing, cumulative interest through 2053 could amount to more than $3.9 trillion.</LI><br /> <LI>The total of U.S. service members killed in Iraq is 4,488. At least 3,400 U.S. contractors have died as well, a number often under-reported.</LI><br /> <LI>Th $2.2 trillion figure includes care for veterans who were injured in the war in Iraq, which will cost the United States almost $500 billion through 2053.</LI><br /> <LI>The $60 billion spent on reconstruction for Iraq has not gone to rebuilding infrastructure such as roads, health care, and water treatment systems, but primarily to the military and police. The Special Inspector General for Iraq Reconstruction has found massive fraud, waste, and abuse of reconstruction funds.</LI><br /> <LI>Our tally of all of the war's dead - including soldiers, militants, police, contractors, journalists, humanitarian workers and civilians - shows that <I>at least</I> 330,000 people have died due to direct war violence.</LI><br /> <LI>A 2011 survey conservatively estimated that between 800,000 and a million Iraqi children have lost one or both parents</LI><br /> <LI>Approximately 2.8 million people are still displaced from their homes</LI></p> <p><a href="">read more</a></p> Civil Liberties Dick Cheney Fascism USA George Bush Iraq Militarism Obama Politics Wars of Aggression Sun, 17 Mar 2013 20:18:13 -0400 tnjp 421 at Leaked Audio of Bradley Manning’s Statement <p><A HREF="" TARGET="_blank">Read the transcript HERE</A>...</p> <p><A HREF="" TARGET="_blank">Freedom of the Press Foundation Publishes Leaked Audio of Bradley Manning’s Statement</A><br /> March 11, 2013<br /> By Trevor Timm Follow @TrevorTimm Rainey Reitman Follow @RaineyReitman</p> <p>Today, Freedom of the Press Foundation is publishing the full, previously unreleased audio recording of Private First Class Bradley Manning’s speech to the military court in Ft. Meade about his motivations for leaking over 700,000 government documents to WikiLeaks. In addition, we have published highlights from Manning’s statement to the court.</p> <p>While unofficial transcripts of this statement are available, this marks the first time the American public has heard the actual voice of Manning.</p> <blockquote><p><B>Bradley Manning's Full Statement</B></p> <p><audio controls preload="auto" autobuffer><br /> <source src="" /><br /> <source src="" /><br /> You are using a browser that doesn't support HTML5 audio.<br /> </audio></p> <p><B>Download</B></p> <p> <A HREF="">full_statement.mp3</A> (63M)</p> <p> <A HREF="">full_statement.ogg</A> (37M)</p> <p> See <A HREF="" TARGET="_blank"><B>Help Spread Bradley Manning's Words Across the Internet</B></A> to embed the full audio, as well as excerpts from the audio, on your website.</p> <p><A HREF="" TARGET="_blank">Read the transcript HERE</A>...</BLOCKQUOTE></p> <p><A HREF="" TARGET="_blank">He explains to the military court</A> in his own cadence and words how and why he gave the Apache helicopter video, Afghanistan and Iraq Wars Logs, and the State Department Diplomatic Cables to WikiLeaks. Manning explains his motives, noting how he believed the documents showed deep wrongdoing by the government and how he hoped that the release would "spark a domestic debate on the role of the military and our foreign policy in general as it related to Iraq and Afghanistan." In conjunction with the statement, Private First Class Manning also pleaded guilty to 10 of the 22 charges against him.</p> <p>Freedom of the Press Foundation is dedicated to supporting journalism that combats overreaching government secrecy. We have been disturbed that Manning’s pre-trial hearings have been hampered by the kind of extreme government secrecy that his releases to WikiLeaks were intended to protest. While reporters are allowed in the courtroom, no audio or visual recordings are permitted by the judge, no transcripts of the proceedings or any motions by the prosecution have been released, and lengthy court orders read on the stand by the judge have not been published for public review...</p> <p><a href="">read more</a></p> Activism Afghanistan Fascism USA Human Rights Iraq Militarism Police State Politics Wars of Aggression Wikileaks Fri, 15 Mar 2013 20:51:16 -0400 tnjp 423 at