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; } ?> Faith vs Legalism | oellermann.com

Faith vs Legalism

: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/oellermann/includes/unicode.inc on line 291.

Faith vs Legalism

a sermon based on Galatians 2:1 – 21

< Open in prayer for understanding as we approach God’s word >

< Read the passage aloud >

Paul does two things in this passage. Firstly, he continues the process of setting out events in his life and in the life of the churches in Galatia. What he says paints a grim picture. He begins the chapter with an account of his trip to Jerusalem, where the message and truth he had taught to the Galatians was confirmed by the other apostles. His reason for this defense of what he has taught is simple: it appears that another group, the Judaisers, had come on the scene, and were "following up" Paul’s work by telling Gentile believers that they needed to adopt the Jewish legalism. Paul is deeply concerned at the resulting confusion in the Galatian churches. His reason for concern is that the doctrine of legalism being taught by the Judaisers is in direct contrast with the doctrine of faith, the good news which Paul had taught.

Paul is hugely alarmed by the acceptance among the believers of the doctrine of legalism. We can begin to understand his concern if we analyse the doctrine itself. To kick off, I searched for a definition of legalism, and I found one (amazingly enough) in my Oxford Dictionary. The dictionary had three definitions of legalism:

  1. Excessive adherence to law or formula
  2. Adherence to the Mosaic Law rather than to the Gospel
  3. The doctrine of justification by works.

This, of course, left the issue as clear and fresh as Johannesburg air! Let’s have a closer look at those definitions:

Excessive adherence to law or formula:

This means that one really plays things "by the book", and tries to do everything just as its set out there, no more, no less. This suggests to me dull, grey initiativeless people.

Adherence to the Mosaic Law rather than to the Gospel:

As I’m sure everybody knows, the Mosaic Law refers to the principle that if you stick thousands of little coloured squares next to each other, if you’re careful enough, you’ll emerge with a beautiful Renaissance artwork. Seriously though, the Mosaic Law refers to the principles set out in the first five books of the bible. I learnt from a paper published by the Joseph Rabinowitz School of Jewish Studies that in total these books contain 613 commandments. This definition then suggests that a legalist would attempt to observe these 613 commandments in every detail rather than sticking to the simple principles of the New Testament.

The doctrine of justification by works:

Justification is one of those words on the list which Reuben gave out. Essentially, it refers to the process by which we, as sinful beings, may become unsinful in God’s sight. Justification by works, then, means that a legalist attempts to become righteous before God by being good and by doing good things.

We need to ask why someone would want to follow the principles of legalism. On the web site of the Association of Torah-Observant Messianics (ATOM), I found the following comment which puts it well:

"The goal of Pharisaic legalism was to do good works that merited righteousness."

The idea here is that a legalist seeks, by his own behaviour, to become righteous in God’s sight. It seems logical enough, doesn’t it? You work hard at these 613 rules, and if you do well enough, maybe you’ll go to Heaven.

The problem with legalism is that it misunderstands God. God tells as that he is omnipresent; in other words, He is at once present everywhere throughout space and time. God at once perceives our lives from beginning to end. Even if we manage to achieve a state where we never break one of the Mosaic laws, God sees our entire lives at once. When God looks at us, we cannot appear righteous because he comprehends our sinful past.

Even more than that, playing things "by the book" is not adequate to ever put us into a righteous position. Jesus commanded use to love the Lord with everything that we are, and to love our neighbours as we love ourselves. This is not something which we can ever meet: as we love, the Lord enables us to love further, and so our debt of love can never be settled. We can never say "Oh, I’ve arrived" and be righteous in ourselves.

That, then, is the doctrine of legalism. Paul grew alarmed because where he had taught the churches at Galatia principles that would give them eternal life, they were now flocking to a doctrine that would enslave them to the unbearable burden of the law, which would surely result in them being crushed.

What had Paul taught them? Paul taught a doctrine that was alive with God; a doctrine available to us to this day and as alive with God as ever it has been. Paul tells us, in verse 16, that we know that we become right with God not by doing what the law commands, but by faith in Jesus Christ. He states quite definitely that no one will ever be saved purely by obedience to the law. In fact, if we could be saved by the Law, why did Jesus die? Jesus came to earth to be the only way to eternal life. Paul tells us that we need to live by faith. He doesn’t say with faith or under faith or holding faith or anything like that: he says that we must live by faith. Our belief and trust in Christ Jesus needs to be the root cause of our life, and then we surely know that we are headed for eternal glory.

Faith is very closely linked with love. The reason Jesus died for us is not because we deserved his sacrifice, but because of God’s love for us. When we place our faith in Jesus Christ, our response to that love must be to desire with all our existence to follow him – and he has told us to love.

