This is an automated email from the ASF dual-hosted git repository. matthiasblaesing pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans-tools.git
The following commit(s) were added to refs/heads/master by this push: new 1e49bb6 Implement apache oauth login new 6a3a7ba Merge pull request #42 from matthiasblaesing/pp3-login-apache 1e49bb6 is described below commit 1e49bb68f2335579e70d8ac5a189c65bf3ef9631 Author: Matthias Bläsing <mblaes...@doppel-helix.eu> AuthorDate: Wed Feb 3 21:39:46 2021 +0100 Implement apache oauth login The ASF provides an oauth based login option via: https://oauth.apache.org see https://oauth.apache.org/api.html for documentation. This change integrates the oauth system and allows every ASF committer to login using his/her ASF credentials. --- .../Application/config/module.config.php.dist | 8 + .../src/Application/Controller/LoginController.php | 88 +++-- pp3/public/img/login/apache.svg | 404 +++++++++++++++++++++ 3 files changed, 467 insertions(+), 33 deletions(-) diff --git a/pp3/module/Application/config/module.config.php.dist b/pp3/module/Application/config/module.config.php.dist index 5dafbfb..32f514b 100755 --- a/pp3/module/Application/config/module.config.php.dist +++ b/pp3/module/Application/config/module.config.php.dist @@ -60,6 +60,14 @@ return array( 'clientId' => 'DO_NOT_COMMIT', 'clientSecret' => 'DO_NOT_COMMIT', 'type' => 'amazon' + ), + array( + 'id' => 'apache', + 'name' => 'Apache', + 'icon' => '/img/login/apache.svg', + 'clientId' => 'IGNORED', + 'clientSecret' => 'IGNORED', + 'type' => 'apache' ) ), 'router' => array( diff --git a/pp3/module/Application/src/Application/Controller/LoginController.php b/pp3/module/Application/src/Application/Controller/LoginController.php index 3fbdfeb..493897d 100644 --- a/pp3/module/Application/src/Application/Controller/LoginController.php +++ b/pp3/module/Application/src/Application/Controller/LoginController.php @@ -82,6 +82,9 @@ class LoginController extends BaseController { $stateBytes = random_bytes(64); $state = bin2hex($stateBytes); + if($loginConfig['type'] == 'apache') { + $state = substr($state, 0, 64); + } $_SESSION['oauthState'] = $state; $_SESSION['oauthConfig'] = $loginConfig['id']; $scopeData = self::scopesFromType($loginConfig['type']); @@ -89,7 +92,7 @@ class LoginController extends BaseController { 'client_id' => $loginConfig['clientId'], 'state' => $state, 'response_type' => 'code', - 'redirect_uri' => $this->redirectUrl() + 'redirect_uri' => $this->redirectUrl($loginConfig['type'], $state) ); if($scopeData) { $queryData['scope'] = $scopeData; @@ -124,39 +127,48 @@ class LoginController extends BaseController { return $response; } - $tokenRequest = self::tokenRequest($code, $loginConfig); - $queryTokenResult = file_get_contents(self::tokenUrlFromType($loginConfig['type']), false, stream_context_create([ - 'http' => [ - 'method' => 'POST', - 'header' => ["Content-type: application/json", "Accept: application/json"], - 'content' => json_encode($tokenRequest) - ] - ])); - - if(!$queryTokenResult) { - error_log("Empty response"); - $response->setStatusCode(500); - $response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_TOKEN'))); - return $response; - } + if($loginConfig['type'] == 'apache') { + $queryProfileResult = file_get_contents("https://oauth.apache.org/token?code=" . $_GET['code'], false, stream_context_create([ + 'http' => [ + 'header' => ['Accept: application/json', 'User-Agent: Netbeans Plugin Portal'], + "ignore_errors" => true, + ] + ])); + } else { + $tokenRequest = self::tokenRequest($code, $loginConfig); + $queryTokenResult = file_get_contents(self::tokenUrlFromType($loginConfig['type']), false, stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'header' => ["Content-type: application/json", "Accept: application/json"], + 'content' => json_encode($tokenRequest) + ] + ])); + + if(!$queryTokenResult) { + error_log("Empty response"); + $response->setStatusCode(500); + $response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_TOKEN'))); + return $response; + } - $tokenData = json_decode($queryTokenResult, true); + $tokenData = json_decode($queryTokenResult, true); - if((! $tokenData) || (! $tokenData['access_token']) || (strtolower($tokenData['token_type']) != 'bearer')) { - error_log("Failed to decode token data: " . $queryTokenResult); - $response->setStatusCode(500); - $response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_TOKEN'))); - return $response; - } + if((! $tokenData) || (! $tokenData['access_token']) || (strtolower($tokenData['token_type']) != 'bearer')) { + error_log("Failed to decode token data: " . $queryTokenResult); + $response->setStatusCode(500); + $response->setContent(json_encode(array('success' => false, 'reason' => 'INVALID_TOKEN'))); + return $response; + } - $queryProfileResult = file_get_contents(self::profileUrlFromType($loginConfig['type']), false, stream_context_create([ - 'http' => [ - 'header' => ['Accept: application/json', 'Authorization: Bearer ' . $tokenData['access_token'], 'User-Agent: Netbeans Plugin Portal'], - "ignore_errors" => true, - ] - ])); + $queryProfileResult = file_get_contents(self::profileUrlFromType($loginConfig['type']), false, stream_context_create([ + 'http' => [ + 'header' => ['Accept: application/json', 'Authorization: Bearer ' . $tokenData['access_token'], 'User-Agent: Netbeans Plugin Portal'], + "ignore_errors" => true, + ] + ])); + } - $userinfo = $this->extractUserInfo($loginConfig['type'], $loginConfig['id'], $queryProfileResult); + $userinfo = $this->extractUserInfo($loginConfig['type'], $loginConfig['id'], $queryProfileResult, $_SESSION['oauthState']); if($userinfo == null) { error_log("Failed to parse: " . $queryProfileResult); @@ -212,8 +224,13 @@ class LoginController extends BaseController { return $this->redirect()->toRoute("home"); } - private function redirectUrl() { - return $this->url()->fromRoute("login", array("action" => "callback"), array('force_canonical'=>true)); + private function redirectUrl($type = '', $state = '') { + $url = $this->url()->fromRoute("login", array("action" => "callback"), array('force_canonical' => true)); + if ($type == 'apache') { + return $url . "?state=$state"; + } else { + return $url; + } } public function logoutAction() { @@ -232,6 +249,7 @@ class LoginController extends BaseController { case 'github': return 'https://github.com/login/oauth/authorize'; case 'google': return 'https://accounts.google.com/o/oauth2/v2/auth'; case 'amazon': return 'https://www.amazon.com/ap/oa'; + case 'apache': return 'https://oauth.apache.org/auth'; } } @@ -275,7 +293,7 @@ class LoginController extends BaseController { return $data; } - private function extractUserInfo($type, $providerId, $data) { + private function extractUserInfo($type, $providerId, $data, $state = '') { if(! $data) { return null; } @@ -297,6 +315,10 @@ class LoginController extends BaseController { $userinfo['id'] = "" . $json['user_id']; $userinfo['email'] = "" . $json['email']; $userinfo['name'] = "" . $json['name']; + } else if ($type == 'apache' && $json['state'] == $state) { + $userinfo['id'] = "" . $json['uid']; + $userinfo['email'] = "" . $json['email']; + $userinfo['name'] = "" . $json['fullname']; } return $userinfo; } diff --git a/pp3/public/img/login/apache.svg b/pp3/public/img/login/apache.svg new file mode 100644 index 0000000..6752b34 --- /dev/null +++ b/pp3/public/img/login/apache.svg @@ -0,0 +1,404 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Feather" + x="0px" + y="0px" + viewBox="0 0 24 23.999999" + enable-background="new 0 0 2392.5 4226.6" + xml:space="preserve" + sodipodi:docname="apache.svg" + width="24" + height="24" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata + id="metadata2733"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs2731" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1842" + inkscape:window-height="1133" + id="namedview2729" + showgrid="false" + inkscape:zoom="23.655936" + inkscape:cx="13.404414" + inkscape:cy="15.139504" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="Feather" /> +<linearGradient + id="SVGID_1_" + gradientUnits="userSpaceOnUse" + x1="-5167.0962" + y1="697.55487" + x2="-4570.1162" + y2="1395.619" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0" + style="stop-color:#F69923" + id="stop2590" /> + <stop + offset="0.3123" + style="stop-color:#F79A23" + id="stop2592" /> + <stop + offset="0.8383" + style="stop-color:#E97826" + id="stop2594" /> +</linearGradient> + + + + + + + + + +<linearGradient + id="SVGID_2_" + gradientUnits="userSpaceOnUse" + x1="-9585.3418" + y1="620.50482" + x2="-5326.209" + y2="620.50482" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#9E2064" + id="stop2615" /> + <stop + offset="0.6302" + style="stop-color:#C92037" + id="stop2617" /> + <stop + offset="0.7514" + style="stop-color:#666666;stop-opacity:1" + id="stop2619" /> + <stop + offset="1" + style="stop-color:#b3b3b3;stop-opacity:1" + id="stop2621" /> +</linearGradient> + +<linearGradient + id="SVGID_3_" + gradientUnits="userSpaceOnUse" + x1="-9071.207" + y1="1047.6898" + x2="-6533.1782" + y2="1047.6898" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0" + style="stop-color:#282662" + id="stop2626" /> + <stop + offset="9.548390e-02" + style="stop-color:#662E8D" + id="stop2628" /> + <stop + offset="0.7882" + style="stop-color:#9F2064" + id="stop2630" /> + <stop + offset="0.9487" + style="stop-color:#CD2032" + id="stop2632" /> +</linearGradient> + +<linearGradient + id="SVGID_4_" + gradientUnits="userSpaceOnUse" + x1="-9346.126" + y1="580.81702" + x2="-5086.9941" + y2="580.81702" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#333333;stop-opacity:1" + id="stop2637" /> + <stop + offset="0.6302" + style="stop-color:#666666;stop-opacity:1" + id="stop2639" /> + <stop + offset="0.7514" + style="stop-color:#808080;stop-opacity:1" + id="stop2641" /> + <stop + offset="1" + style="stop-color:#b3b3b3;stop-opacity:1" + id="stop2643" /> +</linearGradient> + +<linearGradient + id="SVGID_5_" + gradientUnits="userSpaceOnUse" + x1="-9035.5029" + y1="638.4408" + x2="-6797.2012" + y2="638.4408" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0" + style="stop-color:#282662" + id="stop2648" /> + <stop + offset="9.548390e-02" + style="stop-color:#662E8D" + id="stop2650" /> + <stop + offset="0.7882" + style="stop-color:#9F2064" + id="stop2652" /> + <stop + offset="0.9487" + style="stop-color:#CD2032" + id="stop2654" /> +</linearGradient> + +<linearGradient + id="SVGID_6_" + gradientUnits="userSpaceOnUse" + x1="-9346.126" + y1="1021.6218" + x2="-5086.9941" + y2="1021.6218" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#333333;stop-opacity:1" + id="stop2659" /> + <stop + offset="0.6302" + style="stop-color:#666666;stop-opacity:1" + id="stop2661" /> + <stop + offset="0.7514" + style="stop-color:#999999;stop-opacity:1" + id="stop2663" /> + <stop + offset="1" + style="stop-color:#b3b3b3;stop-opacity:1" + id="stop2665" /> +</linearGradient> + +<linearGradient + id="SVGID_7_" + gradientUnits="userSpaceOnUse" + x1="-9610.334" + y1="999.73297" + x2="-5351.2017" + y2="999.73297" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#9E2064" + id="stop2670" /> + <stop + offset="0.6302" + style="stop-color:#C92037" + id="stop2672" /> + <stop + offset="0.7514" + style="stop-color:#666666;stop-opacity:1" + id="stop2674" /> + <stop + offset="1" + style="stop-color:#b3b3b3;stop-opacity:1" + id="stop2676" /> +</linearGradient> + + + +<linearGradient + id="SVGID_8_" + gradientUnits="userSpaceOnUse" + x1="-9346.126" + y1="1152.7261" + x2="-5086.9941" + y2="1152.7261" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#9E2064" + id="stop2685" /> + <stop + offset="0.6302" + style="stop-color:#C92037" + id="stop2687" /> + <stop + offset="0.7514" + style="stop-color:#CD2335" + id="stop2689" /> + <stop + offset="1" + style="stop-color:#E97826" + id="stop2691" /> +</linearGradient> + + + +<linearGradient + id="SVGID_9_" + gradientUnits="userSpaceOnUse" + x1="-9346.126" + y1="1137.7247" + x2="-5086.9941" + y2="1137.7247" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#9E2064" + id="stop2700" /> + <stop + offset="0.6302" + style="stop-color:#C92037" + id="stop2702" /> + <stop + offset="0.7514" + style="stop-color:#CD2335" + id="stop2704" /> + <stop + offset="1" + style="stop-color:#E97826" + id="stop2706" /> +</linearGradient> + + + +<linearGradient + id="SVGID_10_" + gradientUnits="userSpaceOnUse" + x1="-6953.4072" + y1="1134.7161" + x2="-6011.9995" + y2="1134.7161" + gradientTransform="matrix(0.4226,-0.9063,0.9063,0.4226,3144.8108,-4619.2983)"> + <stop + offset="0.3233" + style="stop-color:#9E2064" + id="stop2715" /> + <stop + offset="0.6302" + style="stop-color:#C92037" + id="stop2717" /> + <stop + offset="0.7514" + style="stop-color:#CD2335" + id="stop2719" /> + <stop + offset="1" + style="stop-color:#E97826" + id="stop2721" /> +</linearGradient> +<g + id="g2759" + transform="matrix(0.00637392,0.00170789,-0.00170789,0.00637392,8.20675,-3.0354689)"><path + fill="url(#SVGID_1_)" + d="M 1798.9,20.1 C 1732.6,59.2 1622.5,170 1491,330.5 l 120.8,228 c 84.8,-121.3 170.9,-230.4 257.8,-323.6 6.7,-7.4 10.2,-10.9 10.2,-10.9 -3.4,3.6 -6.8,7.3 -10.2,10.9 -28.1,31 -113.4,130.5 -242.1,328.1 123.9,-6.2 314.3,-31.5 469.6,-58.1 46.2,-258.8 -45.3,-377.3 -45.3,-377.3 0,0 -116.3,-188.2 -252.9,-107.5 z" + id="path2597" + style="fill:#b3b3b3" /><path + fill="none" + d="m 1594.4,1320.7 c 0.9,-0.2 1.8,-0.3 2.7,-0.5 l -17.4,1.9 c -1.1,0.5 -2,1 -3.1,1.4 6,-0.9 11.9,-1.9 17.8,-2.8 z" + id="path2599" /><path + fill="none" + d="m 1471.1,1729.1 c -9.9,2.2 -20,3.9 -30.2,5.4 10.2,-1.5 20.3,-3.3 30.2,-5.4 z" + id="path2601" /><path + fill="none" + d="m 633.1,2645.2 c 1.3,-3.4 2.6,-6.8 3.8,-10.2 26.6,-70.2 52.9,-138.4 79,-204.9 29.3,-74.6 58.2,-146.8 86.8,-216.8 30.1,-73.8 59.8,-145.1 89.1,-214 30.7,-72.3 61,-141.9 90.7,-208.9 24.2,-54.5 48,-107.3 71.5,-158.4 7.8,-17 15.6,-33.9 23.4,-50.6 15.4,-33.1 30.7,-65.6 45.7,-97.3 13.9,-29.3 27.7,-57.9 41.4,-86 4.5,-9.4 9.1,-18.6 13.6,-27.9 0.7,-1.5 1.5,-3 2.2,-4.5 l -14.8,1.6 -11.8,-23.2 c -1.1,2.3 -2.3,4.5 -3.5,6.8 -21.2,42.1 -42.2,84.6 -63,127.5 -12,24.8 -24,49.7 -35.9,74.7 -33,69.3 [...] + id="path2603" /><path + fill="none" + d="m 1433.2,1735.7 v 0 c 0.1,0 0.1,-0.1 0.2,-0.1 0,0 -0.1,0 -0.2,0.1 z" + id="path2605" /><path + fill="#be202e" + d="m 1393.2,1934.8 c -15.4,2.8 -31.3,5.5 -47.6,8.3 -0.1,0 -0.2,0.1 -0.3,0.1 8.2,-1.2 16.3,-2.4 24.3,-3.8 8,-1.4 15.8,-2.9 23.6,-4.6 z" + id="path2607" /><path + opacity="0.35" + fill="#be202e" + d="m 1393.2,1934.8 c -15.4,2.8 -31.3,5.5 -47.6,8.3 -0.1,0 -0.2,0.1 -0.3,0.1 8.2,-1.2 16.3,-2.4 24.3,-3.8 8,-1.4 15.8,-2.9 23.6,-4.6 z" + id="path2609" /><path + fill="#be202e" + d="m 1433.6,1735.5 c 0,0 -0.1,0 -0.1,0.1 -0.1,0 -0.1,0.1 -0.2,0.1 2.6,-0.3 5.1,-0.8 7.6,-1.1 10.3,-1.5 20.4,-3.3 30.2,-5.4 -12.3,2 -24.8,4.2 -37.5,6.3 z" + id="path2611" /><path + opacity="0.35" + fill="#be202e" + d="m 1433.6,1735.5 c 0,0 -0.1,0 -0.1,0.1 -0.1,0 -0.1,0.1 -0.2,0.1 2.6,-0.3 5.1,-0.8 7.6,-1.1 10.3,-1.5 20.4,-3.3 30.2,-5.4 -12.3,2 -24.8,4.2 -37.5,6.3 z" + id="path2613" /><path + fill="url(#SVGID_2_)" + d="m 1255.7,1147.6 c 36.7,-68.6 73.9,-135.7 111.5,-201 39,-67.8 78.5,-133.6 118.4,-197 2.3,-3.7 4.7,-7.5 7,-11.3 39.4,-62.4 79.2,-122.4 119.3,-179.8 l -120.8,-228 c -9.1,11.1 -18.2,22.4 -27.5,33.9 -34.8,43.4 -71,90.1 -108.1,139.6 -41.8,55.8 -84.8,115.4 -128.5,177.9 -40.3,57.8 -81.2,118.3 -122.1,180.9 -34.8,53.3 -69.8,108.2 -104.5,164.5 -1.3,2.1 -2.6,4.2 -3.9,6.3 l 157.2,310.5 c 33.6,-66.5 67.6,-132.1 102,-196.5 z" + id="path2624" + style="fill:url(#SVGID_2_)" /><path + fill="url(#SVGID_3_)" + d="m 539.7,2897.1 c -20.8,57.2 -41.7,115.4 -62.7,174.9 -0.3,0.9 -0.6,1.7 -0.9,2.6 -3,8.4 -5.9,16.8 -8.9,25.2 -14.1,40.1 -26.4,76.2 -54.5,158.3 46.3,21.1 83.5,76.7 118.7,139.8 -3.7,-65.3 -30.8,-126.7 -82.1,-174.2 228.3,10.3 425,-47.4 526.7,-214.3 9.1,-14.9 17.4,-30.5 24.9,-47.2 -46.2,58.6 -103.5,83.5 -211.4,77.4 -0.2,0.1 -0.5,0.2 -0.7,0.3 0.2,-0.1 0.5,-0.2 0.7,-0.3 158.8,-71.1 238.5,-139.3 308.9,-252.4 16.7,-26.8 32.9,-56.1 49.5,-88.6 C 1009,2841.2 848.1,2881.8 678.6,2851 l -127.1,13 [...] + id="path2635" + style="fill:#333333" /><path + fill="url(#SVGID_4_)" + d="m 599,2612.4 c 27.5,-71 55.8,-142.8 84.8,-215.3 27.8,-69.4 56.4,-139.2 85.6,-209.4 29.2,-70.2 59.1,-140.5 89.6,-210.9 31,-71.6 62.7,-143.1 94.9,-214.2 31.9,-70.3 64.4,-140.3 97.4,-209.6 11.9,-25 23.9,-49.9 35.9,-74.7 20.8,-42.9 41.8,-85.4 63,-127.5 1.1,-2.3 2.3,-4.5 3.5,-6.8 L 996.5,1033.5 c -2.6,4.2 -5.1,8.4 -7.7,12.6 -36.6,59.8 -73.1,121 -108.9,183.5 -36.2,63.1 -71.7,127.4 -106.4,192.6 -29.3,55 -57.9,110.5 -85.7,166.5 -5.6,11.4 -11.1,22.6 -16.6,33.9 -34.3,70.5 -65.2,138.6 -93.2 [...] + id="path2646" + style="fill:url(#SVGID_4_)" /><path + fill="url(#SVGID_5_)" + d="m 356.1,2529.2 c -19.8,99.8 -33.9,199.2 -41,298 -0.2,3.5 -0.6,6.9 -0.8,10.4 -49.3,-79 -181.3,-156.1 -181,-155.4 94.5,137 166.2,273 176.9,406.5 -50.6,10.4 -119.9,-4.6 -200,-34.1 83.5,76.7 146.2,97.9 170.6,103.6 -76.7,4.8 -156.6,57.5 -237.1,118.2 117.7,-48 212.8,-67 280.9,-51.6 -108,305.8 -216.3,643.4 -324.6,1001.8 33.2,-9.8 53,-32.1 64.1,-62.3 19.3,-64.9 147.4,-490.7 348.1,-1050.4 5.7,-15.9 11.5,-31.9 17.3,-48 1.6,-4.5 3.3,-9 4.9,-13.4 21.2,-58.7 43.2,-118.6 65.9,-179.7 5.2,-13.9 [...] + id="path2657" + style="fill:#333333" /><path + fill="url(#SVGID_6_)" + d="m 1178.1,1370.3 c -4.5,9.2 -9,18.5 -13.6,27.9 -13.6,28.1 -27.4,56.7 -41.4,86 -15.1,31.7 -30.3,64.1 -45.7,97.3 -7.8,16.7 -15.5,33.5 -23.4,50.6 -23.5,51.1 -47.3,103.9 -71.5,158.4 -29.7,67 -60,136.6 -90.7,208.9 -29.3,68.9 -59,140.2 -89.1,214 -28.6,70 -57.5,142.3 -86.8,216.8 -26.1,66.5 -52.4,134.7 -79,204.9 -1.3,3.4 -2.6,6.8 -3.8,10.2 -26.4,69.7 -53,141.3 -79.8,214.7 -0.6,1.7 -1.2,3.4 -1.8,5 l 127.1,-13.9 c -2.5,-0.5 -5.1,-0.8 -7.6,-1.3 152,-18.9 354,-132.5 484.6,-272.7 60.2,-64.6 11 [...] + id="path2668" + style="fill:url(#SVGID_6_)" /><path + fill="url(#SVGID_7_)" + d="m 1627.6,563.1 c -35.5,54.5 -74.3,116.4 -116,186.5 -2.2,3.6 -4.4,7.4 -6.6,11.1 -36,60.7 -74.3,127.3 -114.5,200.3 -34.8,63 -71,130.6 -108.6,203.3 -32.8,63.3 -66.7,130.5 -101.5,201.6 l 399.3,-43.8 c 116.3,-53.5 168.3,-101.9 218.8,-171.9 13.4,-19.3 26.9,-39.5 40.3,-60.4 41,-64 81.2,-134.5 117.2,-204.6 34.7,-67.7 65.3,-134.8 88.8,-195.3 14.9,-38.5 26.9,-74.3 35.2,-105.7 7.3,-27.7 13,-54 17.4,-79.1 -155.5,26.5 -345.9,51.9 -469.8,58 z" + id="path2679" + style="fill:url(#SVGID_7_)" /><path + fill="#be202e" + d="m 1369.6,1939.4 c -8,1.4 -16.1,2.7 -24.3,3.8 v 0 c 8.2,-1.1 16.3,-2.4 24.3,-3.8 z" + id="path2681" /><path + opacity="0.35" + fill="#be202e" + d="m 1369.6,1939.4 c -8,1.4 -16.1,2.7 -24.3,3.8 v 0 c 8.2,-1.1 16.3,-2.4 24.3,-3.8 z" + id="path2683" /><path + fill="url(#SVGID_8_)" + d="m 1369.6,1939.4 c -8,1.4 -16.1,2.7 -24.3,3.8 v 0 c 8.2,-1.1 16.3,-2.4 24.3,-3.8 z" + id="path2694" + style="fill:url(#SVGID_8_)" /><path + fill="#be202e" + d="m 1433.2,1735.7 c 2.6,-0.3 5.1,-0.8 7.6,-1.1 -2.5,0.3 -5,0.7 -7.6,1.1 z" + id="path2696" /><path + opacity="0.35" + fill="#be202e" + d="m 1433.2,1735.7 c 2.6,-0.3 5.1,-0.8 7.6,-1.1 -2.5,0.3 -5,0.7 -7.6,1.1 z" + id="path2698" /><path + fill="url(#SVGID_9_)" + d="m 1433.2,1735.7 c 2.6,-0.3 5.1,-0.8 7.6,-1.1 -2.5,0.3 -5,0.7 -7.6,1.1 z" + id="path2709" + style="fill:url(#SVGID_9_)" /><path + fill="#be202e" + d="m 1433.5,1735.6 c 0,0 0.1,0 0.1,-0.1 v 0 0 0 c 0,0 -0.1,0 -0.1,0.1 z" + id="path2711" /><path + opacity="0.35" + fill="#be202e" + d="m 1433.5,1735.6 c 0,0 0.1,0 0.1,-0.1 v 0 0 0 c 0,0 -0.1,0 -0.1,0.1 z" + id="path2713" /><path + fill="url(#SVGID_10_)" + d="m 1433.5,1735.6 c 0,0 0.1,0 0.1,-0.1 v 0 0 0 c 0,0 -0.1,0 -0.1,0.1 z" + id="path2724" + style="fill:url(#SVGID_10_)" /></g> + +</svg> --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists