@@ -24,92 +24,6 @@ static public function plugin_post_item_form_formvalidation($parm) {
24
24
}
25
25
}
26
26
27
- const HELPER_FUNCTIONS = <<<'EOT'
28
- //------------------------------------------
29
- // helper function to verify if a string
30
- // is really a date
31
- // uses the datepicker JQuery plugin
32
- //------------------------------------------
33
- function isValidDate(string) {
34
- try {
35
- if (string.length == 0) {
36
- return false;
37
- }
38
- $.datepicker.parseDate($('.hasDatepicker').datepicker('option', 'dateFormat'), string);
39
- return true;
40
- } catch (e) {
41
- return false;
42
- }
43
- }
44
-
45
- //------------------------------------------
46
- // helper function to verify a if a string
47
- // is really a time from 00:00[:00] to 23:59[:59]
48
- //------------------------------------------
49
- function isValidTime(str) {
50
- return /^(?:[0-1]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/.test(str);
51
- }
52
-
53
- //------------------------------------------
54
- // helper function to verify a if a string
55
- // is really an integer
56
- //------------------------------------------
57
- function isValidInteger(str) {
58
- return /^\d+$/.test(str);
59
- }
60
-
61
- //------------------------------------------
62
- // helper function to count words in a given string
63
- // returns quantity of words
64
- //------------------------------------------
65
- function countWords(str) {
66
- return str.split(/\W+/).length;
67
- }
68
-
69
- //------------------------------------------
70
- // helper function to verify a if a string
71
- // is really an IPV4 address
72
- // uses the datapicker JQuery plugin
73
- //------------------------------------------
74
- function isValidIPv4(ipaddress) {
75
- return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress) ;
76
- }
77
-
78
-
79
- //------------------------------------------
80
- // helper function to verify a if a string
81
- // is really an IPV6 address
82
- // uses the datapicker JQuery plugin
83
- //------------------------------------------
84
- function isValidIPv6(ipaddress) {
85
- return /^((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7}$/.test(ipaddress);
86
- }
87
-
88
- //------------------------------------------
89
- // helper function to verify a if a string
90
- // is really an email address
91
- // will use the input type=email if it exists (HTML5)
92
- // otherwise will use a basic verification.
93
- //------------------------------------------
94
- function isValidEmail(value) {
95
- var input = document.createElement("input");
96
-
97
- input.type = "email";
98
- input.value = value;
99
-
100
- return typeof input.checkValidity == "function" ? input.checkValidity() : /^\S+@\S+\.\S+$/.test(value);
101
- }
102
-
103
- //------------------------------------------
104
- // helper function to verify a if a string
105
- // is really a MAC address
106
- //------------------------------------------
107
- function isValidMacAddress(str) {
108
- return /^[\da-f]{2}([:-])(?:[\da-f]{2}\1){4}[\da-f]{2}$/i.test(str);
109
- }
110
-
111
- EOT;
112
-
113
27
/**
114
28
* Summary of plugin_pre_item_update_formvalidation
115
29
* @param mixed $parm the object that is going to be updated
@@ -118,6 +32,8 @@ function isValidMacAddress(str) {
118
32
static public function plugin_pre_item_update_formvalidation ($ parm ) {
119
33
global $ DB ;
120
34
35
+ $ config = PluginFormvalidationConfig::getInstance ();
36
+ $ path = $ config ->fields ["js_path " ];
121
37
// to be executed only for massive actions
122
38
if (strstr ($ _SERVER ['PHP_SELF ' ], "/front/massiveaction.php " )) {
123
39
$ ret =[];
@@ -167,19 +83,19 @@ static public function plugin_pre_item_update_formvalidation($parm) {
167
83
]
168
84
]
169
85
];
170
-
86
+
171
87
if (!empty ($ input )) {
172
88
$ key = array_keys ($ input );
173
89
$ query2 ['WHERE ' ]['AND ' ]["glpi_plugin_formvalidation_fields.css_selector_value " ] = ['LIKE ' , '% ' .$ key [0 ].'% ' ];
174
90
}
175
91
176
92
foreach ($ DB ->request ( $ query2 ) as $ form ) {
177
- foreach ($ DB ->request ('glpi_plugin_formvalidation_fields ' , ['forms_id ' => $ form ['id ' ]]) as $ field ) {
93
+ foreach ($ DB ->request ('glpi_plugin_formvalidation_fields ' , ['AND ' => [ ' forms_id ' => $ form ['id ' ], ' is_active ' => 1 ]]) as $ field ) {
178
94
$ matches = [];
179
95
if (preg_match ('/\[(name|id\^)= \\\\{0,1}"(?<name>[a-z_\-0-9]+) \\\\{0,1}"\]/i ' , $ field ['css_selector_value ' ], $ matches )) {
180
- $ fieldnames [$ field ['id ' ]]= $ matches ['name ' ];
181
- $ formulas [$ field ['id ' ]]= ($ field ['formula ' ] ? $ field ['formula ' ] : '#>0 || #!="" ' );
182
- $ fieldtitles [$ field ['id ' ]]= $ field ['name ' ];
96
+ $ fieldnames [$ field ['id ' ]] = trim ( $ matches ['name ' ], " _ " ) ;
97
+ $ formulas [$ field ['id ' ]] = ($ field ['formula ' ] ? $ field ['formula ' ] : '#>0 || #!="" ' );
98
+ $ fieldtitles [$ field ['id ' ]] = $ field ['name ' ];
183
99
}
184
100
}
185
101
@@ -196,21 +112,40 @@ static public function plugin_pre_item_update_formvalidation($parm) {
196
112
} else {
197
113
$ regex = '/# ' .$ valnum .'\b/i ' ;
198
114
}
199
- //$formulaJS[$fieldnum] = preg_replace( $regex, '"'.Toolbox::addslashes_deep( $val ).'"', $formulaJS[$fieldnum] ) ;
200
- $ formulaJS [$ fieldnum ] = preg_replace ( $ regex , "PHP.val[ $ valnum] " , $ formulaJS [$ fieldnum ] );
115
+ $ formulaJS [$ fieldnum ] = preg_replace ( $ regex , '" ' .$ values [$ valnum ].'" ' , $ formulaJS [$ fieldnum ] );
201
116
}
202
117
}
203
118
204
- $ v8 = new V8Js ();
205
- $ v8 ->val = $ values ;
206
119
$ ret =[];
120
+ $ helpers = file_get_contents (__DIR__ . "/../js/helpers_function.js.tpl " );
121
+ $ helpers = str_replace ('$dateFormat ' , 'YYYY-MM-DD ' , $ helpers );
122
+ $ moment = file_get_contents (GLPI_ROOT ."/lib/moment.min.js " );
207
123
foreach ($ formulaJS as $ index => $ formula ) {
208
124
try {
209
- if (!$ v8 ->executeString (self ::HELPER_FUNCTIONS ."
210
- exec = $ formula;
211
- " ) ) {
212
- Session::addMessageAfterRedirect ( __ ('Mandatory fields or wrong value: ' ).__ ($ fieldtitles [$ index ]), true , ERROR );
213
- $ ret []=$ fieldnames [$ index ];
125
+ if (extension_loaded ('v8js ' )) {
126
+ $ v8 = new V8Js ();
127
+ if (!$ v8 ->executeString ($ moment ."\n" .$ helpers ."\n
128
+ exec = $ formula; " )
129
+ ) {
130
+ Session::addMessageAfterRedirect ( __ ('Mandatory fields or wrong value: ' ).__ ($ fieldtitles [$ index ]), true , ERROR );
131
+ $ ret [] = $ fieldnames [$ index ];
132
+ }
133
+ } else {
134
+ if (file_exists ($ path )) {
135
+ $ tmpfile = tempnam (GLPI_ROOT .'/files/_tmp ' , 'tmp ' );
136
+ $ handle = fopen ($ tmpfile , "w " );
137
+ fwrite ($ handle , "var moment = require('../../lib/moment.min.js'); \n" .$ helpers ."\nif( $ formula){console.log(1);}else{console.log(0);} " );
138
+ fclose ($ handle );
139
+ $ valid = exec ("\"$ path \" \"$ tmpfile \"" );
140
+ if ($ valid == 0 || is_null ($ valid )) {
141
+ Session::addMessageAfterRedirect ( __ ('Mandatory fields or wrong value: ' ).__ ($ fieldtitles [$ index ]), true , ERROR );
142
+ $ ret [] = $ fieldnames [$ index ];
143
+ }
144
+ unlink ($ tmpfile );
145
+ } else {
146
+ Session::addMessageAfterRedirect ( __ ('The field was not updated because node.js and v8js are not installed/enabled. Contact your system administrator ' ), true , ERROR );
147
+ $ ret [] = $ fieldnames [$ index ];
148
+ }
214
149
}
215
150
} catch (Exception $ ex ) {
216
151
Session::addMessageAfterRedirect ( __ ('Error: ' ).__ ($ ex ->message ), false , ERROR );
0 commit comments