It seems as though we have to opposing camps here. In the one corner, wearing white trunks, Faith and Love. In the other corner, wearing some murky colour, the Law. At first glance it looks like the two are strictly opposed, and that we need to choose one or the other – but that isn’t really the case. Listen to Romans 13:8 :

"Pay all your debts, except the debt of love for others. You can never finish paying that! If you love your neighbour, you will fulfil all of the requirements of God’s law."
Paul, perhaps, has grown confused. Fair enough, there was probably a good space of time between the writing of Romans and Galatians, but that’s quite a biggie, isn’t it? I mean, in one verse, Paul says we must fulfil the requirements of the law, and later on he tells as that the law is inadequate! Well, I cheated, not Paul. Let me read a little more (Romans 13:8-10) and we’ll see what he means.

"Pay all your debts, except the debt of love for others. You can never finish paying that! If you love your neighbour, you will fulfil all of the requirements of God’s law. For the commandments against adultery and murder and stealing and coveting – and any other commandment – are summed up in this one commandment: "Love your neighbour as yourself." Love does no wrong to anyone, so love satisfies all of God’s requirements."
Paul here links love to the law. He says that if only we would love as God has commanded, those 613 Mosaic precepts would be taken care of, even though they are not necessary for justification. Love, faith and obedience are all identified as being important parts of our walk with God.

The next question, then, is why Paul spends a whole chapter in Galatians going on about how bad the legalists are. The answer is quite simple. Legalism is focused on a system and its requirements, whereas faith focuses on a relationship with God and His will. Legalism sees the Law as a sufficient end. Jesus’ life and death proves that this is not the case. A belief characterised by love and faith recognises the worth of the law – after all, it was given to us by God – but at the same time understands that the guidelines of the law are lifeless and useless without a relationship with God. Why devote yourself to the Law alone where you can enter into a personal relationship with its author?

Millard Erickson, in his block-busting, door-stopping work "Christian Theology" (hold the book up), has the following to say:

"The principle of salvation by grace alone is something that is difficult for humans to accept. The problem which the Galatian church encountered with legalism is not uncommon. Somehow it does not seem right that we should receive salvation without having to do anything for it or to suffer somewhat for our sins. Or if that does not seem to be the case with respect to ourselves, it certainly does seem to be the case with respect to others, especially those of an unusually evil character. Another difficulty is that when humans do accept the principle that they do not have to work to receive salvation, there frequently is a tendency to overreact, all the way to antinomianism."
I must say that I was with him all the way there, nodding my head in sage agreement, until he hit "antinomianism". Even my computer thought that it was a spelling error. Startled but not defeated, I flipped open my Dictionary of Difficult Words. There, sandwiched between "antineuritic" (which seems to be Vitamin B) and antiodontalgic (toothache muti), I learned that "antinomianism" is an opposition to the law.

Erickson is saying that people tend to find it really hard to believe that we can really be saved without effort, or if we do realise this possibility, we tend to reject the law in its entirety. This is not right. The legalist says that by obeying the Law, we will move God to consider us righteous. This is wrong, but that doesn’t mean that we should write the law off. Rather, a healthy perspective is that when we place our faith in Christ, God pours His love into us, which makes us zealous to obey His will: and the law is one medium through which God’s will may be known. Our righteousness, in other words, is acquired and maintained by faith, but that righteousness in Christ will make us want to fulfil the law as Christ did.

It is true that the law was given to man by God through, and as such it has a purpose. The law exists to guide our awareness of sin or wrongdoing. By itself, contemplation of the law is incredibly depressing: we are inadequate to the task of meeting the requirements of the law, and so we will remain in sin, and so we will surely die.

But the law needs to be considered in the light of Christ’s sacrifice. Christ lived a life of perfect compliance and obedience, and he gave that life and suffered our punishment for no reason other than His love and grace. The law, therefore, is fulfilled or completed in Christ, because Christ has rescued us from the terrible burden of sin. When we enter into a relationship of love with God, based on our faith in Jesus Christ, the law can begin to take on its true role. When we are with Christ, God sees us and Jesus together and says "They are righteous!" Once we are freed from the burdens of sin, we can begin to appreciate the law as being a revelation of God’s will. No longer are we enslaved by the law, but instead we can take its principles and use them to make our lives more like Christ’s. And just as God discloses His will to us through the law, when we believe in Christ as our Saviour, we will have the Holy Spirit in us to guide is in our new life of righteousness.

The law still discloses God’s will – but it is not the only way to know His will, nor even the best way. We need to exceed the boundaries of the law, not be under its tyranny – and by entering into a real, personal relationship with the Living God, we can have a fiery love and righteousness which will power us through the law and far beyond, even to eternity.

< close in prayer >