Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F7055197
enigma_ui.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
15 KB
Referenced Files
None
Subscribers
None
enigma_ui.php
View Options
<?php
/*
+-------------------------------------------------------------------------+
| User Interface for the Enigma Plugin |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License version 2 |
| as published by the Free Software Foundation. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License along |
| with this program; if not, write to the Free Software Foundation, Inc., |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| |
+-------------------------------------------------------------------------+
| Author: Aleksander Machniak <alec@alec.pl> |
+-------------------------------------------------------------------------+
*/
class
enigma_ui
{
private
$rc
;
private
$enigma
;
private
$home
;
private
$css_added
;
private
$data
;
function
__construct
(
$enigma_plugin
,
$home
=
''
)
{
$this
->
enigma
=
$enigma_plugin
;
$this
->
rc
=
$enigma_plugin
->
rc
;
// we cannot use $enigma_plugin->home here
$this
->
home
=
$home
;
}
/**
* UI initialization and requests handlers.
*
* @param string Preferences section
*/
function
init
(
$section
=
''
)
{
$this
->
enigma
->
include_script
(
'enigma.js'
);
// Enigma actions
if
(
$this
->
rc
->
action
==
'plugin.enigma'
)
{
$action
=
get_input_value
(
'_a'
,
RCUBE_INPUT_GPC
);
switch
(
$action
)
{
case
'keyedit'
:
$this
->
key_edit
();
break
;
case
'keyimport'
:
$this
->
key_import
();
break
;
case
'keysearch'
:
case
'keylist'
:
$this
->
key_list
();
break
;
case
'keyinfo'
:
default
:
$this
->
key_info
();
}
}
// Message composing UI
else
if
(
$this
->
rc
->
action
==
'compose'
)
{
$this
->
compose_ui
();
}
// Preferences UI
else
{
// if ($this->rc->action == 'edit-prefs') {
if
(
$section
==
'enigmacerts'
)
{
$this
->
rc
->
output
->
add_handlers
(
array
(
'keyslist'
=>
array
(
$this
,
'tpl_certs_list'
),
'keyframe'
=>
array
(
$this
,
'tpl_cert_frame'
),
'countdisplay'
=>
array
(
$this
,
'tpl_certs_rowcount'
),
'searchform'
=>
array
(
$this
->
rc
->
output
,
'search_form'
),
));
$this
->
rc
->
output
->
set_pagetitle
(
$this
->
enigma
->
gettext
(
'enigmacerts'
));
$this
->
rc
->
output
->
send
(
'enigma.certs'
);
}
else
{
$this
->
rc
->
output
->
add_handlers
(
array
(
'keyslist'
=>
array
(
$this
,
'tpl_keys_list'
),
'keyframe'
=>
array
(
$this
,
'tpl_key_frame'
),
'countdisplay'
=>
array
(
$this
,
'tpl_keys_rowcount'
),
'searchform'
=>
array
(
$this
->
rc
->
output
,
'search_form'
),
));
$this
->
rc
->
output
->
set_pagetitle
(
$this
->
enigma
->
gettext
(
'enigmakeys'
));
$this
->
rc
->
output
->
send
(
'enigma.keys'
);
}
}
}
/**
* Adds CSS style file to the page header.
*/
function
add_css
()
{
if
(
$this
->
css_loaded
)
return
;
$skin
=
$this
->
rc
->
config
->
get
(
'skin'
);
if
(!
file_exists
(
$this
->
home
.
"/skins/$skin/enigma.css"
))
$skin
=
'default'
;
$this
->
enigma
->
include_stylesheet
(
"skins/$skin/enigma.css"
);
$this
->
css_added
=
true
;
}
/**
* Template object for key info/edit frame.
*
* @param array Object attributes
*
* @return string HTML output
*/
function
tpl_key_frame
(
$attrib
)
{
if
(!
$attrib
[
'id'
])
{
$attrib
[
'id'
]
=
'rcmkeysframe'
;
}
$attrib
[
'name'
]
=
$attrib
[
'id'
];
$this
->
rc
->
output
->
set_env
(
'contentframe'
,
$attrib
[
'name'
]);
$this
->
rc
->
output
->
set_env
(
'blankpage'
,
$attrib
[
'src'
]
?
$this
->
rc
->
output
->
abs_url
(
$attrib
[
'src'
])
:
'program/blank.gif'
);
return
html
::
tag
(
'iframe'
,
$attrib
);
}
/**
* Template object for list of keys.
*
* @param array Object attributes
*
* @return string HTML content
*/
function
tpl_keys_list
(
$attrib
)
{
// add id to message list table if not specified
if
(!
strlen
(
$attrib
[
'id'
]))
{
$attrib
[
'id'
]
=
'rcmenigmakeyslist'
;
}
// define list of cols to be displayed
$a_show_cols
=
array
(
'name'
);
// create XHTML table
$out
=
rcube_table_output
(
$attrib
,
array
(),
$a_show_cols
,
'id'
);
// set client env
$this
->
rc
->
output
->
add_gui_object
(
'keyslist'
,
$attrib
[
'id'
]);
$this
->
rc
->
output
->
include_script
(
'list.js'
);
// add some labels to client
$this
->
rc
->
output
->
add_label
(
'enigma.keyconfirmdelete'
);
return
$out
;
}
/**
* Key listing (and searching) request handler
*/
private
function
key_list
()
{
$this
->
enigma
->
load_engine
();
$pagesize
=
$this
->
rc
->
config
->
get
(
'pagesize'
,
100
);
$page
=
max
(
intval
(
get_input_value
(
'_p'
,
RCUBE_INPUT_GPC
)),
1
);
$search
=
get_input_value
(
'_q'
,
RCUBE_INPUT_GPC
);
// define list of cols to be displayed
$a_show_cols
=
array
(
'name'
);
$result
=
array
();
// Get the list
$list
=
$this
->
enigma
->
engine
->
list_keys
(
$search
);
if
(
$list
&&
(
$list
instanceof
enigma_error
))
$this
->
rc
->
output
->
show_message
(
'enigma.keylisterror'
,
'error'
);
else
if
(
empty
(
$list
))
$this
->
rc
->
output
->
show_message
(
'enigma.nokeysfound'
,
'notice'
);
else
{
if
(
is_array
(
$list
))
{
// Save the size
$listsize
=
count
(
$list
);
// Sort the list by key (user) name
usort
(
$list
,
array
(
'enigma_key'
,
'cmp'
));
// Slice current page
$list
=
array_slice
(
$list
,
(
$page
-
1
)
*
$pagesize
,
$pagesize
);
$size
=
count
(
$list
);
// Add rows
foreach
(
$list
as
$idx
=>
$key
)
{
$this
->
rc
->
output
->
command
(
'enigma_add_list_row'
,
array
(
'name'
=>
Q
(
$key
->
name
),
'id'
=>
$key
->
id
));
}
}
}
$this
->
rc
->
output
->
set_env
(
'search_request'
,
$search
);
$this
->
rc
->
output
->
set_env
(
'pagecount'
,
ceil
(
$listsize
/
$pagesize
));
$this
->
rc
->
output
->
set_env
(
'current_page'
,
$page
);
$this
->
rc
->
output
->
command
(
'set_rowcount'
,
$this
->
get_rowcount_text
(
$listsize
,
$size
,
$page
));
$this
->
rc
->
output
->
send
();
}
/**
* Template object for list records counter.
*
* @param array Object attributes
*
* @return string HTML output
*/
function
tpl_keys_rowcount
(
$attrib
)
{
if
(!
$attrib
[
'id'
])
$attrib
[
'id'
]
=
'rcmcountdisplay'
;
$this
->
rc
->
output
->
add_gui_object
(
'countdisplay'
,
$attrib
[
'id'
]);
return
html
::
span
(
$attrib
,
$this
->
get_rowcount_text
());
}
/**
* Returns text representation of list records counter
*/
private
function
get_rowcount_text
(
$all
=
0
,
$curr_count
=
0
,
$page
=
1
)
{
if
(!
$curr_count
)
$out
=
$this
->
enigma
->
gettext
(
'nokeysfound'
);
else
{
$pagesize
=
$this
->
rc
->
config
->
get
(
'pagesize'
,
100
);
$first
=
(
$page
-
1
)
*
$pagesize
;
$out
=
$this
->
enigma
->
gettext
(
array
(
'name'
=>
'keysfromto'
,
'vars'
=>
array
(
'from'
=>
$first
+
1
,
'to'
=>
$first
+
$curr_count
,
'count'
=>
$all
)
));
}
return
$out
;
}
/**
* Key information page handler
*/
private
function
key_info
()
{
$id
=
get_input_value
(
'_id'
,
RCUBE_INPUT_GET
);
$this
->
enigma
->
load_engine
();
$res
=
$this
->
enigma
->
engine
->
get_key
(
$id
);
if
(
$res
instanceof
enigma_key
)
$this
->
data
=
$res
;
else
{
// error
$this
->
rc
->
output
->
show_message
(
'enigma.keyopenerror'
,
'error'
);
$this
->
rc
->
output
->
command
(
'parent.enigma_loadframe'
);
$this
->
rc
->
output
->
send
(
'iframe'
);
}
$this
->
rc
->
output
->
add_handlers
(
array
(
'keyname'
=>
array
(
$this
,
'tpl_key_name'
),
'keydata'
=>
array
(
$this
,
'tpl_key_data'
),
));
$this
->
rc
->
output
->
set_pagetitle
(
$this
->
enigma
->
gettext
(
'keyinfo'
));
$this
->
rc
->
output
->
send
(
'enigma.keyinfo'
);
}
/**
* Template object for key name
*/
function
tpl_key_name
(
$attrib
)
{
return
Q
(
$this
->
data
->
name
);
}
/**
* Template object for key information page content
*/
function
tpl_key_data
(
$attrib
)
{
$out
=
''
;
$table
=
new
html_table
(
array
(
'cols'
=>
2
));
// Key user ID
$table
->
add
(
'title'
,
$this
->
enigma
->
gettext
(
'keyuserid'
));
$table
->
add
(
null
,
Q
(
$this
->
data
->
name
));
// Key ID
$table
->
add
(
'title'
,
$this
->
enigma
->
gettext
(
'keyid'
));
$table
->
add
(
null
,
$this
->
data
->
subkeys
[
0
]->
get_short_id
());
// Key type
$keytype
=
$this
->
data
->
get_type
();
if
(
$keytype
==
enigma_key
::
TYPE_KEYPAIR
)
$type
=
$this
->
enigma
->
gettext
(
'typekeypair'
);
else
if
(
$keytype
==
enigma_key
::
TYPE_PUBLIC
)
$type
=
$this
->
enigma
->
gettext
(
'typepublickey'
);
$table
->
add
(
'title'
,
$this
->
enigma
->
gettext
(
'keytype'
));
$table
->
add
(
null
,
$type
);
// Key fingerprint
$table
->
add
(
'title'
,
$this
->
enigma
->
gettext
(
'fingerprint'
));
$table
->
add
(
null
,
$this
->
data
->
subkeys
[
0
]->
get_fingerprint
());
$out
.=
html
::
tag
(
'fieldset'
,
null
,
html
::
tag
(
'legend'
,
null
,
$this
->
enigma
->
gettext
(
'basicinfo'
))
.
$table
->
show
(
$attrib
));
// Subkeys
$table
=
new
html_table
(
array
(
'cols'
=>
6
));
// Columns: Type, ID, Algorithm, Size, Created, Expires
$out
.=
html
::
tag
(
'fieldset'
,
null
,
html
::
tag
(
'legend'
,
null
,
$this
->
enigma
->
gettext
(
'subkeys'
))
.
$table
->
show
(
$attrib
));
// Additional user IDs
$table
=
new
html_table
(
array
(
'cols'
=>
2
));
// Columns: User ID, Validity
$out
.=
html
::
tag
(
'fieldset'
,
null
,
html
::
tag
(
'legend'
,
null
,
$this
->
enigma
->
gettext
(
'userids'
))
.
$table
->
show
(
$attrib
));
return
$out
;
}
/**
* Key import page handler
*/
private
function
key_import
()
{
// Import process
if
(
$_FILES
[
'_file'
][
'tmp_name'
]
&&
is_uploaded_file
(
$_FILES
[
'_file'
][
'tmp_name'
]))
{
$this
->
enigma
->
load_engine
();
$result
=
$this
->
enigma
->
engine
->
import_key
(
$_FILES
[
'_file'
][
'tmp_name'
],
true
);
if
(
is_array
(
$result
))
{
// reload list if any keys has been added
if
(
$result
[
'imported'
])
{
$this
->
rc
->
output
->
command
(
'parent.enigma_list'
,
1
);
}
else
$this
->
rc
->
output
->
command
(
'parent.enigma_loadframe'
);
$this
->
rc
->
output
->
show_message
(
'enigma.keysimportsuccess'
,
'confirmation'
,
array
(
'new'
=>
$result
[
'imported'
],
'old'
=>
$result
[
'unchanged'
]));
$this
->
rc
->
output
->
send
(
'iframe'
);
}
else
$this
->
rc
->
output
->
show_message
(
'enigma.keysimportfailed'
,
'error'
);
}
else
if
(
$err
=
$_FILES
[
'_file'
][
'error'
])
{
if
(
$err
==
UPLOAD_ERR_INI_SIZE
||
$err
==
UPLOAD_ERR_FORM_SIZE
)
{
$this
->
rc
->
output
->
show_message
(
'filesizeerror'
,
'error'
,
array
(
'size'
=>
show_bytes
(
parse_bytes
(
ini_get
(
'upload_max_filesize'
)))));
}
else
{
$this
->
rc
->
output
->
show_message
(
'fileuploaderror'
,
'error'
);
}
}
$this
->
rc
->
output
->
add_handlers
(
array
(
'importform'
=>
array
(
$this
,
'tpl_key_import_form'
),
));
$this
->
rc
->
output
->
set_pagetitle
(
$this
->
enigma
->
gettext
(
'keyimport'
));
$this
->
rc
->
output
->
send
(
'enigma.keyimport'
);
}
/**
* Template object for key import (upload) form
*/
function
tpl_key_import_form
(
$attrib
)
{
$attrib
+=
array
(
'id'
=>
'rcmKeyImportForm'
);
$upload
=
new
html_inputfield
(
array
(
'type'
=>
'file'
,
'name'
=>
'_file'
,
'id'
=>
'rcmimportfile'
,
'size'
=>
30
));
$form
=
html
::
p
(
null
,
Q
(
$this
->
enigma
->
gettext
(
'keyimporttext'
),
'show'
)
.
html
::
br
()
.
html
::
br
()
.
$upload
->
show
()
);
$this
->
rc
->
output
->
add_label
(
'selectimportfile'
,
'importwait'
);
$this
->
rc
->
output
->
add_gui_object
(
'importform'
,
$attrib
[
'id'
]);
$out
=
$this
->
rc
->
output
->
form_tag
(
array
(
'action'
=>
$this
->
rc
->
url
(
array
(
'action'
=>
'plugin.enigma'
,
'a'
=>
'keyimport'
)),
'method'
=>
'post'
,
'enctype'
=>
'multipart/form-data'
)
+
$attrib
,
$form
);
return
$out
;
}
private
function
compose_ui
()
{
// Options menu button
// @TODO: make this work with non-default skins
$this
->
enigma
->
add_button
(
array
(
'name'
=>
'enigmamenu'
,
'imagepas'
=>
'skins/default/enigma.png'
,
'imageact'
=>
'skins/default/enigma.png'
,
'onclick'
=>
"rcmail_ui.show_popup('enigmamenu', true); return false"
,
'title'
=>
'securityoptions'
,
'domain'
=>
'enigma'
,
),
'toolbar'
);
// Options menu contents
$this
->
enigma
->
add_hook
(
'render_page'
,
array
(
$this
,
'compose_menu'
));
}
function
compose_menu
(
$p
)
{
$menu
=
new
html_table
(
array
(
'cols'
=>
2
));
$chbox
=
new
html_checkbox
(
array
(
'value'
=>
1
));
$menu
->
add
(
null
,
html
::
label
(
array
(
'for'
=>
'enigmadefaultopt'
),
Q
(
$this
->
enigma
->
gettext
(
'identdefault'
))));
$menu
->
add
(
null
,
$chbox
->
show
(
1
,
array
(
'name'
=>
'_enigma_default'
,
'id'
=>
'enigmadefaultopt'
)));
$menu
->
add
(
null
,
html
::
label
(
array
(
'for'
=>
'enigmasignopt'
),
Q
(
$this
->
enigma
->
gettext
(
'signmsg'
))));
$menu
->
add
(
null
,
$chbox
->
show
(
1
,
array
(
'name'
=>
'_enigma_sign'
,
'id'
=>
'enigmasignopt'
)));
$menu
->
add
(
null
,
html
::
label
(
array
(
'for'
=>
'enigmacryptopt'
),
Q
(
$this
->
enigma
->
gettext
(
'encryptmsg'
))));
$menu
->
add
(
null
,
$chbox
->
show
(
1
,
array
(
'name'
=>
'_enigma_crypt'
,
'id'
=>
'enigmacryptopt'
)));
$menu
=
html
::
div
(
array
(
'id'
=>
'enigmamenu'
,
'class'
=>
'popupmenu'
),
$menu
->
show
());
$p
[
'content'
]
=
preg_replace
(
'/(<form name="form"[^>]+>)/i'
,
'
\\
1'
.
"
\n
$menu"
,
$p
[
'content'
]);
return
$p
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Fri, Jun 12, 2:55 AM (20 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
908381
Default Alt Text
enigma_ui.php (15 KB)
Attached To
Mode
R3 roundcubemail
Attached
Detach File
Event Timeline
Log In to Comment