xref: /dokuwiki/inc/actions.php (revision 6b13307fb447795714d01cdc029d6ed7ac087cf3)
1*6b13307fSandi<?php
2*6b13307fSandi/**
3*6b13307fSandi * DokuWiki Actions
4*6b13307fSandi *
5*6b13307fSandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*6b13307fSandi * @author     Andreas Gohr <andi@splitbrain.org>
7*6b13307fSandi */
8*6b13307fSandi
9*6b13307fSandi  if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
10*6b13307fSandi  require_once(DOKU_INC.'inc/template.php');
11*6b13307fSandi
12*6b13307fSandi/**
13*6b13307fSandi * Call the needed action handlers
14*6b13307fSandi *
15*6b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
16*6b13307fSandi */
17*6b13307fSandifunction act_dispatch(){
18*6b13307fSandi  global $INFO;
19*6b13307fSandi  global $ACT;
20*6b13307fSandi  global $ID;
21*6b13307fSandi  global $QUERY;
22*6b13307fSandi  global $lang;
23*6b13307fSandi  global $conf;
24*6b13307fSandi
25*6b13307fSandi  //check permissions
26*6b13307fSandi  $ACT = act_permcheck($ACT);
27*6b13307fSandi
28*6b13307fSandi  //login stuff
29*6b13307fSandi  if(in_array($ACT,array('login','logout','register')))
30*6b13307fSandi    $ACT = act_login($ACT);
31*6b13307fSandi
32*6b13307fSandi  //save
33*6b13307fSandi  if($ACT == 'save')
34*6b13307fSandi    $ACT = act_save($ACT);
35*6b13307fSandi
36*6b13307fSandi  //edit
37*6b13307fSandi  if(($ACT == 'edit' || $ACT == $lang['btn_preview']) && $INFO['editable']){
38*6b13307fSandi    $ACT = act_save($ACT);
39*6b13307fSandi  }else{
40*6b13307fSandi    unlock($ID); //try to unlock
41*6b13307fSandi  }
42*6b13307fSandi
43*6b13307fSandi  //handle export
44*6b13307fSandi  if(substr($ACT,0,6) == 'export')
45*6b13307fSandi    $ACT = act_export($ACT);
46*6b13307fSandi
47*6b13307fSandi  //display some infos
48*6b13307fSandi  if($ACT == 'check'){
49*6b13307fSandi    check();
50*6b13307fSandi    $ACT = 'show';
51*6b13307fSandi  }
52*6b13307fSandi
53*6b13307fSandi  //check if searchword was given - else just show
54*6b13307fSandi  if($ACT == 'search' && empty($QUERY)){
55*6b13307fSandi    $ACT = 'show';
56*6b13307fSandi  }
57*6b13307fSandi
58*6b13307fSandi  //fixme sanitize $ACT
59*6b13307fSandi
60*6b13307fSandi  //call template FIXME: all needed vars available?
61*6b13307fSandi  header('Content-Type: text/html; charset=utf-8');
62*6b13307fSandi  include(DOKU_INC.'tpl/'.$conf['template'].'/main.php');
63*6b13307fSandi}
64*6b13307fSandi
65*6b13307fSandi/**
66*6b13307fSandi * Run permissionchecks
67*6b13307fSandi *
68*6b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
69*6b13307fSandi */
70*6b13307fSandifunction act_permcheck($act){
71*6b13307fSandi  if(in_array($act,array('save','preview','edit'))){
72*6b13307fSandi    if($INFO['exists']){
73*6b13307fSandi      $permneed = AUTH_EDIT;
74*6b13307fSandi    }else{
75*6b13307fSandi      $permneed = AUTH_CREATE;
76*6b13307fSandi    }
77*6b13307fSandi  }elseif(in_array($act,array('login','register','search','recent'))){
78*6b13307fSandi    $permneed = AUTH_NONE;
79*6b13307fSandi  }else{
80*6b13307fSandi    $permneed = AUTH_READ;
81*6b13307fSandi  }
82*6b13307fSandi  if(! auth_quickaclcheck($ID) >= $permneed){
83*6b13307fSandi    return 'denied';
84*6b13307fSandi  }
85*6b13307fSandi
86*6b13307fSandi  return $act;
87*6b13307fSandi}
88*6b13307fSandi
89*6b13307fSandi/**
90*6b13307fSandi * Handle 'save'
91*6b13307fSandi *
92*6b13307fSandi * Checks for spam and conflicts and saves the page.
93*6b13307fSandi * Does a redirect to show the page afterwards or
94*6b13307fSandi * returns a new action.
95*6b13307fSandi *
96*6b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
97*6b13307fSandi */
98*6b13307fSandifunction act_save($act){
99*6b13307fSandi  global $ID;
100*6b13307fSandi  global $DATE;
101*6b13307fSandi  global $PRE;
102*6b13307fSandi  global $TEXT;
103*6b13307fSandi  global $SUF;
104*6b13307fSandi  global $SUM;
105*6b13307fSandi
106*6b13307fSandi  //spam check
107*6b13307fSandi  if(checkwordblock())
108*6b13307fSandi    return 'wordblock';
109*6b13307fSandi  //conflict check //FIXME use INFO
110*6b13307fSandi  if($DATE != 0 && @filemtime(wikiFN($ID)) > $DATE )
111*6b13307fSandi    return 'conflict';
112*6b13307fSandi
113*6b13307fSandi  //save it
114*6b13307fSandi  saveWikiText($ID,con($PRE,$TEXT,$SUF,1),$SUM); //use pretty mode for con
115*6b13307fSandi  //unlock it
116*6b13307fSandi  unlock($ID);
117*6b13307fSandi
118*6b13307fSandi  //show it
119*6b13307fSandi  session_write_close();
120*6b13307fSandi  header("Location: ".wl($ID,'',true));
121*6b13307fSandi  exit();
122*6b13307fSandi}
123*6b13307fSandi
124*6b13307fSandi/**
125*6b13307fSandi * Handle 'login', 'logout', 'register'
126*6b13307fSandi *
127*6b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
128*6b13307fSandi */
129*6b13307fSandifunction act_auth($act){
130*6b13307fSandi  //already logged in?
131*6b13307fSandi  if($_SERVER['REMOTE_USER'] && $act=='login')
132*6b13307fSandi    return 'show';
133*6b13307fSandi
134*6b13307fSandi  //handle logout
135*6b13307fSandi  if($act=='logout'){
136*6b13307fSandi    auth_logoff();
137*6b13307fSandi    return 'login';
138*6b13307fSandi  }
139*6b13307fSandi
140*6b13307fSandi  //handle register
141*6b13307fSandi  if($act=='register' && register()){
142*6b13307fSandi    $act='login';
143*6b13307fSandi  }
144*6b13307fSandi
145*6b13307fSandi  return $act;
146*6b13307fSandi}
147*6b13307fSandi
148*6b13307fSandi/**
149*6b13307fSandi * Handle 'edit', 'preview'
150*6b13307fSandi *
151*6b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
152*6b13307fSandi */
153*6b13307fSandifunction act_edit($act){
154*6b13307fSandi  //check if locked by anyone - if not lock for my self
155*6b13307fSandi  $lockedby = checklock($ID);
156*6b13307fSandi  if($lockedby) return 'locked';
157*6b13307fSandi
158*6b13307fSandi  lock($ID);
159*6b13307fSandi  return $act;
160*6b13307fSandi}
161*6b13307fSandi
162*6b13307fSandi/**
163*6b13307fSandi * Handle 'edit', 'preview'
164*6b13307fSandi *
165*6b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
166*6b13307fSandi */
167*6b13307fSandifunction act_export($act){
168*6b13307fSandi  global $ID;
169*6b13307fSandi  global $REV;
170*6b13307fSandi
171*6b13307fSandi  if($act == 'export_html'){
172*6b13307fSandi    header('Content-Type: text/html; charset=utf-8');
173*6b13307fSandi    ptln('<html>');
174*6b13307fSandi    ptln('<head>');
175*6b13307fSandi    tpl_metaheaders();
176*6b13307fSandi    ptln('</head>');
177*6b13307fSandi    ptln('<body>');
178*6b13307fSandi    print parsedWiki($ID,$REV,false);
179*6b13307fSandi    ptln('</body>');
180*6b13307fSandi    ptln('</html>');
181*6b13307fSandi    exit;
182*6b13307fSandi  }
183*6b13307fSandi
184*6b13307fSandi  if($act == 'export_raw'){
185*6b13307fSandi    header('Content-Type: text/plain; charset=utf-8');
186*6b13307fSandi    print rawWiki($ID,$REV);
187*6b13307fSandi    exit;
188*6b13307fSandi  }
189*6b13307fSandi
190*6b13307fSandi  return 'show';
191*6b13307fSandi}
192*6b13307fSandi?>
193