2222import static java .nio .file .Files .newOutputStream ;
2323import static java .util .Collections .emptyList ;
2424import static java .util .Collections .list ;
25+ import static java .util .Collections .singletonMap ;
2526import static java .util .Comparator .reverseOrder ;
2627import static java .util .Optional .ofNullable ;
2728import static java .util .stream .Collectors .toList ;
2829import static java .util .stream .Collectors .toMap ;
30+ import static org .reaktivity .rym .internal .settings .RymSecrets .decryptSecret ;
31+ import static org .sonatype .plexus .components .sec .dispatcher .DefaultSecDispatcher .SYSTEM_PROPERTY_SEC_LOCATION ;
2932
3033import java .io .File ;
3134import java .io .IOException ;
6972import org .apache .ivy .util .DefaultMessageLogger ;
7073import org .apache .ivy .util .Message ;
7174import org .apache .ivy .util .MessageLogger ;
75+ import org .apache .ivy .util .url .CredentialsStore ;
7276import org .reaktivity .rym .internal .RymCommand ;
7377import org .reaktivity .rym .internal .commands .install .cache .RymArtifact ;
7478import org .reaktivity .rym .internal .commands .install .cache .RymArtifactId ;
7579import org .reaktivity .rym .internal .commands .install .cache .RymCache ;
7680import org .reaktivity .rym .internal .commands .install .cache .RymModule ;
81+ import org .reaktivity .rym .internal .settings .RymCredentials ;
82+ import org .reaktivity .rym .internal .settings .RymSecrets ;
83+ import org .reaktivity .rym .internal .settings .RymSecurity ;
84+ import org .reaktivity .rym .internal .settings .RymSettings ;
85+ import org .sonatype .plexus .components .cipher .PlexusCipherException ;
7786
7887import com .github .rvesse .airline .annotations .Command ;
7988import com .github .rvesse .airline .annotations .Option ;
@@ -86,12 +95,11 @@ public final class RymInstall extends RymCommand
8695 private static final String MODULE_INFO_JAVA_FILENAME = "module-info.java" ;
8796 private static final String MODULE_INFO_CLASS_FILENAME = "module-info.class" ;
8897
98+ private static final Map <String , String > DEFAULT_REALMS = initDefaultRealms ();
99+
89100 @ Option (name = { "--debug" })
90101 public Boolean debug = false ;
91102
92- @ Option (name = { "--ignore-signing-information" })
93- public Boolean ignoreSigning = false ;
94-
95103 @ Option (name = { "--exclude-local-repository" })
96104 public boolean excludeLocalRepo ;
97105
@@ -116,6 +124,7 @@ public void invoke()
116124 config = overrideConfigIfLocked (config , rymFile , lockFile );
117125
118126 logger .info ("resolving dependencies" );
127+ readSettings (settingsDir );
119128 createDirectories (cacheDir );
120129 List <RymRepository > repositories = new ArrayList <>(config .repositories );
121130 if (!excludeLocalRepo )
@@ -182,6 +191,58 @@ public void invoke()
182191 }
183192 }
184193
194+ private void readSettings (
195+ Path settingsDir ) throws IOException , PlexusCipherException
196+ {
197+ Path settingsFile = settingsDir .resolve ("settings.json" );
198+
199+ RymSettings settings = new RymSettings ();
200+ settings .credentials = emptyList ();
201+
202+ Jsonb builder = JsonbBuilder .newBuilder ()
203+ .withConfig (new JsonbConfig ().withFormatting (true ))
204+ .build ();
205+
206+ if (Files .exists (settingsFile ))
207+ {
208+ try (InputStream in = newInputStream (settingsFile ))
209+ {
210+ settings = builder .fromJson (in , RymSettings .class );
211+ }
212+ }
213+
214+ if (settings .credentials .size () > 0 )
215+ {
216+ Path securityFile = settingsDir .resolve ("security.json" );
217+
218+ RymSecurity security = new RymSecurity ();
219+
220+ if (Files .exists (securityFile ))
221+ {
222+ try (InputStream in = newInputStream (securityFile ))
223+ {
224+ security = builder .fromJson (in , RymSecurity .class );
225+ }
226+ }
227+
228+ security .secret = decryptSecret (security .secret , SYSTEM_PROPERTY_SEC_LOCATION );
229+
230+ for (RymCredentials credentials : settings .credentials )
231+ {
232+ String realm = defaultRealmIfNecessary (credentials );
233+ String host = credentials .host ;
234+ String username = credentials .username ;
235+ String password = RymSecrets .decryptSecret (credentials .password , security .secret );
236+
237+ CredentialsStore .INSTANCE .addCredentials (
238+ realm ,
239+ host ,
240+ username ,
241+ password );
242+ }
243+ }
244+ }
245+
185246 private RymConfiguration readOrDefaultConfig (
186247 Path rymFile ) throws IOException
187248 {
@@ -573,10 +634,7 @@ private void linkModules(
573634 "--compress" , "2" ,
574635 "--add-modules" , moduleNames .collect (Collectors .joining ("," ))));
575636
576- if (ignoreSigning )
577- {
578- args .add ("--ignore-signing-information" );
579- }
637+ args .add ("--ignore-signing-information" );
580638
581639 if (!debug )
582640 {
@@ -696,4 +754,16 @@ private void deleteDirectories(
696754 .forEach (File ::delete );
697755 }
698756 }
757+
758+ private String defaultRealmIfNecessary (
759+ RymCredentials credentials )
760+ {
761+ return ofNullable (credentials .realm )
762+ .orElse (DEFAULT_REALMS .get (credentials .host ));
763+ }
764+
765+ private static Map <String , String > initDefaultRealms ()
766+ {
767+ return singletonMap ("maven.pkg.github.com" , "GitHub Package Registry" );
768+ }
699769}
0 commit comments