rxcms-podio_plugin 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +29 -0
- data/app/assets/javascripts/alliance_podio_plugin/configure.js +413 -0
- data/app/assets/javascripts/alliance_podio_plugin/engine.js +2 -0
- data/app/assets/javascripts/alliance_podio_plugin/installer.js +26 -0
- data/app/controllers/engine_controller.rb +98 -0
- data/app/controllers/installer_controller.rb +124 -0
- data/app/controllers/podio_controller.rb +205 -0
- data/app/controllers/services_controller.rb +153 -0
- data/app/controllers/sessions_controller.rb +120 -0
- data/app/helpers/plugin_helper.rb +30 -0
- data/app/models/abstract_application.rb +29 -0
- data/app/models/abstract_item.rb +207 -0
- data/app/models/abstract_organization.rb +12 -0
- data/app/models/abstract_space.rb +4 -0
- data/app/views/engine/configure.html.erb +184 -0
- data/app/views/engine/index.html.erb +1 -0
- data/app/views/engine/installer.html.erb +33 -0
- data/app/views/layouts/application.html.erb +1 -0
- data/config/podio/podio_config.yml +5 -0
- data/config/routes.rb +42 -0
- data/config/symmetric-encryption.yml +107 -0
- data/lib/rxcms-podio_plugin.rb +5 -0
- data/lib/rxcms-podio_plugin/classes/executor.rb +185 -0
- data/lib/rxcms-podio_plugin/engine.rb +12 -0
- data/lib/rxcms-podio_plugin/version.rb +3 -0
- data/lib/tasks/rxcms-podio_plugin_tasks.rake +4 -0
- metadata +133 -0
@@ -0,0 +1,184 @@
|
|
1
|
+
<!-- app delete modal -->
|
2
|
+
<div id="appDelete" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
3
|
+
<div class="modal-header">
|
4
|
+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
|
5
|
+
<h3 id="myModalLabel">Delete App</h3>
|
6
|
+
</div>
|
7
|
+
<div class="modal-body">
|
8
|
+
<p>Are you sure you want to do this?</p>
|
9
|
+
</div>
|
10
|
+
<div class="modal-footer">
|
11
|
+
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
|
12
|
+
<button id="appDeleteBtn" class="btn btn-primary" data-dismiss="modal" onclick="void(0)">Delete</button>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<!-- -->
|
16
|
+
|
17
|
+
<!-- Modal -->
|
18
|
+
<div id="appAccesses" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
19
|
+
<div class="modal-header">
|
20
|
+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
21
|
+
<h3 id="myModalLabel">Currently have access(es) to:</h3>
|
22
|
+
</div>
|
23
|
+
<div class="modal-body">
|
24
|
+
<ul id="accessibleApps">
|
25
|
+
</ul>
|
26
|
+
</div>
|
27
|
+
<div class="modal-footer">
|
28
|
+
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<!-- -->
|
32
|
+
|
33
|
+
<div class="container" style="margin-bottom: 25px;">
|
34
|
+
<div class="">
|
35
|
+
<div class="row-fluid">
|
36
|
+
<div style="min-height:512px;">
|
37
|
+
<ul class="nav nav-tabs" id="systemTabs">
|
38
|
+
<li><a href="#podio" data-toggle="tab">Podio Integration</a></li>
|
39
|
+
<li><a href="#serviceAccountConfig" data-toggle="tab">Podio Service Account</a></li>
|
40
|
+
<li><a href="#uninstaller" data-toggle="tab">Uninstall</a></li>
|
41
|
+
</ul>
|
42
|
+
|
43
|
+
<div class="tab-content">
|
44
|
+
|
45
|
+
<!-- Podio Tab -->
|
46
|
+
<div class="tab-pane" id="podio">
|
47
|
+
|
48
|
+
<div>
|
49
|
+
<ul class="inline">
|
50
|
+
<!--<li><i class="icon-refresh"></i> <span><a href="javascript:void(0);">Reload</a></span></li>-->
|
51
|
+
<a id="aAppAccesses" href="#appAccesses" data-toggle="modal">show access</a>
|
52
|
+
<li><span id="podioTabLoadingText" style="padding:5px;display:none;">populating registered apps, please wait...</span></li>
|
53
|
+
</ul>
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<div>
|
57
|
+
<table id="appTable" style="max-width:none;" class="table">
|
58
|
+
<thead>
|
59
|
+
<tr>
|
60
|
+
<th width="2%">#</th>
|
61
|
+
<th width="5%"></th>
|
62
|
+
<th width="2%">Status</th>
|
63
|
+
<th width="20%"><span style="padding: 0 5px 0 5px;">App Name</span></th>
|
64
|
+
<th width="70%"><span style="padding: 0 5px 0 5px;">App ID</span></th>
|
65
|
+
</tr>
|
66
|
+
</thead>
|
67
|
+
<tbody id="appTableBody">
|
68
|
+
|
69
|
+
<tr>
|
70
|
+
<td data-modify-flag="unchecked" data-id="">...</td>
|
71
|
+
<td data-modify-flag="unchecked" style="text-align:center;">
|
72
|
+
<a id="aNewApp" href="javascript:void(0);"><i class="icon-ok"></i></a>
|
73
|
+
</td>
|
74
|
+
<td data-modify-flag="unchecked" style="text-align:center;"></td>
|
75
|
+
<td data-modify-flag="checked">
|
76
|
+
<div style="max-height:175px;overflow-y:auto;cursor:pointer;">
|
77
|
+
<input type="text" class="input" id="newAppNameTxt" placeholder="new app name" maxlength="64" style="width:90%;display:block;border:0 !important;box-shadow:none !important;outline:0;font-family:'Courier New',sans-serif;" />
|
78
|
+
</div>
|
79
|
+
</td>
|
80
|
+
<td data-modify-flag="checked">
|
81
|
+
<div style="max-height:175px;overflow-y:auto;cursor:pointer;">
|
82
|
+
<!--<input type="text" class="input" id="newAppIdTxt" placeholder="new app id" maxlength="64" style="width:90%;display:block;border:0 !important;box-shadow:none !important;outline:0;font-family:'Courier New',sans-serif;" />-->
|
83
|
+
<select id="newAppIdSelect">
|
84
|
+
</select>
|
85
|
+
</div>
|
86
|
+
</td>
|
87
|
+
</tr>
|
88
|
+
|
89
|
+
<!-- DUMMY -->
|
90
|
+
<tr class="appItem" id="podioAppItemDummy" style="display:none;">
|
91
|
+
<td data-modify-flag="unchecked" data-id=""></td>
|
92
|
+
<td data-modify-flag="unchecked" style="text-align:center;">
|
93
|
+
<a href="#appDelete" data-toggle="modal"><i class="icon-remove"></i></a>
|
94
|
+
</td>
|
95
|
+
<td data-modify-flag="unchecked" style="text-align:center;">
|
96
|
+
<a title="online" href="javascript:void(0);"><i id="" class="icon-eye-open"></i></a>
|
97
|
+
</td>
|
98
|
+
<td data-modify-flag="checked">
|
99
|
+
<div style="max-height:175px;overflow-y:auto;cursor:pointer;">
|
100
|
+
<span style="padding:0 5px 0 5px;">
|
101
|
+
|
102
|
+
</span>
|
103
|
+
<input type="text" class="input" data-attr="editor" maxlength="64" style="width:90%;display:none;border:0 !important;box-shadow:none !important;outline:0;font-family:'Courier New',sans-serif;" />
|
104
|
+
</div>
|
105
|
+
</td>
|
106
|
+
<td data-modify-flag="checked">
|
107
|
+
<div style="max-height:175px;overflow-y:auto;cursor:pointer;">
|
108
|
+
<span style="padding:0 5px 0 5px;">
|
109
|
+
|
110
|
+
</span>
|
111
|
+
<input type="text" class="input" data-attr="editor" maxlength="64" style="width:90%;display:none;border:0 !important;box-shadow:none !important;outline:0;font-family:'Courier New',sans-serif;" />
|
112
|
+
</div>
|
113
|
+
</td>
|
114
|
+
</tr>
|
115
|
+
<!-- DUMMY -->
|
116
|
+
</tbody>
|
117
|
+
</table>
|
118
|
+
|
119
|
+
</div>
|
120
|
+
</div>
|
121
|
+
<!-- End -->
|
122
|
+
|
123
|
+
<!-- Service Account Tab -->
|
124
|
+
<div class="tab-pane" id="serviceAccountConfig">
|
125
|
+
<div style="padding: 15px;">
|
126
|
+
<div>
|
127
|
+
<strong>Service Status: </strong>
|
128
|
+
<% if (@serviceAccount.nil?) %>
|
129
|
+
<span id="serviceAccountStatus">No service account are currently active</span>
|
130
|
+
<% else %>
|
131
|
+
<span id="serviceAccountStatus">Podio service account <%= @serviceAccount.value.strip.html_safe %> is active</span>
|
132
|
+
<% end %>
|
133
|
+
</div>
|
134
|
+
<div style="padding: 25px 0 25px 0;">
|
135
|
+
<div class="control-group">
|
136
|
+
<div class="controls">
|
137
|
+
<div class="input-prepend">
|
138
|
+
<span class="add-on"><i class="icon-user"></i></span>
|
139
|
+
<input id="username" type="text">
|
140
|
+
</div>
|
141
|
+
</div>
|
142
|
+
</div>
|
143
|
+
<div class="control-group">
|
144
|
+
<div class="controls">
|
145
|
+
<div class="input-prepend">
|
146
|
+
<span class="add-on"><i class="icon-asterisk"></i></span>
|
147
|
+
<input id="password" type="password">
|
148
|
+
</div>
|
149
|
+
</div>
|
150
|
+
</div>
|
151
|
+
<div>
|
152
|
+
<button class="btn btn-danger" id="activateServiceAccountBtn">activate</button>
|
153
|
+
</div>
|
154
|
+
</div>
|
155
|
+
<div id="orgsIndicator" style="display:none;">Loading...</div>
|
156
|
+
<div id="chooseOrganization" class="chooseSomething" style="padding: 25px 0 25px 0;display:none;">
|
157
|
+
<label for="selectOrganization"><strong>Choose an organization</strong></label>
|
158
|
+
<select id="selectOrganization">
|
159
|
+
</select>
|
160
|
+
</div>
|
161
|
+
<div id="workspacesIndicator" style="display:none;">Loading...</div>
|
162
|
+
<div id="chooseWorkspace" class="chooseSomething" style="padding: 25px 0 25px 0;display:none;">
|
163
|
+
<label for="selectPodioWorksapce"><strong>Choose a workspace</strong></label>
|
164
|
+
<select id="selectPodioWorkspace">
|
165
|
+
</select>
|
166
|
+
</div>
|
167
|
+
</div>
|
168
|
+
</div>
|
169
|
+
<!-- End -->
|
170
|
+
|
171
|
+
<!-- Uninstaller -->
|
172
|
+
<div class="tab-pane" id="uninstaller">
|
173
|
+
<input type="button" id="uninstall" class="btn" value="uninstall">
|
174
|
+
</div>
|
175
|
+
<!-- End -->
|
176
|
+
|
177
|
+
</div>
|
178
|
+
|
179
|
+
</div>
|
180
|
+
</div>
|
181
|
+
</div>
|
182
|
+
</div>
|
183
|
+
|
184
|
+
<%= javascript_include_tag "alliance_podio_plugin/configure" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<h2>README</h2>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<div class="container" style="margin-bottom: 25px;">
|
2
|
+
<div class="">
|
3
|
+
<div class="row-fluid">
|
4
|
+
<h4>Please provide a valid podio account</h4>
|
5
|
+
|
6
|
+
<div class="input-prepend">
|
7
|
+
<span class="add-on">Username</span>
|
8
|
+
<input class="span12" id="username" type="text" placeholder="">
|
9
|
+
</div>
|
10
|
+
<br />
|
11
|
+
<div class="input-prepend">
|
12
|
+
<span class="add-on">Password</span>
|
13
|
+
<input class="span12" id="password" type="password" placeholder="">
|
14
|
+
</div>
|
15
|
+
<br />
|
16
|
+
<div class="input-prepend">
|
17
|
+
<span class="add-on">Podio API Key</span>
|
18
|
+
<input class="span12" id="podioApiKey" type="text" placeholder="">
|
19
|
+
</div>
|
20
|
+
<br />
|
21
|
+
<div class="input-prepend">
|
22
|
+
<span class="add-on">Podio Secret Key</span>
|
23
|
+
<input class="span12" id="podioSecretKey" type="text" placeholder="">
|
24
|
+
</div>
|
25
|
+
<br />
|
26
|
+
<div>
|
27
|
+
<input type="button" id="submit" class="btn" value="authenticate">
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<%= javascript_include_tag "alliance_podio_plugin/installer" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
|
3
|
+
# Mandatory routes
|
4
|
+
get "/podio/engine/readme" => "engine#index"
|
5
|
+
get "/podio/engine/installer" => "engine#installer"
|
6
|
+
get "/podio/engine/configure" => "engine#configure"
|
7
|
+
|
8
|
+
# Mandatory installer routes
|
9
|
+
post "/podio/installer/before_process" => "installer#before_process"
|
10
|
+
post "/podio/installer/core_process" => "installer#core_process"
|
11
|
+
post "/podio/installer/post_process" => "installer#post_process"
|
12
|
+
post "/podio/installer/uninstall" => "installer#uninstall"
|
13
|
+
|
14
|
+
# Optional routes
|
15
|
+
get "engine/services"
|
16
|
+
|
17
|
+
# Authentication routes
|
18
|
+
# match '/podio/auth/podio' => 'sessions#create_session'
|
19
|
+
# match '/podio/auth/podio/callback' => 'sessions#success_callback'
|
20
|
+
match '/podio/auth/podio/delete' => 'sessions#delete_session'
|
21
|
+
match '/podio/auth/podio_as_user' => 'sessions#create_session_as_user'
|
22
|
+
match '/podio/auth/podio_change_user' => 'sessions#change_session_as_user'
|
23
|
+
|
24
|
+
# Utility routes
|
25
|
+
get '/ext/podio/data/:appid/:fields/:order/:limit/:offset' => 'podio#get_podio_items', :constraints => { :fields => /([a-zA-Z]+\-{0,1}[a-zA-Z]+(%7){0,1})+/ }
|
26
|
+
get '/ext/podio/data/:appid/:fields/:order' => 'podio#get_podio_items', :constraints => { :fields => /([a-zA-Z]+\-{0,1}[a-zA-Z]+(%7){0,1})+/ }
|
27
|
+
get '/ext/podio/data/:appid/:fields/:order/:limit' => 'podio#get_podio_items', :constraints => { :fields => /([a-zA-Z]+\-{0,1}[a-zA-Z]+(%7){0,1})+/ }
|
28
|
+
get '/ext/podio/data/:appid/:fields/:order/:offset' => 'podio#get_podio_items', :constraints => { :fields => /([a-zA-Z]+\-{0,1}[a-zA-Z]+(%7){0,1})+/ }
|
29
|
+
get '/ext/podio/data/:appid/:fields' => 'podio#get_podio_items', :constraints => { :fields => /([a-zA-Z]+\-{0,1}[a-zA-Z]+(%7){0,1})+/ }
|
30
|
+
|
31
|
+
# Servicing routes
|
32
|
+
get '/podio/app/active/:appid' => 'podio#get_podio_app_status'
|
33
|
+
post '/podio/user/login' => 'podio#check_user_login'
|
34
|
+
get '/podio/data/orgs' => 'podio#get_list_of_organizations_of_user'
|
35
|
+
get '/podio/orgs/space/:space' => 'podio#get_list_of_apps_from_workspace'
|
36
|
+
post '/podio/user/manipulate' => 'services#update_or_create_podio_service_account'
|
37
|
+
get '/podio/orgs/curspace' => 'services#get_current_podio_workspace'
|
38
|
+
post '/podio/orgs/space/manipulate/' => 'services#set_current_podio_workspace'
|
39
|
+
get '/podio/orgs/curspace/apps' => 'podio#get_list_of_apps_for_elements'
|
40
|
+
get '/podio/user/current' => 'services#get_current_podio_user'
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#
|
2
|
+
# Symmetric Encryption for Ruby
|
3
|
+
#
|
4
|
+
---
|
5
|
+
# For the development and test environments the test symmetric encryption keys
|
6
|
+
# can be placed directly in the source code.
|
7
|
+
# And therefore no RSA private key is required
|
8
|
+
development: &development_defaults
|
9
|
+
key: 1234567890ABCDEF1234567890ABCDEF
|
10
|
+
iv: 1234567890ABCDEF
|
11
|
+
cipher_name: aes-128-cbc
|
12
|
+
encoding: :base64strict
|
13
|
+
|
14
|
+
test:
|
15
|
+
<<: *development_defaults
|
16
|
+
|
17
|
+
release:
|
18
|
+
# Since the key to encrypt and decrypt with must NOT be stored along with the
|
19
|
+
# source code, we only hold a RSA key that is used to unlock the file
|
20
|
+
# containing the actual symmetric encryption key
|
21
|
+
private_rsa_key: |
|
22
|
+
-----BEGIN RSA PRIVATE KEY-----
|
23
|
+
MIIEpQIBAAKCAQEAtP6lnW1Oj8T+IoxQRrFW1vtYr+jgK9w0SP7tOY2RMbuLrNEv
|
24
|
+
ck5z5O4o2iz8UfXMEMGuMtlj0a8F4myUG6QDWuY8k1+oPHIUvK/9Z8rCmWd0Kw0U
|
25
|
+
ATV+txSg/gdUFD11MX8fLljd9l08b79exh/MMSv0Tp21Mo+ILWDCI2YNLFSDuG95
|
26
|
+
sgiX6as7Ji5254obY6Qa0eR21h4QafzCOp6fLhVpUV6FLnCRoTPe8usS0wwe1KIb
|
27
|
+
byFl/J5wc6HkicibC+jD+IKKCVbX3IdGOyilyz4dQ3egnEsfBGTO5LogXrY991Jb
|
28
|
+
HN34dhpXDkN/sI1X8p3cDyQ75Elk0PJojiBKowIDAQABAoIBABs45a3s39EN3u9R
|
29
|
+
TU2kpJwHB8rFatoN76s+9G0glsL1I0fl2o4FsLaw/2H5PCYToxKuHsY1HidOfMMW
|
30
|
+
c5xIqdyFHn1H+OTGf8n1alavD1/FSJqlB+o6oolkx+YNMh8tMzAzn3v4D8JbOZjR
|
31
|
+
Hq8L30lSBBfC7prhLaktkWWDlt2gw4FcScUc24UFmKCQEtdaoZU71q2g5kWwZdRC
|
32
|
+
W8qIXWwRYhhjUOsuiL/Is/wxx4hK7cmwEezkbwQ29aC4mYtHYq/o5BduBO6wiGkv
|
33
|
+
F1PkySpejNIUl1D2E6noHXlJiqhE5nqp+6jw5HNE5J0JXVyo4MzA1Yn1w9Q+3D06
|
34
|
+
1o9njDECgYEA6ztXOoEZ0BdxSokWc8uaQD6xnTj/fEcVisfspsTR6LxlYs7TFTvf
|
35
|
+
8SqXGrIFSuMGYx/NeuTlF7qQYOxmEptJ/16UnGrT1Y+7xWCcFfmkfRlM1w7X1b/7
|
36
|
+
f4HNp7JjFWbcm1+P3XNYiA921LtsJzP+HwKVY/1Cxzlprq5o3Lx2g/kCgYEAxPlz
|
37
|
+
ex9pZqpUza2RQxdufoIEiwMnhSB0p0ZhCGZlApS6Yj8wr29EjvNKDcFVDK6WpsiL
|
38
|
+
6tGzE0KZ18AAUA1FwfODrp9Qa1+EtU5aErNsf1uLBRrZkYcCwewyI/c6jb0xN5oc
|
39
|
+
coW+ijz/Zh7Y13XGUl+Jq0pwQH2dIlr4mvQ6cnsCgYEAvAWSk5DdsRcL1yf8alIz
|
40
|
+
2WZDUghdLlkjPurOnf50SjNMVs46qp5RQdNpNE1XLaSJVnH1LGYJOA5HmTFb5UN6
|
41
|
+
wkQ3RU+eQvXAgOPX3zjL4bJ3WO7kVlY+EI0QdRqBWHn/m7GmrLul6Bt0QFYO/Mby
|
42
|
+
OJc4EdQ9rECX2KhP6SA7GwECgYEAojQJNMqZMUHys6zKgkU5aFQJCbB/StF/PoBm
|
43
|
+
R1SKuaVgFqeSn+Uwv8b4pHsgXmEnDhD3p1cn8CRYK6Kgn0tOtnihZ5spzkHKNsNe
|
44
|
+
ySeXoQjxYjLKF1zmmGq4n4VnYnD5pp/x7RzV22B/sMiWKFeECTFDXRrfdTv7ud7P
|
45
|
+
+kpEFyECgYEAqsZBfG77Z2kCWNwq/AJqTZk2kZ7gO7TLRjTgwHEYUog9fT5v5KHm
|
46
|
+
KWCo0hchTvtYaJ+MM+f6I627O96LTGll3Iw35YdUjQp/Xzlke20wHoXODy8c+y6M
|
47
|
+
QSamgNAlTe9il4I07p8xd1O1j/fTJXOuUUxK7pfA0+FGNQtEEdMeDZQ=
|
48
|
+
-----END RSA PRIVATE KEY-----
|
49
|
+
|
50
|
+
|
51
|
+
# List Symmetric Key files in the order of current / latest first
|
52
|
+
ciphers:
|
53
|
+
-
|
54
|
+
# Filename containing Symmetric Encryption Key encrypted using the
|
55
|
+
# RSA public key derived from the private key above
|
56
|
+
key_filename: /etc/rails/keys/podioror_release.key
|
57
|
+
iv_filename: /etc/rails/keys/podioror_release.iv
|
58
|
+
cipher_name: aes-256-cbc
|
59
|
+
# Base64 encode encrypted data without newlines
|
60
|
+
encoding: :base64strict
|
61
|
+
version: 1
|
62
|
+
|
63
|
+
production:
|
64
|
+
# Since the key to encrypt and decrypt with must NOT be stored along with the
|
65
|
+
# source code, we only hold a RSA key that is used to unlock the file
|
66
|
+
# containing the actual symmetric encryption key
|
67
|
+
private_rsa_key: |
|
68
|
+
-----BEGIN RSA PRIVATE KEY-----
|
69
|
+
MIIEpQIBAAKCAQEAvU5AXXvdb813T83yBgNCtk44F8RybljZxxM43HyVXicbqdri
|
70
|
+
S2Bt6Qc/KG1QHirOKoTl5uiBd8f4iGVPN80svNLLVetDOsmtgtkDz/pzTkcrYGRG
|
71
|
+
5pRRtAuSp8SfUbCcM/i0KWKUqgZYHm3qlDQUgHqAjx1jSD4V6p1DIJSvrA+/jciQ
|
72
|
+
ksueR2OPn9LkEHBArECLgJBXu8gN0JFnmfzxFpsAgtMhP7ljtJHeORhCYW+O8SSp
|
73
|
+
ricnDxQYF8s/+hHOZah2PPKkVLfx+ZV86Ba8pDk0GCD8afM7eh24DD/YbDmIm8yE
|
74
|
+
P02tm0ZeZfzvFNtDG3Q8kPvK0ccJOFV9GCMc2QIDAQABAoIBAGwH9ANlZIEhKC2K
|
75
|
+
wctcoP2YtboaiZMfcWiCN7jcAAGzH75XAz0w0ohhclGH0Gjm1LC/FtQna3sHy3VL
|
76
|
+
G2Ik3JsFULS/haZO4Y4CeoJ90r+hLcfccfm0Oswcrpy/QIxF1V5zV50mfOBqrm7v
|
77
|
+
GydocSrAvgzuIHJhu/Afvucg8v+lIbuqrRcORULwR1ubmMCgDKGuK5Q9S5OLGDX+
|
78
|
+
oPdQIC6azqVN6WiDtZQy/4G5t1hdnOJITXGVu3ZiLsxMEyKem1XQwPf5kPMgT6/e
|
79
|
+
9ZSfY5JaRe2E0HC7o6I0iSc8Lga3GLZBUzl4eILmOXnteNOrjPPYlFtgE3L31Q7V
|
80
|
+
YFY432ECgYEA4eZeuXMZ75JQalwWuwM2xWV7bpNyifj+LR/ccfxpJLcDHMlbihMM
|
81
|
+
iGr+wfVTjO9QnkFfoQ5vc1ePfi45aTwuxr8kwub0+0+i3ps9hyMn2Ndp+y2rFv8k
|
82
|
+
q0ahJrSmkueZ5T9P8dXxtbAukGKIrNrduchiwK1kwe1iLBBwY+rqXGsCgYEA1oef
|
83
|
+
cc6gkWcdQqTNmUeJqwPHtJfZoS5YVfozrgEfVCFrxbcw2anD7F95dSldsvelHpNe
|
84
|
+
aqFWsEsqUoQ+xdR9kyWjQA/9tWsJHm29gFc3VcwOvcNz/ll5mgSOgX2sutj5AmML
|
85
|
+
Nb1Vtlkq/s2UABHEXQc+VJl4YKaMWF+fj0SYfMsCgYEAoth7OJzs+XM0XTf9etsa
|
86
|
+
RLqffFr2mtfQA5+QPuuCsGDt8XaGcsbApibbd97uWA68wxjFY0kQtslMO93+rQoh
|
87
|
+
fkyUp5vuxqvl8Stf82c4dmzzjYqiZ3WObZoA2fIokoY6vrQhYWilUiCrsJIXjORK
|
88
|
+
Kn92EQfuNo510uYW3zCdufkCgYEA1eQ2xsObOB21AMNL8i1vR0DnllloNNn+XQqv
|
89
|
+
CCg6UilYSLMTU5F9tGiksnnh4BQlX0zTcEEYK4Fl2wvbgmcQJOv7zl2jOYRUfTAx
|
90
|
+
JorOsw5XDECZn9kZ8sPkSZtB4rF95DFX9eamVL6mrZHOpBsSyyXzsWmqqcKkX2BH
|
91
|
+
uBJObu0CgYEA3Uu5hA65WCjP+hABYKNa+XCdd5ljysnPqp3y3BEfu/6QL9wQRLOy
|
92
|
+
slwapCPQoxxpsEoLLEXsO7Ydw9EJxrePGw6qPji7B+nGUhs6rUlZWVr6lhJV9p3v
|
93
|
+
X4YSzkMAbdsaYDh6oqSMN6F4vGnQ+W4uKIFsjGZccH2J6GcaCiW5imk=
|
94
|
+
-----END RSA PRIVATE KEY-----
|
95
|
+
|
96
|
+
|
97
|
+
# List Symmetric Key files in the order of current / latest first
|
98
|
+
ciphers:
|
99
|
+
-
|
100
|
+
# Filename containing Symmetric Encryption Key encrypted using the
|
101
|
+
# RSA public key derived from the private key above
|
102
|
+
key_filename: /etc/rails/keys/podioror_production.key
|
103
|
+
iv_filename: /etc/rails/keys/podioror_production.iv
|
104
|
+
cipher_name: aes-256-cbc
|
105
|
+
# Base64 encode encrypted data without newlines
|
106
|
+
encoding: :base64strict
|
107
|
+
version: 1
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module RxcmsPodioPlugin
|
2
|
+
|
3
|
+
class Executor
|
4
|
+
def self.execute(placeholder, attrs, exts)
|
5
|
+
# Check if placeholder/element template is bound with a podio item, if not, return static HTML content.
|
6
|
+
if (!placeholder.MetadataAssociation.nil?)
|
7
|
+
# Just get one app for one placeholder/element
|
8
|
+
if (placeholder.MetadataAssociation.length == 1)
|
9
|
+
# Check if the items of podio app are specified; if not, show error
|
10
|
+
if (!attrs['configs'].nil?)
|
11
|
+
if (attrs['configs']['items'].nil?)
|
12
|
+
return "{{[rxcms-podio-plugin]WARNING: The items parameter for a podio app for element was not found}}"
|
13
|
+
end
|
14
|
+
else
|
15
|
+
return "{{[rxcms-podio-plugin]WARNING: The configs parameter for element was not found}}"
|
16
|
+
end
|
17
|
+
|
18
|
+
placeholderTemplate = placeholder.value.strip
|
19
|
+
podio = (placeholder.MetadataAssociation.first).destId
|
20
|
+
|
21
|
+
if (!podio.nil?)
|
22
|
+
podioApp = Metadata.find(podio)
|
23
|
+
|
24
|
+
if (!podioApp.nil?)
|
25
|
+
appId = podioApp.value
|
26
|
+
|
27
|
+
contentResult = ''
|
28
|
+
listItems = attrs['configs']['items'].split('|')
|
29
|
+
listItems.each { |i| i.strip }
|
30
|
+
|
31
|
+
# logger.debug(listItems.inspect)
|
32
|
+
# Check if the podio app exists?, if not, raise an awesome error
|
33
|
+
|
34
|
+
# logger.debug(appId);
|
35
|
+
if (AbstractApplication.app_exists?(appId) == false)
|
36
|
+
return "{{[rxcms-podio-plugin]WARNING: The \"#{podioApp.key.strip}\" app doesn't exist or service account doesn't have access to it}}"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Use internal method to get a list of items from that podio app
|
40
|
+
contentObjs = get_podio_items(appId, listItems)
|
41
|
+
# logger.debug(contentObjs.inspect)
|
42
|
+
|
43
|
+
if (attrs['mode'] == 'multiple')
|
44
|
+
|
45
|
+
return "{{[rxcms-podio-plugin]WARNING: The mode \"multiple\" is currently not supported}}"
|
46
|
+
|
47
|
+
elsif (attrs['mode'] == 'alternate')
|
48
|
+
|
49
|
+
if (attrs['configs']['tple'].nil? && attrs['configs']['tplo'].nil?)
|
50
|
+
return "[rxcms-podio-plugin]WARNING: Odd aka. \"&tple\" & even aka. \"&tplo\" template haven't been defined"
|
51
|
+
else
|
52
|
+
evenTpl = attrs['configs']['tple']
|
53
|
+
oddTpl = attrs['configs']['tplo']
|
54
|
+
|
55
|
+
# Load even and odd template from database
|
56
|
+
even = Metadata.first({ :conditions => ['key = ? and cat = ? and sites_id = ?',
|
57
|
+
evenTpl, 'placeholder', exts[:appid]
|
58
|
+
]})
|
59
|
+
|
60
|
+
odd = Metadata.first({ :conditions => ['key = ? and cat = ? and sites_id = ?',
|
61
|
+
oddTpl, 'placeholder', exts[:appid]
|
62
|
+
]})
|
63
|
+
|
64
|
+
if (!odd.nil? && !even.nil?)
|
65
|
+
oddContent = odd.value.strip
|
66
|
+
evenContent = even.value.strip
|
67
|
+
rCount = 0
|
68
|
+
|
69
|
+
contentObjs.each do |obj|
|
70
|
+
parsedObjs = Array.new
|
71
|
+
objectContent = ''
|
72
|
+
|
73
|
+
if (rCount % 2 == 0)
|
74
|
+
parsedObjs = evenContent.scan(/\[\[\$[a-zA-Z\-]+\]\]/)
|
75
|
+
objectContent = evenContent
|
76
|
+
else
|
77
|
+
parsedObjs = oddContent.scan(/\[\[\$[a-zA-Z\-]+\]\]/)
|
78
|
+
objectContent = oddContent
|
79
|
+
end
|
80
|
+
|
81
|
+
# logger.debug(parsedObjs.inspect)
|
82
|
+
|
83
|
+
parsedObjs.each do |pobj|
|
84
|
+
tpObj = pobj.gsub(/[^a-zA-Z\-]/, '')
|
85
|
+
|
86
|
+
# logger.debug(obj[tpObj].inspect)
|
87
|
+
|
88
|
+
if (!obj[tpObj].nil?)
|
89
|
+
objectContent = objectContent.gsub(pobj, obj[tpObj])
|
90
|
+
else
|
91
|
+
objectContent = objectContent.gsub(pobj, '')
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
contentResult << objectContent
|
97
|
+
rCount += 1
|
98
|
+
end
|
99
|
+
|
100
|
+
else
|
101
|
+
return "{{[rxcms-podio-plugin]WARNING: Either even, odd or both templates are missing}}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
elsif (attrs['mode'] == 'single')
|
106
|
+
|
107
|
+
contentObjs.each do |obj|
|
108
|
+
objectContent = placeholderTemplate.strip
|
109
|
+
parsedObjs = objectContent.scan(/\[\[\$[a-zA-Z\-]+\]\]/)
|
110
|
+
|
111
|
+
parsedObjs.each do |pobj|
|
112
|
+
tpObj = pobj.gsub(/[^a-zA-Z\-]/, '')
|
113
|
+
|
114
|
+
if (!obj[tpObj].nil?)
|
115
|
+
objectContent = objectContent.gsub(pobj, obj[tpObj])
|
116
|
+
else
|
117
|
+
objectContent = objectContent.gsub(pobj, '')
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
contentResult << objectContent
|
122
|
+
end
|
123
|
+
|
124
|
+
else
|
125
|
+
|
126
|
+
return "{{[rxcms-podio-plugin]WARNING: The mode \"#{attrs['mode']}\" is not supported}}"
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
contentResult.html_safe
|
131
|
+
else
|
132
|
+
placeholder.value.strip.html_safe
|
133
|
+
end
|
134
|
+
else
|
135
|
+
placeholder.value.strip.html_safe
|
136
|
+
end
|
137
|
+
|
138
|
+
else
|
139
|
+
placeholder.value.strip.html_safe
|
140
|
+
end
|
141
|
+
else
|
142
|
+
placeholder.value.strip.html_safe
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Input: podio app id, arrays of string and a set of attributes
|
147
|
+
# Output: an empty array or an array of data
|
148
|
+
def self.get_podio_items(podioAppId, fields = [], attrs = {
|
149
|
+
:order => "ASC",
|
150
|
+
:limit => 30,
|
151
|
+
:offset => 0
|
152
|
+
})
|
153
|
+
appid = podioAppId.to_i
|
154
|
+
order = attrs[:order].nil? ? "ASC" : attrs[:order].strip
|
155
|
+
limit = attrs[:limit].nil? ? 30 : attrs[:limit]
|
156
|
+
offset = attrs[:offset].nil? ? 0 : attrs[:offset]
|
157
|
+
|
158
|
+
if (fields.length > 0)
|
159
|
+
appFieldsArray = Array.new
|
160
|
+
fields.each do |t|
|
161
|
+
tHash = Hash.new
|
162
|
+
|
163
|
+
tHash[:external_id] = t
|
164
|
+
tHash[:simple] = true
|
165
|
+
|
166
|
+
appFieldsArray << tHash
|
167
|
+
end
|
168
|
+
|
169
|
+
data = nil
|
170
|
+
if (defined?(RxcmsPodioPlugin))
|
171
|
+
data = AbstractItem.range(appid, appFieldsArray, {:order => order, :offset => offset, :limit => limit})
|
172
|
+
end
|
173
|
+
|
174
|
+
if (!data.nil?)
|
175
|
+
return data
|
176
|
+
else
|
177
|
+
return []
|
178
|
+
end
|
179
|
+
else
|
180
|
+
return []
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|