r1965 + more cleanups in syntax analyzer
authorDenis Ovsienko <infrastation@yandex.ru>
Sat, 14 Jun 2008 20:42:59 +0000 (20:42 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Sat, 14 Jun 2008 20:42:59 +0000 (20:42 +0000)
+ draft code for RackCode evaluation

inc/auth.php
inc/code.php
inc/database.php
inc/init.php
inc/interface.php
inc/navigation.php

index 76795f8..20bdfa7 100644 (file)
@@ -27,7 +27,11 @@ function authenticate ()
 // Show error unless the user is allowed access here.
 function authorize ()
 {
-       global $remote_username, $pageno, $tabno;
+       global $remote_username, $pageno, $tabno, $expl_tags, $impl_tags, $auto_tags, $verdict;
+       if (gotClearanceForTagChain (array_merge ($expl_tags, $impl_tags, $auto_tags)))
+               $verdict = 'yes';
+       else
+               $verdict = 'no';
        if (!authorized ($remote_username, $pageno, $tabno))
        {
                showError ("User '${remote_username}' is not allowed to access here.");
index 0cf0b02..39845da 100644 (file)
  *
  */
 
-// Evaluation function table. The functions below process a lexical/syntax node
-// of given type and return boolean value. SYNT_EXPRESSION is missing from this
-// list, because the places, where eval_expression() should be called, are all
-// defined. Each function is passed three arguments: the evaluated item; list
-// of tags, against which we evaluate the whole code; predicates table.
-// The latter changes as the top-level processor meets new definitions on its
-// way down the code list.
-$evalfunc = array
-(
-       'LEX_BOOLCONST' => 'eval_boolconst',
-       'SYNT_NOTEXPR' => 'eval_notexpr',
-       'SYNT_BOOLOP' => 'eval_boolop',
-       'LEX_TAG' => 'eval_tag',
-       'LEX_PREDICATE' => 'eval_predicate',
-);
-
 // Complain about martian char.
 function abortLex1 ($state, $text, $pos)
 {
@@ -429,7 +413,7 @@ function getSentencesFromLexems ($lexems)
                                        (
                                                'type' => 'SYNT_DEFINITION',
                                                'term' => $stacksecondtop['load'],
-                                               'definition' => $stacktop
+                                               'definition' => $stacktop['load']
                                        )
                                );
                                continue;
@@ -488,74 +472,63 @@ function getSentencesFromLexems ($lexems)
        }
 }
 
-// Evaluate a boolean constant.
- function eval_boolconst ($const, $tagchain, $ptable)
+function eval_expression ($expr, $tagchain, $ptable)
 {
-       switch ($const['load'])
+       switch ($expr['type'])
        {
-               case 'true':
-                       return TRUE;
-               case 'false':
+               case 'LEX_TAG': // Return true, if given tag is present on the tag chain.
+                       foreach ($tagchain as $tagInfo)
+                               if ($expr['load'] == $tagInfo['tag'])
+                                       return TRUE;
                        return FALSE;
+               case 'LEX_PREDICATE': // Find given predicate in the symbol table and evaluate it.
+                       $pname = $expr['load'];
+                       if (!isset ($ptable[$pname]))
+                       {
+                               showError ("Predicate '${pname}' is referenced before declaration");
+                               return;
+                       }
+                       return eval_expression ($ptable[$pname], $tagchain, $ptable);
+               case 'BOOLCONST': // Evaluate a boolean constant.
+                       switch ($expr['load'])
+                       {
+                               case 'true':
+                                       return TRUE;
+                               case 'false':
+                                       return FALSE;
+                               default:
+                                       showError ("Could not parse a boolean constant with value '${expr['load']}'");
+                                       return; // should failure be harder?
+                       }
+               case 'SYNT_NOTEXPR':
+                       return !eval_expression ($expr['load'], $tagchain, $ptable);
+               case 'SYNT_BOOLOP':
+                       $leftresult = eval_expression ($expr['left'], $tagchain, $ptable);
+                       switch ($expr['subtype'])
+                       {
+                               case 'or':
+                                       if ($leftresult)
+                                               return TRUE; // early success
+                                       return eval_expression ($expr['right'], $tagchain, $ptable);
+                               case 'and':
+                                       if (!$leftresult)
+                                               return FALSE; // early failure
+                                       return eval_expression ($expr['right'], $tagchain, $ptable);
+                               default:
+                                       showError ("Cannot evaluate unknown boolean operation '${boolop['subtype']}'");
+                                       return;
+                       }
                default:
-                       showError ("Could not parse a boolean constant with value '${const['load']}'");
+                       showError ("Evaluation error, cannot process expression type '${expr['type']}'");
                        break;
        }
 }
 
-function eval_expression ($expr, $tagchain, $ptable)
-{
-}
-
-function eval_notexpr ($notexpr, $tagchain, $ptable)
-{
-       return !eval_expression ($notexpr['load']);
-}
-
-function eval_boolop ($boolop, $tagchain, $ptable)
-{
-       $leftresult = eval_expression ($boolop['left']);
-       switch ($boolop['subtype'])
-       {
-               case 'or':
-                       if ($leftresult)
-                               return TRUE; // early success
-                       return eval_expression ($boolop['right']);
-               case 'and':
-                       if (!$leftresult)
-                               return FALSE; // early failure
-                       return eval_expression ($boolop['right']);
-               default:
-                       showError ("Cannot evaluate boolean operation '${boolop['subtype']}'");
-                       return;
-       }
-}
-
-// Return true, if given tag is present on the tag chain.
-function eval_tag ($tag, $tagchain, $ptable)
-{
-       foreach ($tagchain as $tagInfo)
-               if ($tag['load'] == $tagInfo['tag'])
-                       return TRUE;
-       return FALSE;
-}
-
-// Find given predicate in the symbol table and evaluate it.
-function eval_predicate ($tag, $tagchain, $ptable)
-{
-       $pname = $predicate['load'];
-       if (!isset ($ptable[$pname]))
-       {
-               showError ("Predicate '${pname}' is referenced before declaration");
-               return;
-       }
-       return eval_expression ($ptable[$pname]);
-}
-
-function gotClearanceForTagChain ($code, $tagchain)
+function gotClearanceForTagChain ($tagchain)
 {
+       global $rackCode;
        $ptable = array();
-       foreach ($code as $sentence)
+       foreach ($rackCode as $sentence)
        {
                switch ($sentence['type'])
                {
@@ -574,6 +547,7 @@ function gotClearanceForTagChain ($code, $tagchain)
                                                        showError ("Condition match for unknown grant decision '${sentence['decision']}'");
                                                        break;
                                        }
+                               break;
                        default:
                                showError ("Can't process sentence of unknown type '${sentence['type']}'");
                                break;
@@ -582,4 +556,12 @@ function gotClearanceForTagChain ($code, $tagchain)
        return FALSE;
 }
 
+function getRackCode ()
+{
+       // FIXME: handle errors and display a message with an option to reset RackCode text
+       // FIXME: perform semantical analysis to prove the tree be reference-wise error
+       // free regardless of evaluation order
+       return getSentencesFromLexems (getLexemsFromRackCode (getLongText ('RackCode')));
+}
+
 ?>
index 824bebf..42d8d35 100644 (file)
@@ -2740,4 +2740,17 @@ function destroyIPv4Prefix ($id = 0)
        return '';
 }
 
+// FIXME: this is a dummy function
+function getLongText ($textname)
+{
+       $text = '
+       define [admin] {$userid_1}
+deny [admin] and {$page_object} and {$id_915}
+allow {$page_object} and {$id_915}
+allow {$page_object} and {$id_917}
+allow {$page_useraccount} and {$tab_password}
+';
+       return $text;
+}
+
 ?>
index 31e0249..59aebcf 100644 (file)
@@ -88,6 +88,9 @@ if (!count ($configCache))
        die();
 }
 
+require_once 'inc/code.php';
+$rackCode = getRackCode();
+
 // Now init authentication.
 
 require_once 'inc/auth.php';
index f1d04e1..bac6d65 100644 (file)
@@ -750,6 +750,8 @@ function renderRackObject ($object_id = 0)
                if (!empty ($record['value']))
                        echo "<tr><th width='50%' class=opt_attr_th>${record['name']}:</th><td class=tdleft>${record['a_value']}</td></tr>\n";
        printTagTRs ("${root}?page=objgroup&group_id=${info['objtype_id']}&");
+       global $verdict;
+       echo "<tr><th width='50%' class=tdright>RackCode verdict:</th><td class=tdleft>${verdict}</td></tr>\n";
        echo "</table><br>\n";
        finishPortlet();
 
@@ -5015,4 +5017,16 @@ function dump ($var)
        echo '</pre>';
 }
 
+function renderRackCodeViewer ()
+{
+       global $rackCode;
+       $text = getLongText ('RackCode');
+       startPortlet ('RackCode');
+       dump ($text);
+       finishPortlet();
+       startPortlet ('parse tree');
+       dump ($rackCode);
+       finishPortlet();
+}
+
 ?>
index 9d6d39f..5e020bb 100644 (file)
@@ -337,6 +337,10 @@ $ophandler['tagtree']['edit']['destroyTag'] = 'destroyTag';
 $ophandler['tagtree']['edit']['createTag'] = 'createTag';
 $ophandler['tagtree']['edit']['updateTag'] = 'updateTag';
 
+$page['rackcode']['title'] = '[RackCode]';
+$page['rackcode']['parent'] = 'config';
+$page['rackcode']['handler'] = 'renderRackCodeViewer';
+
 $page['reports']['title'] = 'Reports';
 $page['reports']['parent'] = 'index';
 $page['reports']['handler'] = 'renderReportSummary';