MTrackWeb.php
[web.mtrack] / MTrackWeb.php
1 <?php
2 /**
3  * every class extends this...
4  */
5  
6  
7 class MTrackWeb extends HTML_FlexyFramework_Page
8 {
9     var $template = 'wiki.html';
10     var $priorities = array();
11     var $severities = array();
12     var $link = false; // the link handler..
13     
14     function hasPerm($what, $cando) {
15         // our whole perm logic sits in here....
16         
17         // here's how it works
18         // a) anonymous users - not authenticated.
19         // - can see projects that are in *PUBLIC project "MTrack.Repos", "S"
20         // - can see bugs that are in *PUBLIC project "MTrack.Issue", "S"
21         // - can see bugs that are in *PUBLIC project "MTrack.Wiki", "S"
22         if (!$this->authUser) {
23             if ($cando = 'S' &&
24                     in_array( $what , array( 'MTrack.Repos', 'MTrack.Issue', 'MTrack.Wiki'))) {
25                 return true; // not a diffinative answer...
26             }
27             return false;
28         }
29         
30         return $this->authUser->hasPerm($what, $cando); 
31     }
32     
33     function projectPerm($project_id, $what, $cando)
34     {
35         if (!$project_id) {
36             return false;
37         }
38         $p = DB_DataObject::factory('Projects');
39         $p->get($project_id);
40         if (!$this->authUser) {
41             if ($p->code != '*PUBLIC') {
42                 return false; // only public projects
43             }
44             if ($cando != 'S') {
45                 return false;
46             }
47             // all permissions to view public stuff.
48             return true;
49         }
50         if (!$this->authUser->hasPerm($what, $cando)) {
51             echo "NO PERMS $what $cando";
52             echo '<PRE>'; print_r($this->authUser->getPerms());
53             return false;
54         }
55         // membership rules?
56         //echo "COMPTYPE " . $this->authUser->company()->comptype ;
57         if ($this->authUser->company()->comptype == 'OWNER') {
58                 
59             if ($this->authUser->hasPerm('Core.Projects_All', $cando)) { // they can do what they like on all projects.
60                return true;
61             }
62            // return $p->hasPerm($what, $cando);
63         }
64         // otherwise they have to be a team member of that project.
65         
66         $pd = DB_DataObject::factory('ProjectDirectory');
67         $pd->project_id = $project_id;
68         $pd->user_id = $this->authUser->id;
69         if (!$pd->count()) {
70             return false;
71         }
72         return true;
73         
74         
75         
76         
77     }
78     
79     
80     function getAuthUser()
81     {
82         $u = DB_DataObject::factory('Person');
83         if (!$u->isAuth()) {
84             return false;
85         }
86         return $u->getAuthUser();
87     }
88     /**
89      * base getAuth allows everyone in..
90      */
91     
92     function getAuth()
93     {
94         $this->registerClasses(); // to be destroyed??
95         
96         $ff = HTML_FlexyFramework::get();
97         if ($ff->cli) {
98             return true;
99         }
100         
101         // default timezone first..
102         $ff = HTML_FlexyFramework::get();
103         if (isset($ff->MTrack['timezone'])) {
104             date_default_timezone_set($ff->MTrack['timezone']);
105         }
106         
107         //MTrackConfig::boot(); // eak.. .remove me...
108       
109         $this->authUser = DB_DataObject::factory('Person')->getAuthUser();
110         if (!$this->authUser) {
111             return true; // we do allow people in this far..
112         }
113         
114          
115         // timezone setting... -- this may be a good addon to our core person class.
116         
117         if (!empty($this->authUser->timezone)) {
118             date_default_timezone_set($this->authUser->timezone);
119             return;
120         }
121          
122         /// fixme...
123         //$this->authUser = 
124         return true; // anyone at present..
125     }
126     function get($loc='')
127     {
128         // 
129         if (!empty($loc)) {
130             die ("invalid location". htmlspecialchars($loc));
131         }
132         if (!$this->authUser) {
133             die("wiki todo");
134             return HTML_FlexyFramework::run('Wiki'); 
135         }
136         return HTML_FlexyFramework::run('Wiki/Today'); 
137  
138     }
139     function post()
140     {
141         header("Status: 404 Not Found");
142         die("not valid");
143     }
144     
145     
146     function initOptions()
147     {
148         
149          
150         $q = MTrackDB::q('select priorityname, value from priorities');
151
152         foreach ($q->fetchAll() as $row) {
153             $this->priorities[$row[0]] = $row[1];
154         }
155         $q = MTrackDB::q('select sevname, ordinal from severities');
156         
157         foreach ($q->fetchAll() as $row) {
158             $this->severities[$row[0]] = $row[1];
159         }
160
161     }
162     
163     function registerClasses()
164     {
165         require_once 'MTrack/Wiki.php';
166         require_once 'MTrack/Wiki/Item.php';
167         require_once 'MTrack/Milestone.php';
168         //require_once 'MTrack/Report.php';
169         //require_once 'MTrack/SearchDB.php';
170         //require_once 'MTrack/Watch.php'; 
171         //require_once 'MTrack/CommitChecker.php'; 
172       
173         
174         require_once 'MTrackWeb/LinkHandler.php';
175         require_once 'MTrack/Wiki/HTMLFormatter.php';
176         
177         $this->link = new MTrackWeb_LinkHandler();
178         MTrack_Wiki_HTMLFormatter::registerLinkHandler($this->link);
179  
180
181         $r = DB_DataObject::factory('mtrack_repos');
182         $r->get('shortname', 'wiki'); // default wiki?
183         MTrack_Wiki_Item::$repo = $r->impl();
184         
185         
186         
187         //MTrack_Wiki::register_macro('MilestoneSummary', array('MTrack_Milestone', 'macro_MilestoneSummary'));
188        // MTrack_Wiki::register_macro('BurnDown', array('MTrack_Milestone', 'macro_BurnDown'));
189         //MTrack_Wiki::register_macro('RunReport', array('MTrack_Report', 'macro_RunReport')); << fixme how are we to hanlde this..
190         //MTrack_Wiki::register_macro('TicketQuery', array('MTrack_Report', 'macro_TicketQuery'));
191         MTrack_Wiki::register_macro('IncludeWikiPage', array('MTrack_Wiki', 'macro_IncludeWiki'));
192         MTrack_Wiki::register_macro('IncludeHelpPage', array('MTrack_Wiki', 'macro_IncludeHelp'));
193         MTrack_Wiki::register_macro('Comment', array('MTrack_Wiki', 'macro_comment'));
194         MTrack_Wiki::register_processor('comment', array('MTrack_Wiki', 'processor_comment'));
195         MTrack_Wiki::register_processor('html', array('MTrack_Wiki', 'processor_html'));
196         MTrack_Wiki::register_processor('dataset', array('MTrack_Wiki', 'processor_dataset'));
197
198
199         //MTrackACL::registerAncestry('milestone', 'Roadmap');
200         //MTrackACL::registerAncestry('report', 'Reports');
201         //MTrackACL::registerAncestry('snippet', 'Snippets');
202         //MTrackACL::registerAncestry('repo', 'Browser');
203         //MTrackACL::registerAncestry('enum',     'Enumerations');
204         //MTrackACL::registerAncestry("component", 'Components');
205         //MTrackACL::registerAncestry("project",  'Projects');
206         //MTrackACL::registerAncestry("ticket",   "Tickets");
207         //MTrackACL::registerAncestry('wiki', array('MTrack_Wiki_Item', '_get_parent_for_acl'));
208
209         //MTrackSearchDB::register_indexer('ticket', array('MTrackIssue', 'index_issue'));
210         //MTrackSearchDB::register_indexer('wiki', array('MTrack_Wiki_Item', 'index_item'));
211
212
213
214         //MTrackWatch::registerEventTypes('ticket', array( 'ticket' => 'Tickets' ));
215         //MTrackWatch::registerEventTypes('milestone', array( 'ticket' => 'Tickets', 'changeset' => 'Code changes' ));
216         //MTrackWatch::registerEventTypes('repo', array( 'ticket' => 'Tickets', 'changeset' => 'Code changes' ));
217
218         // should this get registered here??
219         //MTrackCommitChecker::addCheck('Wiki');
220         
221         
222         
223    }
224     
225     function favicon()
226     {
227         return false;
228         /// FIXME - we should allow upload of a favion...
229         $ff = HTML_FlexyFramework::get();
230         
231         
232     }
233      
234     
235     /* renders the attachment list for a given object */
236     // was Attachments::render
237     // move it to MTrackWebAttachemnt...
238     
239   function attachmentsToHtml($object)
240   {
241     if (is_object($object)) {
242         $object = $object->toIdString(); // eg. ticket:1
243     }
244     $atts = MTrackDB::q('
245       select * from attachments
246       left join changes on (attachments.cid = changes.cid)
247       where attachments.object = ? order by changedate, filename',
248         $object)->fetchAll(PDO::FETCH_ASSOC);
249
250     if (count($atts) == 0) return '';
251
252     $max_dim = 150;
253
254     $html = "<div class='attachment-list'><b>Attachments</b><ul>";
255     foreach ($atts as $row) {
256       $url = "{$this->baseURL}/Attachment/$object/". $row['cid'] . '/' . $row['filename'];
257       
258       $html .= "<li><a class='attachment'" .
259         " href='$url'>".
260         "$row[filename]</a> ($row[size]) added by " .
261         $this->link->username($row['who'], array(
262           'no_image' => true
263         )) .
264         " " . $this->link->date($row['changedate']);
265         require_once 'MTrack/Attachment.php';
266       list($width, $height) = getimagesize(MTrackAttachment::local_path($row['hash']));
267       if ($width + $height) {
268         /* limit maximum size */
269         if ($width > $max_dim) {
270           $height *= $max_dim / $width;
271           $width = $max_dim;
272         }
273         if ($height > $max_dim) {
274           $width *= $max_dim / $height;
275           $height = $max_dim;
276         }
277         $html .= "<br><a href='$url'><img src='$url' width='$width' border='0' height='$height'></a>";
278       }
279
280       $html .= "</li>\n";
281     }
282     $html .= "</ul></div>";
283     return $html;
284   }
285     
286     
287
288 }